puzhibing
2023-05-22 b5893f1bb3ce307ac1133138cb085d361cb2394b
新增订单添加功能
10个文件已修改
351 ■■■■ 已修改文件
management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrder.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/guns-admin/src/main/resources/application.yml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/guns-admin/src/main/resources/redis.properties 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder.html 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_add.html 136 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
management/guns-admin/src/main/webapp/static/modular/system/tOrder/tOrder_info.js 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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();
}