management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderController.java
@@ -2,10 +2,12 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.stylefeng.guns.core.base.controller.BaseController; import com.stylefeng.guns.core.base.tips.SuccessTip; import com.stylefeng.guns.core.log.LogObjectHolder; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.system.controller.resp.TAppUserDetailOrderResp; import com.stylefeng.guns.modular.system.controller.resp.TDriverCommissionResp; import com.stylefeng.guns.modular.system.controller.resp.TOrderResp; @@ -14,15 +16,20 @@ import com.stylefeng.guns.modular.system.model.TAppUser; import com.stylefeng.guns.modular.system.model.TDriver; import com.stylefeng.guns.modular.system.model.TOrder; import com.stylefeng.guns.modular.system.model.TOrderPosition; import com.stylefeng.guns.modular.system.service.ITAppUserService; import com.stylefeng.guns.modular.system.service.ITCancelOrderService; import com.stylefeng.guns.modular.system.service.ITDriverService; import com.stylefeng.guns.modular.system.service.ITOrderService; import com.stylefeng.guns.modular.system.util.RedisUtil; import com.stylefeng.guns.modular.system.util.ResultUtil; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; @@ -31,7 +38,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.io.*; import java.math.BigDecimal; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -58,6 +65,15 @@ private ITAppUserService tAppUserService; @Autowired private ITCancelOrderService tCancelOrderService; @Autowired private RedisUtil redisUtil; @Autowired private ITDriverService driverService; @Value("${filePath}") private String filePath; /** * 跳转到首页 @@ -227,6 +243,39 @@ return list; } @RequestMapping(value = "/getOrderTrack") @ResponseBody public ResultUtil getOrderTrack(Integer orderDetailId){ if(ToolUtil.isNotEmpty(orderDetailId)){ try { //将数据存储到文件中 File file = new File(filePath + orderDetailId + ".json"); if(!file.exists()){ return ResultUtil.success(new ArrayList<>()); } //读取文件(字符流) BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8")); //循环取出数据 String str = null; StringBuffer sb = new StringBuffer(); while ((str = in.readLine()) != null) { sb.append(str); } List<TOrderPosition> list = JSONArray.parseArray(sb.toString(), TOrderPosition.class); return ResultUtil.success(list); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } }else { return ResultUtil.paranErr(); } } /** * 关闭订单 */ @@ -236,6 +285,12 @@ TOrder tOrder = tOrderService.selectById(tOrderId); tOrder.setState(OrderStateEnum.CANCELED.getCode()); tOrderService.updateById(tOrder); if(null != tOrder.getDriverId()){ redisUtil.delSetValue("orderService", tOrder.getId().toString()); TDriver tDriver = driverService.selectById(tOrder.getDriverId()); tDriver.setServerStatus(1); driverService.updateById(tDriver); } return SUCCESS_TIP; } management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java
@@ -23,6 +23,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.time.LocalDate; @@ -39,13 +40,16 @@ @Service public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> implements ITOrderService { @Autowired @Resource private TOrderMapper tOrderMapper; @Autowired @Resource private TAppUserMapper tAppUserMapper; @Autowired @Resource private TDriverMapper tDriverMapper; @Autowired @Resource private TBranchOfficeMapper tBranchOfficeMapper; @Override @@ -67,6 +71,7 @@ public void orderDetail(Integer orderId, Model model) { // 订单信息 TOrder tOrder = tOrderMapper.selectById(orderId); model.addAttribute("id", orderId); model.addAttribute("createTime",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(tOrder.getCreateTime()));//下单时间 model.addAttribute("code",tOrder.getCode());//订单编号 model.addAttribute("source",tOrder.getSource());//订单来源 management/guns-admin/src/main/resources/application.yml
@@ -79,9 +79,9 @@ --- #支付回调地址 #正式环境 #callbackPath: https://okyueche.com:8010 callbackPath: https://chaoshengdaijia.com:8443 #测试环境 callbackPath: http://121.37.15.157:8010 #callbackPath: http://121.37.15.157:8010 --- management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrderDetail.html
@@ -13,6 +13,7 @@ <input hidden id="startLat" value="${startLat}"> <input hidden id="endLng" value="${endLng}"> <input hidden id="endLat" value="${endLat}"> <input hidden id="id" value="${id}"> <hr/> <div class="initialLevel col-sm-12 control-label form-group" > @@ -179,20 +180,28 @@ </div> @} @if(startLng != null){ <hr/> <div class="initialLevel col-sm-12 control-label form-group" > <div style="background-color: gray;height: 35px;line-height: 35px"> <label style="color: #0C0C0C">行程轨迹</label> <div class="row" style="margin-top: 30px;"> <div class="col-sm-4"> <h2 class="h3Class" style="font-weight: 700;">线路轨迹</h2> </div> </div> <div class="row"> <div class="col-sm-10"> <div class="form-horizontal" id="container" style="margin-left: 50px;width: 100%; height: 500px;"></div> <div class="input-card" style="margin-left: 50px;"> <h4>轨迹回放控制</h4> <div class="input-item"> <input type="button" class="btn" value="开始动画" id="start" onclick="startAnimation()"/> <input type="button" class="btn" value="暂停动画" id="pause" onclick="pauseAnimation()"/> <input type="button" class="btn" value="继续动画" id="resume" onclick="resumeAnimation()"/> <input type="button" class="btn" value="停止动画" id="stop" onclick="stopAnimation()"/> </div> <div class="input-item"> </div> </div> </div> <hr/> <div class="initialLevel col-sm-12 control-label form-group" > <div id="container" ></div> <div id="panel" ></div> </div> @} </div> <hr/> <div class="initialLevel col-sm-12 control-label form-group" > @@ -202,12 +211,14 @@ </div> <hr/> @if(routeRecord != null){ <div class="initialLevel col-sm-12 control-label form-group" > <audio id="audio" autoplay controls muted> <!-- <source src="http://www.w3capi.com/upload/audio/audio_example.mp3" type="audio/mpeg">--> <source src="${routeRecord}" type="audio/mpeg"> </audio> </div> @} <div class="hidden-xs" id="TDriverTableToolbar" role="group" style="text-align: center"> <#button name="取消" icon="fa-plus" clickFun="TOrderInfoDlg.close()" /> @@ -221,10 +232,9 @@ </div> <script src="${ctxPath}/static/modular/system/tOrder/tOrder.js"></script> <script src="${ctxPath}/static/modular/system/tOrder/tOrder_info.js"></script> <!--<script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=1d43098bcd98ab124623e7e4bcc9595e&plugin=AMap.Driving"></script>--> <!--<script type="text/javascript" src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>--> <!--<script type="text/javascript" src="https://cache.amap.com/lbs/static/addToolbar.js"></script>--> <script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script> <script src="https://webapi.amap.com/maps?v=1.4.15&key=1d43098bcd98ab124623e7e4bcc9595e"></script> <script src="https://cache.amap.com/lbs/static/addToolbar.js"></script> <script src="https://webapi.amap.com/loader.js"></script> <style type="text/css"> @@ -266,44 +276,100 @@ type: 'date', range: true }); if(null != $('#startLng').val() && '' != $('#startLng').val()){ AMapLoader.reset() // 需要把这个reset一下 AMapLoader.load({ "key": "1d43098bcd98ab124623e7e4bcc9595e", // 申请好的Web端开发者Key,首次调用 load 时必填 "version": "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 "plugins": ['AMap.Driving'], // 需要使用的的插件列表,如比例尺'AMap.Scale'等 "AMapUI": { // 是否加载 AMapUI,缺省不加载 "version": '1.1', // AMapUI 版本 "plugins":['overlay/SimpleMarker'], // 需要加载的 AMapUI ui插件 var map = new AMap.Map("container", { resizeEnable: true, zoom: 14 }); $(function() { getTrajectory(); }); function getTrajectory() { $.ajax({ url: Feng.ctxPath + '/tOrder/getOrderTrack', type: 'POST', data:{ orderDetailId: $("#id").val() }, "Loca":{ // 是否加载 Loca, 缺省不加载 "version": '2.0' // Loca 版本 }, }).then((AMap)=>{ //初始化地图对象,加载地图 var map = new AMap.Map('container', { viewMode: '2D', // 默认使用 2D 模式,如果希望使用带有俯仰角的 3D 模式,请设置 viewMode: '3D', zoom:13, //初始化地图层级 center: [$('#startLng').val(), $('#startLat').val()] //初始化地图中心点 }); //构造路线导航类 var driving = new AMap.Driving({ map: map, }); // 根据起终点经纬度规划驾车导航路线 driving.search(new AMap.LngLat($('#startLng').val(), $('#startLat').val()), new AMap.LngLat($('#endLng').val(), $('#endLat').val()), function(status, result) { // result 即是对应的驾车导航信息,相关数据结构文档请参考 https://lbs.amap.com/api/javascript-api/reference/route-search#m_DrivingResult if (status === 'complete') { Feng.success('绘制订单路线完成') } else { Feng.error('获取驾车数据失败:' + result) success: function (res) { if(res.status == 200){ var data = res.data; if(data.length > 0){ orderTrack(data); }/*else{ Feng.error("当前订单没有轨迹"); }*/ }else{ Feng.error(res.msg); } }); }).catch((e)=>{ console.error(e); //加载错误提示 } }); }else { Feng.info('该订单未完成,无地图路线显示!') } var marker, lineArr = []; function orderTrack(data) { for(var i in data){ var waypoints = []; var lon = parseFloat(data[i].lon); var lat = parseFloat(data[i].lat); waypoints.push(lon); waypoints.push(lat); lineArr.push(waypoints); } marker = new AMap.Marker({ map: map, position: lineArr[0], icon: "https://webapi.amap.com/images/car.png", offset: new AMap.Pixel(-26, -13), autoRotation: true, angle:-90, }); // 绘制轨迹 var polyline = new AMap.Polyline({ map: map, path: lineArr, showDir:true, strokeColor: "#28F", //线颜色 // strokeOpacity: 1, //线透明度 strokeWeight: 6, //线宽 // strokeStyle: "solid" //线样式 }); var passedPolyline = new AMap.Polyline({ map: map, // path: lineArr, strokeColor: "#AF5", //线颜色 // strokeOpacity: 1, //线透明度 strokeWeight: 6, //线宽 // strokeStyle: "solid" //线样式 }); marker.on('moving', function (e) { passedPolyline.setPath(e.passedPath); }); map.setFitView(); } function startAnimation () { marker.moveAlong(lineArr, 200); } function pauseAnimation () { marker.pauseMove(); } function resumeAnimation () { marker.resumeMove(); } function stopAnimation () { marker.stopMove(); }