package com.stylefeng.guns.modular.system.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.annotations.TableField;
|
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.system.dao.LinePriceMapper;
|
import com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper;
|
import com.stylefeng.guns.modular.system.dao.OrderCrossCityMapper;
|
import com.stylefeng.guns.modular.system.dao.RegionMapper;
|
import com.stylefeng.guns.modular.system.model.*;
|
import com.stylefeng.guns.modular.system.service.*;
|
import com.stylefeng.guns.modular.system.util.*;
|
import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
|
import com.stylefeng.guns.modular.system.warpper.OrderCrossCityWarpper;
|
import org.springframework.beans.BeanUtils;
|
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.math.MathContext;
|
import java.math.RoundingMode;
|
import java.util.*;
|
|
|
@Service
|
@Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
|
public class OrderCrossCityServiceImpl extends ServiceImpl<OrderCrossCityMapper, OrderCrossCity> implements IOrderCrossCityService {
|
|
@Resource
|
private OrderCrossCityMapper orderCrossCityMapper;
|
|
@Resource
|
private LineShiftDriverMapper lineShiftDriverMapper;
|
|
@Resource
|
private LinePriceMapper linePriceMapper;
|
|
@Resource
|
private RegionMapper regionMapper;
|
|
@Autowired
|
private DateUtil dateUtil;
|
|
@Autowired
|
private IDispatchService dispatchService;
|
|
@Autowired
|
private IOrderCancelService orderCancelService;
|
|
@Autowired
|
private IDriverService driverService;
|
|
@Autowired
|
private IUserInfoService userInfoService;
|
|
@Autowired
|
private GDFalconUtil gdFalconUtil;
|
|
@Autowired
|
private GDMapGeocodingUtil gdMapGeocodingUtil;
|
|
@Autowired
|
private ChinaMobileUtil chinaMobileUtil;
|
|
@Autowired
|
private PushUtil pushUtil;
|
|
@Autowired
|
private ISystemNoticeService systemNoticeService;
|
|
// @Autowired
|
// private ICBCPayUtil icbcPayUtil;
|
|
@Autowired
|
private ITransactionDetailsService transactionDetailsService;
|
|
@Autowired
|
private ILineService lineService;
|
|
@Autowired
|
private IIncomeService incomeService;
|
|
@Autowired
|
private IPaymentRecordService paymentRecordService;
|
|
@Autowired
|
private GDMapElectricFenceUtil gdMapElectricFenceUtil;
|
|
@Autowired
|
private PayMoneyUtil payMoneyUtil;
|
|
@Value("${callbackPath}")
|
private String callbackPath;
|
|
|
|
/**
|
* 获取订单列表
|
* @param search
|
* @param orderSource
|
* @param state
|
* @param lineId
|
* @param pageNum
|
* @param size
|
* @param uid
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public List<Map<String, Object>> queryOrderList(String search, String orderSource, String state, String lineId, Integer pageNum, Integer size, Integer uid) throws Exception {
|
Dispatch dispatch = dispatchService.selectById(uid);
|
Integer companyId = null != dispatch.getFranchiseeId() ? dispatch.getFranchiseeId() : dispatch.getCompanyId();
|
pageNum = (pageNum - 1) * size;
|
List<String> orderSources = null;
|
if(ToolUtil.isNotEmpty(orderSource)){
|
orderSources = Arrays.asList(orderSource.split(","));
|
}
|
List<String> states = null;
|
if(ToolUtil.isNotEmpty(state)){
|
states = Arrays.asList(state.split(","));
|
}
|
List<String> lineIds = null;
|
if(ToolUtil.isNotEmpty(lineId)){
|
lineIds = Arrays.asList(lineId.split(","));
|
}
|
return orderCrossCityMapper.queryOrderList(search, orderSources, states, lineIds, companyId, pageNum, size);
|
}
|
|
|
/**
|
* 获取订单详情
|
* @param orderId
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public Map<String, Object> queryOrderInfo(Integer orderId) throws Exception {
|
return orderCrossCityMapper.queryOrderInfo(orderId);
|
}
|
|
/**
|
* 取消订单
|
* @param orderId
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil cancelOrder(Integer orderId) throws Exception {
|
OrderCrossCity orderCrossCity = this.selectById(orderId);
|
if(orderCrossCity.getState() == 10 || orderCrossCity.getState() == 12){
|
return ResultUtil.error("不允许重复取消");
|
}
|
if(orderCrossCity.getState() == 8 || orderCrossCity.getState() == 9){
|
return ResultUtil.error("订单已完成,不允许取消");
|
}
|
orderCrossCity.setState(10);
|
this.updateById(orderCrossCity);
|
|
|
if(null != orderCrossCity.getDriverId()){
|
//修改司机信息
|
LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
|
lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat() ?
|
lineShiftDriver.getTotalSeat() : lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
|
String seat = "";
|
String[] split = orderCrossCity.getSeatNumber().split(",");
|
for(String s : split){
|
seat += s + ",";
|
}
|
seat = lineShiftDriver.getLaveSeatNumber() + "," + seat.substring(0, seat.length() - 1);
|
|
//总和大于总座位数的情况
|
if(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat()){
|
seat = "";
|
for(int i = 1; i <= lineShiftDriver.getTotalSeat(); i++){
|
seat += i + ",";
|
}
|
seat = seat.substring(0, seat.length() - 1);
|
}
|
lineShiftDriver.setLaveSeatNumber(seat);
|
lineShiftDriverMapper.updateById(lineShiftDriver);
|
if(lineShiftDriver.getLaveSeat() >= lineShiftDriver.getTotalSeat()){
|
Driver driver = driverService.selectById(orderCrossCity.getDriverId());
|
driver.setState(2);
|
driverService.updateById(driver);
|
}
|
|
//已支付的情况下进行退款操作
|
if(null != orderCrossCity.getPayType() && null != orderCrossCity.getPayMoney()){
|
if(orderCrossCity.getPayType() == 3){//余额支付
|
UserInfo userInfo = userInfoService.selectById(orderCrossCity.getUserId());
|
userInfo.setBalance(userInfo.getBalance() + orderCrossCity.getPayMoney());
|
userInfoService.updateById(userInfo);
|
//添加交易明细
|
transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城订单取消退款", orderCrossCity.getPayMoney(), 1, 1, 1, 3, orderId);
|
}else{
|
PaymentRecord query = paymentRecordService.query(1, null, null, orderId, 3, null, 2);
|
if(null == query){
|
return ResultUtil.error("订单还未进行支付");
|
}
|
|
if(query.getPayType() == 1){//微信
|
Map<String, String> map = payMoneyUtil.wxRefund(query.getCode(), orderCrossCity.getId() + "_3", query.getAmount().toString(), query.getAmount().toString(), "/user/base/cancleOrderWXPay");
|
if(!"SUCCESS".equals(map.get("return_code"))){
|
return ResultUtil.error(map.get("return_msg"));
|
}
|
}else{//支付宝
|
Map<String, String> map = payMoneyUtil.aliRefund(query.getCode(), query.getAmount().toString());
|
if(!"10000".equals(map.get("code"))){
|
return ResultUtil.error(map.get("msg"));
|
}
|
//添加交易明细
|
transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", query.getAmount(), 1, 1, 1, 3, orderCrossCity.getId());
|
}
|
|
|
// Map<String, Object> merrefund = icbcPayUtil.merrefund(query.getCode(), "", query.getAmount(), orderId + "_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, orderId);
|
// }
|
// 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("退款返回未知异常");
|
// }
|
// }
|
// }
|
}
|
|
//添加负的收入明细
|
List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", orderId).eq("orderType", 3));
|
for(Income income : incomes){
|
if(income.getUserType() == 2){//处理司机的收入
|
Driver driver = driverService.selectById(income.getObjectId());
|
driver.setBalance(driver.getBalance() + income.getMoney());
|
driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() - income.getMoney());
|
driver.setBusinessMoney(driver.getBusinessMoney() - income.getMoney());
|
driverService.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);
|
}
|
}
|
}
|
|
//添加取消记录
|
OrderCancel orderCancel = new OrderCancel();
|
orderCancel.setOrderId(orderId);
|
orderCancel.setOrderType(3);
|
orderCancel.setReason("调度端取消");
|
orderCancel.setRemark("调度端取消");
|
orderCancel.setState(2);
|
orderCancel.setInsertTime(new Date());
|
orderCancel.setUserType(2);
|
orderCancelService.insert(orderCancel);
|
|
new Thread(new Runnable() {//发送消息提醒
|
@Override
|
public void run() {
|
pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderId, 3, 10, 0);
|
if(null != orderCrossCity.getDriverId()){
|
pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderId, 3, 10, 0);
|
//修改司机为空闲
|
List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11);
|
if(orderCrossCities.size() == 0){
|
Driver driver = driverService.selectById(orderCrossCity.getDriverId());
|
driver.setState(2);
|
driverService.updateById(driver);
|
}
|
}
|
}
|
}).start();
|
//添加消息
|
systemNoticeService.addSystemNotice(1, "调度已成功取消出行订单,谢谢使用!", orderCrossCity.getUserId(), 1);
|
return ResultUtil.success();
|
}
|
|
|
|
/**
|
* 跨城下单操作
|
* @param orderCrossCityWarpper
|
* @param uid
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public synchronized ResultUtil<BaseWarpper> orderCrossCity(OrderCrossCityWarpper orderCrossCityWarpper, Integer uid) throws Exception {
|
/**
|
* 先判断司机座位数是否符合出行人数
|
*/
|
LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCityWarpper.getLineShiftDriverId());
|
if(orderCrossCityWarpper.getTravelMode() == 1){
|
if(lineShiftDriver.getLaveSeat() < orderCrossCityWarpper.getPeopleNumber()){
|
return ResultUtil.error("司机剩余座位数小于出行人数");
|
}
|
}else{
|
if(lineShiftDriver.getLaveSeat() != lineShiftDriver.getTotalSeat()){
|
return ResultUtil.error("司机车辆上已经有人占座了,不能下包车订单");
|
}
|
if(lineShiftDriver.getLaveSeat() == 0){
|
return ResultUtil.error("司机剩余座位数不足");
|
}
|
}
|
Driver driver = driverService.selectById(orderCrossCityWarpper.getDriverId());
|
if(driver.getState() == 1){
|
return ResultUtil.error("司机处于离线状态");
|
}
|
OrderCrossCity orderCrossCity = new OrderCrossCity();
|
UserInfo userInfo = userInfoService.queryByPhone(orderCrossCityWarpper.getPassengersPhone());
|
if(userInfo == null){//添加用户信息
|
userInfo = new UserInfo();
|
userInfo.setNickName(orderCrossCityWarpper.getPassengers());
|
userInfo.setName(orderCrossCityWarpper.getPassengers());
|
userInfo.setPhone(orderCrossCityWarpper.getPassengersPhone());
|
userInfo.setState(1);
|
userInfo.setFlag(1);
|
userInfo.setInsertTime(new Date());
|
userInfo.setInsertUser(uid);
|
userInfoService.insert(userInfo);
|
}
|
orderCrossCity.setUserId(userInfo.getId());
|
orderCrossCity.setPassengers(orderCrossCityWarpper.getPassengers());
|
orderCrossCity.setPassengersPhone(orderCrossCityWarpper.getPassengersPhone());
|
orderCrossCity.setServerCarModelId(orderCrossCityWarpper.getServerCarModelId());
|
orderCrossCity.setDriverId(orderCrossCityWarpper.getDriverId());
|
orderCrossCity.setLineId(orderCrossCityWarpper.getLineId());
|
orderCrossCity.setLineShiftDriverId(orderCrossCityWarpper.getLineShiftDriverId());
|
orderCrossCity.setCarId(orderCrossCityWarpper.getCarId());
|
orderCrossCity.setOrderNum(this.getOrderNum(orderCrossCityWarpper.getDriverId(), orderCrossCityWarpper.getLineShiftDriverId()));
|
orderCrossCity.setPlacementLon(orderCrossCityWarpper.getPlacementLon());
|
orderCrossCity.setPlacementLat(orderCrossCityWarpper.getPlacementLat());
|
orderCrossCity.setPlacementAddress(orderCrossCityWarpper.getPlacementAddress());
|
orderCrossCity.setStartLon(orderCrossCityWarpper.getStartLon());
|
orderCrossCity.setStartLat(orderCrossCityWarpper.getStartLat());
|
orderCrossCity.setStartAddress(orderCrossCityWarpper.getStartAddress());
|
orderCrossCity.setEndLon(orderCrossCityWarpper.getEndLon());
|
orderCrossCity.setEndLat(orderCrossCityWarpper.getEndLat());
|
orderCrossCity.setEndAddress(orderCrossCityWarpper.getEndAddress());
|
orderCrossCity.setMileage(0D);
|
ResultUtil<Map<String, Object>> price = this.getPrice(orderCrossCityWarpper.getDistance(), orderCrossCityWarpper.getPeopleNumber(), orderCrossCityWarpper.getTravelMode(), orderCrossCityWarpper.getLineId(),
|
orderCrossCityWarpper.getServerCarModelId(), orderCrossCityWarpper.getTotalSeat(), orderCrossCityWarpper.getSeatNumber());
|
Double money = Double.valueOf(price.getData().get("price").toString());
|
orderCrossCity.setOrderMoney(money);
|
Integer companyId = driver.getCompanyId();
|
orderCrossCity.setCompanyId(companyId);
|
orderCrossCity.setPeopleNumber(orderCrossCityWarpper.getPeopleNumber());
|
orderCrossCity.setSeatNumber(orderCrossCityWarpper.getSeatNumber());
|
List<OrderCrossCity> orderCrossCities = this.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", orderCrossCity.getOrderNum()).eq("isDelete", 1));
|
orderCrossCity.setSort(orderCrossCities.size() + 1);
|
orderCrossCity.setState(7);//待支付
|
orderCrossCity.setInsertTime(new Date());
|
orderCrossCity.setTravelTime(orderCrossCityWarpper.getTravelTime());
|
orderCrossCity.setSnatchOrderTime(new Date());
|
orderCrossCity.setTravelMode(orderCrossCityWarpper.getTravelMode());
|
orderCrossCity.setOrderSource(orderCrossCityWarpper.getOrderSource());
|
orderCrossCity.setIsDelete(1);
|
orderCrossCity.setIsReassign(1);
|
//调用高德创建轨迹
|
String s = gdFalconUtil.selectTerminal(driver.getPhone());
|
String track = gdFalconUtil.createTrack(s);
|
orderCrossCity.setTrackId(track);
|
|
//调用移动的小号接口
|
Map<String, String> geocode = gdMapGeocodingUtil.geocode(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
|
Region region = regionMapper.query(geocode.get("districtCode"));
|
// Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderCrossCity.getPassengersPhone(), driver.getPhone(), Integer.valueOf(region.getCitycode().substring(1)));
|
// if(String.valueOf(map.get("code")).equals("200")){
|
// orderCrossCity.setTelX(map.get("telX"));
|
// orderCrossCity.setBindId(map.get("bindId"));
|
// }
|
if(orderCrossCityWarpper.getTravelMode() == 2){//包车
|
orderCrossCity.setSeatNumber(lineShiftDriver.getLaveSeatNumber());
|
orderCrossCity.setPeopleNumber(lineShiftDriver.getLaveSeat());
|
}
|
this.insert(orderCrossCity);
|
|
if(driver.getState() == 2){
|
driver.setState(3);
|
driverService.updateById(driver);
|
}
|
|
//修改预约班次的数据
|
if(orderCrossCity.getTravelMode() == 2){//包车
|
lineShiftDriver.setLaveSeat(0);
|
lineShiftDriver.setLaveSeatNumber("");
|
}else{//拼车
|
lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() - orderCrossCity.getPeopleNumber());
|
String[] split = orderCrossCity.getSeatNumber().split(",");
|
String[] split1 = lineShiftDriver.getLaveSeatNumber().split(",");
|
String seatNumber = "";
|
//先判断选中座位号和剩余座位号是否匹配
|
for(String spl : split){
|
boolean b = true;
|
for(String sp : split1){
|
if(ToolUtil.isNotEmpty(spl) && ToolUtil.isNotEmpty(sp) && sp.equals(spl)){
|
b = false;
|
break;
|
}
|
}
|
if(b){
|
throw new SystemException("您选中的" + spl + "号座位已被占用,请选择其他座位!");
|
}
|
}
|
for(String sp : split1){
|
boolean b = true;
|
for(String spl : split){
|
if(ToolUtil.isNotEmpty(spl) && ToolUtil.isNotEmpty(sp) && sp.equals(spl)){
|
b = false;
|
break;
|
}
|
}
|
if(b && ToolUtil.isNotEmpty(sp)){
|
seatNumber += (sp + ",");
|
}
|
}
|
lineShiftDriver.setLaveSeatNumber(ToolUtil.isNotEmpty(seatNumber) ? seatNumber.substring(0, seatNumber.length() - 1) : "");
|
}
|
lineShiftDriverMapper.updateById(lineShiftDriver);
|
|
//添加消息
|
systemNoticeService.addSystemNotice(1, "您的跨城订单已下单成功!", orderCrossCity.getUserId(), 1);
|
|
BaseWarpper baseWarpper = new BaseWarpper();
|
baseWarpper.setId(orderCrossCity.getId());
|
|
//创建定时任务,取消订单30分钟
|
TimerTask timerTask = new TimerTask() {
|
@Override
|
public void run() {
|
OrderCrossCity orderCrossCity1 = orderCrossCityMapper.selectById(orderCrossCity.getId());
|
if(orderCrossCity1.getState() == 7 && orderCrossCity1.getPayMoney() == null){
|
orderCrossCity1.setState(10);
|
orderCrossCityMapper.updateById(orderCrossCity1);
|
|
OrderCancel orderCancel = new OrderCancel();
|
orderCancel.setOrderId(orderCrossCity.getId());
|
orderCancel.setOrderType(3);
|
orderCancel.setReason("用户未及时付款,系统自动取消订单");
|
orderCancel.setRemark("用户未及时付款,系统自动取消订单");
|
orderCancel.setState(2);
|
orderCancel.setInsertTime(new Date());
|
orderCancel.setUserType(2);
|
orderCancelService.insert(orderCancel);
|
|
//修改司机座位
|
LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
|
lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
|
lineShiftDriver.setLaveSeatNumber(lineShiftDriver.getLaveSeatNumber() + (orderCrossCity.getTravelMode() == 1 ? "," : "") + orderCrossCity.getSeatNumber());
|
lineShiftDriverMapper.updateById(lineShiftDriver);
|
|
//修改司机为空闲
|
List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryByDriverId(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11);
|
if(orderCrossCities.size() == 0){
|
Driver driver = driverService.selectById(orderCrossCity.getDriverId());
|
driver.setState(2);
|
driverService.updateById(driver);
|
}
|
}
|
}
|
};
|
Timer timer = new Timer();
|
timer.schedule(timerTask, 30 * 60 * 1000);
|
|
return ResultUtil.success(baseWarpper);
|
}
|
|
|
/**
|
* 获取给定时间范围内司机的有效订单
|
* @param driverId
|
* @param start
|
* @param end
|
* @param state
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public List<OrderCrossCity> queryByDriverId(Integer driverId, Date start, Date end, Integer... state) throws Exception {
|
return orderCrossCityMapper.queryByDriver(driverId, start, end, state);
|
}
|
|
|
/**
|
* 获取排班数据对应的订单
|
* @param lineShiftDriverId
|
* @param state
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public List<OrderCrossCity> queryByLineShiftDriverId(Integer lineShiftDriverId, Integer... state) throws Exception {
|
return orderCrossCityMapper.queryByLineShiftDriverId(lineShiftDriverId, state);
|
}
|
|
/**
|
* 扫码支付回调处理
|
* @param orderId 订单id
|
* @param order_id 工行订单号
|
* @throws Exception
|
*/
|
@Override
|
public void generatePayCallback(Integer orderId, String order_id) throws Exception {
|
OrderCrossCity orderCrossCity = orderCrossCityMapper.selectById(order_id);
|
orderCrossCity.setPayManner(1);
|
orderCrossCity.setPayMoney(orderCrossCity.getOrderMoney());
|
orderCrossCity.setState(2);
|
orderCrossCityMapper.updateById(orderCrossCity);
|
|
//添加交易明细
|
transactionDetailsService.saveData(orderCrossCity.getUserId(), "完成订单", orderCrossCity.getOrderMoney(), 2, 1, 1, 3, orderId);
|
|
//添加已收入明细
|
Line line = lineService.selectById(orderCrossCity.getLineId());
|
Double speMoney = Double.valueOf(line.getRakeRate());
|
BigDecimal d = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_EVEN);//企业收入
|
BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入
|
incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 1, d.doubleValue());
|
incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 1, c.doubleValue());
|
Driver driver = driverService.selectById(orderCrossCity.getDriverId());
|
driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
driverService.updateById(driver);
|
|
// TODO: 2020/5/24 这里需要给司机和用户推送订单状态
|
new Thread(new Runnable() {
|
@Override
|
public void run() {
|
pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
|
pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState(), 0);
|
pushUtil.pushDriverPosition(orderCrossCity.getId(), 3);
|
}
|
}).start();
|
|
systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", orderCrossCity.getUserId(), 1);
|
}
|
|
/**
|
* 获取订单编号
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public synchronized String getOrderNum(Integer driverId, Integer lineShiftDriverId) throws Exception{
|
List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryOrders(driverId, lineShiftDriverId, Arrays.asList(2, 3, 4, 7));
|
if(orderCrossCities.size() > 0){
|
return orderCrossCities.get(0).getOrderNum();
|
}
|
int size = this.selectCount(null);
|
while (true){
|
String orderNum = "CROSS" + String.valueOf(1000000 + size + 1).substring(1);
|
List<OrderCrossCity> orderNum1 = this.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", orderNum));
|
if(orderNum1.size() == 0){
|
return orderNum;
|
}
|
size++;
|
}
|
}
|
|
|
@Override
|
public ResultUtil queryOrderMoney(String startLonLat, String endLonLat, Integer peopleNumber, Integer travelMode, Integer lineId, Integer serverCarModelId, Integer totalSeat, String seatNumber) throws Exception {
|
Map<String, String> distance = gdMapElectricFenceUtil.getDistance(startLonLat, endLonLat, 1);//调用高德计算距离
|
if(null != distance){
|
return this.getPrice(Double.valueOf(distance.get("distance")), peopleNumber, travelMode, lineId, serverCarModelId, totalSeat, seatNumber);
|
}
|
return ResultUtil.error("计算行程距离出错啦!");
|
}
|
|
|
@Override
|
public List<OrderCrossCity> queryListOrder(Integer driverId, Integer lineShiftId, List<Integer> state, String day) throws Exception {
|
return orderCrossCityMapper.queryListOrder(driverId, lineShiftId, state, day);
|
}
|
|
|
/**
|
* 计算价格
|
* @param distance
|
* @param peopleNumber
|
* @param travelMode
|
* @param lineId
|
* @param serverCarModelId
|
* @param totalSeat
|
* @param seatNumber
|
* @return
|
*/
|
public ResultUtil<Map<String, Object>> getPrice(Double distance, Integer peopleNumber, Integer travelMode, Integer lineId, Integer serverCarModelId, Integer totalSeat, String seatNumber){
|
if(0 >= peopleNumber && peopleNumber > 6){
|
return ResultUtil.error("请输入正确的乘车人数");
|
}
|
|
Map<String, Object> map = new HashMap<>();
|
double distance1 = distance.doubleValue() / 1000;//公里
|
map.put("distance", distance);
|
|
/**
|
* 1.固定价格的包车是整车价格
|
* 2.五座车和七座车的优惠系数是中间特殊位置的优惠折扣
|
* 3.包车的情况不享受中间特殊位置的优惠折扣
|
* 4.浮动计费拼车如果选中中间特殊位置既享受优惠系数又享受中间特殊位置的优惠折扣
|
*/
|
Map<String, Object> query = linePriceMapper.query(lineId, serverCarModelId);
|
if(null == query){
|
map.put("distance", 0);
|
map.put("price", 0);
|
return ResultUtil.success(map);
|
}
|
String content = query.get("content").toString();
|
JSONObject jsonObject = JSON.parseObject(content);
|
if(Integer.valueOf(query.get("type").toString()) == 1){//固定金额
|
double num1 = Double.valueOf(jsonObject.getString("num1")).doubleValue();
|
double num2 = Double.valueOf(jsonObject.getString("num2")).doubleValue();
|
double num3 = Double.valueOf(jsonObject.getString("num3")).doubleValue();
|
double num4 = Double.valueOf(jsonObject.getString("num4")).doubleValue();
|
if(travelMode == 1){//拼车
|
String[] split = seatNumber.split(",");
|
boolean b = false;
|
for(String s : split){
|
if((totalSeat == 4 && s.equals("3")) || (totalSeat == 6 && s.equals("5"))){
|
b = true;
|
break;
|
}
|
}
|
double price1 = 0D;
|
if(b){
|
price1 = num1 * (totalSeat == 4 ? num3 : num4);
|
peopleNumber -= 1;
|
}
|
double price = (num1 * peopleNumber) + price1;
|
map.put("price", new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
}else{
|
map.put("price", num2);//包车价
|
}
|
|
}else{//浮动计费
|
//计算公式:实际历程 * 基础单价 * (参考费用 / (参考里程 * 基础单价)) + (实际历程 - 参考里程) * 基础单价 * 优惠系数
|
double num1 = Double.valueOf(jsonObject.getString("num1")).doubleValue();//参考费用
|
double num2 = Double.valueOf(jsonObject.getString("num2")).doubleValue();//参考里程
|
double num3 = Double.valueOf(jsonObject.getString("num3")).doubleValue();//基础单价
|
double num4 = Double.valueOf(jsonObject.getString("num4")).doubleValue();//优惠系数
|
double num5 = Double.valueOf(jsonObject.getString("num5")).doubleValue();//包车系数
|
double num6 = Double.valueOf(jsonObject.getString("num6")).doubleValue();//五座系数
|
double num7 = Double.valueOf(jsonObject.getString("num7")).doubleValue();//七座系数
|
if(travelMode == 1){//拼车
|
double unitPrice = (distance1 * num3 * (num1 / (num2 * num3))) + ((distance1 - num2) * num3 * num4);
|
String[] split = seatNumber.split(",");
|
boolean b = false;
|
for(String s : split){
|
if((totalSeat == 4 && s.equals("3")) || (totalSeat == 6 && s.equals("5"))){
|
b = true;
|
break;
|
}
|
}
|
double price1 = 0D;
|
if(b){
|
price1 = unitPrice * (totalSeat == 4 ? num6 : num7);
|
peopleNumber -= 1;
|
}
|
double price = (unitPrice * peopleNumber) + price1;
|
map.put("price", new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
}else{
|
double unitPrice = (distance1 * num3 * (num1 / (num2 * num3))) + ((distance1 - num2) * num3 * num5);
|
double price = unitPrice * totalSeat;
|
map.put("price", new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
}
|
}
|
return ResultUtil.success(map);
|
}
|
}
|