From 7cced07216f9be95eb6d5c26b74c2e736cda3594 Mon Sep 17 00:00:00 2001
From: LSH
Date: 星期四, 24 八月 2023 21:27:34 +0800
Subject: [PATCH] #出差初稿

---
 src/main/webapp/views/businessTrip/businessTrip.html                       |  288 ++++++++++
 src/main/java/com/zy/crm/manager/entity/BusinessTrip.java                  |  617 ++++++++++++++++++++++
 src/main/resources/mapper/BusinessTripMapper.xml                           |   46 +
 src/main/java/com/zy/crm/manager/service/BusinessTripService.java          |    8 
 src/main/java/com/zy/crm/manager/service/impl/BusinessTripServiceImpl.java |   12 
 src/main/java/com/zy/crm/manager/controller/BusinessTripController.java    |  143 +++++
 src/main/java/com/zy/crm/manager/utils/TimeCalculatorUtils.java            |  110 ++++
 src/main/java/com/zy/crm/manager/utils/CarNumberUtils.java                 |   11 
 src/main/webapp/static/js/businessTrip/businessTrip.js                     |  330 ++++++++++++
 src/main/java/com/zy/crm/manager/mapper/BusinessTripMapper.java            |   12 
 10 files changed, 1,577 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/crm/manager/controller/BusinessTripController.java b/src/main/java/com/zy/crm/manager/controller/BusinessTripController.java
