package com.stylefeng.guns.modular.crossCity.server.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.crossCity.dao.LinePriceMapper;
|
import com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper;
|
import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper;
|
import com.stylefeng.guns.modular.crossCity.model.Line;
|
import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver;
|
import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
|
import com.stylefeng.guns.modular.crossCity.server.ILineService;
|
import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
|
import com.stylefeng.guns.modular.crossCity.warpper.OrderCrossCityWarpper;
|
import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper;
|
import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
|
import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
|
import com.stylefeng.guns.modular.system.dao.PhoneMapper;
|
import com.stylefeng.guns.modular.system.dao.RegionMapper;
|
import com.stylefeng.guns.modular.system.dao.SysIntegralMapper;
|
import com.stylefeng.guns.modular.system.dao.UserInfoMapper;
|
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.taxi.dao.OrderTaxiMapper;
|
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.io.File;
|
import java.io.FileWriter;
|
import java.io.PrintWriter;
|
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;
|
|
@Autowired
|
private ILineService lineService;
|
|
@Autowired
|
private ISystemNoticeService systemNoticeService;
|
|
@Autowired
|
private PushUtil pushUtil;
|
|
@Autowired
|
private IIncomeService incomeService;
|
|
@Autowired
|
private IDriverService driverService;
|
|
@Resource
|
private UserInfoMapper userInfoMapper;
|
|
@Autowired
|
private DateUtil dateUtil;
|
|
@Resource
|
private LinePriceMapper linePriceMapper;
|
|
@Autowired
|
private GDMapGeocodingUtil gdMapGeocodingUtil;
|
|
@Autowired
|
private GDFalconUtil gdFalconUtil;
|
|
@Resource
|
private RegionMapper regionMapper;
|
|
@Autowired
|
private ChinaMobileUtil chinaMobileUtil;
|
|
/*@Autowired
|
private ICBCPayUtil icbcPayUtil;*/
|
|
@Autowired
|
private PayMoneyUtil payMoneyUtil;
|
|
@Autowired
|
private ITransactionDetailsService transactionDetailsService;
|
|
@Autowired
|
private GDMapElectricFenceUtil gdMapElectricFenceUtil;
|
|
@Autowired
|
private IPaymentRecordService paymentRecordService;
|
|
@Resource
|
private SysIntegralMapper sysIntegralMapper;
|
|
@Resource
|
private OrderPrivateCarMapper orderPrivateCarMapper;
|
|
@Resource
|
private OrderTaxiMapper orderTaxiMapper;
|
|
@Resource
|
private PhoneMapper phoneMapper;
|
|
@Autowired
|
private IOrderPositionService orderPositionService;
|
|
@Autowired
|
private IOrderCancelService orderCancelService;
|
|
@Value("${filePath}")
|
private String filePath;
|
|
@Value("${callbackPath}")
|
private String callbackPath;
|
|
|
/**
|
* 获取司机抢单页面的订单详情
|
* @param orderId
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public Map<String, Object> queryPushOrder(Integer orderId) throws Exception {
|
return orderCrossCityMapper.queryPushOrder(orderId);
|
}
|
|
|
|
/**
|
* 获取司机端首页订单列表
|
* @param state 1=服务中,2=待服务(30分钟定义预约)
|
* @param driverId
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public List<Map<String, Object>> queryOrderList(Integer language, Integer state, Integer driverId) throws Exception {
|
List<Map<String, Object>> list = orderCrossCityMapper.queryOrderList(state, driverId);
|
for (Map<String, Object> map : list) {
|
if(null != map.get("time")){
|
String time = map.get("time").toString();
|
map.put("time", DateUtil.conversionFormat(language, time));
|
}
|
}
|
return list;
|
}
|
|
/**
|
* 获取我的订单列表数据
|
* @param state 1=全部,2=待支付,3=已取消
|
* @param uid
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public List<Map<String, Object>> queryMyAllOrder(Integer language, Integer state, Integer uid) throws Exception {
|
List<Map<String, Object>> list = orderCrossCityMapper.queryMyAllOrder(state, uid);
|
for (Map<String, Object> map : list) {
|
if(null != map.get("time")){
|
String time = map.get("time").toString();
|
map.put("time", DateUtil.conversionFormat(language, time));
|
}
|
}
|
return list;
|
}
|
|
|
/**
|
* 获取订单详情页(服务中的页面)
|
* @param orderId
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public Map<String, Object> queryOrderInfo(Integer language, Integer orderId) throws Exception {
|
Map<String, Object> map = new HashMap<>();
|
OrderCrossCity orderCrossCity = this.selectById(orderId);
|
List<Map<String, Object>> order = orderCrossCityMapper.queryOrderInfo(orderCrossCity.getOrderNum());
|
int num = 0;
|
Double serverMoney = 0D;
|
Double totalMoney = 0D;
|
for(Map<String, Object> m : order){
|
if(null != m.get("travelTime_")){
|
String travelTime_ = m.get("travelTime_").toString();
|
m.put("travelTime_", DateUtil.conversionFormat1(language, travelTime_));
|
}
|
if(null != m.get("travelTime")){
|
String travelTime = m.get("travelTime").toString();
|
m.put("travelTime", DateUtil.conversionFormat(language, travelTime));
|
}
|
if(null != m.get("arriveTime")){
|
String arriveTime = m.get("arriveTime").toString();
|
m.put("arriveTime", DateUtil.conversionFormat(language, arriveTime));
|
}
|
num += Integer.valueOf(m.get("peopleNumber").toString());
|
totalMoney += Double.valueOf(m.get("payMoney").toString());
|
List<Income> incomes = incomeService.queryData(1, null, 2, Integer.valueOf(m.get("orderId").toString()), 3);
|
for (Income income : incomes){
|
serverMoney += income.getMoney();
|
}
|
}
|
Line line = lineService.selectById(orderCrossCity.getLineId());
|
|
map.put("line", line.getName());
|
map.put("peopleNumber", num);
|
map.put("orderNumber", orderCrossCity.getOrderNum());
|
map.put("totalMoney", new BigDecimal(totalMoney).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
map.put("serverMoney", new BigDecimal(serverMoney).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
Phone phone = phoneMapper.queryInfo(Integer.valueOf(order.get(0).get("companyId").toString()), 1);
|
map.put("emergencyCall", null != phone ? phone.getPhone() : "110");
|
map.put("orders", JSON.toJSONString(order));
|
return map;
|
}
|
|
|
|
/**
|
* 走订单流程操作
|
* @param orderId
|
* @param state
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil process(Integer orderId, Integer state, Double lon, Double lat, String address) throws Exception {
|
OrderCrossCity orderCrossCity = this.selectById(orderId);
|
switch (state){
|
case 3://出发前往预约点
|
orderCrossCity.setState(3);
|
orderCrossCity.setSetOutTime(new Date());
|
systemNoticeService.addSystemNotice(1, "司机已出发,请耐心等待", orderCrossCity.getUserId());
|
pushUtil.pushDriverPosition(orderCrossCity.getId(), 3);//主动推送司机定位
|
break;
|
case 4://到达预约点,等待客户上车
|
orderCrossCity.setState(4);
|
orderCrossCity.setArriveTime(new Date());
|
systemNoticeService.addSystemNotice(1, "司机已到达您设置的预约地点,请及时上车", orderCrossCity.getUserId());
|
break;
|
case 5://开始服务
|
orderCrossCity.setBoardingLon(lon);
|
orderCrossCity.setBoardingLat(lat);
|
orderCrossCity.setBoardingAddress(address);
|
orderCrossCity.setBoardingTime(new Date());
|
orderCrossCity.setState(5);
|
orderCrossCity.setStartServiceTime(new Date());
|
break;
|
case 6://结束服务
|
orderCrossCity.setGetoffLon(lon);
|
orderCrossCity.setGetoffLat(lat);
|
orderCrossCity.setGetoffAddress(address);
|
orderCrossCity.setGetoffTime(new Date());
|
orderCrossCity.setState(8);//跨城直接到待评价
|
orderCrossCity.setEndServiceTime(new Date());
|
|
//还原座位数
|
LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
|
lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
|
lineShiftDriver.setLaveSeatNumber(
|
(ToolUtil.isNotEmpty(lineShiftDriver.getLaveSeatNumber()) ? lineShiftDriver.getLaveSeatNumber() + "," : "") +
|
orderCrossCity.getSeatNumber()
|
);
|
lineShiftDriverMapper.updateById(lineShiftDriver);
|
|
//修改司机空闲状态
|
List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryWithin30Minutes(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11);
|
if(orderCrossCities.size() == 0){
|
Driver driver = driverService.selectById(orderCrossCity.getDriverId());
|
driver.setState(2);
|
driverService.updateById(driver);
|
}
|
|
pushUtil.removeTask(orderId, 3);//删除定时任务,结束推送数据
|
systemNoticeService.addSystemNotice(1, "司机已结束本次行程,谢谢使用", orderCrossCity.getUserId());
|
break;
|
}
|
this.updateById(orderCrossCity);
|
|
// TODO: 2020/6/5 推送状态
|
new Thread(new Runnable() {
|
@Override
|
public void run() {
|
pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 2, orderCrossCity.getState());
|
pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 2, orderCrossCity.getState());
|
}
|
}).start();
|
return ResultUtil.success();
|
}
|
|
|
/**
|
* 获取订单明细
|
* @param orderId
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public Map<String, Object> queryOrderCrossCityInfo(Integer language, Integer orderId) throws Exception {
|
Map<String, Object> map = orderCrossCityMapper.queryOrderCrossCityInfo(orderId);
|
if(null != map.get("travelTime_")){
|
String travelTime_ = map.get("travelTime_").toString();
|
map.put("travelTime_", DateUtil.conversionFormat1(language, travelTime_));
|
}
|
if(null != map.get("arriveTime")){
|
String arriveTime = map.get("arriveTime").toString();
|
map.put("arriveTime", DateUtil.conversionFormat(language, arriveTime));
|
}
|
return map;
|
}
|
|
|
/**
|
* 修改订单顺序
|
* @param orderId
|
* @throws Exception
|
*/
|
@Override
|
public void setOrderCrossCitySort(Integer orderId) throws Exception {
|
OrderCrossCity orderCrossCity = this.selectById(orderId);
|
List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", orderCrossCity.getOrderNum()).ne("state", 10));
|
for(int i = 0; i < orderCrossCities.size(); i++){
|
if(orderId == orderCrossCities.get(i).getId()){
|
if(i == 0){
|
return;
|
}
|
Integer sort = orderCrossCities.get(i).getSort();
|
OrderCrossCity orderCrossCity1 = orderCrossCities.get(i - 1);
|
orderCrossCities.get(i).setSort(orderCrossCity1.getSort());
|
orderCrossCity1.setSort(sort);
|
orderCrossCityMapper.updateById(orderCrossCities.get(i));
|
orderCrossCityMapper.updateById(orderCrossCity1);
|
}
|
}
|
|
}
|
|
|
|
|
|
/**
|
* 跨城下单操作
|
* @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 = userInfoMapper.queryByPhone(orderCrossCityWarpper.getPassengersPhone());
|
if(userInfo == null){//添加用户信息
|
userInfo = new UserInfo();
|
Integer integer = userInfoMapper.selectCount(null) + 1000001;
|
userInfo.setNickName(ToolUtil.isNotEmpty(orderCrossCityWarpper.getPassengers()) ? orderCrossCityWarpper.getPassengers() : "OK" + String.valueOf(integer).substring(1));
|
userInfo.setLastName(orderCrossCityWarpper.getPassengers());
|
userInfo.setPhone(orderCrossCityWarpper.getPassengersPhone());
|
userInfo.setState(1);
|
userInfo.setFlag(1);
|
userInfo.setInsertTime(new Date());
|
userInfo.setInsertUser(uid);
|
userInfoMapper.insert(userInfo);
|
}
|
orderCrossCity.setUserId(userInfo.getId());
|
|
/**
|
* 1.下了即时单就不能下预约单和即时单
|
* 2.下了预约单和再下一张即时单不能再下预约单
|
*/
|
List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(orderCrossCity.getUserId(), 1, 1, 1, 2, 3, 4, 5, 6, 7, 11);
|
if(orderPrivateCars.size() > 0){
|
return ResultUtil.error("有未完成的订单");
|
}
|
List<OrderTaxi> list = orderTaxiMapper.queryByState_(orderCrossCity.getUserId(), 1, 1, 1, 2, 3, 4, 5, 6, 11);
|
if(list.size() > 0){
|
return ResultUtil.error("有未完成的订单");
|
}
|
List<OrderCrossCity> orderCrossCities1 = orderCrossCityMapper.queryByState(orderCrossCity.getUserId(), 1, 2, 3, 4, 5, 7, 11);
|
if(orderCrossCities1.size() > 0){
|
return ResultUtil.error("有未完成的订单");
|
}
|
|
List<OrderCrossCity> orderCrossCities2 = orderCrossCityMapper.queryOrders(orderCrossCityWarpper.getDriverId(), orderCrossCityWarpper.getLineShiftDriverId(), Arrays.asList(5));
|
if(orderCrossCities2.size() > 0){
|
return ResultUtil.error("司机正在服务中");
|
}
|
|
|
orderCrossCity.setPassengers(orderCrossCityWarpper.getPassengers());
|
orderCrossCity.setPassengersPhone(orderCrossCityWarpper.getPassengersPhone());
|
orderCrossCity.setServerCarModelId(orderCrossCityWarpper.getServerCarModelId());
|
orderCrossCity.setDriverId(orderCrossCityWarpper.getDriverId());
|
orderCrossCity.setLineId(orderCrossCityWarpper.getLineId());
|
orderCrossCity.setCarId(orderCrossCityWarpper.getCarId());
|
orderCrossCity.setOrderNum(this.getOrderNum(orderCrossCityWarpper.getDriverId(), orderCrossCityWarpper.getLineShiftDriverId()));
|
orderCrossCity.setPlacementLon(orderCrossCityWarpper.getPlacementLon());
|
orderCrossCity.setPlacementLat(orderCrossCityWarpper.getPlacementLat());
|
String placementAddress = orderCrossCityWarpper.getPlacementAddress();
|
placementAddress = placementAddress.replaceAll("& #40;", "(");
|
placementAddress = placementAddress.replaceAll("& #41;", ")");
|
orderCrossCity.setPlacementAddress(placementAddress);
|
orderCrossCity.setStartLon(orderCrossCityWarpper.getStartLon());
|
orderCrossCity.setStartLat(orderCrossCityWarpper.getStartLat());
|
String startAddress = orderCrossCityWarpper.getStartAddress();
|
startAddress = startAddress.replaceAll("& #40;", "(");
|
startAddress = startAddress.replaceAll("& #41;", ")");
|
orderCrossCity.setStartAddress(startAddress);
|
orderCrossCity.setEndLon(orderCrossCityWarpper.getEndLon());
|
orderCrossCity.setEndLat(orderCrossCityWarpper.getEndLat());
|
String endAddress = orderCrossCityWarpper.getEndAddress();
|
endAddress = endAddress.replaceAll("& #40;", "(");
|
endAddress = endAddress.replaceAll("& #41;", ")");
|
orderCrossCity.setEndAddress(endAddress);
|
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);
|
orderCrossCity.setLineShiftDriverId(orderCrossCityWarpper.getLineShiftDriverId());
|
//调用高德创建轨迹
|
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(sp.equals(spl)){
|
b = false;
|
break;
|
}
|
}
|
if(b){
|
seatNumber += sp + ",";
|
}
|
}
|
lineShiftDriver.setLaveSeatNumber(ToolUtil.isNotEmpty(seatNumber) ? seatNumber.substring(0, seatNumber.length() - 1) : "");
|
}
|
lineShiftDriverMapper.updateById(lineShiftDriver);
|
|
//添加消息
|
systemNoticeService.addSystemNotice(1, "您的跨城订单已下单成功!", orderCrossCity.getUserId());
|
|
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 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), new MathContext(2, RoundingMode.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());
|
pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState());
|
}
|
}).start();
|
|
systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", orderCrossCity.getUserId());
|
}
|
|
|
|
|
/**
|
* 计算支付金额
|
* @param startLonLat
|
* @param endLonLat
|
* @param peopleNumber
|
* @param travelMode
|
* @param lineId
|
* @param serverCarModelId
|
* @return
|
* @throws Exception
|
*/
|
@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("计算行程距离出错啦!");
|
}
|
|
|
|
|
/**
|
* 订单支付
|
* @param payType
|
* @param orderId
|
* @param couponId
|
* @param type
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil payCrossCityOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception {
|
OrderCrossCity orderCrossCity = this.selectById(orderId);
|
if(orderCrossCity.getState() != 7){
|
return ResultUtil.error("订单已被支付,不允许重复支付");
|
}
|
Integer uid = orderCrossCity.getUserId();
|
Double orderMoney = orderCrossCity.getOrderMoney();
|
ResultUtil resultUtil = ResultUtil.success("");
|
orderCrossCity.setCouponMoney(0D);//初始化历史数据
|
orderCrossCity.setCouponId(null);
|
|
if(payType == 1){//微信支付
|
ResultUtil resultUtil1 = payMoneyUtil.weixinpay("完成订单",orderId+"",orderId + ",3",orderMoney+"","/base/wxPayCrossCity","APP");
|
//Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayCrossCity", "", type, null);
|
if(resultUtil1.getCode()==200){
|
paymentRecordService.saveData(1, null, null, orderId, 3, 1, orderMoney, null, 1);//添加预支付数据
|
resultUtil = resultUtil1;
|
}else{
|
resultUtil = ResultUtil.error("获取支付信息失败", "");
|
}
|
}
|
if(payType == 2){//支付宝支付
|
ResultUtil resultUtil1 = payMoneyUtil.alipay("完成订单","完成订单",orderId + ",3",orderMoney+"","/base/aliPayCrossCity");
|
//Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",3", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayCrossCity", "", type, null);
|
if(resultUtil1.getCode()==200){
|
paymentRecordService.saveData(1, null, null, orderId, 3, 2, orderMoney, null, 1);//添加预支付数据
|
resultUtil = resultUtil1;
|
}else{
|
resultUtil = ResultUtil.error("获取支付信息失败", "");
|
}
|
}
|
/*if(payType == 3){//扫码支付
|
//调用支付获取收款二维码数据
|
ResultUtil<Map<String, Object>> generate = icbcPayUtil.generate(orderCrossCity.getId() + ",3", orderMoney, orderCrossCity.getInsertTime(), orderCrossCity.getOrderNum(), callbackPath + "/base/order/generatePay");
|
resultUtil = ResultUtil.success(generate.getData().get("qrcode").toString());
|
}*/
|
|
this.updateAllColumnById(orderCrossCity);
|
return resultUtil;
|
}
|
|
|
|
/**
|
* 支付成功后的回调操作
|
* @param id 订单=id
|
* @param order_id 工行支付单号
|
* @param type 1=微信,2=支付宝
|
* @throws Exception
|
*/
|
@Override
|
public void payOrderCrossCityCallback(Integer id, String order_id, Integer type) throws Exception {
|
OrderCrossCity orderCrossCity = this.selectById(id);
|
if(orderCrossCity.getState() == 7){
|
PaymentRecord query = paymentRecordService.query(1, null, null, id, 3, type, 1);
|
if(null == query){
|
System.err.println("预支付数据异常(orderId = " + id + ")");
|
}
|
//添加交易明细
|
transactionDetailsService.saveData(orderCrossCity.getUserId(), "完成订单", query.getAmount(), 2, 1, 1, 3, query.getOrderId());
|
orderCrossCity.setState(2);//先支付再服务
|
orderCrossCity.setPayType(type);
|
orderCrossCity.setPayMoney(query.getAmount());
|
this.updateById(orderCrossCity);
|
|
UserInfo userInfo = userInfoMapper.selectById(orderCrossCity.getUserId());
|
SysIntegral query1 = sysIntegralMapper.query(orderCrossCity.getCompanyId());
|
userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
|
userInfoMapper.updateById(userInfo);
|
|
query.setState(2);
|
query.setCode(order_id);
|
paymentRecordService.updateById(query);
|
|
//添加已收入明细
|
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), new MathContext(2, RoundingMode.HALF_EVEN)));//企业收入
|
BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入
|
incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 3, d.doubleValue());
|
incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3, 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());
|
pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 3, orderCrossCity.getState());
|
}
|
}).start();
|
|
|
systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功完成出行订单支付,谢谢使用!", orderCrossCity.getUserId());
|
}
|
}
|
|
@Override
|
public boolean calculateMileage(OrderPosition orderPosition) throws Exception {
|
Integer orderId = orderPosition.getOrderId();
|
String lon = orderPosition.getLon();
|
String lat = orderPosition.getLat();
|
OrderCrossCity order = this.selectById(orderId);
|
if(null == order){
|
System.err.println("订单数据异常:" + orderId);
|
return false;
|
}
|
|
//跨城记录所有服务完成之前的订单服务距离
|
List<OrderCrossCity> orderCrossCities = this.selectList(new EntityWrapper<OrderCrossCity>().eq("orderNum", order.getOrderNum()).eq("isDelete", 1).in("state", Arrays.asList(2, 3, 4, 5)));
|
for(OrderCrossCity orderCrossCity : orderCrossCities){
|
boolean b = false;
|
OrderPosition orderPosition1 = orderPositionService.queryNew(orderCrossCity.getId(), 3);
|
if(null != orderPosition1){
|
String now = lon + "," + lat;
|
String old = orderPosition1.getLon() + "," + orderPosition1.getLat();
|
Map<String, Double> distance = GeodesyUtil.getDistance(now, old);//直线距离
|
if(null != distance){
|
Double distance1 = distance.get("WGS84");
|
if(distance1 > 50){//大于50米表示在移动
|
orderCrossCity.setMileage(new BigDecimal(orderCrossCity.getMileage()).add(new BigDecimal(distance1)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
this.updateById(orderCrossCity);
|
b = true;
|
}
|
}else{
|
System.err.println("调用高德计算距离出错");
|
}
|
}else{
|
orderCrossCity.setMileage(0D);
|
this.updateById(orderCrossCity);
|
b = true;//第一条数据不作处理,直接存储
|
}
|
if(b){
|
//先计算里程,在存储最新位置
|
orderPosition.setInsertTime(new Date());
|
//将数据存储到文件中
|
List<OrderPosition> orderPositions = orderPositionService.queryPosition(orderCrossCity.getId(), 3);
|
File file = new File(filePath + orderCrossCity.getId() + "_3" + ".txt");
|
if(!file.exists()){
|
file.getParentFile().mkdirs();
|
file.createNewFile();
|
}
|
//写入相应的文件
|
PrintWriter out = new PrintWriter(new FileWriter(file));
|
orderPositions.add(orderPosition);
|
System.err.println("存储新数据:" + JSON.toJSONString(orderPositions));
|
out.write(JSON.toJSONString(orderPositions));
|
out.flush();
|
out.close();
|
}
|
}
|
return false;//上层不需要处理
|
}
|
|
@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);
|
}
|
|
|
|
|
/**
|
* 获取订单编号
|
* @return
|
* @throws Exception
|
*/
|
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);
|
return "CROSS" + String.valueOf(1000000 + size + 1).substring(1);
|
}
|
}
|