package com.stylefeng.guns.modular.system.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.account.service.ITEnterpriseWithdrawalService; import com.stylefeng.guns.modular.account.unionpay.GetOpenBodySig; import com.stylefeng.guns.modular.account.unionpay.QrCodeConfiguration; import com.stylefeng.guns.modular.account.unionpay.Util; import com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper; import com.stylefeng.guns.modular.crossCity.dao.LineShiftMapper; import com.stylefeng.guns.modular.crossCity.dao.LineSiteMapper; import com.stylefeng.guns.modular.crossCity.model.Line; import com.stylefeng.guns.modular.crossCity.model.LineShift; import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver; import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity; import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService; import com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics; import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService; import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar; import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService; import com.stylefeng.guns.modular.system.dao.DispatchMapper; import com.stylefeng.guns.modular.system.dao.ReassignMapper; import com.stylefeng.guns.modular.system.dao.SensitiveWordsMapper; import com.stylefeng.guns.modular.system.dao.CarBrandMapper; import com.stylefeng.guns.modular.system.dao.CarModelMapper; 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.taxi.model.OrderTaxi; import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService; import org.apache.commons.lang.time.DateFormatUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @Service @Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public class ReassignServiceImpl extends ServiceImpl implements IReassignService { @Resource private ReassignMapper reassignMapper; @Resource private SensitiveWordsMapper sensitiveWordsMapper; @Autowired private IOrderService orderService; @Autowired private IDriverService driverService; @Autowired private ITransactionDetailsService transactionDetailsService; @Autowired private IPaymentRecordService paymentRecordService; @Autowired private PayMoneyUtil payMoneyUtil; @Autowired private CbyzxOrderPayHelper cbyzxOrderPayHelper; @Autowired private IOrderTaxiService orderTaxiService; @Autowired private IIncomeService incomeService; @Autowired private ISystemNoticeService systemNoticeService; @Autowired private IOrderPrivateCarService orderPrivateCarService; @Autowired private IOrderCrossCityService orderCrossCityService; @Autowired private JGPushUtil jgPushUtil; @Autowired private QrCodeConfiguration qrCodeConfiguration; @Resource private DispatchMapper dispatchMapper; @Autowired private IOrderLogisticsService orderLogisticsService; @Autowired private ICompanyService companyService; @Autowired private ITEnterpriseWithdrawalService enterpriseWithdrawalService; @Autowired private LineShiftMapper lineShiftMapper; @Autowired private LineSiteMapper lineSiteMapper; @Value("${callbackPath}") private String callbackPath; @Autowired private LineShiftDriverMapper lineShiftDriverMapper; @Autowired private ICarService carService; @Resource private CarBrandMapper carBrandMapper; @Resource private CarModelMapper carModelMapper; @Autowired private IOrderEvaluateService orderEvaluateService; /** * 提交改派申请 * @param uid 申请司机id * @return * @throws Exception */ @Override public ResultUtil saveData(Reassign reassign, Integer uid, Integer type,Integer driverId) throws Exception { type = null == type ? 2 : type;//现目前微信只支持小程序支付 String content = reassign.getRemark(); if (ToolUtil.isNotEmpty(content)) { List sensitiveWords = sensitiveWordsMapper.selectList(null); for (SensitiveWords s : sensitiveWords) { content = content.replaceAll(s.getContent(), "***"); } } reassign.setRemark(content); ResultUtil resultUtil = ResultUtil.success(); Driver driver = driverService.selectById(uid); // TODO: 2020/11/12 司机端不控制重复提交(如果重复提交且未支付,直接将之前的数据删除) // Reassign query = reassignMapper.query(uid, null, null, null, 1); // if(null != query){ // return ResultUtil.error("有未完成支付的改派申请"); // } int types = 1; Reassign query = reassignMapper.query(uid, null, reassign.getOrderId(), reassign.getOrderType(), 1); if (isActiveReassign(query)) { types = 2; // return ResultUtil.error("不能重复提交申请"); reassignMapper.deleteById(query.getId()); } query = reassignMapper.query(uid, null, reassign.getOrderId(), reassign.getOrderType(), 2); if (isActiveReassign(query)) { types = 2; // return ResultUtil.error("您提交的申请正在处理中"); } //获取支付金额 Double aDouble = orderService.queryReassignMoney(reassign.getOrderId(), reassign.getOrderType()); reassign.setMoney(aDouble); reassign.setOriginalDriverId(uid); reassign.setOriginalCarId(driver.getCarId()); reassign.setInsertTime(new Date()); if (types == 1) { this.insert(reassign); } // systemNoticeService.addSystemNotice(2, "您的改派申请已成功提交,我们会尽快为你处理!", uid, 1); //开始支付 if (null != reassign.getPayType()) { if (reassign.getPayType() == 1) {//微信支付 reassign.setState(1); if (ToolUtil.isEmpty(driver.getAppletsOpenId())) { return ResultUtil.errorOpenId("司机未绑定微信小程序openid,无法发起微信支付"); } String outTradeNo = buildCbyzxReassignOutTradeNo(reassign.getId(), reassign.getOrderType()); JSONObject response = cbyzxOrderPayHelper.createOrder(uid, driver.getAppletsOpenId(), outTradeNo, aDouble); if (!cbyzxOrderPayHelper.isCreateSuccess(response)) { return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response); } resultUtil = ResultUtil.success(response); paymentRecordService.saveData(1, uid, 2, reassign.getOrderId(), reassign.getOrderType(), 1, aDouble, outTradeNo, 1);//添加预支付数据 } if (reassign.getPayType() == 2) {//支付宝 reassign.setState(1); resultUtil = payMoneyUtil.alipay("改派订单", "改派订单", "", reassign.getId() + "_" + reassign.getOrderType() + "_" + UUIDUtil.getRandomCode(5), "0", "/base/aliReassign"); paymentRecordService.saveData(1, uid, 2, reassign.getOrderId(), reassign.getOrderType(), 2, 0.0, "", 1);//添加预支付数据 } if (reassign.getPayType() == 3) {//余额 reassign.setState(2); reassign.setPayTime(new Date()); reassignMapper.updateById(reassign); Double balance = driver.getBalance(); Double laveBusinessMoney = driver.getLaveBusinessMoney(); Double laveActivityMoney = driver.getLaveActivityMoney(); if (null == balance || balance < aDouble) { throw new SystemException("账户余额不足"); } if (null != laveBusinessMoney && laveBusinessMoney.compareTo(aDouble) >= 0) { driver.setLaveBusinessMoney(new BigDecimal(laveBusinessMoney).subtract(new BigDecimal(aDouble)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); } else if (null != laveActivityMoney && laveActivityMoney.compareTo(aDouble) >= 0) { driver.setLaveActivityMoney(new BigDecimal(laveActivityMoney).subtract(new BigDecimal(aDouble)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); } driver.setBalance(new BigDecimal(balance).subtract(new BigDecimal(aDouble)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driverService.updateById(driver); // 添加交易明细 transactionDetailsService.saveData(uid, "司机改派支付", aDouble, 2, 1, 2, reassign.getOrderType(), reassign.getOrderId()); //修改改派通知状态 switch (reassign.getOrderType()) { case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(reassign.getOrderId()); orderPrivateCar.setOldState(orderPrivateCar.getState()); orderPrivateCar.setState(11); orderPrivateCar.setReassignNotice(2); orderPrivateCar.setIsReassign(2); orderPrivateCarService.updateById(orderPrivateCar); //添加已收入明细 // incomeService.saveData(1, orderPrivateCar.getCompanyId(), 4, orderPrivateCar.getId(), 1, reassign.getMoney()); // qyt 改派直接推送 pushOrderPrivate(orderPrivateCar, uid, types); break; case 2: OrderTaxi orderTaxi = orderTaxiService.selectById(reassign.getOrderId()); orderTaxi.setOldState(orderTaxi.getState()); orderTaxi.setState(11); orderTaxi.setReassignNotice(2); orderTaxi.setIsReassign(2); orderTaxiService.updateById(orderTaxi); //添加已收入明细 // incomeService.saveData(1, orderTaxi.getCompanyId(), 4, orderTaxi.getId(), 2, reassign.getMoney()); // qyt 改派直接推送 pushOrderTaxi(orderTaxi, uid, types); break; case 3: OrderCrossCity orderCrossCity = orderCrossCityService.selectById(reassign.getOrderId()); orderCrossCity.setOldState(orderCrossCity.getState()); orderCrossCity.setIsReassign(2); orderCrossCity.setReassignNotice(2); if(driverId==null){ orderCrossCity.setState(11); }else { orderCrossCity.setDriverId(driverId); } orderCrossCityService.updateById(orderCrossCity); //添加已收入明细 incomeService.saveData(1, orderCrossCity.getCompanyId(), 4, orderCrossCity.getId(), 3, reassign.getMoney()); // 推送用户消息 pushUtil.pushOrderReassign(orderCrossCity.getUserId(), 1, orderCrossCity.getId(), 3); // 推送司机消息 pushUtil.pushOrderReassign(orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3); case 4: OrderLogistics orderLogistics = orderLogisticsService.selectById(reassign.getOrderId()); orderLogistics.setOldState(orderLogistics.getState()); orderLogistics.setState(11); orderLogistics.setReassignNotice(2); orderLogistics.setIsReassign(2); orderLogisticsService.updateById(orderLogistics); //添加已收入明细 incomeService.saveData(1, orderLogistics.getCompanyId(), 4, orderLogistics.getId(), orderLogistics.getType(), reassign.getMoney()); break; case 5: OrderLogistics orderLogistics1 = orderLogisticsService.selectById(reassign.getOrderId()); orderLogistics1.setOldState(orderLogistics1.getState()); orderLogistics1.setState(11); orderLogistics1.setReassignNotice(2); orderLogistics1.setIsReassign(2); orderLogisticsService.updateById(orderLogistics1); //添加已收入明细 incomeService.saveData(1, orderLogistics1.getCompanyId(), 4, orderLogistics1.getId(), orderLogistics1.getType(), reassign.getMoney()); break; } systemNoticeService.addSystemNotice(2, "您已使用余额成功支付改派申请费用!", uid, 1); //开始推送调度单 Map map = new HashMap<>(); map.put("orderId", reassign.getOrderId().toString()); map.put("orderType", reassign.getOrderType().toString()); // List dispatches = dispatchMapper.queryDispatchs(driver.getFranchiseeId() == null ? driver.getCompanyId() : driver.getFranchiseeId(), 1); // for(Dispatch dispatch : dispatches){ // jgPushUtil.push(2,"有新的改派订单需要处理,请及时处理!", "订单改派", map, "DISPATCH" + dispatch.getId()); // } } // if (reassign.getPayType() == 4) { // // TODO 司机云闪付 改派调起云闪付 // Double payMoney = reassign.getMoney(); // paymentRecordService.saveData(1, uid, 2, reassign.getOrderId(), reassign.getOrderType(), 4, aDouble, "", 1);//添加预支付数据 // resultUtil = placeAnOrder(new BigDecimal(payMoney), 4, 1, reassign.getId()); // } } return resultUtil; } @Override public ResultUtil saveDataCancel(Reassign reassign, Integer uid, Integer type) throws Exception { Driver driver = driverService.selectById(uid); //修改改派通知状态 switch (reassign.getOrderType()) { case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(reassign.getOrderId()); if (orderPrivateCar.getState() == 10) { return ResultUtil.error("订单已取消"); } orderPrivateCar.setState(orderPrivateCar.getOldState()); orderPrivateCar.setReassignNotice(0); orderPrivateCarService.updateById(orderPrivateCar); break; case 2: OrderTaxi orderTaxi = orderTaxiService.selectById(reassign.getOrderId()); if (orderTaxi.getState() == 10) { return ResultUtil.error("订单已取消"); } orderTaxi.setState(orderTaxi.getOldState()); orderTaxi.setReassignNotice(0); orderTaxiService.updateById(orderTaxi); break; } reassignMapper.delete(new EntityWrapper().eq("orderId", reassign.getOrderId()).eq("orderType", reassign.getOrderType())); return ResultUtil.success(); } private ResultUtil placeAnOrder(BigDecimal amount, Integer type, Integer orderType, Integer reassignId) throws Exception { Reassign reassign = reassignMapper.selectById(reassignId); String merOrderId = Util.getMerOrderId(qrCodeConfiguration.getMsgSrcId()); reassign.setBillNo(merOrderId + "0"); reassignMapper.updateById(reassign); JSONObject json = new JSONObject(); json.put("requestTimestamp", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss")); // 报文请求时间 json.put("merOrderId", merOrderId); // 商户订单号 json.put("mid", qrCodeConfiguration.getMid()); // 商户号 json.put("tid", qrCodeConfiguration.getTid()); // 终端号 json.put("instMid", qrCodeConfiguration.getInstMid()); // 业务类型 json.put("totalAmount", amount.multiply(new BigDecimal("100")).intValue()); // 支付总金额 json.put("orderDesc", "APP下单"); // 订单描述 json.put("srcReserve", reassignId + "_" + orderType + "_" + UUIDUtil.getRandomCode(5) + "-" + orderType + "-" + type); // 预留字段 json.put("subAppId", "wxasdasdasdasdads"); json.put("notifyUrl", "https://zhentonggongsi.com:443/driver/api/placeOrder/notifyUrl"); json.put("tradeType", "APP"); // 交易类型,微信必传 // json.put("divisionFlag", true); // 分账标记 // json.put("platformAmount", 0); // 平台商户分账金额 // ArrayList subOrders = new ArrayList<>(); // JSONObject jsonObject = new JSONObject(); // jsonObject.put("mid", "988460101800201"); // jsonObject.put("totalAmount", 1); // subOrders.add(jsonObject); // json.put("subOrders", subOrders); System.err.println("请求报文json:\n" + json); String url; if (1 == type) { // url = "https://test-api-open.chinaums.com/v1/netpay/wx/app-pre-order";// 测试 url = "https://api-mop.chinaums.com/v1/netpay/wx/app-pre-order"; } else if (2 == type) { // url = "https://test-api-open.chinaums.com/v1/netpay/trade/precreate";// 测试 url = "https://api-mop.chinaums.com/v1/netpay/trade/precreate"; } else { // url = "https://test-api-open.chinaums.com/v1/netpay/uac/app-order";// 测试 url = "https://api-mop.chinaums.com/v1/netpay/uac/app-order"; } //OPEN-BODY-SIG 方式 String result = GetOpenBodySig.sendOpenBodySig(qrCodeConfiguration.getAppId(), qrCodeConfiguration.getAppKey(), 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); } /** * 跨城订单改派 * @param amount * @param type * @param orderType * @param reassignId * @return * @throws Exception */ private ResultUtil placeAnOrder1(BigDecimal amount, Integer type, Integer orderType, Integer reassignId) throws Exception { Reassign reassign = reassignMapper.selectById(reassignId); String merOrderId = Util.getMerOrderId(qrCodeConfiguration.getMsgSrcId()); reassign.setBillNo(merOrderId + "0"); reassignMapper.updateById(reassign); JSONObject json = new JSONObject(); json.put("requestTimestamp", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss")); // 报文请求时间 json.put("merOrderId", merOrderId); // 商户订单号 json.put("mid", qrCodeConfiguration.getMid()); // 商户号 json.put("tid", qrCodeConfiguration.getTid()); // 终端号 json.put("instMid", qrCodeConfiguration.getInstMid()); // 业务类型 json.put("totalAmount", amount.multiply(new BigDecimal("100")).intValue()); // 支付总金额 json.put("orderDesc", "APP下单"); // 订单描述 json.put("srcReserve", reassignId + "_" + orderType + "_" + UUIDUtil.getRandomCode(5) + "-" + 1 + "-" + type); // 预留字段 json.put("subAppId", "wxasdasdasdasdads"); json.put("notifyUrl", "https://zhentonggongsi.com:443/driver/api/placeOrder/notifyUrl"); json.put("tradeType", "APP"); // 交易类型,微信必传 // json.put("divisionFlag", true); // 分账标记 // json.put("platformAmount", 0); // 平台商户分账金额 // ArrayList subOrders = new ArrayList<>(); // JSONObject jsonObject = new JSONObject(); // jsonObject.put("mid", "988460101800201"); // jsonObject.put("totalAmount", 1); // subOrders.add(jsonObject); // json.put("subOrders", subOrders); System.err.println("请求报文json:\n" + json); String url; if (1 == type) { // url = "https://test-api-open.chinaums.com/v1/netpay/wx/app-pre-order";// 测试 url = "https://api-mop.chinaums.com/v1/netpay/wx/app-pre-order"; } else if (2 == type) { // url = "https://test-api-open.chinaums.com/v1/netpay/trade/precreate";// 测试 url = "https://api-mop.chinaums.com/v1/netpay/trade/precreate"; } else { // url = "https://test-api-open.chinaums.com/v1/netpay/uac/app-order";// 测试 url = "https://api-mop.chinaums.com/v1/netpay/uac/app-order"; } //OPEN-BODY-SIG 方式 String result = GetOpenBodySig.sendOpenBodySig(qrCodeConfiguration.getAppId(), qrCodeConfiguration.getAppKey(), 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); } /** * 提交改派申请(跨城专用) * @param uid 申请司机id * @return * @throws Exception */ @Override public ResultUtil saveData_(Reassign reassign, String orderIds, Integer uid, Integer type) throws Exception { type = null == type ? 2 : type;//现目前微信只支持小程序支付 String content = reassign.getRemark(); if (ToolUtil.isNotEmpty(content)) { List sensitiveWords = sensitiveWordsMapper.selectList(null); for (SensitiveWords s : sensitiveWords) { content = content.replaceAll(s.getContent(), "***"); } } reassign.setRemark(content); ResultUtil resultUtil = ResultUtil.success(); Driver driver = driverService.selectById(uid); // TODO: 2020/11/12 司机端不控制重复提交(如果重复提交且未支付,直接将之前的数据删除) // Reassign query = reassignMapper.query(uid, null, null, null, 1); // if(null != query){ // return ResultUtil.error("有未完成支付的改派申请"); // } String[] split = orderIds.split(",");//获取支付金额 // 跨城改派:如果指定了司机,不收改派费用 Double aDouble; if (isAssignedReassignTarget(reassign.getNowDriverId())) { aDouble = 0.0; // 指定司机,免费 } else { aDouble = orderService.queryReassignMoney(Integer.valueOf(split[0]), 3); } Double totalMoney = aDouble * split.length; String ids = ""; Integer requestTargetId = reassign.getNowDriverId(); List currentReassignList = new ArrayList<>(); for (String id : split) { Reassign query = reassignMapper.query(uid, null, Integer.valueOf(id), 3, 1); if (isActiveReassign(query)) { // return ResultUtil.error("不能重复提交申请"); reassignMapper.deleteById(query.getId()); } query = reassignMapper.query(uid, null, Integer.valueOf(id), 3, 2); if (isActiveReassign(query)) { return ResultUtil.error("您提交的申请正在处理中"); } reassign.setMoney(aDouble); reassign.setOrderId(Integer.valueOf(id)); reassign.setOrderType(3); reassign.setOriginalDriverId(uid); reassign.setOriginalCarId(driver.getCarId()); reassign.setInsertTime(new Date()); reassign.setState(1); reassign.setNowDriverId(requestTargetId); reassign.setNeedConfirm(null); reassign.setConfirmStatus(null); reassign.setConfirmTime(null); reassign.setExpireTime(null); reassign.setTempLineShiftDriverId(null); // 设置是否需要确认相关字段 if (isAssignedReassignTarget(requestTargetId)) { OrderCrossCity orderCrossCity = orderCrossCityService.selectById(Integer.valueOf(id)); boolean needConfirm = checkIfNeedConfirm(requestTargetId, orderCrossCity); reassign.setNeedConfirm(needConfirm ? 2 : 1); if (needConfirm) { reassign.setNowDriverId(resolveConfirmDriverId(requestTargetId)); // 需要确认:设置超时时间 reassign.setConfirmStatus(1); // 待确认 Date expireTime = new Date(System.currentTimeMillis() + 60000); // 60秒后 reassign.setExpireTime(expireTime); } else { reassign.setNowDriverId(requestTargetId); // 不需要确认 reassign.setConfirmStatus(2); // 直接同意 } } else { // 未指定司机,由调度分配 reassign.setNeedConfirm(1); } this.insert(reassign); currentReassignList.add(this.selectById(reassign.getId())); ids += reassign.getId() + ","; } ids = ids.substring(0, ids.length() - 1); systemNoticeService.addSystemNotice(2, "您的改派申请已成功提交,我们会尽快为你处理!", uid, 1); if (isAssignedReassignTarget(requestTargetId)) { processFreeAssignedCrossCityReassign(split, currentReassignList, reassign); return ResultUtil.success(); } //开始支付 if (null != reassign.getPayType()) { if (reassign.getPayType() == 1) {//微信支付 String[] split1 = ids.split(","); if (ToolUtil.isEmpty(driver.getAppletsOpenId())) { return ResultUtil.errorOpenId("司机未绑定微信小程序openid,无法发起微信支付"); } String outTradeNo = buildCbyzxBatchReassignOutTradeNo(ids); JSONObject response = cbyzxOrderPayHelper.createOrder(uid, driver.getAppletsOpenId(), outTradeNo, totalMoney); if (!cbyzxOrderPayHelper.isCreateSuccess(response)) { return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response); } resultUtil = ResultUtil.success(response); for (String id : split1) { paymentRecordService.saveData(1, uid, 2, Integer.valueOf(id), 3, 1, aDouble, outTradeNo, 1);//添加预支付数据 } } if (reassign.getPayType() == 2) {//支付宝 String[] split1 = ids.split(","); resultUtil = payMoneyUtil.alipay("改派订单", "改派订单", "", ids + "_3_" + UUIDUtil.getRandomCode(5), totalMoney.toString(), "/base/aliReassign"); for (String id : split1) { paymentRecordService.saveData(1, uid, 2, Integer.valueOf(id), 3, 2, aDouble, "", 1);//添加预支付数据 } } if (reassign.getPayType() == 3) {//余额 for (String id : split) { Reassign query = reassignMapper.query(uid, null, Integer.valueOf(id), 3, 1); query.setState(2); if (reassign.getNowDriverId() != null) { query.setState(3); } query.setPayTime(new Date()); reassignMapper.updateById(query); //添加交易明细 transactionDetailsService.saveData(uid, "司机改派支付", aDouble, 2, 1, 2, 3, Integer.valueOf(id)); } Double balance = driver.getBalance(); Double laveBusinessMoney = driver.getLaveBusinessMoney(); Double laveActivityMoney = driver.getLaveActivityMoney(); if (null == balance || balance < totalMoney) { throw new SystemException("账户余额不足"); } if (null != laveBusinessMoney && laveBusinessMoney.compareTo(totalMoney) >= 0) { driver.setLaveBusinessMoney(new BigDecimal(laveBusinessMoney).subtract(new BigDecimal(totalMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); } else if (null != laveActivityMoney && laveActivityMoney.compareTo(totalMoney) >= 0) { driver.setLaveActivityMoney(new BigDecimal(laveActivityMoney).subtract(new BigDecimal(totalMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); } driver.setBalance(new BigDecimal(balance).subtract(new BigDecimal(totalMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driverService.updateById(driver); //修改改派通知状态 boolean needConfirmPush = false; // 标记是否需要发送确认推送 OrderCrossCity firstOrder = null; // 保存第一个订单用于发送推送 Reassign firstConfirmReassign = null; // 保存第一条待确认改派记录 int totalPeopleNumber = 0; // 累计总人数 List orderIdList = new ArrayList<>(); // 收集所有订单ID List reassignIdList = new ArrayList<>(); // 收集所有改派记录ID for (String id : split) { OrderCrossCity orderCrossCity = orderCrossCityService.selectById(id); orderCrossCity.setOldState(orderCrossCity.getState()); // 查询改派记录 Reassign reassignRecord = reassignMapper.query(uid, null, Integer.valueOf(id), 3, 1, 2, 3); if (reassignRecord != null) { reassignIdList.add(String.valueOf(reassignRecord.getId())); } // 累加人数 if (orderCrossCity.getPeopleNumber() != null) { totalPeopleNumber += orderCrossCity.getPeopleNumber(); } orderIdList.add(id); if(reassignRecord == null || reassignRecord.getNowDriverId()==null){ System.out.println("跨城改派确认Socket未触发: reassignRecord为空或未指定司机, orderId=" + id); orderCrossCity.setState(11); }else { boolean needConfirm = reassignRecord.getNeedConfirm() != null && reassignRecord.getNeedConfirm() == 2; System.out.println("跨城改派余额支付确认判断: orderId=" + id + ", reassignId=" + reassignRecord.getId() + ", nowDriverId=" + reassignRecord.getNowDriverId() + ", needConfirm=" + reassignRecord.getNeedConfirm() + ", confirmStatus=" + reassignRecord.getConfirmStatus() + ", state=" + reassignRecord.getState()); if (needConfirm) { // 需要确认:标记需要发送推送,但不立即发送 orderCrossCity.setState(11); // 改派中状态 needConfirmPush = true; if (firstConfirmReassign == null) { firstConfirmReassign = reassignRecord; } if (firstOrder == null) { firstOrder = orderCrossCity; // 保存第一个订单 } } else { // 不需要确认:直接改派 driverReassignSelf(reassignRecord, orderCrossCity); // 只有无需确认时才推送乘客和司机信息 try { // 推送用户消息 pushUtil.pushOrderReassign(orderCrossCity.getUserId(), 1, orderCrossCity.getId(), 3); // 推送司机消息 pushUtil.pushOrderReassign(orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3); } catch (Exception ignore) { } } } orderCrossCity.setReassignNotice(2); orderCrossCity.setIsReassign(2); orderCrossCityService.updateById(orderCrossCity); //添加已收入明细 incomeService.saveData(1, orderCrossCity.getCompanyId(), 4, orderCrossCity.getId(), 3, reassign.getMoney()); } // 所有订单处理完后,只发送一次确认推送 if (needConfirmPush && firstOrder != null && firstConfirmReassign != null) { System.out.println("准备发送跨城改派确认Socket(余额支付): driverId=" + firstConfirmReassign.getNowDriverId() + ", reassignIds=" + String.join(",", reassignIdList) + ", orderIds=" + String.join(",", orderIdList)); sendReassignConfirmPush(firstConfirmReassign.getNowDriverId(), firstConfirmReassign, firstOrder, totalPeopleNumber, orderIdList, reassignIdList); } else { System.out.println("跨城改派确认Socket未发送(余额支付): needConfirmPush=" + needConfirmPush + ", firstOrder=" + (firstOrder == null ? "null" : firstOrder.getId()) + ", firstConfirmReassign=" + (firstConfirmReassign == null ? "null" : firstConfirmReassign.getId())); } systemNoticeService.addSystemNotice(2, "您已使用余额成功支付改派申请费用!", uid, 1); //开始推送调度单 // Map map = new HashMap<>(); // map.put("orderId", reassign.getOrderId().toString()); // map.put("orderType", reassign.getOrderType().toString()); // List dispatches = dispatchMapper.queryDispatchs(driver.getFranchiseeId() == null ? driver.getCompanyId() : driver.getFranchiseeId(), 1); // for (Dispatch dispatch : dispatches) { // jgPushUtil.push(2, "有新的改派订单需要处理,请及时处理!", "订单改派", map, "DISPATCH" + dispatch.getId()); // } } // if (reassign.getPayType() == 4) { // // String[] split1 = ids.split(","); // resultUtil = placeAnOrder1(new BigDecimal(aDouble), 4, 3, Integer.valueOf(split1[0])); // for (String id : split1) { // TODO 司机云闪付 跨城改派调起云闪付 // paymentRecordService.saveData(1, uid, 2, Integer.valueOf(id), 3, 4, aDouble, "", 1);//添加预支付数据 // } // } } return resultUtil; } /** * 获取列表数据 * @param uid * @param pageNum * @param size * @return * @throws Exception */ @Override public List> queryList(Integer uid, Integer pageNum, Integer size) throws Exception { pageNum = (pageNum - 1) * size; return reassignMapper.queryList(uid, pageNum, size); } /** * 创博优单条改派支付单号,保留原有 reassignId_orderType 结构用于回调复用旧逻辑。 */ private String buildCbyzxReassignOutTradeNo(Integer reassignId, Integer orderType) throws Exception { return "reassign_" + reassignId + "_" + orderType + "_" + UUIDUtil.getRandomCode(5); } /** * 创博优批量跨城改派支付单号,使用前缀避免与跨城完成订单支付冲突。 */ private String buildCbyzxBatchReassignOutTradeNo(String reassignIds) throws Exception { return "reassignBatch_" + reassignIds + "_3_" + UUIDUtil.getRandomCode(5); } public static List orderIds = new ArrayList<>(); @Resource private RedisTemplate redisTemplate; /** * 改派支付完成后的操作 * @param id 改派回调中的平台业务单号,格式仍按 reassignId_orderType_random 解析 * @param order_id 第三方支付流水号 * @param type 1=微信,2=支付宝,4=云闪付 * @throws Exception */ @Override public void payReassign(String id, String order_id, Integer type) throws Exception { System.out.println("改派支付完成后的操作"); String[] s = id.split("_"); if (Integer.valueOf(s[1]) == 3) {//跨城订单 System.out.println("跨城订单"); String[] split = s[0].split(","); List reassigns = this.selectBatchIds(Arrays.asList(split)); Driver driver = driverService.selectById(reassigns.get(0).getOriginalDriverId()); boolean batchHandled = false; for (String key : split) { PaymentRecord query = paymentRecordService.query(1, driver.getId(), 2, Integer.valueOf(key), 3, type, 1); if (null != query) { System.out.println("跨城订单开始"); //添加交易明细 transactionDetailsService.saveData(reassigns.get(0).getOriginalDriverId(), "司机改派支付", reassigns.get(0).getMoney(), 2, 1, 2, 3, Integer.valueOf(key)); System.out.println("==============添加交易明细完毕==================="); for (Reassign reassign : reassigns) { reassign.setState(2); reassign.setPayOrder(order_id); reassign.setPayTime(new Date()); this.updateById(reassign); // //开始推送调度单 // Map map = new HashMap<>(); // map.put("orderId", reassign.getOrderId().toString()); // map.put("orderType", reassign.getOrderType().toString()); // List dispatches = dispatchMapper.queryDispatchs(driver.getFranchiseeId() == null ? driver.getCompanyId() : driver.getFranchiseeId(), 1); // for (Dispatch dispatch : dispatches) { // jgPushUtil.push(2, "有新的改派订单需要处理,请及时处理!", "订单改派", map, "DISPATCH" + dispatch.getId()); // } } query.setState(2); if (reassigns.get(0).getNowDriverId() != null) { query.setState(3); } query.setCode(order_id); paymentRecordService.updateById(query); System.out.println("==============paymentRecord完毕===================" + query); if (batchHandled) { continue; } batchHandled = true; //修改改派通知状态 boolean needConfirmPush = false; OrderCrossCity firstOrder = null; Reassign firstConfirmReassign = null; int totalPeopleNumber = 0; List orderIdList = new ArrayList<>(); List reassignIdList = new ArrayList<>(); for (Reassign reassign : reassigns) { OrderCrossCity orderCrossCity1 = orderCrossCityService.selectById(reassign.getOrderId()); orderCrossCity1.setOldState(orderCrossCity1.getState()); if (orderCrossCity1.getPeopleNumber() != null) { totalPeopleNumber += orderCrossCity1.getPeopleNumber(); } orderIdList.add(String.valueOf(orderCrossCity1.getId())); reassignIdList.add(String.valueOf(reassign.getId())); if(reassign.getNowDriverId()==null){ System.out.println("跨城改派确认Socket未触发: 未指定司机, reassignId=" + reassign.getId() + ", orderId=" + reassign.getOrderId()); orderCrossCity1.setState(11); } else { boolean needConfirm = reassign.getNeedConfirm() != null ? reassign.getNeedConfirm() == 2 : checkIfNeedConfirm(reassign.getNowDriverId(), orderCrossCity1); System.out.println("跨城改派在线支付确认判断: orderId=" + reassign.getOrderId() + ", reassignId=" + reassign.getId() + ", nowDriverId=" + reassign.getNowDriverId() + ", needConfirm=" + reassign.getNeedConfirm() + ", confirmStatus=" + reassign.getConfirmStatus() + ", state=" + reassign.getState() + ", needConfirmResult=" + needConfirm); if (needConfirm) { if (reassign.getNeedConfirm() == null) { reassign.setNowDriverId(resolveConfirmDriverId(reassign.getNowDriverId())); } ensureReassignConfirmTimeout(reassign); reassign.setState(3); this.updateById(reassign); orderCrossCity1.setState(11); needConfirmPush = true; if (firstConfirmReassign == null) { firstConfirmReassign = reassign; } if (firstOrder == null) { firstOrder = orderCrossCity1; } } else { // reassign.getNowDriverId() 是 lineShiftDriverId driverReassignSelf(reassign, orderCrossCity1); } } orderCrossCity1.setReassignNotice(2); orderCrossCity1.setIsReassign(2); orderCrossCityService.updateById(orderCrossCity1); System.out.println("==============跨城修改改派通知状态完毕===================" + orderCrossCity1); //添加已收入明细 incomeService.saveData(1, orderCrossCity1.getCompanyId(), 4, orderCrossCity1.getId(), 3, reassign.getMoney()); if(reassign.getNowDriverId()!=null){ if (reassign.getNeedConfirm() == null || reassign.getNeedConfirm().intValue() != 2) { // 推送用户消息 pushUtil.pushOrderReassign(orderCrossCity1.getUserId(), 1, orderCrossCity1.getId(), 3); // 推送司机消息 pushUtil.pushOrderReassign(orderCrossCity1.getDriverId(), 2, orderCrossCity1.getId(), 3); } } } if (needConfirmPush && firstOrder != null && firstConfirmReassign != null) { System.out.println("准备发送跨城改派确认Socket(在线支付): driverId=" + firstConfirmReassign.getNowDriverId() + ", reassignIds=" + String.join(",", reassignIdList) + ", orderIds=" + String.join(",", orderIdList)); sendReassignConfirmPush(firstConfirmReassign.getNowDriverId(), firstConfirmReassign, firstOrder, totalPeopleNumber, orderIdList, reassignIdList); } else { System.out.println("跨城改派确认Socket未发送(在线支付): needConfirmPush=" + needConfirmPush + ", firstOrder=" + (firstOrder == null ? "null" : firstOrder.getId()) + ", firstConfirmReassign=" + (firstConfirmReassign == null ? "null" : firstConfirmReassign.getId())); } systemNoticeService.addSystemNotice(2, "您已使用" + (type == 1 ? "微信" : (type == 2 ? "支付宝" : "云闪付")) + "成功支付改派申请费用!", reassigns.get(0).getOriginalDriverId(), 1); System.out.println("==============跨城修改改派通知状态完毕==================="); // qyt 新增改派 重新推送 } else { System.err.println("预支付数据异常(orderId = " + id + ")"); } } } else {//其他订单 System.out.println("其他订单"); Reassign reassign = this.selectById(s[0]); Driver driver = driverService.selectById(reassign.getOriginalDriverId()); PaymentRecord query = paymentRecordService.query(1, driver.getId(), 2, reassign.getOrderId(), reassign.getOrderType(), type, 1); System.out.println("==============paymentRecord查询===================" + query); if (null != query) { //添加交易明细 transactionDetailsService.saveData(reassign.getOriginalDriverId(), "司机改派支付", reassign.getMoney(), 2, 1, 2, reassign.getOrderType(), reassign.getOrderId()); reassign.setState(2); reassign.setPayOrder(order_id); reassign.setPayTime(new Date()); this.updateById(reassign); query.setState(2); query.setCode(order_id); paymentRecordService.updateById(query); System.out.println("==============paymentRecord完毕===================" + query); //修改改派通知状态 switch (reassign.getOrderType()) { case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(reassign.getOrderId()); orderPrivateCar.setOldState(orderPrivateCar.getState()); orderPrivateCar.setState(11); orderPrivateCar.setReassignNotice(2); orderPrivateCar.setIsReassign(2); orderPrivateCarService.updateById(orderPrivateCar); //添加已收入明细 incomeService.saveData(1, orderPrivateCar.getCompanyId(), 4, orderPrivateCar.getId(), 1, reassign.getMoney()); System.out.println("==============快车完毕===================" + orderPrivateCar); break; case 2: OrderTaxi orderTaxi = orderTaxiService.selectById(reassign.getOrderId()); orderTaxi.setOldState(orderTaxi.getState()); orderTaxi.setState(11); orderTaxi.setReassignNotice(2); orderTaxi.setIsReassign(2); orderTaxiService.updateById(orderTaxi); //添加已收入明细 incomeService.saveData(1, orderTaxi.getCompanyId(), 4, orderTaxi.getId(), 2, reassign.getMoney()); System.out.println("==============出租车完毕===================" + orderTaxi); break; case 4: OrderLogistics orderLogistics = orderLogisticsService.selectById(reassign.getOrderId()); orderLogistics.setOldState(orderLogistics.getState()); orderLogistics.setState(11); orderLogistics.setReassignNotice(2); orderLogistics.setIsReassign(2); orderLogisticsService.updateById(orderLogistics); //添加已收入明细 incomeService.saveData(1, orderLogistics.getCompanyId(), 4, orderLogistics.getId(), 4, reassign.getMoney()); System.out.println("==============物流订单完毕1===================" + orderLogistics); break; case 5: OrderLogistics orderLogistics1 = orderLogisticsService.selectById(reassign.getOrderId()); orderLogistics1.setOldState(orderLogistics1.getState()); orderLogistics1.setState(11); orderLogistics1.setReassignNotice(2); orderLogistics1.setIsReassign(2); orderLogisticsService.updateById(orderLogistics1); //添加已收入明细 incomeService.saveData(1, orderLogistics1.getCompanyId(), 4, orderLogistics1.getId(), 5, reassign.getMoney()); System.out.println("==============物流订单完毕2===================" + orderLogistics1); break; } systemNoticeService.addSystemNotice(2, "您已使用" + (type == 1 ? "微信" : (type == 2 ? "支付宝" : "云闪付")) + "成功支付改派申请费用!", reassign.getOriginalDriverId(), 1); // //开始推送调度单 // Map map = new HashMap<>(); // map.put("orderId", reassign.getOrderId().toString()); // map.put("orderType", reassign.getOrderType().toString()); // List dispatches = dispatchMapper.queryDispatchs(driver.getFranchiseeId() == null ? driver.getCompanyId() : driver.getFranchiseeId(), 1); // for (Dispatch dispatch : dispatches) { // jgPushUtil.push(2, "有新的改派订单需要处理,请及时处理!", "订单改派", map, "DISPATCH" + dispatch.getId()); // } System.out.println("==============其他订单完毕==================="); } else { System.err.println("预支付数据异常(orderId = " + id + ")"); } } } private void driverReassignSelf(Reassign reassign, OrderCrossCity orderCrossCity1) { driverReassignSelf(reassign, orderCrossCity1, null); } private void driverReassignSelf(Reassign reassign, OrderCrossCity orderCrossCity1, Integer peopleNumberOverride) { // 交换人数 交换座位 Integer oldLineShiftDriverId = orderCrossCity1.getLineShiftDriverId(); LineShiftDriver oldLineShiftDriver = lineShiftDriverMapper.selectById(oldLineShiftDriverId); LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(reassign.getNowDriverId()); orderCrossCity1.setDriverId(lineShiftDriver.getDriverId()); orderCrossCity1.setLineShiftDriverId(reassign.getNowDriverId()); Driver driver1 = driverService.selectById(lineShiftDriver.getDriverId()); orderCrossCity1.setCarId(driver1.getCarId()); Integer peopleNumber = peopleNumberOverride == null ? orderCrossCity1.getPeopleNumber() : peopleNumberOverride; oldLineShiftDriver.setLaveSeat(oldLineShiftDriver.getLaveSeat() + peopleNumber); lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() - peopleNumber); String laveSeatNumber = Arrays.stream(lineShiftDriver.getLaveSeatNumber().split(",")).skip(peopleNumber).collect(Collectors.joining(",")); Set oldLaveSeatSet = Arrays.stream(oldLineShiftDriver.getLaveSeatNumber().split(",")).collect(Collectors.toSet()); for (int i = 1; i <= 6; i++) { oldLaveSeatSet.add(String.valueOf(i)); if (oldLaveSeatSet.size() == oldLineShiftDriver.getLaveSeat()) { break; } } String oldLaveSeatNumber = oldLaveSeatSet.stream().sorted().collect(Collectors.joining(",")); oldLineShiftDriver.setLaveSeatNumber(oldLaveSeatNumber); lineShiftDriver.setLaveSeatNumber(laveSeatNumber); lineShiftDriverMapper.updateById(oldLineShiftDriver); lineShiftDriverMapper.updateById(lineShiftDriver); } private void processFreeAssignedCrossCityReassign(String[] orderIds, List currentReassignList, Reassign requestReassign) throws Exception { Map currentReassignMap = new HashMap<>(); for (Reassign currentReassign : currentReassignList) { if (currentReassign == null || currentReassign.getOrderId() == null) { continue; } currentReassign.setState(currentReassign.getNowDriverId() != null ? 3 : 2); currentReassign.setPayTime(new Date()); reassignMapper.updateById(currentReassign); currentReassignMap.put(currentReassign.getOrderId(), currentReassign); } boolean needConfirmPush = false; OrderCrossCity firstOrder = null; Reassign firstConfirmReassign = null; int totalPeopleNumber = 0; List orderIdList = new ArrayList<>(); List reassignIdList = new ArrayList<>(); for (String id : orderIds) { OrderCrossCity orderCrossCity = orderCrossCityService.selectById(id); if (orderCrossCity == null) { continue; } orderCrossCity.setOldState(orderCrossCity.getState()); Reassign reassignRecord = currentReassignMap.get(Integer.valueOf(id)); if (reassignRecord != null) { reassignIdList.add(String.valueOf(reassignRecord.getId())); } if (orderCrossCity.getPeopleNumber() != null) { totalPeopleNumber += orderCrossCity.getPeopleNumber(); } orderIdList.add(id); if (reassignRecord == null || reassignRecord.getNowDriverId() == null) { orderCrossCity.setState(11); } else { boolean needConfirm = reassignRecord.getNeedConfirm() != null && reassignRecord.getNeedConfirm() == 2; System.out.println("跨城指定司机免费改派确认判断: orderId=" + id + ", reassignId=" + reassignRecord.getId() + ", nowDriverId=" + reassignRecord.getNowDriverId() + ", needConfirm=" + reassignRecord.getNeedConfirm() + ", confirmStatus=" + reassignRecord.getConfirmStatus() + ", state=" + reassignRecord.getState()); if (needConfirm) { orderCrossCity.setState(11); needConfirmPush = true; if (firstConfirmReassign == null) { firstConfirmReassign = reassignRecord; } if (firstOrder == null) { firstOrder = orderCrossCity; } } else { driverReassignSelf(reassignRecord, orderCrossCity); try { pushUtil.pushOrderReassign(orderCrossCity.getUserId(), 1, orderCrossCity.getId(), 3); pushUtil.pushOrderReassign(orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3); } catch (Exception ignore) { } } } orderCrossCity.setReassignNotice(2); orderCrossCity.setIsReassign(2); orderCrossCityService.updateById(orderCrossCity); incomeService.saveData(1, orderCrossCity.getCompanyId(), 4, orderCrossCity.getId(), 3, requestReassign.getMoney()); } if (needConfirmPush && firstOrder != null && firstConfirmReassign != null) { System.out.println("准备发送跨城改派确认Socket(指定司机免费): driverId=" + firstConfirmReassign.getNowDriverId() + ", reassignIds=" + String.join(",", reassignIdList) + ", orderIds=" + String.join(",", orderIdList)); sendReassignConfirmPush(firstConfirmReassign.getNowDriverId(), firstConfirmReassign, firstOrder, totalPeopleNumber, orderIdList, reassignIdList); } else { System.out.println("跨城改派确认Socket未发送(指定司机免费): needConfirmPush=" + needConfirmPush + ", firstOrder=" + (firstOrder == null ? "null" : firstOrder.getId()) + ", firstConfirmReassign=" + (firstConfirmReassign == null ? "null" : firstConfirmReassign.getId())); } } private void ensureReassignConfirmTimeout(Reassign reassign) { reassign.setNeedConfirm(2); reassign.setConfirmStatus(1); if (reassign.getExpireTime() == null) { reassign.setExpireTime(new Date(System.currentTimeMillis() + 60000)); } } @Override @Transactional(rollbackFor = Exception.class) public void timeoutReassign(Reassign reassign) throws Exception { if (reassign == null) { return; } Reassign current = this.selectById(reassign.getId()); if (current == null || current.getConfirmStatus() == null || current.getConfirmStatus() != 1) { return; } current.setConfirmStatus(4); current.setState(5); current.setConfirmTime(new Date()); this.updateById(current); restoreCrossCityOrderAfterReassignEnd(current); } private void restoreCrossCityOrderAfterReassignEnd(Reassign reassign) { if (reassign == null || reassign.getOrderType() == null || reassign.getOrderType() != 3 || reassign.getOrderId() == null) { return; } OrderCrossCity order = orderCrossCityService.selectById(reassign.getOrderId()); if (order == null || order.getState() == null || order.getState() != 11) { return; } order.setState(order.getOldState() == null ? 2 : order.getOldState()); order.setReassignNotice(0); order.setIsReassign(1); orderCrossCityService.updateById(order); } private void restoreCrossCityOrderAfterReassignSuccess(OrderCrossCity order) { if (order == null || order.getState() == null || order.getState() != 11) { return; } order.setState(order.getOldState() == null ? 2 : order.getOldState()); order.setReassignNotice(0); order.setIsReassign(1); } @Override public List> queryDriver(String orderId) throws Exception { OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String day = sdf.format(new Date()); Calendar c = Calendar.getInstance(); c.setTime(new Date()); c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH), 0, 0, 0); c.set(Calendar.MILLISECOND, 0); List> list = new ArrayList<>(); // 1. 查询同批次同时间的司机(不需要确认) List> sameBatchDrivers = querySameBatchDrivers(orderCrossCity, sdf, day, c); for (Map driver : sameBatchDrivers) { driver.put("needConfirm", 1); // 不需要确认 } list.addAll(sameBatchDrivers); // 2. 查询其他同公司司机(需要确认) List> otherCompanyDrivers = queryOtherCompanyDrivers(orderCrossCity, day); for (Map driver : otherCompanyDrivers) { driver.put("needConfirm", 2); // 需要确认 } list.addAll(otherCompanyDrivers); return list; } /** * 查询同批次同时间的司机(原逻辑) */ private List> querySameBatchDrivers(OrderCrossCity orderCrossCity, SimpleDateFormat sdf, String day, Calendar c) throws Exception { List> list = new ArrayList<>(); List lineShifts = lineShiftMapper.getOtherDriverLineShift(orderCrossCity.getLineShiftDriverId()); List> s = lineSiteMapper.queryOtherDriver(orderCrossCity.getLineId(), sdf.parse(day), orderCrossCity.getDriverId()); Calendar calendar = Calendar.getInstance(); calendar.setTime(sdf.parse(day)); String vehicle = (String) redisTemplate.opsForValue().get("VEHICLE"); List integers = new ArrayList<>(); if (ToolUtil.isNotEmpty(vehicle)) { integers = JSON.parseArray(vehicle).toJavaList(Integer.class); } for (LineShift lineShift : lineShifts) { boolean b = true; String[] split = lineShift.getEndTime().split(":"); calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0])); calendar.set(Calendar.MINUTE, Integer.valueOf(split[1])); if (calendar.getTimeInMillis() < System.currentTimeMillis()) {//结束时间小于当前时间不显示 continue; } Map data = new HashMap<>(); for (Map map : s) { //先判断司机是否在限制接单范围内 boolean bo = false; for (Integer integer : integers) { if (integer.compareTo(Integer.valueOf(map.get("driverId").toString())) == 0) { bo = true; break; } } if (bo) { continue; } int i = orderTaxiService.selectCount(new EntityWrapper().eq("driverId", map.get("driverId")).in("state", Arrays.asList(2, 3, 4, 5, 11)).eq("DATE_FORMAT(travelTime, '%Y-%m-%d')", day)); if (i > 0) { continue; } i = orderPrivateCarService.selectCount(new EntityWrapper().eq("driverId", map.get("driverId")).in("state", Arrays.asList(2, 3, 4, 5, 11)).eq("DATE_FORMAT(travelTime, '%Y-%m-%d')", day)); if (i > 0) { continue; } List driverId1 = orderCrossCityService.queryListOrder(Integer.valueOf(map.get("driverId").toString()), lineShift.getId(), Arrays.asList(5), day); if (driverId1.size() > 0) { continue; } if (Integer.valueOf(map.get("laveSeat").toString()) < orderCrossCity.getPeopleNumber()) { continue; } if (lineShift.getId().intValue() == Integer.valueOf(map.get("id").toString()).intValue()) { b = false; String content = map.get("content").toString(); JSONObject jsonObject = JSON.parseObject(content); map.put("price", jsonObject.getString("num1")); data = map; list.add(data); } } if (b) { data.put("id", lineShift.getId()); data.put("startTime", lineShift.getStartTime() + "-" + lineShift.getEndTime()); list.add(data); } } return list; } /** * 查询其他同公司司机(需要确认) * 条件:同公司 + 该时段无排班 + 该时段无订单 + 座位数足够 */ private List> queryOtherCompanyDrivers(OrderCrossCity orderCrossCity, String day) throws Exception { List> list = new ArrayList<>(); // 获取原司机信息 Driver originalDriver = driverService.selectById(orderCrossCity.getDriverId()); if (originalDriver == null || originalDriver.getCompanyId() == null) { return list; } // 获取班次时间信息 LineShiftDriver originalLsd = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId()); if (originalLsd == null) { return list; } LineShift lineShift = lineShiftMapper.selectById(originalLsd.getLineShiftId()); if (lineShift == null) { return list; } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date dayDate = sdf.parse(day); // 获取 VEHICLE 黑名单 String vehicle = (String) redisTemplate.opsForValue().get("VEHICLE"); List blacklist = new ArrayList<>(); if (ToolUtil.isNotEmpty(vehicle)) { blacklist = JSON.parseArray(vehicle).toJavaList(Integer.class); } // 查询同公司的所有空闲司机 List companyDrivers = driverService.selectList( new EntityWrapper() .eq("companyId", originalDriver.getCompanyId()) .eq("state", 2) // 空闲状态 .ne("id", orderCrossCity.getDriverId()) // 排除当前司机 ); for (Driver driver : companyDrivers) { // 检查司机是否在黑名单中 if (blacklist.contains(driver.getId())) { continue; // 黑名单司机,跳过 } // 检查该司机在该时段是否有排班 int shiftCount = lineShiftDriverMapper.selectCount( new EntityWrapper() .eq("driverId", driver.getId()) .eq("day", dayDate) .exists("SELECT 1 FROM t_line_shift ls WHERE ls.id = {0}.lineShiftId " + "AND ls.startTime <= '" + lineShift.getEndTime() + "' " + "AND ls.endTime >= '" + lineShift.getStartTime() + "'") ); if (shiftCount > 0) { continue; // 该时段有排班,跳过 } // 检查该司机在该时段是否有跨城订单(使用相同的方法检查) List orderList = orderCrossCityService.queryListOrder( driver.getId(), lineShift.getId(), Arrays.asList(2, 3, 4, 5), // 待出发、服务中等 day ); if (orderList != null && orderList.size() > 0) { continue; // 该时段有跨城订单,跳过 } // 检查该司机在该时段是否有出租车订单 int taxiOrderCount = orderTaxiService.selectCount( new EntityWrapper() .eq("driverId", driver.getId()) .in("state", Arrays.asList(2, 3, 4, 5, 11)) // 待出发、服务中等 .eq("DATE_FORMAT(travelTime, '%Y-%m-%d')", day) ); if (taxiOrderCount > 0) { continue; // 该时段有出租车订单,跳过 } // 检查该司机在该时段是否有专车订单 int privateCarOrderCount = orderPrivateCarService.selectCount( new EntityWrapper() .eq("driverId", driver.getId()) .in("state", Arrays.asList(2, 3, 4, 5, 11)) // 待出发、服务中等 .eq("DATE_FORMAT(travelTime, '%Y-%m-%d')", day) ); if (privateCarOrderCount > 0) { continue; // 该时段有专车订单,跳过 } // 检查车辆信息和座位数 if (driver.getCarId() == null) { continue; // 未分配车辆,跳过 } Car car = carService.selectById(driver.getCarId()); if (car == null || car.getCarModelId() == null) { continue; // 车辆不存在或未设置车型,跳过 } // 从车型获取座位数 CarModel carModel = carModelMapper.selectById(car.getCarModelId()); if (carModel == null || carModel.getSeat() == null || carModel.getSeat() < orderCrossCity.getPeopleNumber()) { continue; // 座位数不足,跳过 } // 构建返回数据 Map data = new HashMap<>(); data.put("id", lineShift.getId()); data.put("lineShiftDriverId", null); // 无现有排班 data.put("startTime", lineShift.getStartTime() + "-" + lineShift.getEndTime()); data.put("headImgUrl", driver.getHeadImgUrl()); data.put("name", driver.getName().substring(0, 1) + "师傅"); data.put("carLicensePlate", car.getCarLicensePlate()); data.put("carColor", car.getCarColor()); data.put("driverId", driver.getId()); data.put("carId", car.getId()); data.put("totalSeat", carModel.getSeat() - 1); // 总座位数(减去司机位) data.put("laveSeat", carModel.getSeat() - 1); // 全部座位可用 // 获取品牌型号 if (car.getCarBrandId() != null && car.getCarModelId() != null) { CarBrand brand = carBrandMapper.selectById(car.getCarBrandId()); CarModel model = carModelMapper.selectById(car.getCarModelId()); if (brand != null && model != null) { data.put("brand", brand.getName() + model.getName()); } } // 设置默认评分 data.put("evaluate", 5.0); list.add(data); } return list; } @Autowired private ICompanyCityService companyCityService; @Autowired private IPushOrderService pushOrderService; @Autowired private IOpenCityService openCityService; @Autowired private PushUtil pushUtil; /** * 推送订单给司机抢单 * @param orderTaxi * @throws Exception */ public void pushOrderTaxi(OrderTaxi orderTaxi, Integer uid, int type) throws Exception { new Thread(new Runnable() { @Override public void run() { try { orderIds.add(orderTaxi.getId());//添加记录,防止调用接口重复提醒无人接单 String vehicle = (String) redisTemplate.opsForValue().get("VEHICLE"); List integers = new ArrayList<>(); if (ToolUtil.isNotEmpty(vehicle)) { integers = JSON.parseArray(vehicle).toJavaList(Integer.class); } OpenCity openCity = openCityService.openCity1(orderTaxi.getStartLon().toString(), orderTaxi.getStartLat().toString()); List querys = pushOrderService.querys(null, 2, openCity.getId());//获取需要推送的次数 int num = 0; for (int j = 0; j < 6; j++) { Boolean push = false; for (int i = 1; i <= querys.size(); i++) { num++; int finalI = i; PushOrder pushOrder = querys.stream().filter(s -> s.getType() == finalI).findFirst().orElse(null); System.out.println("pushOrder:" + pushOrder); //获取空闲司机 List list = driverService.queryIdleDriver(2, orderTaxi.getStartLon(), orderTaxi.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机 list = list.stream().filter(e -> e.getId() != uid).collect(Collectors.toList()); OrderTaxi orderTaxi1 = orderTaxiService.selectById(orderTaxi.getId()); if (list.size() > 0) { double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数 int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取) lastIndex = lastIndex == 0 ? list.size() : lastIndex; list = list.subList(0, lastIndex);//获取空闲司机中占比数据 for (Driver driver : list) {//开始进行推送 //查询是否在限制推单范围内 boolean bo = false; for (Integer integer : integers) { if (integer.compareTo(driver.getId()) == 0) { bo = true; break; } } if (bo) { continue; } pushUtil.pushOrderState(2, driver.getId(), orderTaxi.getId(), 2, orderTaxi.getState(), pushOrder.getPushTime()); } } Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间 Integer state = orderTaxi1.getState(); if (state != 1 && state != 11) { orderIds.remove(orderTaxi.getId()); push = true; break; } if (num == 18 && (state == 1 || state == 11)) { System.err.println("结束改派退单-------------修改订单为取消状态"); pushUtil.pushEndPush(1, orderTaxi.getUserId(), orderTaxi.getId(), 2, 11); pushUtil.pushOrderState(2, orderTaxi.getDriverId(), orderTaxi.getId(), 2, 10); orderTaxi1.setState(10); orderTaxiService.updateById(orderTaxi1); Driver driver = driverService.selectById(orderTaxi1.getDriverId()); driver.setState(2); driverService.updateById(driver); orderIds.remove(orderTaxi.getId()); } } if (push) { break; } } } catch (Exception e) { e.printStackTrace(); } } }).start(); } /** * 推送抢单数据 * @param orderPrivateCar * @throws Exception */ public void pushOrderPrivate(OrderPrivateCar orderPrivateCar, Integer uid, int type) throws Exception { new Thread(new Runnable() { @Override public void run() { try { Integer id = orderPrivateCar.getId(); Integer orderType = orderPrivateCar.getRideType() == 1 ? 1 : orderPrivateCar.getRideType() == 2 ? 9 : 8; orderIds.add(orderPrivateCar.getId());//添加记录,防止调用接口重复提醒无人接单 String vehicle = (String) redisTemplate.opsForValue().get("VEHICLE"); List integers = new ArrayList<>(); if (ToolUtil.isNotEmpty(vehicle)) { integers = JSON.parseArray(vehicle).toJavaList(Integer.class); } OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString()); List querys = pushOrderService.querys(null, 1, openCity.getId());//获取需要推送的次数 int num = 0; for (int j = 0; j < 6; j++) { Boolean push = false; for (int i = 1; i <= querys.size(); i++) { num++; OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(id); if (null == orderPrivateCar || (orderPrivateCar.getState() > 1 && orderPrivateCar.getState() != 11)) { push = true; break; } int finalI = i; PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null); System.out.println("pushOrder:" + pushOrder); if (orderPrivateCar.getState() > 1 && orderPrivateCar.getState() != 11) { push = true; break; } //获取空闲司机 List list = driverService.queryIdleDriver(orderType, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机 list = list.stream().filter(e -> !e.getId().equals(uid)).collect(Collectors.toList()); if (list.size() > 0) { double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数 int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取) lastIndex = lastIndex == 0 ? list.size() : lastIndex; list = list.subList(0, lastIndex);//获取空闲司机中占比数据 for (Driver driver : list) {//开始进行推送 boolean bo = false; for (Integer integer : integers) { if (integer.compareTo(driver.getId()) == 0) { bo = true; break; } } if (bo) { continue; } pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime()); } } Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间 Integer state = orderPrivateCar.getState(); if (state > 1 && state != 11) { orderIds.remove(orderPrivateCar.getId()); push = true; return; } if (num == 18 && (state == 1 || state == 11)) { System.err.println("结束改派退单-------------修改订单为取消状态"); pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 11); pushUtil.pushReassignEndCancel(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 10); orderPrivateCar.setState(10); orderPrivateCarService.updateById(orderPrivateCar); Driver driver = driverService.selectById(orderPrivateCar.getDriverId()); driver.setState(2); driverService.updateById(driver); orderIds.remove(orderPrivateCar.getId()); } } if (push) { break; } } } catch (Exception e) { e.printStackTrace(); } } }).start(); } /** * 检查是否需要对方确认 * @param targetId 正数为同批次 lineShiftDriverId,负数为扩展司机的 0-driverId * @param orderCrossCity 订单 * @return true=需要确认, false=不需要确认 */ private boolean checkIfNeedConfirm(Integer targetId, OrderCrossCity orderCrossCity) { try { if (targetId == null || orderCrossCity == null || orderCrossCity.getLineShiftDriverId() == null) { return true; } if (targetId < 0) { return true; } LineShiftDriver targetLineShiftDriver = lineShiftDriverMapper.selectById(targetId); if (targetLineShiftDriver == null) { return true; } LineShiftDriver originalLsd = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId()); if (originalLsd == null || targetLineShiftDriver.getLineShiftId() == null || originalLsd.getLineShiftId() == null) { return true; } return targetLineShiftDriver.getLineShiftId().compareTo(originalLsd.getLineShiftId()) != 0 || targetLineShiftDriver.getDay() == null || originalLsd.getDay() == null || !new SimpleDateFormat("yyyy-MM-dd").format(targetLineShiftDriver.getDay()) .equals(new SimpleDateFormat("yyyy-MM-dd").format(originalLsd.getDay())); } catch (Exception e) { e.printStackTrace(); return true; // 出错默认需要确认 } } private boolean isAssignedReassignTarget(Integer targetId) { return targetId != null && targetId != 0; } private boolean isActiveReassign(Reassign reassign) { if (reassign == null) { return false; } if (reassign.getState() != null && (reassign.getState() == 4 || reassign.getState() == 5)) { return false; } return reassign.getConfirmStatus() == null || (reassign.getConfirmStatus() != 3 && reassign.getConfirmStatus() != 4); } private Integer resolveConfirmDriverId(Integer targetId) { if (targetId == null) { return null; } if (targetId < 0) { return 0 - targetId; } LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(targetId); return lineShiftDriver == null ? targetId : lineShiftDriver.getDriverId(); } /** * 发送改派确认推送给目标司机(使用Socket推送,不用极光推送) * @param driverId 目标司机ID * @param reassign 改派记录 * @param order 订单信息 * @param totalPeopleNumber 总人数(已在调用处计算好) * @param orderIdList 订单ID列表 * @param reassignIdList 改派记录ID列表 */ private void sendReassignConfirmPush(Integer driverId, Reassign reassign, OrderCrossCity order, int totalPeopleNumber, List orderIdList, List reassignIdList) { try { System.out.println("进入跨城改派确认Socket发送方法: driverId=" + driverId + ", reassignId=" + (reassign == null ? "null" : reassign.getId()) + ", orderId=" + (order == null ? "null" : order.getId()) + ", totalPeopleNumber=" + totalPeopleNumber); // 使用订单的起点和终点地址(订单的startAddress和endAddress就是跨城站点地址) String startSite = order.getStartAddress() != null ? order.getStartAddress() : ""; String endSite = order.getEndAddress() != null ? order.getEndAddress() : ""; // 转换时间为字符串 SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String travelTime = order.getTravelTime() != null ? dateTimeFormat.format(order.getTravelTime()) : ""; String expireTime = reassign.getExpireTime() != null ? dateTimeFormat.format(reassign.getExpireTime()) : ""; // 使用 Socket 推送(不用极光推送) pushUtil.pushReassignConfirmRequest( driverId, String.join(",", reassignIdList), // 改派记录ID列表(逗号分隔) String.join(",", orderIdList), // 订单ID列表(逗号分隔) startSite, endSite, totalPeopleNumber, travelTime, expireTime ); } catch (Exception e) { e.printStackTrace(); } } /** * 为司机创建临时 LineShiftDriver * @param order 订单 * @param driverId 司机ID * @return 新创建的 LineShiftDriverId */ private Integer createTempLineShiftDriver(OrderCrossCity order, Integer driverId) throws Exception { return createTempLineShiftDriver(order, driverId, order.getPeopleNumber()); } private Integer createTempLineShiftDriver(OrderCrossCity order, Integer driverId, Integer peopleNumber) throws Exception { // 获取原始班次信息 LineShiftDriver originalLsd = lineShiftDriverMapper.selectById(order.getLineShiftDriverId()); if (originalLsd == null) { throw new Exception("原始班次信息不存在"); } // 创建新的 LineShiftDriver LineShiftDriver tempLsd = new LineShiftDriver(); tempLsd.setLineShiftId(originalLsd.getLineShiftId()); // 相同班次 tempLsd.setDriverId(driverId); // 新司机 tempLsd.setDay(originalLsd.getDay()); Driver driver = driverService.selectById(driverId); if (driver == null) { throw new Exception("司机信息不存在"); } Car car = carService.selectById(driver.getCarId()); if (car == null || car.getCarModelId() == null) { throw new Exception("车辆信息不存在或未设置车型"); } // 从车型获取座位数 CarModel carModel = carModelMapper.selectById(car.getCarModelId()); if (carModel == null || carModel.getSeat() == null) { throw new Exception("车型信息不存在"); } int totalSeat = carModel.getSeat() - 1; // 总座位数(减去司机位) tempLsd.setTotalSeat(totalSeat); tempLsd.setLaveSeat(totalSeat); // 新建临时班次时先放全部可用座位,后续统一按本批总人数扣减。 StringBuilder seatNumbers = new StringBuilder(); for (int i = 1; i <= totalSeat; i++) { if (i > 1) seatNumbers.append(","); seatNumbers.append(i); } tempLsd.setLaveSeatNumber(seatNumbers.toString()); tempLsd.setInserTime(new Date()); lineShiftDriverMapper.insert(tempLsd); return tempLsd.getId(); } /** * 通知原司机改派成功(使用Socket推送) */ private void pushReassignSuccess(Reassign reassign) { try { pushUtil.pushReassignSuccess( reassign.getOriginalDriverId(), reassign.getId(), reassign.getOrderId(), reassign.getOrderType() ); } catch (Exception e) { e.printStackTrace(); } } /** * 通知原司机改派被拒绝(使用Socket推送) */ private void pushReassignRejected(Reassign reassign) { try { pushUtil.pushReassignRejected( reassign.getOriginalDriverId(), reassign.getId(), reassign.getOrderId(), reassign.getOrderType() ); } catch (Exception e) { e.printStackTrace(); } } /** * 通知原司机改派超时(使用Socket推送) */ private void pushReassignTimeout(Reassign reassign) { try { pushUtil.pushReassignTimeout( reassign.getOriginalDriverId(), reassign.getId(), reassign.getOrderId(), reassign.getOrderType() ); } catch (Exception e) { e.printStackTrace(); } } @Override @Transactional(rollbackFor = Exception.class) public ResultUtil respondReassign(Integer reassignId, Integer driverId, Integer responseType) { // 兼容旧接口:单个改派记录 return respondReassignBatch(String.valueOf(reassignId), driverId, responseType); } /** * 批量响应改派请求(同意或拒绝) * @param reassignIds 改派记录ID列表(逗号分隔) * @param driverId 司机ID * @param responseType 响应类型(1=同意,2=拒绝) * @return 处理结果 */ @Transactional(rollbackFor = Exception.class) public ResultUtil respondReassignBatch(String reassignIds, Integer driverId, Integer responseType) { try { if (reassignIds == null || reassignIds.trim().isEmpty()) { return reassignResponse("改派申请ID不能为空", false); } String[] idArray = reassignIds.split(","); List reassignList = new ArrayList<>(); // 第一步:验证所有改派记录 for (String idStr : idArray) { Integer reassignId = Integer.valueOf(idStr.trim()); Reassign reassign = this.baseMapper.selectById(reassignId); if (reassign == null) { return reassignResponse("改派申请不存在: " + reassignId, false); } // 验证权限:检查nowDriverId是否匹配 if (reassign.getNowDriverId() == null || !reassign.getNowDriverId().equals(driverId)) { return reassignResponse("无权操作改派申请: " + reassignId, false); } // 幂等性检查:只有待确认状态才能响应 if (reassign.getConfirmStatus() != 1) { if (reassign.getConfirmStatus() == 2) { return reassignResponse("改派申请已被接受: " + reassignId, false); } else if (reassign.getConfirmStatus() == 3) { return reassignResponse("改派申请已被拒绝: " + reassignId, false); } else if (reassign.getConfirmStatus() == 4) { return reassignResponse("改派申请已超时: " + reassignId, false); } else { return reassignResponse("改派申请已处理: " + reassignId, false); } } // 验证是否超时 if (new Date().after(reassign.getExpireTime())) { reassign.setConfirmStatus(4); this.updateById(reassign); return reassignResponse("改派申请已超时: " + reassignId, false); } reassignList.add(reassign); } // 第二步:批量处理所有改派记录 if (responseType == 1) { // 同意改派 List orderList = new ArrayList<>(); int totalPeopleNumber = 0; for (Reassign reassign : reassignList) { OrderCrossCity order = orderCrossCityService.selectById(reassign.getOrderId()); if (order == null) { return reassignResponse("订单不存在: " + reassign.getOrderId(), false); } if (order.getState() != 11) { return reassignResponse("订单状态已变更,无法改派: " + order.getId(), false); } orderList.add(order); if (order.getPeopleNumber() != null) { totalPeopleNumber += order.getPeopleNumber(); } } OrderCrossCity firstOrder = orderList.get(0); String batchOrderNum = firstOrder.getOrderNum(); Integer tempLineShiftDriverId = createTempLineShiftDriver(firstOrder, driverId, totalPeopleNumber); Reassign tempReassign = new Reassign(); tempReassign.setNowDriverId(tempLineShiftDriverId); driverReassignSelf(tempReassign, firstOrder, totalPeopleNumber); LineShiftDriver tempLineShiftDriver = lineShiftDriverMapper.selectById(tempLineShiftDriverId); Driver targetDriver = driverService.selectById(driverId); for (int i = 0; i < reassignList.size(); i++) { Reassign reassign = reassignList.get(i); OrderCrossCity order = orderList.get(i); // 使用乐观锁更新状态 reassign.setConfirmStatus(2); reassign.setConfirmTime(new Date()); reassign.setTempLineShiftDriverId(tempLineShiftDriverId); int updateCount = this.baseMapper.update(reassign, new EntityWrapper() .eq("id", reassign.getId()) .eq("confirmStatus", 1) // 只有待确认状态才能更新 ); if (updateCount == 0) { return reassignResponse("改派申请已被处理: " + reassign.getId(), false); } order.setDriverId(tempLineShiftDriver.getDriverId()); order.setLineShiftDriverId(tempLineShiftDriverId); order.setOrderNum(batchOrderNum); restoreCrossCityOrderAfterReassignSuccess(order); if (targetDriver != null) { order.setCarId(targetDriver.getCarId()); } orderCrossCityService.updateById(order); // 推送乘客和司机通知 try { pushUtil.pushOrderReassign(order.getUserId(), 1, order.getId(), 3); //司机就是发起确定的人 这里就不需要通知司机了 } catch (Exception ignore) { } } // 通知原司机改派成功(只通知一次) if (!reassignList.isEmpty()) { pushReassignSuccess(reassignList.get(0)); } return reassignResponse("批量改派成功,共处理 " + reassignList.size() + " 条订单", true); } else { // 拒绝改派 for (Reassign reassign : reassignList) { reassign.setConfirmStatus(3); reassign.setConfirmTime(new Date()); int updateCount = this.baseMapper.update(reassign, new EntityWrapper() .eq("id", reassign.getId()) .eq("confirmStatus", 1) ); if (updateCount == 0) { return reassignResponse("改派申请已被处理: " + reassign.getId(), false); } restoreCrossCityOrderAfterReassignEnd(reassign); } // 通知原司机被拒绝(只通知一次) if (!reassignList.isEmpty()) { pushReassignRejected(reassignList.get(0)); } return reassignResponse("已拒绝改派,共 " + reassignList.size() + " 条订单", true); } } catch (Exception e) { e.printStackTrace(); return reassignResponse("操作失败:" + e.getMessage(), false); } } private ResultUtil reassignResponse(String message, boolean success) { return ResultUtil.success(message, success); } @Override public List> queryPendingReassigns(Integer driverId) { try { List list = this.selectList( new EntityWrapper() .eq("nowDriverId", driverId) .eq("needConfirm", 2) .eq("confirmStatus", 1) .gt("expireTime", new Date()) // 未超时 .orderBy("insertTime", false) ); List> result = new ArrayList<>(); for (Reassign reassign : list) { Map data = new HashMap<>(); data.put("reassignId", reassign.getId()); data.put("orderId", reassign.getOrderId()); data.put("orderType", reassign.getOrderType()); data.put("expireTime", reassign.getExpireTime()); data.put("reason", reassign.getReason()); data.put("insertTime", reassign.getInsertTime()); // 获取订单详情 if (reassign.getOrderType() == 3) { OrderCrossCity order = orderCrossCityService.selectById(reassign.getOrderId()); if (order != null) { data.put("startAddress", order.getStartAddress()); data.put("endAddress", order.getEndAddress()); data.put("peopleNumber", order.getPeopleNumber()); data.put("travelTime", order.getTravelTime()); data.put("orderMoney", order.getOrderMoney()); } } // 获取原司机信息 Driver originalDriver = driverService.selectById(reassign.getOriginalDriverId()); if (originalDriver != null) { data.put("originalDriverName", originalDriver.getName()); data.put("originalDriverPhone", originalDriver.getPhone()); } result.add(data); } return result; } catch (Exception e) { e.printStackTrace(); return new ArrayList<>(); } } }