new file mode 100644
index 0000000..48a9700
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/controller/BusinessTripController.java
@@ -0,0 +1,143 @@
+package com.zy.crm.manager.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.DateUtils;
+import com.core.common.R;
+import com.zy.crm.common.web.BaseController;
+import com.zy.crm.manager.entity.BusinessTrip;
+import com.zy.crm.manager.service.BusinessTripService;
+import com.zy.crm.manager.utils.CarNumberUtils;
+import com.zy.crm.manager.utils.TimeCalculatorUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+public class BusinessTripController extends BaseController {
+
+    @Autowired
+    private BusinessTripService businessTripService;
+
+    @RequestMapping(value = "/businessTrip/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(businessTripService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/businessTrip/list/auth")
+    @ManagerAuth
+    public R list(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam Map<String, Object> param){
+        EntityWrapper<BusinessTrip> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(businessTripService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/businessTrip/add/auth")
+    @ManagerAuth
+    public R add(BusinessTrip businessTrip) {
+
+        Date now = new Date();
+        //鍒ゆ柇杞︾墝鍙�
+        if (businessTrip.getBusinessTransportation()==5 || businessTrip.getBusinessTransportation()==4){
+            boolean carNumberBoolean = CarNumberUtils.isValidLicensePlate(businessTrip.getCarNumber());
+            if (!carNumberBoolean){
+                return R.error("璇疯緭鍏ユ湁鏁堣溅鐗屽彿");
+            }
+        }
+        businessTrip.setBusinessPeersId(System.currentTimeMillis());
+//        businessTrip.setBusinessDuration(TimeCalculatorUtils.getDifferenceDayDouble(businessTrip.getBusinessStartTimeDay$(),businessTrip.getBusinessEndTimeDay$()));
+        businessTrip.setBusinessTripDays(TimeCalculatorUtils.getDifferenceDayInt(businessTrip.getBusinessStartTime(),businessTrip.getBusinessEndTime()));
+        businessTrip.setUserId(getUserId());
+        businessTrip.setDeptId(getDeptId());
+        businessTrip.setCreateTime(now);
+        businessTrip.setUserId(getUserId());
+        businessTrip.setUpdateTime(now);
+        businessTrip.setStatus(0);
+
+        businessTripService.insert(businessTrip);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/businessTrip/update/auth")
+	@ManagerAuth
+    public R update(BusinessTrip businessTrip){
+        if (Cools.isEmpty(businessTrip) || null==businessTrip.getId()){
+            return R.error();
+        }
+        businessTripService.updateById(businessTrip);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/businessTrip/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            businessTripService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/businessTrip/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<BusinessTrip> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("businessTrip"));
+        convert(map, wrapper);
+        List<BusinessTrip> list = businessTripService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/businessTripQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<BusinessTrip> wrapper = new EntityWrapper<>();
+        wrapper.like("id", condition);
+        Page<BusinessTrip> page = businessTripService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (BusinessTrip businessTrip : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", businessTrip.getId());
+            map.put("value", businessTrip.getId());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/businessTrip/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<BusinessTrip> wrapper = new EntityWrapper<BusinessTrip>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != businessTripService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(BusinessTrip.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+}
diff --git a/src/main/java/com/zy/crm/manager/entity/BusinessTrip.java b/src/main/java/com/zy/crm/manager/entity/BusinessTrip.java
new file mode 100644
index 0000000..6ff5444
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/entity/BusinessTrip.java
@@ -0,0 +1,617 @@
+package com.zy.crm.manager.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.common.Cools;
+import com.core.common.SpringUtils;
+import com.zy.crm.manager.utils.TimeCalculatorUtils;
+import com.zy.crm.system.entity.Dic;
+import com.zy.crm.system.service.DicService;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("man_business_trip")
+public class BusinessTrip implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鍑哄樊浜嬬敱
+     */
+    @ApiModelProperty(value= "鍑哄樊浜嬬敱")
+    @TableField("business_trip_reasons")
+    private String businessTripReasons;
+
+    /**
+     * 浜ら�氬伐鍏�
+     */
+    @ApiModelProperty(value= "浜ら�氬伐鍏�")
+    @TableField("business_transportation")
+    private Integer businessTransportation;
+
+    /**
+     * 鍗曠▼寰�杩�
+     */
+    @ApiModelProperty(value= "鍗曠▼寰�杩�")
+    @TableField("business_return")
+    private Integer businessReturn;
+
+    /**
+     * 鍑哄彂鐪�
+     */
+    @ApiModelProperty(value= "鍑哄彂鐪�")
+    @TableField("business_start_province")
+    private String businessStartProvince;
+
+    /**
+     * 鍑哄彂甯�
+     */
+    @ApiModelProperty(value= "鍑哄彂甯�")
+    @TableField("business_start_city")
+    private String businessStartCity;
+
+    /**
+     * 鍑哄彂鍘�
+     */
+    @ApiModelProperty(value= "鍑哄彂鍘�")
+    @TableField("business_start_district")
+    private String businessStartDistrict;
+
+    /**
+     * 鍑哄彂闀�
+     */
+    @ApiModelProperty(value= "鍑哄彂闀�")
+    @TableField("business_start_town")
+    private String businessStartTown;
+
+    /**
+     * 鍑哄彂鍦�
+     */
+    @ApiModelProperty(value= "鍑哄彂鍦�")
+    @TableField("business_start_addr")
+    private String businessStartAddr;
+
+    /**
+     * 鐩殑鐪�
+     */
+    @ApiModelProperty(value= "鐩殑鐪�")
+    @TableField("business_end_province")
+    private String businessEndProvince;
+
+    /**
+     * 鐩殑甯�
+     */
+    @ApiModelProperty(value= "鐩殑甯�")
+    @TableField("business_end_city")
+    private String businessEndCity;
+
+    /**
+     * 鐩殑鍘�
+     */
+    @ApiModelProperty(value= "鐩殑鍘�")
+    @TableField("business_end_district")
+    private String businessEndDistrict;
+
+    /**
+     * 鐩殑闀�
+     */
+    @ApiModelProperty(value= "鐩殑闀�")
+    @TableField("business_end_town")
+    private String businessEndTown;
+
+    /**
+     * 鐩殑鍦�
+     */
+    @ApiModelProperty(value= "鐩殑鍦�")
+    @TableField("business_end_addr")
+    private String businessEndAddr;
+
+    /**
+     * 鍑哄彂鏃ユ湡
+     */
+    @ApiModelProperty(value= "鍑哄彂鏃ユ湡")
+    @TableField("business_start_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date businessStartTime;
+
+    /**
+     * 缁撴潫鏃ユ湡
+     */
+    @ApiModelProperty(value= "缁撴潫鏃ユ湡")
+    @TableField("business_end_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date businessEndTime;
+
+    /**
+     * 鍑哄樊鏃堕暱
+     */
+    @ApiModelProperty(value= "鍑哄樊鏃堕暱")
+    @TableField("business_duration")
+    private Long businessDuration;
+
+    /**
+     * 鍑哄樊澶╂暟
+     */
+    @ApiModelProperty(value= "鍑哄樊澶╂暟")
+    @TableField("business_trip_days")
+    private Integer businessTripDays;
+
+    /**
+     * 鍑哄樊澶囨敞
+     */
+    @ApiModelProperty(value= "鍑哄樊澶囨敞")
+    @TableField("business_notes")
+    private String businessNotes;
+
+    /**
+     * 鍑鸿浜恒�佸悓琛屼汉
+     */
+    @ApiModelProperty(value= "鍑鸿浜恒�佸悓琛屼汉")
+    @TableField("business_peers")
+    private String businessPeers;
+
+    /**
+     * 鍚岃浜篒D
+     */
+    @ApiModelProperty(value= "鍚岃浜篒D")
+    @TableField("business_peers_id")
+    private Long businessPeersId;
+
+    /**
+     * 鑷┚绉佸杞﹁溅鐗屽彿
+     */
+    @ApiModelProperty(value= "鑷┚绉佸杞﹁溅鐗屽彿")
+    @TableField("car_number")
+    private String carNumber;
+
+    /**
+     * 鑷┚绉佸杞﹁绋嬫槑缁嗗強鍏噷鏁�
+     */
+    @ApiModelProperty(value= "鑷┚绉佸杞﹁绋嬫槑缁嗗強鍏噷鏁�")
+    private String kilometers;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @ApiModelProperty(value= "鍒涘缓浜�")
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 鎵�灞為儴闂�
+     */
+    @ApiModelProperty(value= "鎵�灞為儴闂�")
+    @TableField("dept_id")
+    private Long deptId;
+
+    /**
+     * hostId
+     */
+    @ApiModelProperty(value= "hostId")
+    @TableField("host_id")
+    private Long hostId;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ApiModelProperty(value= "鍒涘缓鏃堕棿")
+    @TableField("create_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @ApiModelProperty(value= "鏇存柊鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 鏇存柊浜哄憳ID
+     */
+    @ApiModelProperty(value= "鏇存柊浜哄憳ID")
+    @TableField("update_id")
+    private Long updateId;
+
+    @ApiModelProperty(value= "")
+    private String form;
+
+    /**
+     * 杩涘害
+     */
+    @ApiModelProperty(value= "杩涘害")
+    private Integer settle;
+
+    /**
+     * 娴佺▼杩涘害
+     */
+    @ApiModelProperty(value= "娴佺▼杩涘害")
+    @TableField("settle_msg")
+    private String settleMsg;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 宸插畬鎴�  0: 鏈畬鎴�  ")
+    private Integer status;
+
+    /**
+     * 绫诲瀷
+     */
+    @ApiModelProperty(value= "绫诲瀷")
+    @TableField("business_trip_type")
+    private Integer businessTripType;
+
+    /**
+     * 绫诲瀷
+     */
+    @ApiModelProperty(value= "寮�濮嬫椂杈�")
+    @TableField("business_start_time_day")
+    private Integer businessStartTimeDay;
+
+    /**
+     * 绫诲瀷
+     */
+    @ApiModelProperty(value= "缁撴潫鏃惰景")
+    @TableField("business_end_time_day")
+    private Integer businessEndTimeDay;
+
+    @TableField(exist = false)
+    private String pcdStart;
+
+    @TableField(exist = false)
+    private String pcdEnd;
+
+    public BusinessTrip() {}
+
+    public BusinessTrip(String businessTripReasons, Integer businessTransportation, Integer businessReturn, String businessStartProvince, String businessStartCity, String businessStartDistrict, String businessStartTown, String businessStartAddr, String businessEndProvince, String businessEndCity, String businessEndDistrict, String businessEndTown, String businessEndAddr, Date businessStartTime, Date businessEndTime, Long businessDuration, Integer businessTripDays, String businessNotes, String businessPeers, Long businessPeersId, String carNumber, String kilometers, Long userId, Long deptId, Long hostId, Date createTime, Date updateTime, Long updateId, String form, Integer settle, String settleMsg, Integer status, Integer businessTripType, Integer businessStartTimeDay, Integer businessEndTimeDay) {
+        this.businessTripReasons = businessTripReasons;
+        this.businessTransportation = businessTransportation;
+        this.businessReturn = businessReturn;
+        this.businessStartProvince = businessStartProvince;
+        this.businessStartCity = businessStartCity;
+        this.businessStartDistrict = businessStartDistrict;
+        this.businessStartTown = businessStartTown;
+        this.businessStartAddr = businessStartAddr;
+        this.businessEndProvince = businessEndProvince;
+        this.businessEndCity = businessEndCity;
+        this.businessEndDistrict = businessEndDistrict;
+        this.businessEndTown = businessEndTown;
+        this.businessEndAddr = businessEndAddr;
+        this.businessStartTime = businessStartTime;
+        this.businessEndTime = businessEndTime;
+        this.businessDuration = businessDuration;
+        this.businessTripDays = businessTripDays;
+        this.businessNotes = businessNotes;
+        this.businessPeers = businessPeers;
+        this.businessPeersId = businessPeersId;
+        this.carNumber = carNumber;
+        this.kilometers = kilometers;
+        this.userId = userId;
+        this.deptId = deptId;
+        this.hostId = hostId;
+        this.createTime = createTime;
+        this.updateTime = updateTime;
+        this.updateId = updateId;
+        this.form = form;
+        this.settle = settle;
+        this.settleMsg = settleMsg;
+        this.status = status;
+        this.businessTripType = businessTripType;
+        this.businessStartTimeDay = businessStartTimeDay;
+        this.businessEndTimeDay = businessEndTimeDay;
+    }
+
+//    BusinessTrip businessTrip = new BusinessTrip(
+//            null,    // 鍑哄樊浜嬬敱[闈炵┖]
+//            null,    // 浜ら�氬伐鍏穂闈炵┖]
+//            null,    // 鍗曠▼寰�杩擺闈炵┖]
+//            null,    // 鍑哄彂鐪�
+//            null,    // 鍑哄彂甯�
+//            null,    // 鍑哄彂鍘�
+//            null,    // 鍑哄彂闀�
+//            null,    // 鍑哄彂鍦癧闈炵┖]
+//            null,    // 鐩殑鐪�
+//            null,    // 鐩殑甯�
+//            null,    // 鐩殑鍘�
+//            null,    // 鐩殑闀�
+//            null,    // 鐩殑鍦癧闈炵┖]
+//            null,    // 鍑哄彂鏃ユ湡[闈炵┖]
+//            null,    // 缁撴潫鏃ユ湡[闈炵┖]
+//            null,    // 鍑哄樊鏃堕暱
+//            null,    // 鍑哄樊澶╂暟
+//            null,    // 鍑哄樊澶囨敞
+//            null,    // 鍑鸿浜恒�佸悓琛屼汉[闈炵┖]
+//            null,    // 鍚岃浜篒D
+//            null,    // 鑷┚绉佸杞﹁溅鐗屽彿[闈炵┖]
+//            null,    // 鑷┚绉佸杞﹁绋嬫槑缁嗗強鍏噷鏁癧闈炵┖]
+//            null,    // 鍒涘缓浜�
+//            null,    // 鎵�灞為儴闂�
+//            null,    // hostId
+//            null,    // 鍒涘缓鏃堕棿
+//            null,    // 鏇存柊鏃堕棿
+//            null,    // 鏇存柊浜哄憳ID
+//            null,    // 
+//            null,    // 杩涘害
+//            null,    // 娴佺▼杩涘害
+//            null,    // 鐘舵��
+//            null    // 绫诲瀷
+//    );
+
+    public String getBusinessStartTime$(){
+        if (Cools.isEmpty(this.businessStartTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.businessStartTime);
+    }
+
+    public String getBusinessEndTime$(){
+        if (Cools.isEmpty(this.businessEndTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.businessEndTime);
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "宸插畬鎴�";
+            case 0:
+                return "鏈畬鎴�";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getBusinessTransportation$(){
+        if (null == this.businessTransportation){ return null; }
+        switch (this.businessTransportation){
+            case 1:
+                return "椋炴満";
+            case 2:
+                return "楂橀搧";
+            case 3:
+                return "鐏溅";
+            case 4:
+                return "姹借溅";
+            case 5:
+                return "鎽╂墭";
+            case 6:
+                return "鐢佃溅";
+            default:
+//                return String.valueOf(this.status);
+                return "鍏跺畠";
+        }
+    }
+
+    public String getBusinessReturn$(){
+        if (null == this.businessTransportation){ return null; }
+        switch (this.businessTransportation){
+            case 1:
+                return "鍗曠▼";
+            case 2:
+                return "寰�杩�";
+            default:
+//                return String.valueOf(this.status);
+                return "鍏跺畠";
+        }
+    }
+
+    public String getBusinessStartTimeDay$(){
+        if (null == this.businessStartTimeDay){ return null; }
+        switch (this.businessStartTimeDay){
+            case 1:
+                return TimeCalculatorUtils.getYestMonthDay(this.businessStartTime)+ "涓婂崍";
+            case 2:
+                return TimeCalculatorUtils.getYestMonthDay(this.businessStartTime)+ "涓嬪崍";
+            default:
+//                return String.valueOf(this.status);
+                return "鏈煡";
+        }
+    }
+
+    public String getBusinessEndTimeDay$(){
+        if (null == this.businessEndTimeDay){ return null; }
+        switch (this.businessTransportation){
+            case 1:
+                return TimeCalculatorUtils.getYestMonthDay(this.businessEndTime)+ "涓婂崍";
+            case 2:
+                return TimeCalculatorUtils.getYestMonthDay(this.businessEndTime)+ "涓嬪崍";
+            default:
+//                return String.valueOf(this.status);
+                return "鏈煡";
+        }
+    }
+
+
+
+    public String getPcdStart() {
+        StringBuilder sb = new StringBuilder();
+        if (!Cools.isEmpty(businessStartProvince)) {
+            sb.append(businessStartProvince).append(",");
+        }
+        if (!Cools.isEmpty(businessStartCity)) {
+            sb.append(businessStartCity).append(",");
+        }
+        if (!Cools.isEmpty(businessStartDistrict)) {
+            sb.append(businessStartDistrict).append(",");
+        }
+        String s = sb.toString();
+        if (s.endsWith(",")) {
+            s = s.substring(0, s.length() - 1);
+        }
+        return s;
+    }
+
+    public String getPcdStart$() {
+        StringBuilder sb = new StringBuilder();
+        DicService service = SpringUtils.getBean(DicService.class);
+        if (!Cools.isEmpty(businessStartProvince)) {
+            Dic provinceDic = service.selectById(businessStartProvince);
+            if (!Cools.isEmpty(provinceDic)) {
+                sb.append(provinceDic.getName()).append(",");
+            }
+        }
+        if (!Cools.isEmpty(businessStartCity)) {
+            Dic cityDic = service.selectById(businessStartCity);
+            if (!Cools.isEmpty(cityDic)) {
+                sb.append(cityDic.getName()).append(",");
+            }
+        }
+        if (!Cools.isEmpty(businessStartDistrict)) {
+            Dic districtDic = service.selectById(businessStartDistrict);
+            if (!Cools.isEmpty(districtDic)) {
+                sb.append(districtDic.getName()).append(",");
+            }
+        }
+        String s = sb.toString();
+        if (s.endsWith(",")) {
+            s = s.substring(0, s.length() - 1);
+        }
+        return s;
+    }
+
+    public void setPcdStart(String pcdStart) {
+        this.pcdStart = pcdStart;
+        if (!Cools.isEmpty(pcdStart)) {
+            String[] split = this.pcdStart.split(",");
+            for (int i = 0;i< split.length; i++) {
+                switch (i) {
+                    case 0:
+                        this.businessStartProvince = split[0];
+                        break;
+                    case 1:
+                        this.businessStartCity = split[1];
+                        break;
+                    case 2:
+                        this.businessStartDistrict = split[2];
+                        break;
+                    default:
+                        break;
+                }
+            }
+        } else {
+            this.businessStartProvince = "";
+            this.businessStartCity = "";
+            this.businessStartDistrict = "";
+        }
+    }
+
+    public String getPcdEnd() {
+        StringBuilder sb = new StringBuilder();
+        if (!Cools.isEmpty(businessEndProvince)) {
+            sb.append(businessEndProvince).append(",");
+        }
+        if (!Cools.isEmpty(businessEndCity)) {
+            sb.append(businessEndCity).append(",");
+        }
+        if (!Cools.isEmpty(businessEndDistrict)) {
+            sb.append(businessEndDistrict).append(",");
+        }
+        String s = sb.toString();
+        if (s.endsWith(",")) {
+            s = s.substring(0, s.length() - 1);
+        }
+        return s;
+    }
+
+    public String getPcdEnd$() {
+        StringBuilder sb = new StringBuilder();
+        DicService service = SpringUtils.getBean(DicService.class);
+        if (!Cools.isEmpty(businessEndProvince)) {
+            Dic provinceDic = service.selectById(businessEndProvince);
+            if (!Cools.isEmpty(provinceDic)) {
+                sb.append(provinceDic.getName()).append(",");
+            }
+        }
+        if (!Cools.isEmpty(businessEndCity)) {
+            Dic cityDic = service.selectById(businessEndCity);
+            if (!Cools.isEmpty(cityDic)) {
+                sb.append(cityDic.getName()).append(",");
+            }
+        }
+        if (!Cools.isEmpty(businessEndDistrict)) {
+            Dic districtDic = service.selectById(businessEndDistrict);
+            if (!Cools.isEmpty(districtDic)) {
+                sb.append(districtDic.getName()).append(",");
+            }
+        }
+        String s = sb.toString();
+        if (s.endsWith(",")) {
+            s = s.substring(0, s.length() - 1);
+        }
+        return s;
+    }
+
+    public void setPcdEnd(String pcdEnd) {
+        this.pcdEnd = pcdEnd;
+        if (!Cools.isEmpty(pcdEnd)) {
+            String[] split = this.pcdEnd.split(",");
+            for (int i = 0;i< split.length; i++) {
+                switch (i) {
+                    case 0:
+                        this.businessEndProvince = split[0];
+                        break;
+                    case 1:
+                        this.businessEndCity = split[1];
+                        break;
+                    case 2:
+                        this.businessEndDistrict = split[2];
+                        break;
+                    default:
+                        break;
+                }
+            }
+        } else {
+            this.businessEndProvince = "";
+            this.businessEndCity = "";
+            this.businessEndDistrict = "";
+        }
+    }
+
+    public String getBusinessStartAddr$(){
+        if (!Cools.isEmpty(businessStartAddr)){
+            return getPcdStart$()+"--"+businessStartAddr;
+        }
+        return getPcdStart$();
+    }
+
+    public String getBusinessEndAddr$(){
+        if (!Cools.isEmpty(businessEndAddr)){
+            return getPcdEnd$()+"--"+businessEndAddr;
+        }
+        return getPcdStart$();
+    }
+
+}
diff --git a/src/main/java/com/zy/crm/manager/mapper/BusinessTripMapper.java b/src/main/java/com/zy/crm/manager/mapper/BusinessTripMapper.java
new file mode 100644
index 0000000..a6883f8
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/mapper/BusinessTripMapper.java
@@ -0,0 +1,12 @@
+package com.zy.crm.manager.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.crm.manager.entity.BusinessTrip;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface BusinessTripMapper extends BaseMapper<BusinessTrip> {
+
+}
diff --git a/src/main/java/com/zy/crm/manager/service/BusinessTripService.java b/src/main/java/com/zy/crm/manager/service/BusinessTripService.java
new file mode 100644
index 0000000..0590825
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/service/BusinessTripService.java
@@ -0,0 +1,8 @@
+package com.zy.crm.manager.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.crm.manager.entity.BusinessTrip;
+
+public interface BusinessTripService extends IService<BusinessTrip> {
+
+}
diff --git a/src/main/java/com/zy/crm/manager/service/impl/BusinessTripServiceImpl.java b/src/main/java/com/zy/crm/manager/service/impl/BusinessTripServiceImpl.java
new file mode 100644
index 0000000..a3057e8
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/service/impl/BusinessTripServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.crm.manager.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.crm.manager.entity.BusinessTrip;
+import com.zy.crm.manager.mapper.BusinessTripMapper;
+import com.zy.crm.manager.service.BusinessTripService;
+import org.springframework.stereotype.Service;
+
+@Service("businessTripService")
+public class BusinessTripServiceImpl extends ServiceImpl<BusinessTripMapper, BusinessTrip> implements BusinessTripService {
+
+}
diff --git a/src/main/java/com/zy/crm/manager/utils/CarNumberUtils.java b/src/main/java/com/zy/crm/manager/utils/CarNumberUtils.java
new file mode 100644
index 0000000..6f78f43
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/utils/CarNumberUtils.java
@@ -0,0 +1,11 @@
+package com.zy.crm.manager.utils;
+
+import java.util.regex.Pattern;
+
+public class CarNumberUtils {
+    private static final Pattern LICENSE_PLATE_PATTERN = Pattern.compile("^[\u4e00-\u9fa5]{1}[A-Z]{1}[A-Z_0-9]{5}$");
+
+    public static boolean isValidLicensePlate(String licensePlate) {
+        return LICENSE_PLATE_PATTERN.matcher(licensePlate).matches();
+    }
+}
diff --git a/src/main/java/com/zy/crm/manager/utils/TimeCalculatorUtils.java b/src/main/java/com/zy/crm/manager/utils/TimeCalculatorUtils.java
new file mode 100644
index 0000000..3def1fc
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/utils/TimeCalculatorUtils.java
@@ -0,0 +1,110 @@
+package com.zy.crm.manager.utils;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+public class TimeCalculatorUtils {
+
+    public static int getTimeHour(){
+        //濡備綍鑾峰彇褰撳墠鏃堕棿鐨勫皬鏃舵暟锛�24灏忔椂鍒讹級锛�
+        // 鑾峰彇褰撳墠鏃堕棿鎴�
+        long timestamp = System.currentTimeMillis();
+
+        // 鍒涘缓Date瀵硅薄锛屽苟璁剧疆鏃堕棿鎴�
+        Date date = new Date(timestamp);
+
+        // 鍒涘缓TimeZone瀵硅薄锛岃缃负涓浗鍖椾含鏃堕棿
+        TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
+
+        // 鍒涘缓Calendar瀵硅薄锛屽苟璁剧疆鏃跺尯
+        // 娉ㄦ剰锛欳alendar绫讳腑鐨勬湀浠芥槸浠�0寮�濮嬬殑锛屾墍浠ラ渶瑕佸噺鍘�1
+        java.util.Calendar calendar = java.util.Calendar.getInstance(timeZone);
+        calendar.setTime(date);
+
+        // 鑾峰彇褰撳墠灏忔椂鏁帮紙24灏忔椂鍒讹級
+        return calendar.get(java.util.Calendar.HOUR_OF_DAY);
+    }
+
+    public static int getTimeHour(Date date){
+        // 鍒涘缓TimeZone瀵硅薄锛岃缃负涓浗鍖椾含鏃堕棿
+        TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
+
+        // 鍒涘缓Calendar瀵硅薄锛屽苟璁剧疆鏃跺尯
+        // 娉ㄦ剰锛欳alendar绫讳腑鐨勬湀浠芥槸浠�0寮�濮嬬殑锛屾墍浠ラ渶瑕佸噺鍘�1
+        java.util.Calendar calendar = java.util.Calendar.getInstance(timeZone);
+        calendar.setTime(date);
+
+        // 鑾峰彇褰撳墠灏忔椂鏁帮紙24灏忔椂鍒讹級
+        return calendar.get(java.util.Calendar.HOUR_OF_DAY);
+    }
+
+    public static Date getYesterday(Date date){
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.DAY_OF_MONTH, -1);
+        return calendar.getTime();
+    }
+
+    public static String getYestMonthDay(Date date){
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+
+        int year = calendar.get(Calendar.YEAR);
+        int month = calendar.get(Calendar.MONTH) + 1;  // 鏈堜唤浠�0寮�濮嬶紝闇�瑕佸姞1
+        int day = calendar.get(Calendar.DAY_OF_MONTH);
+        return year+"骞�"+month+"鏈�"+day+"鏃�";
+    }
+
+    public static int getDifferenceDayInt(Date startDay,Date endDay){
+        return getDifferenceDayLong(startDay,endDay).intValue();
+    }
+
+    public static Long getDifferenceDayLong(Date startDay,Date endDay){
+        LocalDate localDateA = dateToLocalDate(startDay);
+        LocalDate localDateB = dateToLocalDate(endDay);
+
+        return getDifferenceDays(localDateA, localDateB);
+    }
+
+    public static Long getDifferenceDayDouble(String startDay,String endDay){
+        // 瀹氫箟鏃ユ湡瀛楃涓茬殑鏍煎紡
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝鏈坉鏃hh:mm");
+
+        // 灏嗘棩鏈熷瓧绗︿覆瑙f瀽涓篖ocalDate瀵硅薄
+        LocalDate dateA = LocalDate.parse(startDay, formatter);
+        LocalDate dateB = LocalDate.parse(endDay, formatter);
+
+        // 璁$畻鏃ユ湡瀵硅薄涔嬮棿鐨勭浉闅斿ぉ鏁�
+        return ChronoUnit.DAYS.between(dateA, dateB);
+
+    }
+
+    private static String getDatePart(String dateTime) {
+        int index = dateTime.indexOf(" ");
+        if (index != -1) {
+            return dateTime.substring(0, index);
+        }
+        return dateTime;
+    }
+
+    private static String getTimePart(String dateTime) {
+        int index = dateTime.indexOf(" ");
+        if (index != -1) {
+            return dateTime.substring(index + 1);
+        }
+        return "";
+    }
+
+    private static LocalDate dateToLocalDate(Date date) {
+        return date.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate();
+    }
+
+    private static long getDifferenceDays(LocalDate dateA, LocalDate dateB) {
+        return ChronoUnit.DAYS.between(dateA, dateB);
+    }
+}
diff --git a/src/main/resources/mapper/BusinessTripMapper.xml b/src/main/resources/mapper/BusinessTripMapper.xml
new file mode 100644
index 0000000..ab2d560
--- /dev/null
+++ b/src/main/resources/mapper/BusinessTripMapper.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.crm.manager.mapper.BusinessTripMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.crm.manager.entity.BusinessTrip">
+        <id column="id" property="id" />
+        <result column="business_trip_reasons" property="businessTripReasons" />
+        <result column="business_transportation" property="businessTransportation" />
+        <result column="business_return" property="businessReturn" />
+        <result column="business_start_province" property="businessStartProvince" />
+        <result column="business_start_city" property="businessStartCity" />
+        <result column="business_start_district" property="businessStartDistrict" />
+        <result column="business_start_town" property="businessStartTown" />
+        <result column="business_start_addr" property="businessStartAddr" />
+        <result column="business_end_province" property="businessEndProvince" />
+        <result column="business_end_city" property="businessEndCity" />
+        <result column="business_end_district" property="businessEndDistrict" />
+        <result column="business_end_town" property="businessEndTown" />
+        <result column="business_end_addr" property="businessEndAddr" />
+        <result column="business_start_time" property="businessStartTime" />
+        <result column="business_end_time" property="businessEndTime" />
+        <result column="business_duration" property="businessDuration" />
+        <result column="business_trip_days" property="businessTripDays" />
+        <result column="business_notes" property="businessNotes" />
+        <result column="business_peers" property="businessPeers" />
+        <result column="business_peers_id" property="businessPeersId" />
+        <result column="car_number" property="carNumber" />
+        <result column="kilometers" property="kilometers" />
+        <result column="user_id" property="userId" />
+        <result column="dept_id" property="deptId" />
+        <result column="host_id" property="hostId" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_id" property="updateId" />
+        <result column="form" property="form" />
+        <result column="settle" property="settle" />
+        <result column="settle_msg" property="settleMsg" />
+        <result column="status" property="status" />
+        <result column="business_trip_type" property="businessTripType" />
+        <result column="business_start_time_day" property="businessStartTimeDay" />
+        <result column="business_end_time_day" property="businessEndTimeDay" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/webapp/static/js/businessTrip/businessTrip.js b/src/main/webapp/static/js/businessTrip/businessTrip.js
new file mode 100644
index 0000000..6dc5bb3
--- /dev/null
+++ b/src/main/webapp/static/js/businessTrip/businessTrip.js
@@ -0,0 +1,330 @@
+var pageCurr;
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).extend({
+    cascader: 'cascader/cascader',
+}).use(['table','laydate', 'form', 'admin', 'cascader'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+    var cascader = layui.cascader;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#businessTrip',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/businessTrip/list/auth',
+        page: true,
+        limit: 15,
+        limits: [15, 30, 50, 100, 200, 500],
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-120',
+        cols: [[
+            // {type: 'checkbox'},
+            {field: 'id', align: 'center',title: 'ID',hide: true}
+            ,{field: 'businessTripReasons', align: 'center',title: '鍑哄樊浜嬬敱',hide: false}
+            ,{field: 'businessTransportation', align: 'center',title: '浜ら�氬伐鍏�',hide: false}
+            ,{field: 'businessReturn', align: 'center',title: '鍗曠▼寰�杩�',hide: false}
+            ,{field: 'businessStartProvince', align: 'center',title: '鍑哄彂鐪�',hide: true}
+            ,{field: 'businessStartCity', align: 'center',title: '鍑哄彂甯�',hide: true}
+            ,{field: 'businessStartDistrict', align: 'center',title: '鍑哄彂鍘�',hide: true}
+            ,{field: 'businessStartTown', align: 'center',title: '鍑哄彂闀�',hide: true}
+            ,{field: 'businessStartAddr', align: 'center',title: '鍑哄彂鍦�', templet:function(d){return emptyShow(d.businessStartAddr)},hide: true}
+            ,{field: 'businessStartAddr$', align: 'center',title: '鍑哄彂鍦�',hide: false}
+            ,{field: 'businessEndProvince', align: 'center',title: '鐩殑鐪�',hide: true}
+            ,{field: 'businessEndCity', align: 'center',title: '鐩殑甯�',hide: true}
+            ,{field: 'businessEndDistrict', align: 'center',title: '鐩殑鍘�',hide: true}
+            ,{field: 'businessEndTown', align: 'center',title: '鐩殑闀�',hide: true}
+            ,{field: 'businessEndAddr', align: 'center',title: '鐩殑鍦�', templet:function(d){return emptyShow(d.businessEndAddr)},hide: true}
+            ,{field: 'businessEndAddrr$', align: 'center',title: '鐩殑鍦�',hide: false}
+            ,{field: 'businessStartTimeDay$', align: 'center',title: '鍑哄彂鏃ユ湡',hide: false}
+            ,{field: 'businessEndTimeDay$', align: 'center',title: '缁撴潫鏃ユ湡',hide: false}
+            ,{field: 'businessDuration', align: 'center',title: '鍑哄樊鏃堕暱',hide: false}
+            ,{field: 'businessTripDays', align: 'center',title: '鍑哄樊澶╂暟',hide: false}
+            ,{field: 'businessNotes', align: 'center',title: '鍑哄樊澶囨敞',hide: false}
+            ,{field: 'businessPeers', align: 'center',title: '鍑鸿浜�',hide: false}
+            ,{field: 'businessPeersId', align: 'center',title: '鍚岃浜篒D',hide: true}
+            ,{field: 'carNumber', align: 'center',title: '鑷┚绉佸杞﹁溅鐗屽彿',hide: false}
+            ,{field: 'kilometers', align: 'center',title: '鑷┚绉佸杞﹁绋嬫槑缁嗗強鍏噷鏁�',hide: false}
+            ,{field: 'userId', align: 'center',title: '鍒涘缓浜�',hide: false}
+            ,{field: 'deptId', align: 'center',title: '鎵�灞為儴闂�',hide: false}
+            ,{field: 'hostId', align: 'center',title: 'hostId',hide: true}
+            ,{field: 'createTime$', align: 'center',title: '鍒涘缓鏃堕棿',hide: false}
+            ,{field: 'updateTime$', align: 'center',title: '鏇存柊鏃堕棿',hide: false}
+            ,{field: 'updateId', align: 'center',title: '鏇存柊浜哄憳ID',hide: true}
+            ,{field: 'settle', align: 'center',title: '杩涘害',hide: false}
+            ,{field: 'status$', align: 'center',title: '鐘舵��',hide: false}
+            ,{field: 'businessTripType', align: 'center',title: '绫诲瀷',hide: true}
+
+            ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:120}
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            limit();
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(businessTrip)', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {curr: 1}
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(businessTrip)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id).data;
+        switch(obj.event) {
+            case 'addData':
+                showEditModel();
+                break;
+            case 'deleteData':
+               if (checkStatus.length === 0) {
+                   layer.msg('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁', {icon: 2});
+                   return;
+               }
+               del(checkStatus.map(function (d) {
+                   return d.id;
+               }));
+               break;
+            case 'exportData':
+                admin.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        'businessTrip': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/businessTrip/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg, {icon: 2})
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(businessTrip)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            case 'edit':
+                showEditModel(data);
+                break;
+            case "del":
+                del([data.id]);
+                break;
+        }
+    });
+
+    /* 寮圭獥 - 鏂板銆佷慨鏀� */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: ["95%", "90%"],
+            title: (mData ? '淇敼' : '娣诲姞') + '璁㈠崟鐘舵��',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                if (mData) {
+                    $('#cascaderValStart').val(mData.pcdStart);
+                }
+                if (mData) {
+                    $('#cascaderValEnd').val(mData.pcdEnd);
+                }
+                layDateRender(mData);
+                cascaderRenderStart();
+                cascaderRenderEnd();
+                form.val('detail', mData);
+                form.on('submit(editSubmit)', function (data) {
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/businessTrip/"+(mData?'update':'add')+"/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                layer.msg(res.msg, {icon: 1});
+                                tableReload();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    /* 鍒犻櫎 */
+    function del(ids) {
+        layer.confirm('纭畾瑕佸垹闄ら�変腑鏁版嵁鍚楋紵', {
+            skin: 'layui-layer-admin',
+            shade: .1
+        }, function (i) {
+            layer.close(i);
+            var loadIndex = layer.load(2);
+            $.ajax({
+                url: baseUrl+"/businessTrip/delete/auth",
+                headers: {'token': localStorage.getItem('token')},
+                data: {ids: ids},
+                method: 'POST',
+                success: function (res) {
+                    layer.close(loadIndex);
+                    if (res.code === 200){
+                        layer.msg(res.msg, {icon: 1});
+                        tableReload();
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    } else {
+                        layer.msg(res.msg, {icon: 2});
+                    }
+                }
+            })
+        });
+    }
+
+    // 鎼滅储
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 閲嶇疆
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    function layDateRender(data) {
+        setTimeout(function () {
+            layDate.render({
+                elem: '#businessStartTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['businessStartTime\\$']:null
+            });
+            layDate.render({
+                elem: '#businessEndTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['businessEndTime\\$']:null
+            });
+            layDate.render({
+                elem: '#createTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['createTime\\$']:null
+            });
+            layDate.render({
+                elem: '#updateTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['updateTime\\$']:null
+            });
+
+        }, 300);
+    }
+    layDateRender();
+
+    // 鐪佸競鍖洪�夋嫨
+    function cascaderRenderStart() {
+        cascader.render({
+            elem: '#cascaderValStart',
+            data: citysData,
+            itemHeight: '250px',
+            filterable: true,
+            onChange: function (values, data) {
+                // console.log(values);console.log(data);
+            }
+        });
+    }
+
+    // 鐪佸競鍖洪�夋嫨
+    function cascaderRenderEnd() {
+        cascader.render({
+            elem: '#cascaderValEnd',
+            data: citysData,
+            itemHeight: '250px',
+            filterable: true,
+            onChange: function (values, data) {
+                // console.log(values);console.log(data);
+            }
+        });
+    }
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function() {
+        searchData[this.name] = this.value;
+    });
+    tableIns.reload({
+        where: searchData,
+        page: {curr: pageCurr}
+     });
+}
diff --git a/src/main/webapp/views/businessTrip/businessTrip.html b/src/main/webapp/views/businessTrip/businessTrip.html
new file mode 100644
index 0000000..7ecf9c7
--- /dev/null
+++ b/src/main/webapp/views/businessTrip/businessTrip.html
@@ -0,0 +1,288 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/tree.css" media="all">
+    <link rel="stylesheet" href="../../static/layui/lay/modules/formDesigner/coolForm.css" />
+    <style>
+        .nav-box {
+            position: absolute;
+            top: 1px;
+            left: 5px;
+        }
+        .nav-box-item {
+            display: inline-block;
+            vertical-align: middle;
+            margin-right: 5px;
+        }
+
+        .layui-dropdown.layui-border-box.layui-panel.layui-anim.layui-anim-downbit,.layui-dropdown.layui-border-box.layui-panel.layui-anim.layui-anim-downbit * {
+            box-sizing:inherit;
+        }
+
+        .layui-menu li {
+            width: inherit;
+        }
+        .layui-tree-icon {
+            height: 16px;
+            line-height: 15px;
+            width: 15px;
+            text-align: center;
+            border: 1px solid #c0c4cc;
+        }
+
+        .site-dropdown-demo,
+        .site-dropdown-demo .layui-menu{background: #32363F;border-color: #484e58;}
+        .site-dropdown-demo .layui-menu li{color: #a1a8b8;}
+        .site-dropdown-demo .layui-menu li:hover{background-color: #32363F;}
+        .layui-menu-body-title>.layui-icon {
+            position: relative;
+            margin-right: 5px;
+        }
+
+        .layui-form-radio {
+            display: block;
+        }
+        .layui-unselect.layui-form-radio {
+            display: inline-block;
+        }
+        .layui-form-radio:hover *, .layui-form-radioed, .layui-form-radioed>i {
+            color: #2d8cf0;
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-form toolbar" id="search-box">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <label class="layui-form-label">缂栧彿:</label>
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="id" placeholder="缂栧彿" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">&emsp;
+                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                            <i class="layui-icon">&#xe615;</i>鎼滅储
+                        </button>
+                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                            <i class="layui-icon">&#xe666;</i>閲嶇疆
+                        </button>
+                    </div>
+                </div>
+            </div>
+            <table class="layui-hide" id="businessTrip" lay-filter="businessTrip"></table>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">鏂板</button>
+        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">淇敼</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">鍒犻櫎</a>
+</script>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/layui/lay/modules/cascader/citys-data.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/businessTrip/businessTrip.js" charset="utf-8"></script>
+</body>
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <form id="detail" lay-filter="detail" class="layui-form admin-form" style="height: 100%;overflow-y: hidden;">
+        <div class="model-form" style="height: 87%;overflow-x: hidden;overflow-y: scroll">
+            <input name="id" type="hidden">
+            <!--鍩烘湰淇℃伅-->
+            <blockquote class="layui-elem-quote" style="margin-left: 30px;padding: 8px 15px;">鍩烘湰淇℃伅</blockquote>
+            <div class="layui layui-row">
+                <div class="layui-col-md12">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">鍑哄樊浜嬬敱: </label>
+                        <div class="layui-input-block">
+                            <input class="layui-input" name="businessTripReasons" placeholder="璇疯緭鍏ュ嚭宸簨鐢�" lay-vertype="tips" lay-verify="required">
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <!--琛岀▼-->
+            <blockquote class="layui-elem-quote" style="margin-left: 30px;padding: 8px 15px;">琛岀▼淇℃伅</blockquote>
+            <div class="layui layui-row">
+                <div class="layui-col-md6">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">浜ら�氬伐鍏�: </label>
+                        <div class="layui-input-block">
+                            <select name="businessTransportation" lay-vertype="tips" lay-verify="required">
+                                <option value="">璇烽�夋嫨鍖哄垎</option>
+                                <option value="1">椋炴満</option>
+                                <option value="2">楂橀搧</option>
+                                <option value="3">鐏溅</option>
+                                <option value="4">姹借溅</option>
+                                <option value="5">鎽╂墭</option>
+                                <option value="6">鐢佃溅</option>
+                                <option value="7">鍏跺畠</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">鍗曠▼寰�杩�: </label>
+                        <div class="layui-input-block">
+                            <select name="businessReturn" lay-vertype="tips" lay-verify="required">
+                                <option value="">璇烽�夋嫨鍖哄垎</option>
+                                <option value="1">鍗曠▼</option>
+                                <option value="2">寰�杩�</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">杞︾墝鍙�: </label>
+                        <div class="layui-input-block">
+                            <input class="layui-input" name="carNumber" placeholder="璇疯緭鍏ヨ嚜椹剧瀹惰溅杞︾墝鍙�(鑻ヤ笉鐢ㄥ垯濉啓鈥樻棤鈥�)" lay-vertype="tips" lay-verify="required">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">琛岀▼鏄庣粏鍙婂叕閲屾暟: </label>
+                        <div class="layui-input-block">
+                            <input class="layui-input" name="kilometers" placeholder="璇疯緭鍏ヨ嚜椹剧瀹惰溅琛岀▼鏄庣粏鍙婂叕閲屾暟(鑻ヤ笉鐢ㄥ垯濉啓鈥樻棤鈥�)" lay-vertype="tips" lay-verify="required">
+                        </div>
+                    </div>
+
+                </div>
+                <div class="layui-col-md6">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">鍑哄彂鍦�: </label>
+                        <div class="layui-input-block">
+                            <input id="cascaderValStart" class="layui-input" name="pcdStart" placeholder="璇烽�夋嫨鍑哄彂鍦�"  lay-verify="required">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">鍑哄彂鍦拌缁嗗湴鍧�: </label>
+                        <div class="layui-input-block">
+                            <input class="layui-input" name="businessStartAddr" placeholder="璇疯緭鍏ュ嚭鍙戝湴璇︾粏鍦板潃"  autocomplete="off"  lay-verify="required">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">鐩殑鍦�: </label>
+                        <div class="layui-input-block">
+                            <input id="cascaderValEnd" class="layui-input" name="pcdEnd" placeholder="璇烽�夋嫨鍑哄彂鍦�"  lay-verify="required">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">鐩殑鍦拌缁嗗湴鍧�: </label>
+                        <div class="layui-input-block">
+                            <input class="layui-input" name="businessEndAddr" placeholder="璇疯緭鍏ョ洰鐨勫湴璇︾粏鍦板潃"  autocomplete="off"  lay-verify="required">
+                        </div>
+                    </div>
+<!--                    <div class="layui-form-item">-->
+<!--                        <label class="layui-form-label">鍑哄樊鏃堕暱: </label>-->
+<!--                        <div class="layui-input-block">-->
+<!--                            <input class="layui-input" name="businessDuration" placeholder="璇疯緭鍏ュ嚭宸椂闀�">-->
+<!--                        </div>-->
+<!--                    </div>-->
+<!--                    <div class="layui-form-item">-->
+<!--                        <label class="layui-form-label">鍑哄樊澶╂暟: </label>-->
+<!--                        <div class="layui-input-block">-->
+<!--                            <input class="layui-input" name="businessTripDays" placeholder="璇疯緭鍏ュ嚭宸ぉ鏁�">-->
+<!--                        </div>-->
+<!--                    </div>-->
+                </div>
+            </div>
+            <!--鑷┚-->
+            <blockquote class="layui-elem-quote" style="margin-left: 30px;padding: 8px 15px;">鑷┚淇℃伅</blockquote>
+            <div class="layui layui-row">
+                <div class="layui-col-md6">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">鍑哄彂鏃ユ湡: </label>
+                        <div class="layui-input-block">
+                            <input class="layui-input" name="businessStartTime" id="businessStartTime$" placeholder="璇疯緭鍏ュ嚭鍙戞棩鏈�" lay-vertype="tips" lay-verify="required">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">鍑哄彂鏃惰景: </label>
+                        <div class="layui-input-block">
+                            <select name="businessStartTimeDay" lay-vertype="tips" lay-verify="required">
+                                <option value="">璇烽�夋嫨鍖哄垎</option>
+                                <option value="1">涓婂崍</option>
+                                <option value="2">涓嬪崍</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-col-md6">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">缁撴潫鏃ユ湡: </label>
+                        <div class="layui-input-block">
+                            <input class="layui-input" name="businessEndTime" id="businessEndTime$" placeholder="璇疯緭鍏ョ粨鏉熸棩鏈�" lay-vertype="tips" lay-verify="required">
+                        </div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">缁撴潫鏃惰景: </label>
+                        <div class="layui-input-block">
+                            <select name="businessEndTimeDay" lay-vertype="tips" lay-verify="required">
+                                <option value="">璇烽�夋嫨鍖哄垎</option>
+                                <option value="1">涓婂崍</option>
+                                <option value="2">涓嬪崍</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <!--鍏跺畠-->
+            <blockquote class="layui-elem-quote" style="margin-left: 30px;padding: 8px 15px;">琛岀▼淇℃伅</blockquote>
+            <div class="layui layui-row">
+                <div class="layui-col-md6">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label layui-form-required">鍚岃浜�: </label>
+                        <div class="layui-input-block">
+                            <input class="layui-input" name="businessPeers" placeholder="璇疯緭鍏ュ悓琛屼汉" lay-vertype="tips" lay-verify="required">
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-col-md6">
+                </div>
+                <div class="layui-col-md12">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">鍑哄樊澶囨敞: </label>
+                        <div class="layui-input-block">
+                            <input class="layui-input" name="businessNotes" placeholder="璇疯緭鍏ュ嚭宸娉�">
+                        </div>
+                    </div>
+<!--                    <div class="layui-form-item">-->
+<!--                        <label class="layui-form-label">绫诲瀷: </label>-->
+<!--                        <div class="layui-input-block">-->
+<!--                            <input class="layui-input" name="businessTripType" placeholder="璇疯緭鍏ョ被鍨�">-->
+<!--                        </div>-->
+<!--                    </div>-->
+
+                 </div>
+            </div>
+            <hr class="layui-bg-gray">
+        </div>
+        <div class="layui-form-item text-right">
+            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+        </div>
+    </form>
+</script>
+</html>
+

--
Gitblit v1.9.1