package com.stylefeng.guns.modular.system.controller.specialTrain;
|
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.baomidou.mybatisplus.plugins.Page;
|
import com.stylefeng.guns.core.base.controller.BaseController;
|
import com.stylefeng.guns.core.beetl.ShiroExtUtil;
|
import com.stylefeng.guns.core.common.constant.factory.PageFactory;
|
import com.stylefeng.guns.core.shiro.ShiroUser;
|
import com.stylefeng.guns.core.util.DateUtil;
|
import com.stylefeng.guns.core.util.SinataUtil;
|
import com.stylefeng.guns.core.util.ToolUtil;
|
import com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper;
|
import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
|
import com.stylefeng.guns.modular.system.model.*;
|
import com.stylefeng.guns.modular.system.service.*;
|
import com.stylefeng.guns.modular.system.util.*;
|
import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
|
import com.stylefeng.guns.modular.system.util.PayMoneyUtil;
|
import com.stylefeng.guns.modular.system.util.PushURL;
|
import com.stylefeng.guns.modular.system.util.ResultUtil;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.data.domain.Sort;
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
import org.springframework.data.mongodb.core.query.Criteria;
|
import org.springframework.data.mongodb.core.query.Query;
|
import org.springframework.stereotype.Controller;
|
import org.springframework.ui.Model;
|
import org.springframework.web.bind.annotation.*;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.math.BigDecimal;
|
import java.util.*;
|
|
/**
|
* 跨城出行订单控制器
|
*
|
* @author fengshuonan
|
* @Date 2020-09-16 14:56:46
|
*/
|
@Controller
|
@RequestMapping("/tOrderCrossCity")
|
public class TOrderCrossCityController extends BaseController {
|
|
private String PREFIX = "/system/tOrderCrossCity/";
|
|
@Autowired
|
private ITOrderCrossCityService tOrderCrossCityService;
|
|
@Autowired
|
private ITServerCarmodelService tServerCarmodelService;
|
|
@Autowired
|
private ITLineService itLineService;
|
|
@Autowired
|
private ITOrderPositionService tOrderPositionService;
|
|
private ResultUtil resultUtil;
|
|
@Autowired
|
private ITUserService userService;
|
|
@Resource
|
private MongoTemplate mongoTemplate;
|
@Autowired
|
private ShiroExtUtil shiroExtUtil;
|
|
|
/**
|
* 跳转到跨城出行订单首页
|
*/
|
@RequestMapping("")
|
public String index(Model model) {
|
//服务快车车型
|
List<TServerCarmodel> carmodelList = tServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 2).eq("state", 1));
|
model.addAttribute("carmodelList", carmodelList);
|
//线路
|
List<TLine> lineList = itLineService.selectList(new EntityWrapper<TLine>().last(" where not FIND_IN_SET(state,'3')"));
|
model.addAttribute("lineList",lineList);
|
return PREFIX + "tOrderCrossCity.html";
|
}
|
|
/**
|
* 跳转到查看跨城出行订单详情页面
|
*/
|
@RequestMapping("/tOrderCrossCity_detail/{tOrderCrossCityId}")
|
public String tOrderCrossCityUpdate(@PathVariable Integer tOrderCrossCityId, Model model) {
|
Map<String, Object> item = tOrderCrossCityService.getCrossCityOrderDetailById(tOrderCrossCityId);
|
model.addAttribute("item",item);
|
return PREFIX + "tOrderCrossCity_detail.html";
|
}
|
|
/**
|
* 跳转到跨城出行订单轨迹页面
|
*/
|
@RequestMapping("/tOrderCrossCity_track/{tOrderCrossCityId}")
|
public String tOrderCrossCity_track(@PathVariable Integer tOrderCrossCityId, Model model) {
|
model.addAttribute("tOrderCrossCityId",tOrderCrossCityId);
|
return PREFIX + "tOrderCrossCity_track.html";
|
}
|
|
/**
|
* 获取订单轨迹
|
*
|
* @param orderDetailId
|
* @return
|
*/
|
@ResponseBody
|
@RequestMapping(value = "/getOrderTrack", method = RequestMethod.POST)
|
public ResultUtil getOrderTrack(Integer orderDetailId) {
|
if (ToolUtil.isNotEmpty(orderDetailId)) {
|
try {
|
Query query = new Query()
|
.addCriteria(Criteria.where("orderId").is(orderDetailId).and("orderType").is(3))
|
.with(new Sort(Sort.Direction.ASC, "insertTime"));
|
List<TOrderPosition> positions = mongoTemplate.find(query, TOrderPosition.class);
|
resultUtil = ResultUtil.success(positions);
|
} catch (Exception e) {
|
e.printStackTrace();
|
resultUtil = ResultUtil.runErr();
|
}
|
} else {
|
resultUtil = ResultUtil.paranErr();
|
}
|
return resultUtil;
|
}
|
|
/**
|
* 获取跨城出行订单列表
|
*/
|
@RequestMapping(value = "/list")
|
@ResponseBody
|
public Object list(String insertTime,
|
String orderNum,
|
Integer orderSource,
|
String userName,
|
String userPhone,
|
String passengers,
|
String passengersPhone,
|
Integer serverCarModelId,
|
String driver,
|
Integer lineId,
|
Integer state,
|
Integer abnormal,
|
Integer promotion,
|
String promotionUser) {
|
String beginTime = null;
|
String endTime = null;
|
if (SinataUtil.isNotEmpty(insertTime)){
|
String[] timeArray = insertTime.split(" - ");
|
beginTime = timeArray[0];
|
endTime = timeArray[1];
|
}
|
Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
|
page.setRecords(tOrderCrossCityService.getCrossCityOrderList(page, beginTime, endTime, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId(), orderNum, orderSource, userName, userPhone, passengers, passengersPhone, serverCarModelId, driver, lineId, state, abnormal, promotion, promotionUser,null));
|
return super.packForBT(page);
|
}
|
|
|
|
@GetMapping("/export")
|
@ResponseBody
|
public void export(String insertTime,
|
String orderNum,
|
Integer orderSource,
|
String userName,
|
String userPhone,
|
String passengers,
|
String passengersPhone,
|
Integer serverCarModelId,
|
String driver,
|
Integer lineId,
|
Integer state,
|
Integer abnormal,
|
Integer promotion,
|
String promotionUser, HttpServletRequest request, HttpServletResponse response) {
|
try {
|
String beginTime = null;
|
String endTime = null;
|
if (SinataUtil.isNotEmpty(insertTime)) {
|
String[] timeArray = insertTime.split(" - ");
|
beginTime = timeArray[0];
|
endTime = timeArray[1];
|
}
|
List<Map<String, Object>> list = tOrderCrossCityService.getCrossCityOrderListExport(null, beginTime, endTime, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId(), orderNum, orderSource, userName, userPhone, passengers, passengersPhone, serverCarModelId, driver, lineId, state, abnormal, promotion, promotionUser,null);
|
|
// 表格数据【封装】
|
List<List<String>> dataList = new ArrayList<>();
|
|
//第一行显示【封装】
|
List<String> twoList = new ArrayList<String>();
|
twoList.add("总计:");
|
twoList.add(String.valueOf(list.size())+"条");
|
dataList.add(twoList);
|
|
// 列【封装】
|
List<String> shellList = new ArrayList<String>();
|
shellList.add("下单时间");
|
shellList.add("订单编号");
|
shellList.add("订单来源");
|
shellList.add("乘车时间");
|
shellList.add("下单用户昵称");
|
shellList.add("下单用户手机");
|
shellList.add("乘车用户姓名");
|
shellList.add("乘车用户手机");
|
shellList.add("起点");
|
shellList.add("终点");
|
shellList.add("线路名称");
|
shellList.add("选择车型");
|
shellList.add("接单司机");
|
shellList.add("接单车辆");
|
shellList.add("订单金额");
|
shellList.add("状态");
|
shellList.add("是否异常订单");
|
shellList.add("是否推广订单");
|
shellList.add("推广员姓名");
|
shellList.add("推广员电话");
|
dataList.add(shellList);
|
|
for (Map<String,Object> object : list){
|
// 详细数据列【封装】
|
shellList = new ArrayList<String>();
|
if(SinataUtil.isNotEmpty(object.get("insertTime"))){
|
shellList.add(DateUtil.formatDate(DateUtil.parse(object.get("insertTime").toString(),"YYYY-MM-dd HH:mm:ss.S"), "YYYY-MM-dd HH:mm:ss"));
|
}else{
|
shellList.add("-");
|
}
|
if(SinataUtil.isNotEmpty(object.get("orderNum"))){
|
shellList.add(object.get("orderNum").toString());
|
}else{
|
shellList.add("-");
|
}
|
|
// 1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单
|
if(SinataUtil.isNotEmpty(object.get("orderSource"))){
|
switch (object.get("orderSource").toString()){
|
case "1":
|
shellList.add("APP下单");
|
break;
|
case "2":
|
shellList.add("扫码下单");
|
break;
|
case "3":
|
shellList.add("小程序下单");
|
break;
|
case "4":
|
shellList.add("司机下单");
|
break;
|
case "5":
|
shellList.add("调度下单");
|
break;
|
case "6":
|
shellList.add("道行龙城下单");
|
break;
|
default:
|
shellList.add("-");
|
break;
|
}
|
|
}
|
|
if(SinataUtil.isNotEmpty(object.get("travelTime"))){
|
shellList.add(DateUtil.formatDate(DateUtil.parse(object.get("travelTime").toString(),"YYYY-MM-dd HH:mm:ss.S"), "YYYY-MM-dd HH:mm:ss"));
|
}else{
|
shellList.add("-");
|
}
|
|
|
if(SinataUtil.isNotEmpty(object.get("userName"))){
|
shellList.add(object.get("userName").toString());
|
}else{
|
shellList.add("-");
|
}
|
|
if(SinataUtil.isNotEmpty(object.get("userPhone"))){
|
shellList.add(object.get("userPhone").toString());
|
}else{
|
shellList.add("-");
|
}
|
|
if(SinataUtil.isNotEmpty(object.get("passengers"))){
|
shellList.add(object.get("passengers").toString());
|
}else{
|
shellList.add("-");
|
}
|
|
if(SinataUtil.isNotEmpty(object.get("passengersPhone"))){
|
shellList.add(object.get("passengersPhone").toString());
|
}else{
|
shellList.add("-");
|
}
|
|
if(SinataUtil.isNotEmpty(object.get("contactPersonPhone"))){
|
shellList.add(object.get("contactPersonPhone").toString());
|
}else{
|
shellList.add("-");
|
}
|
|
if(SinataUtil.isNotEmpty(object.get("startAddress"))){
|
shellList.add(object.get("startAddress").toString());
|
}else{
|
shellList.add("-");
|
}
|
|
if(SinataUtil.isNotEmpty(object.get("endAddress"))){
|
shellList.add(object.get("endAddress").toString());
|
}else{
|
shellList.add("-");
|
}
|
if(SinataUtil.isNotEmpty(object.get("lineName"))){
|
shellList.add(object.get("lineName").toString());
|
}else{
|
shellList.add("-");
|
}
|
if(SinataUtil.isNotEmpty(object.get("serverCarModelName"))){
|
shellList.add(object.get("serverCarModelName").toString());
|
}else{
|
shellList.add("-");
|
}
|
|
if(SinataUtil.isNotEmpty(object.get("driver"))){
|
shellList.add(object.get("driver").toString());
|
}else{
|
shellList.add("-");
|
}
|
|
if(SinataUtil.isNotEmpty(object.get("car"))){
|
shellList.add(object.get("car").toString());
|
}else{
|
shellList.add("-");
|
}
|
|
if(SinataUtil.isNotEmpty(object.get("orderMoney"))){
|
shellList.add(object.get("orderMoney").toString());
|
}else{
|
shellList.add("-");
|
}
|
|
// 1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付
|
if(SinataUtil.isNotEmpty(object.get("state"))){
|
switch (object.get("state").toString()){
|
case "1":
|
shellList.add("待接单");
|
break;
|
case "2":
|
shellList.add("待出发");
|
break;
|
case "3":
|
shellList.add("待到达预约地点");
|
break;
|
case "4":
|
shellList.add("待乘客上车");
|
break;
|
case "5":
|
shellList.add("服务中");
|
break;
|
case "6":
|
shellList.add("完成服务");
|
break;
|
case "7":
|
shellList.add("待支付");
|
break;
|
case "8":
|
shellList.add("待评价");
|
break;
|
case "9":
|
shellList.add("已完成");
|
break;
|
case "10":
|
shellList.add("已取消");
|
break;
|
case "11":
|
shellList.add("改派中");
|
break;
|
case "12":
|
shellList.add("取消待支付");
|
break;
|
default:
|
shellList.add("-");
|
break;
|
}
|
}
|
|
|
if(SinataUtil.isNotEmpty(object.get("abnormal"))){
|
shellList.add(object.get("abnormal").toString().equals("1")?"否":"是");
|
}else{
|
shellList.add("-");
|
}
|
|
|
if(SinataUtil.isNotEmpty(object.get("promotion"))){
|
shellList.add(object.get("promotion").toString().equals("1")?"否":"是");
|
}else{
|
shellList.add("-");
|
}
|
|
|
if(SinataUtil.isNotEmpty(object.get("promotionUser"))){
|
shellList.add(object.get("promotionUser").toString());
|
}else{
|
shellList.add("-");
|
}
|
if(SinataUtil.isNotEmpty(object.get("promotionPhone"))){
|
shellList.add(object.get("promotionPhone").toString());
|
}else{
|
shellList.add("-");
|
}
|
|
|
dataList.add(shellList);
|
}
|
try {
|
// 调用工具类进行导出
|
ExcelExportUtil.easySheet("订单导出记录"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "订单导出记录", dataList,request, response);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
|
@Autowired
|
private ITDriverService tDriverService;
|
|
@Resource
|
private LineShiftDriverMapper lineShiftDriverMapper;
|
|
@Autowired
|
private ITransactionDetailsService transactionDetailsService;
|
|
@Autowired
|
private IPaymentRecordService paymentRecordService;
|
|
@Autowired
|
private PayMoneyUtil payMoneyUtil;
|
|
@Resource
|
private OrderCancelMapper orderCancelMapper;
|
|
@Autowired
|
private IIncomeService incomeService;
|
|
|
/**
|
* 取消跨城出行订单
|
*/
|
@RequestMapping(value = "/cancel")
|
@ResponseBody
|
public Object cancel(@RequestParam Integer tOrderCrossCityId) throws Exception {
|
TOrderCrossCity tOrderCrossCity = tOrderCrossCityService.selectById(tOrderCrossCityId);
|
ShiroUser user = shiroExtUtil.getUser();
|
|
TOrderCrossCity orderCrossCity = tOrderCrossCityService.selectById(tOrderCrossCityId);
|
if (orderCrossCity.getState() > 5 && orderCrossCity.getState() != 11 && orderCrossCity.getState() != 7) {
|
return ResultUtil.error("订单状态不在可取消范围内");
|
}
|
orderCrossCity.setState(10);
|
tOrderCrossCityService.updateById(orderCrossCity);
|
|
if (orderCrossCity.getDriverId() != null) {
|
//修改司机信息
|
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()){
|
TDriver driver = tDriverService.selectById(orderCrossCity.getDriverId());
|
driver.setState(2);
|
tDriverService.updateById(driver);
|
}
|
}
|
|
|
//已支付的情况下进行退款操作
|
if(null != orderCrossCity.getPayType() && null != orderCrossCity.getPayMoney()){
|
if(orderCrossCity.getPayType()==5){
|
TDriver driver = tDriverService.selectById(orderCrossCity.getDriverId());
|
if(orderCrossCity.getPayMoney().doubleValue()>0) {
|
}
|
}
|
|
if(orderCrossCity.getPayType() == 3){//余额支付
|
TUser userInfo = userService.selectById(orderCrossCity.getUserId());
|
userInfo.setBalance(userInfo.getBalance().add(orderCrossCity.getPayMoney()));
|
userService.updateById(userInfo);
|
//添加交易明细
|
transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", orderCrossCity.getPayMoney().doubleValue(), 1, 1, 1, 3, tOrderCrossCityId);
|
if(orderCrossCity.getPayMoney().doubleValue()>0){
|
if(orderCrossCity.getOrderSource()==4){
|
}
|
}
|
}else{
|
PaymentRecord query = null;
|
if(orderCrossCity.getOrderSource() == 4){
|
List<PaymentRecord> query1 = paymentRecordService.query(1, orderCrossCity.getDriverId(), 2, tOrderCrossCityId, 3, orderCrossCity.getPayType(), 2);
|
System.out.println(query1);
|
query = paymentRecordService.query(1, orderCrossCity.getDriverId(), 2, tOrderCrossCityId, 3, orderCrossCity.getPayType(), 2).get(0);
|
}else{
|
query = paymentRecordService.query(1, orderCrossCity.getUserId(), 1, tOrderCrossCityId, 3, orderCrossCity.getPayType(), 2).get(0);
|
}
|
if(null == query){
|
return ResultUtil.error("订单还未进行支付");
|
}
|
|
if(query.getPayType() == 1){//微信
|
Map<String, String> map = payMoneyUtil.wxRefund(query.getCode(), tOrderCrossCityId + "_3", query.getAmount().toString(), query.getAmount().toString(), "/base/cancleOrderWXPay");
|
if(!"SUCCESS".equals(map.get("return_code"))){
|
return ResultUtil.error(map.get("return_msg"));
|
}
|
}else if(query.getPayType()==4){
|
// TODO 退款
|
TUser userInfo = userService.selectById(orderCrossCity.getUserId());
|
userInfo.setBalance(userInfo.getBalance().add(orderCrossCity.getPayMoney()));
|
userService.updateById(userInfo);
|
//添加交易明细
|
transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", orderCrossCity.getPayMoney().doubleValue(), 1, 1, 1, 3, tOrderCrossCityId);
|
|
System.out.println("退款");
|
String billNo = orderCrossCity.getBillNo();
|
// cancleMoney(orderCrossCity.getPayMoney(),billNo);
|
}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, tOrderCrossCityId);
|
}
|
}
|
|
//添加负的收入明细
|
List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", tOrderCrossCityId).eq("orderType", 3));
|
for(Income income : incomes){
|
if(income.getUserType() == 2){//处理司机的收入
|
TDriver driver = tDriverService.selectById(income.getObjectId());
|
driver.setBalance(driver.getBalance().subtract(new BigDecimal(income.getMoney())));
|
driver.setBusinessMoney(driver.getBusinessMoney() - income.getMoney());
|
driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() - income.getMoney());
|
tDriverService.updateById(driver);
|
}
|
Income income1 = new Income();
|
BeanUtils.copyProperties(income, income1);
|
income1.setMoney(income.getMoney() * -1);
|
income1.setId(null);
|
income1.setInsertTime(new Date());
|
incomeService.insert(income1);
|
}
|
}
|
//添加取消记录
|
OrderCancel orderCancel = new OrderCancel();
|
orderCancel.setOrderId(tOrderCrossCityId);
|
orderCancel.setOrderType(3);
|
orderCancel.setReason("调度端取消订单");
|
orderCancel.setRemark("调度“" + user.getName() + "-" + user.getId() + "”执行取消操作");
|
orderCancel.setState(2);
|
orderCancel.setInsertTime(new Date());
|
orderCancel.setUserType(3);
|
orderCancel.setUserId(user.getId());
|
orderCancelMapper.insert(orderCancel);
|
|
|
//增加推送
|
Map<String,String> map1 = new HashMap<>();
|
map1.put("id", tOrderCrossCity.getId().toString());
|
map1.put("orderType", "3");
|
String result1 = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map1);
|
System.out.println("跨城出行取消:【orderId="+tOrderCrossCity.getId().toString()+"】,调用接口:"+result1);
|
|
return ResultUtil.success();
|
}
|
|
/**
|
* 删除跨城出行订单
|
*/
|
@RequestMapping(value = "/delete")
|
@ResponseBody
|
public Object delete(@RequestParam Integer tOrderCrossCityId) {
|
TOrderCrossCity tOrderCrossCity = tOrderCrossCityService.selectById(tOrderCrossCityId);
|
tOrderCrossCity.setIsDelete(2);
|
tOrderCrossCityService.updateById(tOrderCrossCity);
|
return SUCCESS_TIP;
|
}
|
|
}
|