package com.stylefeng.guns.modular.system.service.impl; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.stylefeng.guns.core.util.ToolUtil; 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.smallLogistics.server.IOrderLogisticsSpreadService; 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.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.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; 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.util.*; @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 ICBCPayUtil icbcPayUtil;*/ @Autowired private IOrderTaxiService orderTaxiService; @Autowired private IIncomeService incomeService; @Autowired private ISystemNoticeService systemNoticeService; @Autowired private IOrderPrivateCarService orderPrivateCarService; @Autowired private IOrderCrossCityService orderCrossCityService; @Autowired private JGPushUtil jgPushUtil; @Resource private DispatchMapper dispatchMapper; @Autowired private IOrderLogisticsService orderLogisticsService; @Value("${callbackPath}") private String callbackPath; @Autowired private RedisUtil redisUtil; /** * 提交改派申请 * @param uid 申请司机id * @return * @throws Exception */ @Override public ResultUtil saveData(Reassign reassign, Integer uid, Integer type) throws Exception { boolean lock = redisUtil.lock(reassign.getOrderId() + "_reassign", 10); if(!lock){ int num1 = 1; while (num1 <= 10){ Thread.sleep(3000);//等待3秒 lock = redisUtil.lock(reassign.getOrderId() + "_reassign", 10); if(lock){ break; }else{ num1++; } } } ResultUtil resultUtil = ResultUtil.success(); try { 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); Driver driver = driverService.selectById(uid); // TODO: 2020/11/12 司机端不控制重复提交(如果重复提交且未支付,直接将之前的数据删除) // Reassign query = reassignMapper.query(uid, null, null, null, 1); // if(null != query){ // return ResultUtil.error("有未完成支付的改派申请"); // } Reassign query = reassignMapper.query(uid, null, reassign.getOrderId(), reassign.getOrderType(), 1); if(null != query){ // return ResultUtil.error("不能重复提交申请"); reassignMapper.deleteById(query.getId()); } query = reassignMapper.query(uid, null, reassign.getOrderId(), reassign.getOrderType(), 2); if(null != query){ 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()); this.insert(reassign); systemNoticeService.addSystemNotice(2, "您的改派申请已成功提交,我们会尽快为你处理!", uid); //开始支付 if(null != reassign.getPayType()){ if(reassign.getPayType() == 1){//微信支付 reassign.setState(1); ResultUtil resultUtil1 = payMoneyUtil.weixinpay("改派订单",reassign.getId()+"",reassign.getId() + "_" + reassign.getOrderType(),aDouble+"","/base/wxReassign","APP", ""); //Map map = icbcPayUtil.placeAnOrder(reassign.getId() + "_" + reassign.getOrderType(), 9, 5, uid.toString(), "改派订单", aDouble, callbackPath + "/base/wxReassign", "", type, driver.getAppletsOpenId()); if(resultUtil1.getCode()==200){ paymentRecordService.saveData(1, null, null, reassign.getOrderId(), reassign.getOrderType(), 1, aDouble, null, 1);//添加预支付数据 resultUtil = resultUtil1; }else{ resultUtil = ResultUtil.error("获取支付信息失败", ""); } } if(reassign.getPayType() == 2){//支付宝 reassign.setState(1); ResultUtil resultUtil1 = payMoneyUtil.alipay("改派订单","改派订单",reassign.getId() + "_" + reassign.getOrderType(),aDouble+"","/base/aliReassign", ""); //Map map = icbcPayUtil.placeAnOrder(reassign.getId() + "_" + reassign.getOrderType(), 10, 5, uid.toString(), "改派订单", aDouble, callbackPath + "/base/aliReassign", "", 2, ""); if(resultUtil1.getCode()==200){ paymentRecordService.saveData(1, null, null, reassign.getOrderId(), reassign.getOrderType(), 2, aDouble, null, 1);//添加预支付数据 resultUtil = resultUtil1; }else{ resultUtil = ResultUtil.error("获取支付信息失败", ""); } } 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.saveDriverData(uid, "司机改派支付", aDouble, 2, 1, 2, reassign.getOrderType(), reassign.getOrderId(), driver.getLaveBusinessMoney()); //修改改派通知状态 switch (reassign.getOrderType()){ case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(reassign.getOrderId()); orderPrivateCar.setOldState(orderPrivateCar.getState()); orderPrivateCar.setState(11); orderPrivateCar.setReassignNotice(2); orderPrivateCarService.updateById(orderPrivateCar); //添加已收入明细 incomeService.saveData(1, orderPrivateCar.getCompanyId(), 4, orderPrivateCar.getId(), 1, reassign.getMoney()); break; case 2: OrderTaxi orderTaxi = orderTaxiService.selectById(reassign.getOrderId()); orderTaxi.setOldState(orderTaxi.getState()); orderTaxi.setState(11); orderTaxi.setReassignNotice(2); orderTaxiService.updateById(orderTaxi); //添加已收入明细 incomeService.saveData(1, orderTaxi.getCompanyId(), 4, orderTaxi.getId(), 2, reassign.getMoney()); break; case 4: OrderLogistics orderLogistics = orderLogisticsService.selectById(reassign.getOrderId()); orderLogistics.setOldState(orderLogistics.getState()); orderLogistics.setState(11); orderLogistics.setReassignNotice(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); orderLogisticsService.updateById(orderLogistics1); //添加已收入明细 incomeService.saveData(1, orderLogistics1.getCompanyId(), 4, orderLogistics1.getId(), orderLogistics1.getType(), reassign.getMoney()); break; } systemNoticeService.addSystemNotice(2, "您已使用余额成功支付改派申请费用!", uid); //开始推送调度单 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()); // } } } }catch (Exception e){ e.printStackTrace(); }finally { redisUtil.unlock(reassign.getOrderId() + "_reassign"); } return resultUtil; } /** * 提交改派申请(跨城专用) * @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 = orderService.queryReassignMoney(Integer.valueOf(split[0]), 3); Double totalMoney = aDouble * split.length; String ids = ""; for(String id : split){ Reassign query = reassignMapper.query(uid, null, Integer.valueOf(id), 3, 1); if(null != query){ // return ResultUtil.error("不能重复提交申请"); reassignMapper.deleteById(query.getId()); } query = reassignMapper.query(uid, null, Integer.valueOf(id), 3, 2); if(null != 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); this.insert(reassign); ids += reassign.getId() + ","; } ids = ids.substring(0, ids.length() - 1); systemNoticeService.addSystemNotice(2, "您的改派申请已成功提交,我们会尽快为你处理!", uid); //开始支付 if(null != reassign.getPayType()){ if(reassign.getPayType() == 1){//微信支付 String[] split1 = ids.split(","); resultUtil = payMoneyUtil.weixinpay("改派订单",ids+"",ids + "_3",totalMoney+"","/base/wxReassign","APP", ""); //Map map = icbcPayUtil.placeAnOrder(ids + "_3", 9, 5, uid.toString(), "改派订单", totalMoney, callbackPath + "/base/wxReassign", "", type, driver.getAppletsOpenId()); if(resultUtil.getCode()==200){ for(String id : split1){ paymentRecordService.saveData(1, null, null, Integer.valueOf(id), 3, 1, aDouble, null, 1);//添加预支付数据 } resultUtil = resultUtil; }else{ resultUtil = ResultUtil.error("获取支付信息失败", ""); } } if(reassign.getPayType() == 2){//支付宝 String[] split1 = ids.split(","); resultUtil = payMoneyUtil.alipay("改派订单","v",ids + "_3",totalMoney+"","/base/aliReassign", ""); //Map map = icbcPayUtil.placeAnOrder(ids + "_3", 10, 5, uid.toString(), "改派订单", totalMoney, callbackPath + "/base/aliReassign", "", 2, ""); if(resultUtil.getCode()==200){ for(String id : split1){ paymentRecordService.saveData(1, null, null, Integer.valueOf(id), 3, 2, aDouble, null, 1);//添加预支付数据 } resultUtil = resultUtil; }else{ resultUtil = ResultUtil.error("获取支付信息失败", ""); } } if(reassign.getPayType() == 3){//余额 for(String id : split){ Reassign query = reassignMapper.query(uid, null, Integer.valueOf(id), 3, 1); query.setState(2); query.setPayTime(new Date()); reassignMapper.updateById(query); } Double balance = driver.getBalance(); if(null == balance || balance < totalMoney){ throw new SystemException("账户余额不足"); } driver.setBalance(new BigDecimal(balance).subtract(new BigDecimal(totalMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driverService.updateById(driver); for(String id : split){ //添加交易明细 transactionDetailsService.saveDriverData(uid, "司机改派支付", aDouble, 2, 1, 2, 3, Integer.valueOf(id),driver.getLaveBusinessMoney()); } //修改改派通知状态 for(String id : split){ OrderCrossCity orderCrossCity = orderCrossCityService.selectById(id); orderCrossCity.setOldState(orderCrossCity.getState()); orderCrossCity.setState(11); orderCrossCity.setReassignNotice(2); orderCrossCityService.updateById(orderCrossCity); //添加已收入明细 incomeService.saveData(1, orderCrossCity.getCompanyId(), 4, orderCrossCity.getId(), 3, reassign.getMoney()); } systemNoticeService.addSystemNotice(2, "您已使用余额成功支付改派申请费用!", uid); //开始推送调度单 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()); // } } } 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); } /** * 改派支付完成后的操作 * @param id 改派单id * @param order_id 工行支付订单 * @param type 1=微信,2=支付宝 * @throws Exception */ @Override public void payReassign(String id, String order_id, Integer type) throws Exception { String[] s = id.split("_"); if(Integer.valueOf(s[1]) == 3){//跨城订单 String[] split = s[0].split(","); List reassigns = this.selectBatchIds(Arrays.asList(split)); Driver driver = driverService.selectById(reassigns.get(0).getOriginalDriverId()); for(String key : split){ PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(key), 3, type, 1); if(null != query){ //添加交易明细 transactionDetailsService.saveDriverData(reassigns.get(0).getOriginalDriverId(), "司机改派支付", reassigns.get(0).getMoney(), 2, 1, 2, 3, Integer.valueOf(key),driver.getLaveBusinessMoney()); 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); query.setCode(order_id); paymentRecordService.updateById(query); //修改改派通知状态 for(Reassign reassign : reassigns){ OrderCrossCity orderCrossCity1 = orderCrossCityService.selectById(reassign.getOrderId()); orderCrossCity1.setOldState(orderCrossCity1.getState()); orderCrossCity1.setState(11); orderCrossCity1.setReassignNotice(2); orderCrossCityService.updateById(orderCrossCity1); //添加已收入明细 incomeService.saveData(1, orderCrossCity1.getCompanyId(), 4, orderCrossCity1.getId(), 3, reassign.getMoney()); } systemNoticeService.addSystemNotice(2, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功支付改派申请费用!", reassigns.get(0).getOriginalDriverId()); }else{ System.err.println("预支付数据异常(orderId = " + id + ")"); } } }else{//其他订单 Reassign reassign = this.selectById(s[0]); Driver driver = driverService.selectById(reassign.getOriginalDriverId()); PaymentRecord query = paymentRecordService.query(1, null, null, reassign.getOrderId(), reassign.getOrderType(), type, 1); if(null != query){ //添加交易明细 transactionDetailsService.saveDriverData(reassign.getOriginalDriverId(), "司机改派支付", reassign.getMoney(), 2, 1, 2, reassign.getOrderType(), reassign.getOrderId(),driver.getLaveBusinessMoney()); reassign.setState(2); reassign.setPayOrder(order_id); reassign.setPayTime(new Date()); this.updateById(reassign); query.setState(2); query.setCode(order_id); paymentRecordService.updateById(query); //修改改派通知状态 switch (reassign.getOrderType()){ case 1: OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(reassign.getOrderId()); orderPrivateCar.setOldState(orderPrivateCar.getState()); orderPrivateCar.setState(11); orderPrivateCar.setReassignNotice(2); orderPrivateCarService.updateById(orderPrivateCar); //添加已收入明细 incomeService.saveData(1, orderPrivateCar.getCompanyId(), 4, orderPrivateCar.getId(), 1, reassign.getMoney()); break; case 2: OrderTaxi orderTaxi = orderTaxiService.selectById(reassign.getOrderId()); orderTaxi.setOldState(orderTaxi.getState()); orderTaxi.setState(11); orderTaxi.setReassignNotice(2); orderTaxiService.updateById(orderTaxi); //添加已收入明细 incomeService.saveData(1, orderTaxi.getCompanyId(), 4, orderTaxi.getId(), 2, reassign.getMoney()); break; case 4: OrderLogistics orderLogistics = orderLogisticsService.selectById(reassign.getOrderId()); orderLogistics.setOldState(orderLogistics.getState()); orderLogistics.setState(11); orderLogistics.setReassignNotice(2); orderLogisticsService.updateById(orderLogistics); //添加已收入明细 incomeService.saveData(1, orderLogistics.getCompanyId(), 4, orderLogistics.getId(), 4, reassign.getMoney()); break; case 5: OrderLogistics orderLogistics1 = orderLogisticsService.selectById(reassign.getOrderId()); orderLogistics1.setOldState(orderLogistics1.getState()); orderLogistics1.setState(11); orderLogistics1.setReassignNotice(2); orderLogisticsService.updateById(orderLogistics1); //添加已收入明细 incomeService.saveData(1, orderLogistics1.getCompanyId(), 4, orderLogistics1.getId(), 5, reassign.getMoney()); break; } systemNoticeService.addSystemNotice(2, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功支付改派申请费用!", reassign.getOriginalDriverId()); //开始推送调度单 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()); // } }else{ System.err.println("预支付数据异常(orderId = " + id + ")"); } } } }