management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderController.java
@@ -2,10 +2,13 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; 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; @@ -242,7 +245,7 @@ @RequestMapping(value = "/add") @ResponseBody public Object add(TOrder tOrder) { tOrderService.insert(tOrder); return SUCCESS_TIP; } management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrder.java
@@ -38,6 +38,14 @@ */ private Integer userId; /** * 乘车人电话 */ private String userPhone; /** * 乘车人姓名 */ private String userName; /** * 司机id */ private Integer driverId; @@ -192,6 +200,22 @@ @ApiModelProperty(value = "是否已开票 1是 0否") private Integer isInvoice; public String getUserPhone() { return userPhone; } public void setUserPhone(String userPhone) { this.userPhone = userPhone; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Integer getIsInvoice() { return isInvoice; } management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderService.java
@@ -5,6 +5,7 @@ import com.stylefeng.guns.modular.system.controller.resp.TOrderServerResp; import com.stylefeng.guns.modular.system.model.TOrder; import com.baomidou.mybatisplus.service.IService; import com.stylefeng.guns.modular.system.util.ResultUtil; import org.springframework.ui.Model; import java.math.BigDecimal; @@ -165,4 +166,12 @@ * @return */ Integer getValidOrderCount(Integer driverId, BigDecimal orderMoney, String month); /** * 添加订单 * @param tOrder * @return */ ResultUtil add(TOrder tOrder); } management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java
@@ -1,11 +1,16 @@ package com.stylefeng.guns.modular.system.service.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.shiro.ShiroKit; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.system.controller.resp.DataStatisticsOrderYearResp; import com.stylefeng.guns.modular.system.controller.resp.PerformanceTableResp; import com.stylefeng.guns.modular.system.controller.resp.TOrderResp; import com.stylefeng.guns.modular.system.controller.resp.TOrderServerResp; import com.stylefeng.guns.modular.system.controller.util.UUIDUtil; import com.stylefeng.guns.modular.system.dao.TAppUserMapper; import com.stylefeng.guns.modular.system.dao.TBranchOfficeMapper; import com.stylefeng.guns.modular.system.dao.TDriverMapper; @@ -15,14 +20,17 @@ import com.stylefeng.guns.modular.system.model.TBranchOffice; import com.stylefeng.guns.modular.system.model.TDriver; import com.stylefeng.guns.modular.system.model.TOrder; import com.stylefeng.guns.modular.system.service.ITAppUserService; import com.stylefeng.guns.modular.system.service.ITOrderService; import com.stylefeng.guns.modular.system.util.DateUtil; import com.stylefeng.guns.modular.system.util.ResultUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.ui.Model; 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,14 +47,20 @@ @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; @Autowired private ITAppUserService appUserService; @Override public List<TOrderResp> getOrderList(String createTime, String code, Integer source, String userName, String userPhone, Integer state, String driverName,Integer isException) { @@ -351,4 +365,69 @@ // 查询司机当月有效订单数量 return tOrderMapper.getValidOrderCount(driverId,orderMoney,month); } @Override public ResultUtil add(TOrder tOrder) { String startAddress = tOrder.getStartAddress(); String endAddress = tOrder.getEndAddress(); String userPhone = tOrder.getUserPhone(); int count = this.selectCount(new EntityWrapper<TOrder>().eq("userPhone", userPhone).eq("status", 1).in("state", Arrays.asList(101, 102, 103, 104, 105, 106, 201))); if(count > 0){ return ResultUtil.error("该用户还有未完成的订单", ""); } TAppUser tAppUser = appUserService.selectOne(new EntityWrapper<TAppUser>().eq("phone", userPhone).eq("status", 1)); if(null != tAppUser){ tOrder.setUserId(tAppUser.getId()); } JSONObject jsonObject = JSON.parseObject(startAddress); tOrder.setStartAddress(jsonObject.getString("address")); tOrder.setStartLat(jsonObject.getString("lat")); tOrder.setStartLng(jsonObject.getString("lon")); tOrder.setSource(3); if(ToolUtil.isNotEmpty(endAddress)){ jsonObject = JSON.parseObject(endAddress); tOrder.setEndAddress(jsonObject.getString("address")); tOrder.setEndLat(jsonObject.getString("lat")); tOrder.setEndLng(jsonObject.getString("lon")); } tOrder.setCode(UUIDUtil.getTimeStr() + UUIDUtil.getNumberRandom(3)); Double d = 0D; if(ToolUtil.isNotEmpty(endAddress)){ Map<String, String> distance = MapUtil.getDistance(tOrder.getStartLng() + "," + tOrder.getStartLat(), tOrder.getEndLng() + "," + tOrder.getEndLat(), 1); if(null == distance){ return ResultUtil.error("获取预估距离出错", ""); } d = Double.valueOf(distance.get("distance")) / 1000; order.setEstimatedMileage(d); order.setEstimatedTime(Integer.valueOf(distance.get("duration")) / 60); } String city = ""; District geocode = MapUtil.geocode(order.getStartLng(), order.getStartLat()); if(null != geocode){ WeatherCity weatherCity = weatherCityService.selectOne(new EntityWrapper<WeatherCity>() .where("'" + geocode.getCity() + "' like CONCAT('%', city, '%') and '" + geocode.getDistrict() + "' like CONCAT('%', district, '%') ")); city = null != weatherCity ? weatherCity.getId().toString() : ""; } order = getOrderPrice(1, d, 0, order, city); order.setState(null == order.getDriverId() ? 101 : 102); order.setStatus(1); order.setCreateTime(new Date()); this.insert(order); driverService.updateById(driver); //推送状态 if(null != order.getDriverId()){ pushUtil.pushOrderStatus(uid, 2, order.getId(), order.getStatus()); }else{ //开始推单 Order finalOrder = order; new Thread(new Runnable() { @Override public void run() { pushOrder(finalOrder); } }).start(); } return ResultUtil.success(order.getState() == 102 ? order.getId() : null); } } management/guns-admin/src/main/resources/application.yml
@@ -2,8 +2,8 @@ port: 8011 guns: swagger-open: true #是否开启swagger (true/false) kaptcha-open: true #是否开启登录时验证码 (true/false) swagger-open: false #是否开启swagger (true/false) kaptcha-open: false #是否开启登录时验证码 (true/false) spring-session-open: false #是否开启spring session,如果是多机环境需要开启(true/false) session-invalidate-time: 1800 #session失效时间(只在单机环境下生效,多机环境在SpringSessionConfig类中配置) 单位:秒 session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 @@ -15,7 +15,7 @@ spring: profiles: active: dev active: local mvc: static-path-pattern: /static/** view: @@ -57,11 +57,11 @@ spring: datasource: url: jdbc:mysql://192.168.110.80:3306/fh_agent_driving?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8 url: jdbc:mysql://127.0.0.1:3306/fh_agent_driving?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8 username: root # password: PI_v6J5@dvHwGTqc password: 123456 db-name: super_save_driving #用来搜集数据库的所有表 db-name: fh_agent_driving #用来搜集数据库的所有表 filters: wall,mergeStat management/guns-admin/src/main/resources/redis.properties
@@ -1,19 +1,20 @@ #redisÅäÖÿªÊ¼ # RedisÊý¾Ý¿âË÷Òý£¨Ä¬ÈÏΪ0£© spring.redis.database=0 # Redis·þÎñÆ÷µØÖ· spring.redis.host=127.0.0.1 ## Redis·þÎñÆ÷Á¬½Ó¶Ë¿Ú spring.redis.port=16379 ## Redis·þÎñÆ÷Á¬½ÓÃÜÂ루ĬÈÏΪ¿Õ£© spring.redis.password=wuOT@8NLdZ*V09Jt ## Redis·þÎñÆ÷µØÖ· #spring.redis.host=127.0.0.1 ## Redis·þÎñÆ÷Á¬½Ó¶Ë¿Ú #spring.redis.port=6379 ## Redis·þÎñÆ÷Á¬½ÓÃÜÂ루ĬÈÏΪ¿Õ£© #spring.redis.password=123456 ### Redis·þÎñÆ÷Á¬½Ó¶Ë¿Ú #spring.redis.port=16379 ### Redis·þÎñÆ÷Á¬½ÓÃÜÂ루ĬÈÏΪ¿Õ£© #spring.redis.password=wuOT@8NLdZ*V09Jt # Redis·þÎñÆ÷µØÖ· spring.redis.host=127.0.0.1 # Redis·þÎñÆ÷Á¬½Ó¶Ë¿Ú spring.redis.port=6379 # Redis·þÎñÆ÷Á¬½ÓÃÜÂ루ĬÈÏΪ¿Õ£© spring.redis.password=123456 # Á¬½Ó³Ø×î´óÁ¬½ÓÊý£¨Ê¹ÓøºÖµ±íʾûÓÐÏÞÖÆ£© spring.redis.jedis.pool.max-active=1024 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder.html
@@ -53,7 +53,10 @@ <#button name="查询" icon="fa-search" clickFun="TOrder.search()"/> <#button name="重置" icon="fa-trash" clickFun="TOrder.resetSearch()" space="true"/> </div> <div class="col-sm-12"> <div class="hidden-xs" id="TOrderTableToolbar" role="group"> @if(shiro.hasPermission("/tOrder/add")){ <#button name="添加" icon="fa-plus" clickFun="TOrder.openAddTOrder()"/> @} @if(shiro.hasPermission("/tOrder/cancelOrder")){ <#button name="取消订单" icon="" clickFun="TOrder.cancelOrder()"/> @} @@ -62,17 +65,6 @@ @} @if(shiro.hasPermission("/tOrder/export")){ <#button name="导出" icon="" clickFun="TOrder.export()"/> @} </div> <div class="hidden-xs" id="TOrderTableToolbar" role="group"> @if(shiro.hasPermission("/tOrder/add")){ <#button name="添加" icon="fa-plus" clickFun="TOrder.openAddTOrder()"/> @} @if(shiro.hasPermission("/tOrder/update")){ <#button name="修改" icon="fa-edit" clickFun="TOrder.openTOrderDetail()" space="true"/> @} @if(shiro.hasPermission("/tOrder/delete")){ <#button name="删除" icon="fa-remove" clickFun="TOrder.delete()" space="true"/> @} </div> <#table id="TOrderTable"/> management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_add.html
@@ -4,36 +4,43 @@ <div class="form-horizontal"> <div class="row"> <div class="col-sm-6 b-r"> <#input id="id" name="主键" underline="true"/> <#input id="code" name="编号" underline="true"/> <#input id="userId" name="用户id" underline="true"/> <#input id="driverId" name="司机id" underline="true"/> <#input id="source" name="订单来源(1=小程序)" underline="true"/> <#input id="agentId" name="代理商id" underline="true"/> <#input id="branchOfficeId" name="分公司id" underline="true"/> <#input id="startTime" name="开始服务时间" underline="true"/> <#input id="startAddress" name="起点地址" underline="true"/> <#input id="startLat" name="起点纬度" underline="true"/> <#input id="startLng" name="起点经度" underline="true"/> <#input id="endAddress" name="终点地址" underline="true"/> <#input id="endLat" name="终点纬度"/> </div> <div class="col-sm-6"> <#input id="endLng" name="终点经度" underline="true"/> <#input id="boardingTime" name="上车时间" underline="true"/> <#input id="getoffTime" name="下车时间" underline="true"/> <#input id="estimatedPrice" name="预估价" underline="true"/> <#input id="orderMoney" name="订单金额" underline="true"/> <#input id="payMoney" name="支付金额" underline="true"/> <#input id="discountedPrice" name="优惠金额" underline="true"/> <#input id="couponId" name="优惠券id" underline="true"/> <#input id="payType" name="支付类型(1=线上)" underline="true"/> <#input id="payTime" name="支付时间" underline="true"/> <#input id="state" name="订单状态(1=待接单,2=已接单,3=)" underline="true"/> <#input id="status" name="状态(1=正常,2=冻结,3=删除)" underline="true"/> <#input id="createTime" name="添加时间" underline="true"/> <div class="col-sm-12"> <div class="form-group"> <label class="col-sm-2 control-label">*乘客姓名:</label> <div class="col-sm-6"> <input type="text" class="form-control" id="userName" name="userName" placeholder="请输入"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">*乘客手机号:</label> <div class="col-sm-6"> <input type="text" class="form-control" id="userPhone" name="userPhone" placeholder="请输入"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">*起始地点:</label> <div class="col-sm-6"> <input type="text" id="tipinput1" class="form-control" id="startAddress" name="startAddress" placeholder="请输入"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label"></label> <div class="col-sm-6"> <div id="container1" style="width: 100%;height: 300px;"></div> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">目的地:</label> <div class="col-sm-6"> <input type="text" id="tipinput2" class="form-control" id="endAddress" name="endAddress"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label"></label> <div class="col-sm-6"> <div id="container2" style="width: 100%;height: 300px;"></div> </div> </div> </div> </div> @@ -47,5 +54,74 @@ </div> </div> <script type="text/javascript"> window._AMapSecurityConfig = { securityJsCode:'0e712f129051b8df19a7f81484009f28', } </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=99b1546635dac9d51440c9d5b1fde512"></script> <script type="text/javascript"> //地图加载 var map1 = new AMap.Map("container1", { zoom: 13, center: [104.064, 30.6576], resizeEnable: true }); //输入提示 var autoOptions1 = { input: "tipinput1" }; AMap.plugin(['AMap.PlaceSearch','AMap.AutoComplete'], function(){ var auto = new AMap.AutoComplete(autoOptions1); var placeSearch = new AMap.PlaceSearch({ map: map1 }); //构造地点查询类 auto.on("select", select);//注册监听,当选中某条记录时会触发 function select(e) { placeSearch.setCity(e.poi.adcode); placeSearch.search(e.poi.name); //关键字查询查询 TOrderInfoDlg.position = e.poi; console.log(e.poi); TOrderInfoDlg.startAddress = { name:e.poi.name, address: e.poi.district + e.poi.address, lat: e.poi.location.lat, lon: e.poi.location.lng, }; } }); var map2 = new AMap.Map("container2", { zoom: 13, center: [104.064, 30.6576], resizeEnable: true }); //输入提示 var autoOptions2 = { input: "tipinput2" }; AMap.plugin(['AMap.PlaceSearch','AMap.AutoComplete'], function(){ var auto = new AMap.AutoComplete(autoOptions2); var placeSearch = new AMap.PlaceSearch({ map: map2 }); //构造地点查询类 auto.on("select", select);//注册监听,当选中某条记录时会触发 function select(e) { placeSearch.setCity(e.poi.adcode); placeSearch.search(e.poi.name); //关键字查询查询 TOrderInfoDlg.position = e.poi; console.log(e.poi); TOrderInfoDlg.endAddress = { name:e.poi.name, address: e.poi.district + e.poi.address, lat: e.poi.location.lat, lon: e.poi.location.lng, }; } }); </script> @} management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder.js
@@ -107,8 +107,8 @@ TOrder.openAddTOrder = function () { var index = layer.open({ type: 2, title: '添加', area: ['800px', '420px'], //宽高 title: '添加订单', area: ['100%', '100%'], //宽高 fix: false, //不固定 maxmin: true, content: Feng.ctxPath + '/tOrder/tOrder_add' management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder_info.js
@@ -2,7 +2,9 @@ * 初始化详情对话框 */ var TOrderInfoDlg = { tOrderInfoData : {} tOrderInfoData : {}, startAddress:null, endAddress:null }; /** @@ -53,41 +55,20 @@ TOrderInfoDlg.collectData = function() { this .set('id') .set('code') .set('userId') .set('driverId') .set('source') .set('agentId') .set('branchOfficeId') .set('startTime') .set('startAddress') .set('startLat') .set('startLng') .set('endAddress') .set('endLat') .set('endLng') .set('boardingTime') .set('getoffTime') .set('estimatedPrice') .set('orderMoney') .set('payMoney') .set('discountedPrice') .set('couponId') .set('payType') .set('payTime') .set('state') .set('status') .set('createTime'); .set('userName') .set('userPhone') } /** * 提交添加 */ TOrderInfoDlg.addSubmit = function() { this.clearData(); this.collectData(); if(null == this.startAddress){ Feng.info("请填写有效的起点"); return } //提交信息 var ajax = new $ax(Feng.ctxPath + "/tOrder/add", function(data){ Feng.success("添加成功!"); @@ -97,6 +78,8 @@ Feng.error("添加失败!" + data.responseJSON.message + "!"); }); ajax.set(this.tOrderInfoData); ajax.set('startAddress', JSON.stringify(TOrderInfoDlg.startAddress)); ajax.set('endAddress', null == endAddress ? "" : JSON.stringify(TOrderInfoDlg.endAddress)); ajax.start(); }