Prechádzať zdrojové kódy

管桩预约和充电桩预约

shasha 5 dní pred
rodič
commit
49aa044769
39 zmenil súbory, kde vykonal 3192 pridanie a 16 odobranie
  1. 11 12
      app.json
  2. 187 0
      otherPages/chargestation/add.js
  3. 18 0
      otherPages/chargestation/add.json
  4. 40 0
      otherPages/chargestation/add.wxml
  5. 209 0
      otherPages/chargestation/add.wxss
  6. 204 0
      otherPages/chargestation/edit.js
  7. 20 0
      otherPages/chargestation/edit.json
  8. 1 0
      otherPages/chargestation/edit.less
  9. 41 0
      otherPages/chargestation/edit.wxml
  10. 417 0
      otherPages/chargestation/index.js
  11. 15 0
      otherPages/chargestation/index.json
  12. 44 0
      otherPages/chargestation/index.less
  13. 115 0
      otherPages/chargestation/index.wxml
  14. 42 0
      otherPages/chargestation/index.wxss
  15. 143 0
      otherPages/chargestation/info.js
  16. 16 0
      otherPages/chargestation/info.json
  17. 1 0
      otherPages/chargestation/info.less
  18. 24 0
      otherPages/chargestation/info.wxml
  19. 1 1
      otherPages/loadAppoint/allocation.js
  20. 204 0
      otherPages/pipeAppoint/add.js
  21. 18 0
      otherPages/pipeAppoint/add.json
  22. 50 0
      otherPages/pipeAppoint/add.wxml
  23. 209 0
      otherPages/pipeAppoint/add.wxss
  24. 237 0
      otherPages/pipeAppoint/edit.js
  25. 20 0
      otherPages/pipeAppoint/edit.json
  26. 1 0
      otherPages/pipeAppoint/edit.less
  27. 51 0
      otherPages/pipeAppoint/edit.wxml
  28. 417 0
      otherPages/pipeAppoint/index.js
  29. 15 0
      otherPages/pipeAppoint/index.json
  30. 44 0
      otherPages/pipeAppoint/index.less
  31. 113 0
      otherPages/pipeAppoint/index.wxml
  32. 42 0
      otherPages/pipeAppoint/index.wxss
  33. 143 0
      otherPages/pipeAppoint/info.js
  34. 16 0
      otherPages/pipeAppoint/info.json
  35. 1 0
      otherPages/pipeAppoint/info.less
  36. 24 0
      otherPages/pipeAppoint/info.wxml
  37. 6 1
      pages/workstand/index.js
  38. 24 2
      utils/api.js
  39. 8 0
      utils/iconfont.wxss

+ 11 - 12
app.json

@@ -11,7 +11,7 @@
     "pages/temporary/edit",
     "pages/queueCar/index",
     "pages/queueCar/info",
-    "pages/queueCar/adjustOrder",  
+    "pages/queueCar/adjustOrder",
     "pages/weighingRecord/index",
     "pages/weighingRecord/info",
     "pages/mine/index",
@@ -44,10 +44,7 @@
     "pages/operationExecution/production",
     "pages/operationExecution/waterHandle",
     "pages/operationExecution/hygieneHandle"
-
-
   ],
-
   "subpackages": [
     {
       "root": "otherPages",
@@ -56,29 +53,31 @@
         "repairDispatch/index",
         "repairDispatch/dispatch",
         "repairDispatch/info",
-
         "upDownSubmit/index",
         "upDownSubmit/info",
         "upDownSubmit/sign",
-        
         "workTask/index",
         "workTask/info",
-
         "reportFault/index",
         "reportFault/info",
         "reportFault/report",
-
         "parkConfig/index",
         "loadArrive/index",
         "loadArrive/add",
         "loadArrive/edit",
         "loadArrive/info",
-
         "loadAppoint/index",
-        "loadAppoint/info",      
+        "loadAppoint/info",
         "loadAppoint/allocation",
-        "loadAppoint/dispatch"
-
+        "loadAppoint/dispatch",
+        "pipeAppoint/index",
+        "pipeAppoint/add",
+        "pipeAppoint/edit",
+        "pipeAppoint/info",
+        "chargestation/index",
+        "chargestation/add",
+        "chargestation/edit",
+        "chargestation/info"
       ],
       "independent": false
     }

+ 187 - 0
otherPages/chargestation/add.js

@@ -0,0 +1,187 @@
+// pages/pipeAppoint/add.js
+const app = getApp()
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    showModal: false,
+    defaultText: '请选择',
+    isSubmitting: false,
+
+    isKeyboard: false, //是否显示车牌输入键盘
+    inputOnFocusIndex: '', //当前锁定的车号位置
+    licensePlate: '', //用于提交
+    inputPlates: '', //用于显示
+
+    driverArray:[], //司机
+    driverIndex:null,
+
+  },
+  //输入框焦点聚焦时隐藏车牌号输入框
+  hideKeybord: function () {
+    this.setData({
+      isKeyboard: false,
+      inputOnFocusIndex: ''
+    })
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    //获取司机信息
+    this.loadUserData()
+  },
+
+  //获取车牌号
+  licensePlate: function (e) {
+    this.setData({
+      licensePlate: e.detail.carNum
+    })
+  },
+
+  //司机
+  loadUserData:function(loadUserId){
+    app.request.GET({
+      url: app.API.roleUser,
+      params: {
+        roleName : '司机',
+      },
+      page: this,
+      successFun: true
+    }).then(res => {
+      this.setData({
+        driverArray : res.data.data
+      })
+    })
+  },
+
+  //下拉选择
+  bindPickerChange: function (e) { 
+    let { pickername } = e.target.dataset
+    let getIndex = pickername + 'Index'
+    app.util.getPickerIndex(this, getIndex, e);
+    switch (pickername) {
+      case 'driver': //选择司机
+        this.setData({
+          driverMobile  : this.data.driverArray[this.data.driverIndex].phone,
+        })
+        break;
+    }
+  },
+
+  // 单选
+  dangerStatusChange: function (e) {
+    this.setData({
+      [e.currentTarget.dataset.radiotype]: e.detail.value
+    })
+  },
+  //多选
+  checkboxChange: function (e) {
+    this.setData({
+      [e.currentTarget.dataset.checkboxtype]: e.detail
+    })
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  bindscrolltolowerFun() {
+    
+  },
+
+  //表单提交 carTaskAdd
+  formSubmit: function ({detail:{value}}) {
+    var warn = ""; //弹框时提示的内容
+    let reg = /^1[3-9]\d{9}$/;
+    var xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
+    var creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
+    //value.certificateNoImage = this.data.originalInvoicePhoto
+    if (value.licenseNumber == '') {
+      warn = "车牌不能为空!";
+    } else if (value.licenseNumber.length < 8) {
+      warn = "请选择新能源车牌号!";
+    } else if (value.licenseNumber.length == 8 && !xreg.test(value.licenseNumber)) {
+      warn = "新能源车牌号格式错误!";
+    } else if(value.driverId == ''){
+      warn = "请输入司机姓名!";
+    } 
+
+    if (warn != '') {
+      app.util.checkForm(warn);
+    } else {
+      app.request.POST({
+        url: app.API.chargestationAdd,
+        params: value,
+        page: this,
+        isLoadingTxt: '提交中...',
+        isSubmitting: true,
+        successFun: true
+      }).then(res => {
+        wx.showToast({
+          title: '新增成功',
+          icon: 'success',
+          duration: 2000,
+          mask:true,
+          complete: function () {
+            setTimeout(() => {
+              wx.navigateBack()
+            }, 1500) //延迟时间  
+          }
+        })
+      })
+
+    }
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+    
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  }
+})

+ 18 - 0
otherPages/chargestation/add.json

@@ -0,0 +1,18 @@
+{
+  "navigationBarTitleText": "新增充电桩预约",
+  "usingComponents": {
+    "van-checkbox": "@vant/weapp/checkbox/index",
+    "van-checkbox-group": "@vant/weapp/checkbox-group/index",
+    "van-uploader": "@vant/weapp/uploader/index",
+    "car-num-input": "/components/CarNumInput/index",
+    "van-icon": "@vant/weapp/icon/index",
+    "van-cell": "@vant/weapp/cell/index",
+    "van-cell-group": "@vant/weapp/cell-group/index",
+    "van-field": "@vant/weapp/field/index",
+    "van-button": "@vant/weapp/button/index",
+    "van-popup": "@vant/weapp/popup/index",
+    "van-datetime-picker": "@vant/weapp/datetime-picker/index",
+    "van-action-sheet": "@vant/weapp/action-sheet/index",
+    "van-search": "@vant/weapp/search/index"
+  }
+}

+ 40 - 0
otherPages/chargestation/add.wxml

@@ -0,0 +1,40 @@
+<!--pages/pipeAppoint/add.wxml-->
+<view class="container" style="padding-bottom:100px;">
+  <view class="height20"></view>
+  <view>
+    <form bindsubmit="formSubmit">
+      <view class="part">
+        <van-field required label="车牌号码" readonly border="{{false}}"></van-field>
+        <car-num-input bind:setCarNum="licensePlate" isKeyboard="{{isKeyboard}}" inputOnFocusIndex="{{inputOnFocusIndex}}" inputPlates="{{inputPlates}}" isNewEnergy="{{isNewEnergy}}"></car-num-input>
+        <input name="licenseNumber" value='{{licensePlate}}' hidden='true' />
+      </view>
+        
+      <view class="part">
+        <!-- 司机 -->
+        <van-field label="司机" required input-align="right">
+          <view slot="input" style="width: 100%;">
+            <input name="driverId" value='{{driverArray[driverIndex].id}}' hidden='true' />
+            <picker bindchange="bindPickerChange" value="{{driverIndex}}" range="{{driverArray}}" range-key="name" data-pickername='driver'>
+              <view wx:if="{{driverArray[driverIndex].name}}"> {{driverArray[driverIndex].name}}</view>
+              <view wx:else class="selectPlaceholder">{{ defaultText }}</view>
+            </picker>
+          </view>
+          <view slot="right-icon">
+            <van-icon name="arrow" />
+          </view>
+        </van-field>
+
+        <van-field label="司机电话" wx:if="{{driverArray[driverIndex].id}}" name="driverMobile" readonly value="{{ driverMobile }}" placeholder="选择司机自动填入" input-align="right">
+        </van-field>
+      </view>
+
+      <view class="fixedBtn submitBtn">
+        <van-button loading="{{isSubmitting}}" round block disabled="{{isSubmitting}}" loading-text="{{isSubmitting?'提交中...':''}}" type="info" form-type="submit">确定
+        </van-button>
+      </view>
+
+    </form>
+  </view>
+</view>
+
+<wxs module="filters" src="../../utils/filter.wxs"></wxs>

+ 209 - 0
otherPages/chargestation/add.wxss

@@ -0,0 +1,209 @@
+/* pages/pipeAppoint/add.wxss */
+.van-field__label {
+  width: 240rpx !important;
+}
+
+.formTopBlueBg {
+  height: 144rpx;
+  background-color: #0396FF;
+}
+
+.part {
+  border-radius: 16rpx;
+  padding: 20rpx 00rpx;
+  background: #fff;
+  margin-bottom: 20rpx;
+}
+
+picker view {
+  line-height: normal !important;
+}
+
+.heightAuto .van-field__control--right {
+  height: auto !important;
+}
+
+.topProJectInfo {
+  padding: 26rpx 40rpx;
+}
+.labelTitle{
+  padding: 0 16px;
+  color: #323233;
+  font-size: 14px;
+}
+.topItem1 .van-cell {
+  padding-top: 6rpx !important;
+  padding-bottom: 6rpx !important;
+}
+.topItem {
+  position: relative;
+  padding-bottom: 16rpx;
+}
+.topItem2::after{
+  border:0 none !important
+}
+.topItem::after {
+  border-bottom: 1px solid #ebedf0;
+  bottom: 0;
+  box-sizing: border-box;
+  content: " ";
+  left: 16px;
+  pointer-events: none;
+  position: absolute;
+  right: 16px;
+  transform: scaleY(.5);
+  transform-origin: center;
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+  border-bottom-color: rgb(235, 237, 240);
+}
+
+.proTitle {
+  font-size: 36rpx;
+  font-weight: bold;
+  color: rgba(0, 0, 0, 0.85);
+}
+
+.proJectInfoCode {
+  width: 100%;
+  display: flex;
+  padding: 10rpx 10rpx 0 0rpx;
+  color: rgba(0, 0, 0, 0.65);
+  justify-content: space-between;
+}
+
+.proJectInfoCode>view:last-child {
+  padding: 0 16rpx;
+  display: flex;
+  height: 40rpx;
+  line-height: 40rpx;
+  color: #2C6CEC;
+  font-size: 20rpx;
+  border-radius: 20rpx;
+  border: 1px solid #2C6CEC;
+  align-items: center;
+  white-space: nowrap;
+}
+
+.radioHeight .radioHeightBx {
+  width: 100%;
+}
+radio-group {
+  text-align: right;
+}
+.fieldAutoHeight .van-field__body,.fieldAutoHeight .van-field__control {
+  height: auto !important;
+  text-align: left;
+  line-height: 30px;
+}
+.ysType{
+  flex: 1;
+  text-align: right;
+}
+.ysType text:first-child{
+  margin-right: 12rpx;
+}
+.ysType text{
+  display: inline-block;
+  width: 80rpx;
+  height: 48rpx;
+  line-height: 48rpx;
+  text-align: center;
+  background: #E1E1E1;
+  border: 1px solid #E1E1E1;
+  border-radius: 4rpx;
+  box-sizing: border-box;
+}
+.ysType .active{
+  color: #2C6CEC;
+  border: 1rpx solid #2C6CEC;
+  background: transparent;
+}
+
+.otherInfo{
+  padding: 10rpx 10rpx 0 0rpx;
+  color: rgba(0, 0, 0, 0.65);
+}
+.otherInfo .status {
+  clear: both;
+}
+
+.type{
+  display: inline-block;
+  padding: 4rpx 10rpx;
+  color: #2C6CEC;
+  background: rgba(44,108,236,0.1);
+}
+.type1{
+  color: #52C41A;
+  background: rgba(82,196,26,0.1);
+}
+.type2{
+  color: #FAAD14;
+  background: rgba(250,173,20,0.1);
+}
+
+.setHeight{
+  height: 120rpx !important;
+}
+.radioHeight .radioHeightBx{
+  width: 100%;
+}
+.radioHeight .van-field__body {
+  height: 28px;
+  line-height: 25px;
+}
+.bottomBtn view:first-child {
+  flex: 1;
+}
+.chooseDriver{
+  width: 600rpx;
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+}
+.dialogUser {
+  flex: 1;
+  width: 100%;
+  padding: 30rpx 0;
+  box-sizing: border-box;
+  overflow-y: auto;
+}
+.spacialName {
+  display: inline-block;
+  width: 64rpx;
+  height: 64rpx;
+  line-height: 64rpx;
+  margin: 0 20rpx 0 10rpx;
+  border-radius: 50%;
+  text-align: center;
+  color: #3764FF;
+  font-size: 24rpx;
+  background-color: rgba(55, 100, 255, 0.0510);
+}
+.bottomBtn {
+  display: flex;
+  width: 100%;
+  padding: 20rpx;
+  font-size: 28rpx;
+  box-sizing: border-box;
+  align-items: center;
+  justify-content: space-around;
+  border-top: 1px solid #f9f7f9;
+}
+
+/* 选人弹窗 */
+.chooseUserMain {
+  width: 600rpx;
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+}
+
+.dialogUser {
+  flex: 1;
+  width: 100%;
+  padding: 30rpx 0;
+  box-sizing: border-box;
+  overflow-y: auto;
+}

+ 204 - 0
otherPages/chargestation/edit.js

@@ -0,0 +1,204 @@
+// pages/pipeAppoint/edit.js
+const app = getApp()
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    showModal: false,
+    defaultText: '请选择',
+    isSubmitting: false,
+
+    isKeyboard: false, //是否显示车牌输入键盘
+    inputOnFocusIndex: '', //当前锁定的车号位置
+    licensePlate: '', //用于提交
+    inputPlates: '', //用于显示
+
+    driverArray:[], //司机
+    driverIndex:null,
+  },
+  //输入框焦点聚焦时隐藏车牌号输入框
+  hideKeybord: function () {
+    this.setData({
+      isKeyboard: false,
+      inputOnFocusIndex: ''
+    })
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    //获取详情
+    var pages = getCurrentPages();
+    var prevPage = pages[pages.length - 2];
+    let getInfo = prevPage.data.resData[options.index]
+
+    let getCarNumArr = getInfo.licenseNumber ? getInfo.licenseNumber.split('') : ''
+    let inputPlates = {};
+    for (let i = 0; i < getCarNumArr.length; i++) {
+      inputPlates['index' + i] = getCarNumArr[i]
+    }
+
+    this.setData({
+      info: getInfo,
+      driverMobile: getInfo.driverMobile,
+      inputPlates: inputPlates,
+      isNewEnergy: getCarNumArr.length > 7 ? true : false,
+      licensePlate: getInfo.licenseNumber,
+    })
+    //获取司机信息
+    this.loadUserData()
+  },
+
+  //获取车牌号
+  licensePlate: function (e) {
+    this.setData({
+      licensePlate: e.detail.carNum
+    })
+  },
+
+  //司机
+  loadUserData:function(loadUserId){
+    app.request.GET({
+      url: app.API.roleUser,
+      params: {
+        roleName : '司机',
+      },
+      page: this,
+      successFun: true
+    }).then(res => {
+      this.setData({
+        driverArray : res.data.data,
+        driverIndex : app.util.getDicIndex(res.data.data, this.data.info.driverId, 'id')
+      })
+    })
+  },
+
+  //下拉选择
+  bindPickerChange: function (e) { 
+    let { pickername } = e.target.dataset
+    let getIndex = pickername + 'Index'
+    app.util.getPickerIndex(this, getIndex, e);
+    switch (pickername) {
+      case 'driver': //选择司机
+        this.setData({
+          driverMobile  : this.data.driverArray[this.data.driverIndex].phone,
+        })
+        break;
+    }
+  },
+
+  // 单选
+  dangerStatusChange: function (e) {
+    this.setData({
+      [e.currentTarget.dataset.radiotype]: e.detail.value
+    })
+  },
+  //多选
+  checkboxChange: function (e) {
+    this.setData({
+      [e.currentTarget.dataset.checkboxtype]: e.detail
+    })
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  bindscrolltolowerFun() {
+    
+  },
+
+  //表单提交 carTaskAdd
+  formSubmit: function ({detail:{value}}) {
+    var warn = ""; //弹框时提示的内容
+    let reg = /^1[3-9]\d{9}$/;
+    var xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
+    var creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
+    if (value.licenseNumber == '') {
+      warn = "车牌不能为空!";
+    } else if (value.licenseNumber.length < 8) {
+      warn = "请选择新能源车牌号!";
+    } else if (value.licenseNumber.length == 8 && !xreg.test(value.licenseNumber)) {
+      warn = "新能源车牌号格式错误!";
+    } else if(value.driverId == ''){
+      warn = "请输入司机姓名!";
+    } 
+
+    if (warn != '') {
+      app.util.checkForm(warn);
+    } else {
+      app.request.POST({
+        url: app.API.appointmentPipeEdit,
+        params: value,
+        page: this,
+        isLoadingTxt: '提交中...',
+        isSubmitting: true,
+        successFun: true
+      }).then(res => {
+        wx.showToast({
+          title: '修改成功',
+          icon: 'success',
+          duration: 2000,
+          mask:true,
+          complete: function () {
+            setTimeout(() => {
+              wx.navigateBack()
+            }, 1500) //延迟时间  
+          }
+        })
+      })
+
+    }
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+    
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  }
+})

+ 20 - 0
otherPages/chargestation/edit.json

@@ -0,0 +1,20 @@
+{
+  "navigationBarTitleText": "修改充电桩预约",
+  "usingComponents": {
+    "van-checkbox": "@vant/weapp/checkbox/index",
+    "van-checkbox-group": "@vant/weapp/checkbox-group/index",
+    "van-uploader": "@vant/weapp/uploader/index",
+    "car-num-input": "/components/CarNumInput/index",
+    "van-icon": "@vant/weapp/icon/index",
+    "van-cell": "@vant/weapp/cell/index",
+    "van-cell-group": "@vant/weapp/cell-group/index",
+    "van-field": "@vant/weapp/field/index",
+    "van-button": "@vant/weapp/button/index",
+    "van-popup": "@vant/weapp/popup/index",
+    "van-datetime-picker": "@vant/weapp/datetime-picker/index",
+    "van-radio": "@vant/weapp/radio/index",
+    "van-radio-group": "@vant/weapp/radio-group/index",
+    "van-action-sheet": "@vant/weapp/action-sheet/index",
+    "van-search": "@vant/weapp/search/index"
+  }
+}

+ 1 - 0
otherPages/chargestation/edit.less

@@ -0,0 +1 @@
+/* pages/pipeAppoint/edit.wxss */

+ 41 - 0
otherPages/chargestation/edit.wxml

@@ -0,0 +1,41 @@
+<!--pages/pipeAppoint/edit.wxml-->
+<view class="container" style="padding-bottom:100px;">
+  <view class="height20"></view>
+  <view>
+    <form bindsubmit="formSubmit">
+      <input name="id" value='{{info.id}}' hidden='true' />
+      <view class="part">
+        <van-field required label="车牌号码" readonly border="{{false}}"></van-field>
+        <car-num-input bind:setCarNum="licensePlate" isKeyboard="{{isKeyboard}}" inputOnFocusIndex="{{inputOnFocusIndex}}" inputPlates="{{inputPlates}}" isNewEnergy="{{isNewEnergy}}"></car-num-input>
+        <input name="licenseNumber" value='{{licensePlate}}' hidden='true' />
+      </view>
+        
+      <view class="part">
+        <!-- 司机 -->
+        <van-field label="司机" required input-align="right">
+          <view slot="input" style="width: 100%;">
+            <input name="driverId" value='{{driverArray[driverIndex].id}}' hidden='true' />
+            <picker bindchange="bindPickerChange" value="{{driverIndex}}" range="{{driverArray}}" range-key="name" data-pickername='driver'>
+              <view wx:if="{{driverArray[driverIndex].name}}"> {{driverArray[driverIndex].name}}</view>
+              <view wx:else class="selectPlaceholder">{{ defaultText }}</view>
+            </picker>
+          </view>
+          <view slot="right-icon">
+            <van-icon name="arrow" />
+          </view>
+        </van-field>
+
+        <van-field label="司机电话" wx:if="{{driverArray[driverIndex].id}}" name="driverMobile" readonly value="{{ driverMobile }}" placeholder="选择司机自动填入" input-align="right">
+        </van-field>
+      </view>
+
+      <view class="fixedBtn submitBtn">
+        <van-button loading="{{isSubmitting}}" round block disabled="{{isSubmitting}}" loading-text="{{isSubmitting?'提交中...':''}}" type="info" form-type="submit">确定
+        </van-button>
+      </view>
+
+    </form>
+  </view>
+</view>
+
+<wxs module="filters" src="../../utils/filter.wxs"></wxs>

+ 417 - 0
otherPages/chargestation/index.js

@@ -0,0 +1,417 @@
+// pages/pipeAppoint/index.js
+const app = getApp()
+var startPoint
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    str:'&emsp;',
+    str2: '&ensp;',
+
+    filterWidth: 0, //获取顶部筛选宽度
+    filterHeight: 0, //获取顶部筛选高度
+    safeAreaHeight: 0, //底部安全区域的高度
+    //按钮位置参数
+    buttonTop: 0,
+    buttonLeft: 0,
+    windowHeight: '',
+    windowWidth: '',
+
+    loginStatus: wx.getStorageSync('loginStatus') ? wx.getStorageSync('loginStatus') : false,
+    roleCodeList: wx.getStorageSync('roleCodeList') ? wx.getStorageSync('roleCodeList') : '',
+    searchVal: '',
+
+    appointmentStatusArray: [{
+      dictValue: "",
+      dictLabel: "全部状态"
+    }],
+    appointmentStatusIndex: 0,
+
+    //分页
+    limit: 10,
+    requestStatu: '加载中...',
+    page: 1,
+    totalPages: 1,
+    more: false,
+    nomore: '',
+    type: '4',// 充电张预约类型
+
+    resData:[],
+
+    show: false,
+    auditFlag:true,
+    orderReason:'',//审核备注
+
+    requestStatu2: '加载中...',
+    page2: 1,
+    totalPages2: 1,
+    more2: false,
+    nomore2: '',
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad(options) {
+    //预约审核状态
+    let treeData = app.globalData.treeArr
+    for (const element of treeData) {
+      let arrStr;
+      switch (element.dictValue) {
+        case 'appointment_status':
+          arrStr = "appointmentStatusArray";
+          break;
+      }
+      let getArray =[{
+        dictValue: "",
+        dictLabel: "全部状态"
+      }]
+      this.setData({
+        [arrStr]: getArray.concat(element.children)
+      })
+    }
+
+    this.setData({
+      safeAreaHeight: app.globalData.windowInfo.screenHeight - app.globalData.systemInfo.safeArea.bottom
+    })
+
+    // 使用选择器选择节点
+    this.getFilterHeight()
+    //获取页面高度设置新增按钮的初始位置
+    var that = this;
+    wx.getSystemInfo({
+      success: function (res) {
+        // 高度,宽度 单位为px
+        that.setData({
+          windowHeight: res.windowHeight, //屏幕宽度、高度
+          windowWidth: res.windowWidth,
+          buttonTop: res.windowHeight * 0.8 - that.data.safeAreaHeight-50, //这里定义按钮的初始位置
+          buttonLeft: res.windowWidth * 0.80, //这里定义按钮的初始位置
+        })
+      }
+    })
+  },
+
+  //获取顶部筛选区域的高度
+  getFilterHeight:function(){
+    let that = this;
+    // 使用顶部筛选高度选择器选择节点的高度
+    const query = wx.createSelectorQuery();
+    query.select('.topSeach').boundingClientRect(function (rect) {
+      if(rect){
+        that.setData({
+          filterWidth: rect.width,
+          filterHeight: rect.height,
+        });
+      }
+    }).exec();
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+    const roleCodeList = wx.getStorageSync('roleCodeList')
+    let loginStatus = wx.getStorageSync('loginStatus')
+    this.setData({
+      searchVal: '',
+      roleCodeList: roleCodeList ? roleCodeList : '',
+      loginStatus: loginStatus ? loginStatus : false
+    })
+
+    this.setData({
+      requestStatu:'加载中...',
+    })
+    if (wx.getStorageSync('loginStatus')) {
+      this.getListFun();
+    }
+  },
+
+  //下拉选择
+  bindPickerChange: function (e) { //下拉菜单
+    //方法一动态的
+    let getIndex = e.target.dataset.pickername + 'Index'
+    app.util.getPickerIndex(this, getIndex, e);
+    this.getListFun()
+  },
+
+  //搜索框请求S
+  onChange(e) {
+    this.setData({
+      searchVal: e.detail,
+    });
+  },
+  onSearch: function (event) {
+    this.setData({
+      searchVal: event.detail
+    })
+    this.getListFun();
+  },
+  onCancel: function () {
+    this.setData({})
+  },
+  toSearch: function (event) {
+    this.getListFun();
+  },
+
+  //列表
+  getListFun: function () {
+    this.setData({
+      page: 1
+    })
+    let params = {
+      current    : this.data.page,
+      size       : this.data.limit,
+      type       : this.data.type,
+      searchKey  : this.data.searchVal,
+      status     : this.data.appointmentStatusArray[this.data.appointmentStatusIndex].dictValue
+    }
+    app.request.pageFirst({
+      url: app.API.chargestationPage,
+      page: this,
+      params: params,
+    })
+  },
+
+  //页面跳转
+  toLink: function (e) {
+    let { url } = e.currentTarget.dataset
+    wx.navigateTo({
+      url: url
+    })
+  },
+
+  //删除
+  delFun: function (e) {
+    let _this = this
+    let { id, otherNumber } = e.currentTarget.dataset
+    wx.showModal({
+      title: '提示!',
+      content: `删除充电桩预约号【${otherNumber}】后不可恢复。确定要删除吗?`,
+      confirmColor: '#FF5B5B',
+      success: function (res) {
+        if (res.confirm) {
+          app.request.POST({
+            url: app.API.appointmentDelete,
+            params: [{
+              id: id
+            }],
+            page: _this,
+            isLoadingTxt: '删除中...',
+            successFun: true
+          }).then(res => {
+            wx.showToast({
+              title: '删除成功',
+              icon: 'success',
+              duration: 1000,
+              mask: true
+            })
+            _this.getListFun(); //刷新列表
+          })
+        } else if (res.cancel) {
+
+        }
+      }
+    })
+  },
+
+  //强制结束
+  cancelFun: function (e) {
+    let _this = this
+    let { id, otherNumber } = e.currentTarget.dataset
+    wx.showModal({
+      title: '提示!',
+      content: `充电桩预约号【${otherNumber}】,确定强制结束该预约吗?`,
+      confirmColor: '#FF5B5B',
+      success: function (res) {
+        if (res.confirm) {
+          app.request.POST({
+            url: app.API.chargestationExit,
+            params: {
+              id: id
+            },
+            page: _this,
+            isLoadingTxt: '提交中...',
+            successFun: true
+          }).then(res => {
+            wx.showToast({
+              title: '强制结束成功',
+              icon: 'success',
+              duration: 1000,
+              mask: true
+            })
+            _this.getListFun(); //刷新列表
+          })
+        } else if (res.cancel) {
+
+        }
+      }
+    })
+  },
+
+  // 审核S
+  showPopup(e) {
+    let { id } = e.currentTarget.dataset
+    this.setData({
+      show: true,
+      orderReason: '',
+      id: id,
+    });
+  },
+  onClose() {
+    this.setData({
+      show: false,
+      auditFlag:'false',
+      orderReason:'',
+      id: ''
+    });
+  },
+  // 单选
+  dangerStatusChange: function (e) {
+    this.setData({
+      [e.currentTarget.dataset.radiotype]: e.detail.value
+    })
+    if (e.detail.value == '1') {
+      this.setData({
+        appointmentReason: ''
+      })
+    }
+  },
+  
+  //审核
+  formSubmit: function (e) {
+    let formData = e.detail.value;
+    var warn = ""; //弹框时提示的内容
+    if (formData.auditFlag=='true' && formData.arriveReason == '') {
+      warn = "审核不通过时备注不能为空!";
+    }
+    formData.auditFlag = formData.auditFlag=='true'
+    if (warn != '') {
+      app.util.checkForm(warn);
+    } else {
+      app.request.POST({
+        url: app.API.bizloadarriveAudit,
+        params: formData,
+        page: this,
+        isLoadingTxt: '审核中...',
+        successFun: true
+      }).then(res => {
+        wx.showToast({
+          title: '审核成功',
+          icon: 'success',
+          duration: 1000,
+          mask: true
+        })
+        this.onClose()
+        this.getListFun(); //刷新列表
+      })
+    }
+  },
+  // 审核E
+
+  //申请
+  changeAdd() {
+    wx.navigateTo({
+      url: 'add'
+    })
+  },
+
+  
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+    this.setData({
+      searchVal: ''
+    })
+    if (wx.getStorageSync('loginStatus')) {
+      this.getListFun();
+    } else {
+      wx.stopPullDownRefresh();
+    }
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+    this.data.page++;
+    let params = {
+      current     : this.data.page,
+      size        : this.data.limit,
+      type        : this.data.type,
+      searchKey   : this.data.searchVal,
+      status      : this.data.appointmentStatusArray[this.data.appointmentStatusIndex].dictValue
+    }
+    app.request.pageOther({
+      url: app.API.bizloadarrivePage,
+      page: this,
+      params: params,
+      loadType: true //加载类型,是否是下拉加载
+    });
+  },
+
+
+  //以下是按钮拖动事件
+  buttonStart: function (e) {
+    startPoint = e.touches[0] //获取拖动开始点
+  },
+  buttonMove: function (e) {
+    var endPoint = e.touches[e.touches.length - 1] //获取拖动结束点
+    //计算在X轴上拖动的距离和在Y轴上拖动的距离
+    var translateX = endPoint.clientX - startPoint.clientX
+    var translateY = endPoint.clientY - startPoint.clientY
+    startPoint = endPoint //重置开始位置
+    var buttonTop = this.data.buttonTop + translateY
+    var buttonLeft = this.data.buttonLeft + translateX
+    //判断是移动否超出屏幕
+    if (buttonLeft + 60 >= this.data.windowWidth) {
+      buttonLeft = this.data.windowWidth - 60;
+    }
+    if (buttonLeft <= 0) {
+      buttonLeft = 0;
+    }
+    if (buttonTop <= this.data.filterHeight) {
+      buttonTop = this.data.filterHeight
+    }
+    if (buttonTop + 60 + 48 + this.data.safeAreaHeight >= this.data.windowHeight) {
+      buttonTop = this.data.windowHeight - 60 - 48 - this.data.safeAreaHeight;
+    }
+    this.setData({
+      buttonTop: buttonTop,
+      buttonLeft: buttonLeft
+    })
+  },
+  buttonEnd: function (e) {},
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  }
+})

+ 15 - 0
otherPages/chargestation/index.json

@@ -0,0 +1,15 @@
+{
+  "navigationBarTitleText": "充电桩预约",
+  "backgroundTextStyle": "dark",
+  "enablePullDownRefresh": true,
+  "usingComponents": {
+    "van-field": "@vant/weapp/field/index",
+    "van-popup": "@vant/weapp/popup/index",
+    "van-sticky": "@vant/weapp/sticky/index",
+    "van-search": "@vant/weapp/search/index",
+    "van-icon": "@vant/weapp/icon/index",
+    "van-empty": "@vant/weapp/empty/index",
+    "van-button": "@vant/weapp/button/index",
+    "van-loading": "@vant/weapp/loading/index"
+  }
+}

+ 44 - 0
otherPages/chargestation/index.less

@@ -0,0 +1,44 @@
+/* pages/pipeAppoint/index.wxss */
+page{
+  --cell-vertical-padding:12rpx;
+  --cell-horizontal-padding:0;
+  --cell-background-color:transparent;
+}
+.bottomBtn{
+  padding-top: 20rpx;
+  text-align: right;
+}
+.bottomBtn button {
+  margin-left: 0 !important;
+}
+.orderLoadBox{
+  > .title{
+    height: 100rpx;
+    line-height: 100rpx;
+    font-weight: bold;
+    font-size: 40rpx;
+    color: #14284A;
+    text-align: center;
+    background: linear-gradient( 180deg, #D4E1F6 0%, #FFFFFF 100%);
+  }
+  .dialogUser{
+    height: 50vh;
+    padding-top: 30rpx;
+    .saleItem{
+      width: 700rpx;
+      margin:0 auto 30rpx;
+      padding-bottom: 20rpx;
+      border-bottom: 1px solid #eee;
+      .title{
+        font-size: 36rpx;
+        display: flex;
+        justify-content: space-between;
+      }
+      .time{
+        margin-top: 10rpx;
+        color: #666;
+        font-size: 24rpx;
+      }
+    }
+  }
+}

+ 115 - 0
otherPages/chargestation/index.wxml

@@ -0,0 +1,115 @@
+<!--pages/pipeAppoint/index.wxml-->
+<view class="container listMain">
+  <block wx:if="{{loginStatus}}">
+    <view url="" class="addBtn" catch:tap="changeAdd" hover-class="none" catchtouchmove="buttonMove" bindtouchstart="buttonStart" bindtouchend="buttonEnd" style="top:{{buttonTop}}px;left:{{buttonLeft}}px;" wx:if="{{roleCodeList == 'driver'}}">
+      <van-icon name="plus" size="30px" />
+    </view>
+    <van-sticky>
+      <view class="topSeach">
+        <view class="rightBox" style="position: relative;">
+          <van-search value="{{ searchVal }}" shape="round" placeholder="查询预约单号/计划单号" bind:change="onChange" bind:search="onSearch" bind:cancel="onCancel" use-action-slot>
+            <view slot="label" style="width:160rpx;margin-right: 20rpx;">
+                  <van-field label="" input-align="center" style="width: 100%;">
+                    <view slot="input" style="width: 100%;">
+                      <input name="status" value='{{appointmentStatusArray[appointmentStatusIndex].dictValue}}' hidden='true' />
+                      <picker bindchange="bindPickerChange" value="{{appointmentStatusIndex}}" range="{{appointmentStatusArray}}" range-key="dictLabel" data-pickername='appointmentStatus'>
+                        <view wx:if="{{appointmentStatusArray[appointmentStatusIndex].dictLabel}}" style="font-size: 12px;white-space: nowrap;"> {{appointmentStatusArray[appointmentStatusIndex].dictLabel}}</view>
+                        <view wx:else class="selectPlaceholder" style="font-size: 12px;white-space: nowrap;">{{defaultText}}</view>
+                      </picker>
+                    </view>
+                    <view slot="right-icon">
+                      <van-icon name="arrow-down" />
+                    </view>
+                  </van-field>
+                </view>
+            <van-icon slot="action" class-prefix="iconfont" name="arrow3-right_fill" size="28px" color="#4B70EA" bind:tap="toSearch" />
+          </van-search>
+        </view>
+      </view>
+    </van-sticky>
+
+    <view class="width710">
+      <block wx:if="{{!requestStatu}}">
+        <block wx:if="{{resData.length>0}}">
+          <block wx:for="{{resData}}" wx:key="index">
+            <navigator url="info?id={{item.id}}&otherNumber={{item.otherNumber}}&index={{index}}" class="listItem">
+              <view class="title van-ellipsis">
+                <van-icon class='iconfont' name='/images/codeNumber.png' size="36rpx"></van-icon>
+                <text>{{item.licenseNumber}}</text>
+                <text wx:if="{{item.status}}" class="status status{{item.status}}">{{item.statusName}}</text>
+              </view>
+              <view class="info">
+                <text>预约单号:{{item.otherNumber?item.otherNumber:'未填写'}}</text>
+              </view>
+              <view class="info">
+                <text decode="{{true}}">司机:{{item.driverName?item.driverName:'未填写'}} / {{item.driverMobile?item.driverMobile:'未填写'}}</text>
+              </view>
+
+              <view class="bottomBtn" wx:if="{{ roleCodeList == 'driver' && (item.status=='4' || item.status=='5' || item.status=='6' || item.status=='7'	|| item.status=='8' || item.status=='9' || item.status=='16' || item.status=='18') }}">
+                <van-button type="info" size="small" data-url="edit?index={{index}}" catchtap="toLink" style="margin-right: 20rpx;" wx:if="{{ roleCodeList == 'driver' && item.status == '4' }}">修改</van-button>
+
+                <van-button type="danger" size="small" data-id="{{item.id}}" data-other-number="{{item.otherNumber}}" catchtap="delFun" style="margin-right: 20rpx;" wx:if="{{ roleCodeList == 'driver' && item.status == '4' }}">删除</van-button>
+
+                <van-button type="warning" size="small" data-id="{{item.id}}" data-other-number="{{item.otherNumber}}" catchtap="cancelFun" style="margin-right: 20rpx;" wx:if="{{ roleCodeList == 'driver' && (item.status=='4' || item.status=='5' || item.status=='6' || item.status=='7'	|| item.status=='8' || item.status=='9' || item.status=='16' || item.status=='18') }}">强制结束</van-button>
+              </view>
+            </navigator>
+          </block>
+          <!-- 底部加载动画 -->
+          <view class='more'>
+            <block wx:if="{{more}}">
+              <van-loading size="24px" color="#1989fa">加载中...</van-loading>
+            </block>
+            <block wx:else>{{nomore}}</block>
+          </view>
+          <view style="height: 200rpx;"> </view>
+        </block>
+        <block wx:else>
+          <van-empty description="未搜索到预约记录" image="/images/null5.png" />
+        </block>
+      </block>
+    </view>
+  </block>
+  <block wx:else>
+    <view>
+      <van-empty image="/images/loginNull.png">
+        <view slot="description" style="text-align: center;">
+          <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
+          <van-button type="info" bindtap="toLogin">立即登录</van-button>
+        </view>
+      </van-empty>
+    </view>
+  </block>
+</view>
+
+<!-- 弹窗 -->
+<van-popup show="{{ show }}" position="bottom" round closeable custom-style="width:100%;padding:0rpx 30rpx 160rpx;" bind:close="onClose">
+  <view style="height: 90rpx;line-height: 90rpx;text-align: center;">审核</view>
+  <form bindsubmit="formSubmit">
+    <view class="part">
+      <view class="height20"> </view>
+      <view class="height20"> </view>
+      <input name="id" value='{{id}}' hidden='true' />
+      <van-field label="审核结果" name="auditFlag" value="{{ auditFlag }}" required input-align="right" class="radioHeight fieldAutoHeight">
+        <view slot="input" class="radioHeightBx">
+          <radio-group class="radio-group" bindchange="dangerStatusChange" data-radioType="auditFlag">
+            <label class="radio">
+              <radio value="true" checked="{{auditFlag=='true'}}" color="#4B70EA" />通过
+            </label>
+            <label class="radio">
+              <radio value="false" checked="{{auditFlag=='false'}}" color="#4B70EA" />不通过
+            </label>
+          </radio-group>
+        </view>
+      </van-field>
+      <van-field label="审核备注" required="{{auditFlag=='false'}}" name="arriveReason" value="{{ arriveReason }}" type="textarea" input-align="right" placeholder="请输入审核备注" autosize></van-field>
+    </view>
+
+    <view class="submitBtn">
+      <view style="padding-top: 60rpx;">
+        <van-button block round type="info" form-type="submit" color="#0396FF">确认</van-button>
+      </view>
+    </view>
+  </form>
+</van-popup>
+
+<wxs module="filters" src="../../utils/filter.wxs"></wxs>

+ 42 - 0
otherPages/chargestation/index.wxss

@@ -0,0 +1,42 @@
+/* pages/pipeAppoint/index.wxss */
+page {
+  --cell-vertical-padding: 12rpx;
+  --cell-horizontal-padding: 0;
+  --cell-background-color: transparent;
+}
+.bottomBtn {
+  padding-top: 20rpx;
+  text-align: right;
+}
+.bottomBtn button {
+  margin-left: 0 !important;
+}
+.orderLoadBox > .title {
+  height: 100rpx;
+  line-height: 100rpx;
+  font-weight: bold;
+  font-size: 40rpx;
+  color: #14284A;
+  text-align: center;
+  background: linear-gradient(180deg, #D4E1F6 0%, #FFFFFF 100%);
+}
+.orderLoadBox .dialogUser {
+  height: 50vh;
+  padding-top: 30rpx;
+}
+.orderLoadBox .dialogUser .saleItem {
+  width: 700rpx;
+  margin: 0 auto 30rpx;
+  padding-bottom: 20rpx;
+  border-bottom: 1px solid #eee;
+}
+.orderLoadBox .dialogUser .saleItem .title {
+  font-size: 36rpx;
+  display: flex;
+  justify-content: space-between;
+}
+.orderLoadBox .dialogUser .saleItem .time {
+  margin-top: 10rpx;
+  color: #666;
+  font-size: 24rpx;
+}

+ 143 - 0
otherPages/chargestation/info.js

@@ -0,0 +1,143 @@
+// pages/pipeAppoint/info.js
+const app = getApp()
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    info: {},
+
+    appointmentStatusArray: [{
+      dictValue: "",
+      dictLabel: "全部状态"
+    }],
+    appointmentStatusIndex: 0,
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad(options) {
+    //预约审核状态
+    let treeData = app.globalData.treeArr
+    for (const element of treeData) {
+      let arrStr;
+      switch (element.dictValue) {
+        case 'appointment_status':
+          arrStr = "appointmentStatusArray";
+          break;
+      }
+      let getArray =[{
+        dictValue: "",
+        dictLabel: "全部状态"
+      }]
+      this.setData({
+        [arrStr]: getArray.concat(element.children)
+      })
+    }
+    //获取详情
+    var pages = getCurrentPages();
+    var prevPage = pages[pages.length - 2];
+    let getInfo = prevPage.data.resData[options.index]
+  
+    this.setData({
+      info     : getInfo
+    })
+
+    app.request.GET({
+      url: app.API.bizpipeplanDetail,
+      params: {'id' : getInfo.orderId},
+      page: this,
+      successFun: true
+    }).then(res => {
+      let getInfo = res.data.data;
+      this.setData({
+        planNumber      : getInfo.planNumber,
+        planName        : getInfo.planName,
+        planCount       : getInfo.planCount,
+        planAlreadyCount: getInfo.planAlreadyCount,
+      })
+    })
+    //this.getInfo(options.id)
+  },
+
+  // //查询详情
+  // getInfo: function (id) {
+  //   app.request.GET({
+  //     url: app.API.bizloadarriveDetail,
+  //     page: this,
+  //     params: {
+  //       'id': id
+  //     },
+  //     successFun: true
+  //   }).then(res => {
+  //     let getInfo = res.data.data;
+  //     //司机回签图片
+  //     let fileList = []
+  //     if(getInfo.unloadImg){
+  //       let unloadImgArr = getInfo.unloadImg.split(',')
+  //       unloadImgArr.forEach(element => {
+  //         fileList.push({
+  //           url: app.host.BASEIMG_URL+element,
+  //           isImage:true
+  //         })
+  //       });
+  //     }
+  //     this.setData({
+  //       info              : getInfo,
+  //       fileList          : fileList,
+  //       accessControlAuth : JSON.parse(getInfo.accessControlAuth)
+  //     })
+  //   })
+  // },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh() {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom() {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  }
+})

+ 16 - 0
otherPages/chargestation/info.json

@@ -0,0 +1,16 @@
+{
+  "navigationBarTitleText": "充电桩预约详情",
+  "enablePullDownRefresh": true,
+  "usingComponents": {
+    "van-checkbox": "@vant/weapp/checkbox/index",
+    "van-checkbox-group": "@vant/weapp/checkbox-group/index",
+    "van-uploader": "@vant/weapp/uploader/index",
+    "car-num-input": "/components/CarNumInput/index",
+    "van-icon": "@vant/weapp/icon/index",
+    "van-cell-group": "@vant/weapp/cell-group/index",
+    "van-field": "@vant/weapp/field/index",
+    "van-button": "@vant/weapp/button/index",
+    "van-tag": "@vant/weapp/tag/index",
+    "van-image": "@vant/weapp/image/index"
+  }
+}

+ 1 - 0
otherPages/chargestation/info.less

@@ -0,0 +1 @@
+/* pages/pipeAppoint/info.wxss */

+ 24 - 0
otherPages/chargestation/info.wxml

@@ -0,0 +1,24 @@
+<!--pages/pipeAppoint/info.wxml-->
+<view class="container">
+  <view class="part">
+    <van-field label="管桩计划单号" input-align="right" value="{{info.planNumber }}" readonly></van-field>
+    <van-field label="- 计划名称" input-align="right" value="{{ planName }}" readonly></van-field>
+    <van-field label="- 预约次数" input-align="right" value="{{ planCount }}" readonly></van-field>
+    <van-field label="- 已预约次数" input-align="right" value="{{ planAlreadyCount }}" readonly></van-field>
+
+    <van-field label="车牌号" input-align="right" value="{{ info.licenseNumber }}" readonly></van-field>
+    <van-field label="司机姓名" input-align="right" value="{{ info.driverName }}" readonly></van-field>
+    <van-field label="司机电话" input-align="right" value="{{ info.driverMobile }}" readonly></van-field>
+    <van-field label="入场时间" input-align="right" value="{{ info.enterTime }}" readonly></van-field>
+    <van-field label="出场时间" input-align="right" value="{{ info.leaveTime }}" readonly></van-field>
+    <!-- <van-field label="创建人" input-align="right" value="{{info.createUserName}}" readonly></van-field>
+    <van-field label="创建时间" input-align="right" value="{{info.createTime}}" readonly></van-field> -->
+    <van-field label="预约状态" input-align="right" readonly>
+      <text slot="button" class="status status{{info.status}}">{{filters.codeAnalysis(appointmentStatusArray, info.status, 'dictValue', 'dictLabel')}} 
+      </text>
+    </van-field>
+  </view>
+  <view style="height: 50px;"></view>
+</view>
+
+<wxs module="filters" src="../../utils/filter.wxs"></wxs>

+ 1 - 1
otherPages/loadAppoint/allocation.js

@@ -106,7 +106,7 @@ Page({
     }
   },
 
-  //装卸时间
+  //装卸
   loadUserData:function(loadUserId){
     app.request.GET({
       url: app.API.roleUser,

+ 204 - 0
otherPages/pipeAppoint/add.js

@@ -0,0 +1,204 @@
+// pages/pipeAppoint/add.js
+const app = getApp()
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    showModal: false,
+    defaultText: '请选择',
+    isSubmitting: false,
+
+    orderArray:[], //管桩计划
+    orderIndex:null,
+
+    appointmentStatusArray: [{
+      dictValue: "",
+      dictLabel: "全部状态"
+    }],
+    appointmentStatusIndex: 0,
+
+    isKeyboard: false, //是否显示车牌输入键盘
+    inputOnFocusIndex: '', //当前锁定的车号位置
+    licensePlate: '', //用于提交
+    inputPlates: '', //用于显示
+
+  },
+  //输入框焦点聚焦时隐藏车牌号输入框
+  hideKeybord: function () {
+    this.setData({
+      isKeyboard: false,
+      inputOnFocusIndex: ''
+    })
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    //获取管桩计划信息
+    this.getorderData()
+  },
+
+  //选择管桩计划
+  getorderData:function(){
+    app.request.GET({
+      url: app.API.bizpipeplanList,
+      params: {},
+      page: this,
+      successFun: true
+    }).then(res => {
+      let orderList = res.data.data
+      orderList.forEach((element,index) => {
+        orderList[index].name = element.planNumber
+      });
+      this.setData({
+        orderArray: orderList
+      })
+    })
+  },
+
+  //获取车牌号
+  licensePlate: function (e) {
+    this.setData({
+      licensePlate: e.detail.carNum
+    })
+  },
+
+  //下拉选择
+  bindPickerChange: function (e) { 
+    let { pickername } = e.target.dataset
+    let getIndex = pickername + 'Index'
+    app.util.getPickerIndex(this, getIndex, e);
+    switch (pickername) {
+      case 'order': //管桩计划
+        this.setData({
+          planNumber      : this.data.orderArray[this.data.orderIndex].planNumber,
+          planName        : this.data.orderArray[this.data.orderIndex].planName,
+          planCount       : this.data.orderArray[this.data.orderIndex].planCount,
+          planAlreadyCount: this.data.orderArray[this.data.orderIndex].planAlreadyCount,
+        })
+        break;
+    }
+  },
+
+  // 单选
+  dangerStatusChange: function (e) {
+    this.setData({
+      [e.currentTarget.dataset.radiotype]: e.detail.value
+    })
+  },
+  //多选
+  checkboxChange: function (e) {
+    this.setData({
+      [e.currentTarget.dataset.checkboxtype]: e.detail
+    })
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  bindscrolltolowerFun() {
+    
+  },
+
+  //表单提交 carTaskAdd
+  formSubmit: function ({detail:{value}}) {
+    var warn = ""; //弹框时提示的内容
+    let reg = /^1[3-9]\d{9}$/;
+    var xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
+    var creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
+    //value.certificateNoImage = this.data.originalInvoicePhoto
+    if (value.orderId == '') {
+      warn = "请选择管桩计划订单!";
+    } else if (value.licenseNumber == '') {
+      warn = "车牌不能为空!";
+    } else if (value.licenseNumber.length < 7) {
+      warn = "请选择完整车牌号!";
+    } else if (value.licenseNumber.length == 7 && !creg.test(value.licenseNumber)) {
+      warn = "车牌号格式错误!";
+    } else if (value.licenseNumber.length == 8 && !xreg.test(value.licenseNumber)) {
+      warn = "车牌号格式错误!";
+    } else if(value.driverName == ''){
+      warn = "请输入司机姓名!";
+    } else if(value.driverMobile == ''){
+      warn = "请输入司机电话!";
+    } 
+
+    if (warn != '') {
+      app.util.checkForm(warn);
+    } else {
+      app.request.POST({
+        url: app.API.appointmentPipeAdd,
+        params: value,
+        page: this,
+        isLoadingTxt: '提交中...',
+        isSubmitting: true,
+        successFun: true
+      }).then(res => {
+        wx.showToast({
+          title: '新增成功',
+          icon: 'success',
+          duration: 2000,
+          mask:true,
+          complete: function () {
+            setTimeout(() => {
+              wx.navigateBack()
+            }, 1500) //延迟时间  
+          }
+        })
+      })
+
+    }
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+    
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  }
+})

+ 18 - 0
otherPages/pipeAppoint/add.json

@@ -0,0 +1,18 @@
+{
+  "navigationBarTitleText": "新增管桩预约",
+  "usingComponents": {
+    "van-checkbox": "@vant/weapp/checkbox/index",
+    "van-checkbox-group": "@vant/weapp/checkbox-group/index",
+    "van-uploader": "@vant/weapp/uploader/index",
+    "car-num-input": "/components/CarNumInput/index",
+    "van-icon": "@vant/weapp/icon/index",
+    "van-cell": "@vant/weapp/cell/index",
+    "van-cell-group": "@vant/weapp/cell-group/index",
+    "van-field": "@vant/weapp/field/index",
+    "van-button": "@vant/weapp/button/index",
+    "van-popup": "@vant/weapp/popup/index",
+    "van-datetime-picker": "@vant/weapp/datetime-picker/index",
+    "van-action-sheet": "@vant/weapp/action-sheet/index",
+    "van-search": "@vant/weapp/search/index"
+  }
+}

+ 50 - 0
otherPages/pipeAppoint/add.wxml

@@ -0,0 +1,50 @@
+<!--pages/pipeAppoint/add.wxml-->
+<view class="container" style="padding-bottom:100px;">
+  <view class="height20"></view>
+  <view>
+    <form bindsubmit="formSubmit">
+      <view class="part">
+        <!-- 管桩计划 -->
+        <van-field label="管桩计划" required input-align="right">
+          <view slot="input" style="width: 100%;">
+            <input name="orderId" value='{{orderArray[orderIndex].id}}' hidden='true' />
+            <picker bindchange="bindPickerChange" value="{{orderIndex}}" range="{{orderArray}}" range-key="name" data-pickername='order'>
+              <view wx:if="{{orderArray[orderIndex].name}}"> {{orderArray[orderIndex].name}}</view>
+              <view wx:else class="selectPlaceholder">{{ defaultText }}</view>
+            </picker>
+          </view>
+          <view slot="right-icon">
+            <van-icon name="arrow" />
+          </view>
+        </van-field>
+
+        <van-field label="计划编号" wx:if="{{orderArray[orderIndex].id}}" name="planNumber" readonly value="{{ planNumber }}" placeholder="选择管桩计划自动填入" input-align="right">
+        </van-field>
+        <van-field label="计划名称" wx:if="{{orderArray[orderIndex].id}}" name="planName" readonly value="{{ planName }}" placeholder="选择管桩计划自动填入" input-align="right">
+        </van-field>
+        <van-field label="预约次数" wx:if="{{orderArray[orderIndex].id}}" name="planCount" readonly value="{{ planCount }}" placeholder="选择管桩计划自动填入" input-align="right">
+        </van-field>
+        <van-field label="已预约次数" wx:if="{{orderArray[orderIndex].id}}" name="planAlreadyCount" readonly value="{{ planAlreadyCount }}" placeholder="选择管桩计划自动填入" input-align="right">
+        </van-field>
+      </view>
+        
+      <view class="part">
+        <van-field required label="车牌号码" readonly border="{{false}}"></van-field>
+        <car-num-input bind:setCarNum="licensePlate" isKeyboard="{{isKeyboard}}" inputOnFocusIndex="{{inputOnFocusIndex}}" inputPlates="{{inputPlates}}" isNewEnergy="{{isNewEnergy}}"></car-num-input>
+        <input name="licenseNumber" value='{{licensePlate}}' hidden='true' />
+
+        <van-field label="司机姓名" required name="driverName" value="{{ driverName }}" placeholder="请填写司机姓名" input-align="right" ></van-field>
+
+        <van-field label="司机电话" required name="driverMobile" value="{{ driverMobile }}" placeholder="请填写司机电话" input-align="right" ></van-field>
+      </view>
+
+      <view class="fixedBtn submitBtn">
+        <van-button loading="{{isSubmitting}}" round block disabled="{{isSubmitting}}" loading-text="{{isSubmitting?'提交中...':''}}" type="info" form-type="submit">确定
+        </van-button>
+      </view>
+
+    </form>
+  </view>
+</view>
+
+<wxs module="filters" src="../../utils/filter.wxs"></wxs>

+ 209 - 0
otherPages/pipeAppoint/add.wxss

@@ -0,0 +1,209 @@
+/* pages/pipeAppoint/add.wxss */
+.van-field__label {
+  width: 240rpx !important;
+}
+
+.formTopBlueBg {
+  height: 144rpx;
+  background-color: #0396FF;
+}
+
+.part {
+  border-radius: 16rpx;
+  padding: 20rpx 00rpx;
+  background: #fff;
+  margin-bottom: 20rpx;
+}
+
+picker view {
+  line-height: normal !important;
+}
+
+.heightAuto .van-field__control--right {
+  height: auto !important;
+}
+
+.topProJectInfo {
+  padding: 26rpx 40rpx;
+}
+.labelTitle{
+  padding: 0 16px;
+  color: #323233;
+  font-size: 14px;
+}
+.topItem1 .van-cell {
+  padding-top: 6rpx !important;
+  padding-bottom: 6rpx !important;
+}
+.topItem {
+  position: relative;
+  padding-bottom: 16rpx;
+}
+.topItem2::after{
+  border:0 none !important
+}
+.topItem::after {
+  border-bottom: 1px solid #ebedf0;
+  bottom: 0;
+  box-sizing: border-box;
+  content: " ";
+  left: 16px;
+  pointer-events: none;
+  position: absolute;
+  right: 16px;
+  transform: scaleY(.5);
+  transform-origin: center;
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+  border-bottom-color: rgb(235, 237, 240);
+}
+
+.proTitle {
+  font-size: 36rpx;
+  font-weight: bold;
+  color: rgba(0, 0, 0, 0.85);
+}
+
+.proJectInfoCode {
+  width: 100%;
+  display: flex;
+  padding: 10rpx 10rpx 0 0rpx;
+  color: rgba(0, 0, 0, 0.65);
+  justify-content: space-between;
+}
+
+.proJectInfoCode>view:last-child {
+  padding: 0 16rpx;
+  display: flex;
+  height: 40rpx;
+  line-height: 40rpx;
+  color: #2C6CEC;
+  font-size: 20rpx;
+  border-radius: 20rpx;
+  border: 1px solid #2C6CEC;
+  align-items: center;
+  white-space: nowrap;
+}
+
+.radioHeight .radioHeightBx {
+  width: 100%;
+}
+radio-group {
+  text-align: right;
+}
+.fieldAutoHeight .van-field__body,.fieldAutoHeight .van-field__control {
+  height: auto !important;
+  text-align: left;
+  line-height: 30px;
+}
+.ysType{
+  flex: 1;
+  text-align: right;
+}
+.ysType text:first-child{
+  margin-right: 12rpx;
+}
+.ysType text{
+  display: inline-block;
+  width: 80rpx;
+  height: 48rpx;
+  line-height: 48rpx;
+  text-align: center;
+  background: #E1E1E1;
+  border: 1px solid #E1E1E1;
+  border-radius: 4rpx;
+  box-sizing: border-box;
+}
+.ysType .active{
+  color: #2C6CEC;
+  border: 1rpx solid #2C6CEC;
+  background: transparent;
+}
+
+.otherInfo{
+  padding: 10rpx 10rpx 0 0rpx;
+  color: rgba(0, 0, 0, 0.65);
+}
+.otherInfo .status {
+  clear: both;
+}
+
+.type{
+  display: inline-block;
+  padding: 4rpx 10rpx;
+  color: #2C6CEC;
+  background: rgba(44,108,236,0.1);
+}
+.type1{
+  color: #52C41A;
+  background: rgba(82,196,26,0.1);
+}
+.type2{
+  color: #FAAD14;
+  background: rgba(250,173,20,0.1);
+}
+
+.setHeight{
+  height: 120rpx !important;
+}
+.radioHeight .radioHeightBx{
+  width: 100%;
+}
+.radioHeight .van-field__body {
+  height: 28px;
+  line-height: 25px;
+}
+.bottomBtn view:first-child {
+  flex: 1;
+}
+.chooseDriver{
+  width: 600rpx;
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+}
+.dialogUser {
+  flex: 1;
+  width: 100%;
+  padding: 30rpx 0;
+  box-sizing: border-box;
+  overflow-y: auto;
+}
+.spacialName {
+  display: inline-block;
+  width: 64rpx;
+  height: 64rpx;
+  line-height: 64rpx;
+  margin: 0 20rpx 0 10rpx;
+  border-radius: 50%;
+  text-align: center;
+  color: #3764FF;
+  font-size: 24rpx;
+  background-color: rgba(55, 100, 255, 0.0510);
+}
+.bottomBtn {
+  display: flex;
+  width: 100%;
+  padding: 20rpx;
+  font-size: 28rpx;
+  box-sizing: border-box;
+  align-items: center;
+  justify-content: space-around;
+  border-top: 1px solid #f9f7f9;
+}
+
+/* 选人弹窗 */
+.chooseUserMain {
+  width: 600rpx;
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+}
+
+.dialogUser {
+  flex: 1;
+  width: 100%;
+  padding: 30rpx 0;
+  box-sizing: border-box;
+  overflow-y: auto;
+}

+ 237 - 0
otherPages/pipeAppoint/edit.js

@@ -0,0 +1,237 @@
+// pages/pipeAppoint/edit.js
+const app = getApp()
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    showModal: false,
+    defaultText: '请选择',
+    isSubmitting: false,
+
+    orderArray:[], //管桩计划
+    orderIndex:null,
+
+    appointmentStatusArray: [{
+      dictValue: "",
+      dictLabel: "全部状态"
+    }],
+    appointmentStatusIndex: 0,
+
+    isKeyboard: false, //是否显示车牌输入键盘
+    inputOnFocusIndex: '', //当前锁定的车号位置
+    licensePlate: '', //用于提交
+    inputPlates: '', //用于显示
+  },
+  //输入框焦点聚焦时隐藏车牌号输入框
+  hideKeybord: function () {
+    this.setData({
+      isKeyboard: false,
+      inputOnFocusIndex: ''
+    })
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    //获取详情
+    var pages = getCurrentPages();
+    var prevPage = pages[pages.length - 2];
+    let getInfo = prevPage.data.resData[options.index]
+
+    let getCarNumArr = getInfo.licenseNumber ? getInfo.licenseNumber.split('') : ''
+    let inputPlates = {};
+    for (let i = 0; i < getCarNumArr.length; i++) {
+      inputPlates['index' + i] = getCarNumArr[i]
+    }
+
+    this.setData({
+      info: getInfo,
+      orderId: getInfo.orderId,
+      inputPlates: inputPlates,
+      isNewEnergy: getCarNumArr.length > 7 ? true : false,
+      licensePlate: getInfo.licenseNumber,
+    })
+    //获取管桩计划信息
+    this.getorderData()
+
+    app.request.GET({
+      url: app.API.bizpipeplanDetail,
+      params: {'id' : getInfo.orderId},
+      page: this,
+      successFun: true
+    }).then(res => {
+      let getInfo = res.data.data;
+      this.setData({
+        planNumber      : getInfo.planNumber,
+        planName        : getInfo.planName,
+        planCount       : getInfo.planCount,
+        planAlreadyCount: getInfo.planAlreadyCount,
+      })
+    })
+  },
+
+  //选择管桩计划
+  getorderData:function(){
+    app.request.GET({
+      url: app.API.bizpipeplanList,
+      params: {},
+      page: this,
+      successFun: true
+    }).then(res => {
+      let orderList = res.data.data
+      orderList.forEach((element,index) => {
+        orderList[index].name = element.planNumber
+      });
+      this.setData({
+        orderArray: orderList,
+        orderIndex: app.util.getDicIndex(res.data.data, this.data.info.orderId, 'id')
+      })
+    })
+  },
+
+  //获取车牌号
+  licensePlate: function (e) {
+    this.setData({
+      licensePlate: e.detail.carNum
+    })
+  },
+
+  //下拉选择
+  bindPickerChange: function (e) { 
+    let { pickername } = e.target.dataset
+    let getIndex = pickername + 'Index'
+    app.util.getPickerIndex(this, getIndex, e);
+    switch (pickername) {
+      case 'order': //管桩计划
+        this.setData({
+          planNumber      : this.data.orderArray[this.data.orderIndex].planNumber,
+          planName        : this.data.orderArray[this.data.orderIndex].planName,
+          planCount       : this.data.orderArray[this.data.orderIndex].planCount,
+          planAlreadyCount: this.data.orderArray[this.data.orderIndex].planAlreadyCount,
+        })
+        break;
+    }
+  },
+
+  // 单选
+  dangerStatusChange: function (e) {
+    this.setData({
+      [e.currentTarget.dataset.radiotype]: e.detail.value
+    })
+  },
+  //多选
+  checkboxChange: function (e) {
+    this.setData({
+      [e.currentTarget.dataset.checkboxtype]: e.detail
+    })
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  bindscrolltolowerFun() {
+    
+  },
+
+  //表单提交 carTaskAdd
+  formSubmit: function ({detail:{value}}) {
+    var warn = ""; //弹框时提示的内容
+    let reg = /^1[3-9]\d{9}$/;
+    var xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
+    var creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
+    //value.certificateNoImage = this.data.originalInvoicePhoto
+    if (value.orderId == '') {
+      warn = "请选择管桩计划订单!";
+    } else if (value.licenseNumber == '') {
+      warn = "车牌不能为空!";
+    } else if (value.licenseNumber.length < 7) {
+      warn = "请选择完整车牌号!";
+    } else if (value.licenseNumber.length == 7 && !creg.test(value.licenseNumber)) {
+      warn = "车牌号格式错误!";
+    } else if (value.licenseNumber.length == 8 && !xreg.test(value.licenseNumber)) {
+      warn = "车牌号格式错误!";
+    } else if(value.driverName == ''){
+      warn = "请输入司机姓名!";
+    } else if(value.driverMobile == ''){
+      warn = "请输入司机电话!";
+    } 
+
+    if (warn != '') {
+      app.util.checkForm(warn);
+    } else {
+      app.request.POST({
+        url: app.API.appointmentPipeEdit,
+        params: value,
+        page: this,
+        isLoadingTxt: '提交中...',
+        isSubmitting: true,
+        successFun: true
+      }).then(res => {
+        wx.showToast({
+          title: '修改成功',
+          icon: 'success',
+          duration: 2000,
+          mask:true,
+          complete: function () {
+            setTimeout(() => {
+              wx.navigateBack()
+            }, 1500) //延迟时间  
+          }
+        })
+      })
+
+    }
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+    
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  }
+})

+ 20 - 0
otherPages/pipeAppoint/edit.json

@@ -0,0 +1,20 @@
+{
+  "navigationBarTitleText": "修改管桩预约",
+  "usingComponents": {
+    "van-checkbox": "@vant/weapp/checkbox/index",
+    "van-checkbox-group": "@vant/weapp/checkbox-group/index",
+    "van-uploader": "@vant/weapp/uploader/index",
+    "car-num-input": "/components/CarNumInput/index",
+    "van-icon": "@vant/weapp/icon/index",
+    "van-cell": "@vant/weapp/cell/index",
+    "van-cell-group": "@vant/weapp/cell-group/index",
+    "van-field": "@vant/weapp/field/index",
+    "van-button": "@vant/weapp/button/index",
+    "van-popup": "@vant/weapp/popup/index",
+    "van-datetime-picker": "@vant/weapp/datetime-picker/index",
+    "van-radio": "@vant/weapp/radio/index",
+    "van-radio-group": "@vant/weapp/radio-group/index",
+    "van-action-sheet": "@vant/weapp/action-sheet/index",
+    "van-search": "@vant/weapp/search/index"
+  }
+}

+ 1 - 0
otherPages/pipeAppoint/edit.less

@@ -0,0 +1 @@
+/* pages/pipeAppoint/edit.wxss */

+ 51 - 0
otherPages/pipeAppoint/edit.wxml

@@ -0,0 +1,51 @@
+<!--pages/pipeAppoint/edit.wxml-->
+<view class="container" style="padding-bottom:100px;">
+  <view class="height20"></view>
+  <view>
+    <form bindsubmit="formSubmit">
+      <input name="id" value='{{info.id}}' hidden='true' />
+      <view class="part">
+        <!-- 管桩计划 -->
+        <van-field label="管桩计划" required input-align="right">
+          <view slot="input" style="width: 100%;">
+            <input name="orderId" value='{{orderArray[orderIndex].id}}' hidden='true' />
+            <picker bindchange="bindPickerChange" value="{{orderIndex}}" range="{{orderArray}}" range-key="name" data-pickername='order'>
+              <view wx:if="{{orderArray[orderIndex].name}}"> {{orderArray[orderIndex].name}}</view>
+              <view wx:else class="selectPlaceholder">{{ defaultText }}</view>
+            </picker>
+          </view>
+          <view slot="right-icon">
+            <van-icon name="arrow" />
+          </view>
+        </van-field>
+        
+        <van-field label="计划编号" wx:if="{{orderArray[orderIndex].id}}" name="planNumber" readonly value="{{ planNumber }}" placeholder="选择管桩计划自动填入" input-align="right">
+        </van-field>
+        <van-field label="计划名称" wx:if="{{orderArray[orderIndex].id}}" name="planName" readonly value="{{ planName }}" placeholder="选择管桩计划自动填入" input-align="right">
+        </van-field>
+        <van-field label="预约次数" wx:if="{{orderArray[orderIndex].id}}" name="planCount" readonly value="{{ planCount }}" placeholder="选择管桩计划自动填入" input-align="right">
+        </van-field>
+        <van-field label="已预约次数" wx:if="{{orderArray[orderIndex].id}}" name="planAlreadyCount" readonly value="{{ planAlreadyCount }}" placeholder="选择管桩计划自动填入" input-align="right">
+        </van-field>
+      </view>
+        
+      <view class="part">
+        <van-field required label="车牌号码" readonly border="{{false}}"></van-field>
+        <car-num-input bind:setCarNum="licensePlate" isKeyboard="{{isKeyboard}}" inputOnFocusIndex="{{inputOnFocusIndex}}" inputPlates="{{inputPlates}}" isNewEnergy="{{isNewEnergy}}"></car-num-input>
+        <input name="licenseNumber" value='{{licensePlate}}' hidden='true' />
+
+        <van-field label="司机姓名" required name="driverName" value="{{ info.driverName }}" placeholder="请填写司机姓名" input-align="right" ></van-field>
+
+        <van-field label="司机电话" required name="driverMobile" value="{{ info.driverMobile }}" placeholder="请填写司机电话" input-align="right" ></van-field>
+      </view>
+
+      <view class="fixedBtn submitBtn">
+        <van-button loading="{{isSubmitting}}" round block disabled="{{isSubmitting}}" loading-text="{{isSubmitting?'提交中...':''}}" type="info" form-type="submit">确定
+        </van-button>
+      </view>
+
+    </form>
+  </view>
+</view>
+
+<wxs module="filters" src="../../utils/filter.wxs"></wxs>

+ 417 - 0
otherPages/pipeAppoint/index.js

@@ -0,0 +1,417 @@
+// pages/pipeAppoint/index.js
+const app = getApp()
+var startPoint
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    str:'&emsp;',
+    str2: '&ensp;',
+
+    filterWidth: 0, //获取顶部筛选宽度
+    filterHeight: 0, //获取顶部筛选高度
+    safeAreaHeight: 0, //底部安全区域的高度
+    //按钮位置参数
+    buttonTop: 0,
+    buttonLeft: 0,
+    windowHeight: '',
+    windowWidth: '',
+
+    loginStatus: wx.getStorageSync('loginStatus') ? wx.getStorageSync('loginStatus') : false,
+    roleCodeList: wx.getStorageSync('roleCodeList') ? wx.getStorageSync('roleCodeList') : '',
+    searchVal: '',
+
+    appointmentStatusArray: [{
+      dictValue: "",
+      dictLabel: "全部状态"
+    }],
+    appointmentStatusIndex: 0,
+
+    //分页
+    limit: 10,
+    requestStatu: '加载中...',
+    page: 1,
+    totalPages: 1,
+    more: false,
+    nomore: '',
+    type: '5',// 管桩预约类型
+
+    resData:[],
+
+    show: false,
+    auditFlag:true,
+    orderReason:'',//审核备注
+
+    requestStatu2: '加载中...',
+    page2: 1,
+    totalPages2: 1,
+    more2: false,
+    nomore2: '',
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad(options) {
+    //预约审核状态
+    let treeData = app.globalData.treeArr
+    for (const element of treeData) {
+      let arrStr;
+      switch (element.dictValue) {
+        case 'appointment_status':
+          arrStr = "appointmentStatusArray";
+          break;
+      }
+      let getArray =[{
+        dictValue: "",
+        dictLabel: "全部状态"
+      }]
+      this.setData({
+        [arrStr]: getArray.concat(element.children)
+      })
+    }
+
+    this.setData({
+      safeAreaHeight: app.globalData.windowInfo.screenHeight - app.globalData.systemInfo.safeArea.bottom
+    })
+
+    // 使用选择器选择节点
+    this.getFilterHeight()
+    //获取页面高度设置新增按钮的初始位置
+    var that = this;
+    wx.getSystemInfo({
+      success: function (res) {
+        // 高度,宽度 单位为px
+        that.setData({
+          windowHeight: res.windowHeight, //屏幕宽度、高度
+          windowWidth: res.windowWidth,
+          buttonTop: res.windowHeight * 0.8 - that.data.safeAreaHeight-50, //这里定义按钮的初始位置
+          buttonLeft: res.windowWidth * 0.80, //这里定义按钮的初始位置
+        })
+      }
+    })
+  },
+
+  //获取顶部筛选区域的高度
+  getFilterHeight:function(){
+    let that = this;
+    // 使用顶部筛选高度选择器选择节点的高度
+    const query = wx.createSelectorQuery();
+    query.select('.topSeach').boundingClientRect(function (rect) {
+      if(rect){
+        that.setData({
+          filterWidth: rect.width,
+          filterHeight: rect.height,
+        });
+      }
+    }).exec();
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+    const roleCodeList = wx.getStorageSync('roleCodeList')
+    let loginStatus = wx.getStorageSync('loginStatus')
+    this.setData({
+      searchVal: '',
+      roleCodeList: roleCodeList ? roleCodeList : '',
+      loginStatus: loginStatus ? loginStatus : false
+    })
+
+    this.setData({
+      requestStatu:'加载中...',
+    })
+    if (wx.getStorageSync('loginStatus')) {
+      this.getListFun();
+    }
+  },
+
+  //下拉选择
+  bindPickerChange: function (e) { //下拉菜单
+    //方法一动态的
+    let getIndex = e.target.dataset.pickername + 'Index'
+    app.util.getPickerIndex(this, getIndex, e);
+    this.getListFun()
+  },
+
+  //搜索框请求S
+  onChange(e) {
+    this.setData({
+      searchVal: e.detail,
+    });
+  },
+  onSearch: function (event) {
+    this.setData({
+      searchVal: event.detail
+    })
+    this.getListFun();
+  },
+  onCancel: function () {
+    this.setData({})
+  },
+  toSearch: function (event) {
+    this.getListFun();
+  },
+
+  //列表
+  getListFun: function () {
+    this.setData({
+      page: 1
+    })
+    let params = {
+      current    : this.data.page,
+      size       : this.data.limit,
+      type       : this.data.type,
+      searchKey  : this.data.searchVal,
+      status     : this.data.appointmentStatusArray[this.data.appointmentStatusIndex].dictValue
+    }
+    app.request.pageFirst({
+      url: app.API.appointmentPipePage,
+      page: this,
+      params: params,
+    })
+  },
+
+  //页面跳转
+  toLink: function (e) {
+    let { url } = e.currentTarget.dataset
+    wx.navigateTo({
+      url: url
+    })
+  },
+
+  //删除
+  delFun: function (e) {
+    let _this = this
+    let { id, planNumber } = e.currentTarget.dataset
+    wx.showModal({
+      title: '提示!',
+      content: `删除管桩预约号【${planNumber}】后不可恢复。确定要删除吗?`,
+      confirmColor: '#FF5B5B',
+      success: function (res) {
+        if (res.confirm) {
+          app.request.POST({
+            url: app.API.appointmentDelete,
+            params: [{
+              id: id
+            }],
+            page: _this,
+            isLoadingTxt: '删除中...',
+            successFun: true
+          }).then(res => {
+            wx.showToast({
+              title: '删除成功',
+              icon: 'success',
+              duration: 1000,
+              mask: true
+            })
+            _this.getListFun(); //刷新列表
+          })
+        } else if (res.cancel) {
+
+        }
+      }
+    })
+  },
+
+  //取消
+  cancelFun: function (e) {
+    let _this = this
+    let { id, planNumber } = e.currentTarget.dataset
+    wx.showModal({
+      title: '提示!',
+      content: `管桩预约号【${planNumber}】,确定取消该预约吗?`,
+      confirmColor: '#FF5B5B',
+      success: function (res) {
+        if (res.confirm) {
+          app.request.POST({
+            url: app.API.appointmentCancel,
+            params: {
+              id: id
+            },
+            page: _this,
+            isLoadingTxt: '提交中...',
+            successFun: true
+          }).then(res => {
+            wx.showToast({
+              title: '取消成功',
+              icon: 'success',
+              duration: 1000,
+              mask: true
+            })
+            _this.getListFun(); //刷新列表
+          })
+        } else if (res.cancel) {
+
+        }
+      }
+    })
+  },
+
+  // 审核S
+  showPopup(e) {
+    let { id } = e.currentTarget.dataset
+    this.setData({
+      show: true,
+      orderReason: '',
+      id: id,
+    });
+  },
+  onClose() {
+    this.setData({
+      show: false,
+      auditFlag:'false',
+      orderReason:'',
+      id: ''
+    });
+  },
+  // 单选
+  dangerStatusChange: function (e) {
+    this.setData({
+      [e.currentTarget.dataset.radiotype]: e.detail.value
+    })
+    if (e.detail.value == '1') {
+      this.setData({
+        appointmentReason: ''
+      })
+    }
+  },
+  
+  //审核
+  formSubmit: function (e) {
+    let formData = e.detail.value;
+    var warn = ""; //弹框时提示的内容
+    if (formData.auditFlag=='true' && formData.arriveReason == '') {
+      warn = "审核不通过时备注不能为空!";
+    }
+    formData.auditFlag = formData.auditFlag=='true'
+    if (warn != '') {
+      app.util.checkForm(warn);
+    } else {
+      app.request.POST({
+        url: app.API.bizloadarriveAudit,
+        params: formData,
+        page: this,
+        isLoadingTxt: '审核中...',
+        successFun: true
+      }).then(res => {
+        wx.showToast({
+          title: '审核成功',
+          icon: 'success',
+          duration: 1000,
+          mask: true
+        })
+        this.onClose()
+        this.getListFun(); //刷新列表
+      })
+    }
+  },
+  // 审核E
+
+  //申请
+  changeAdd() {
+    wx.navigateTo({
+      url: 'add'
+    })
+  },
+
+  
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+    this.setData({
+      searchVal: ''
+    })
+    if (wx.getStorageSync('loginStatus')) {
+      this.getListFun();
+    } else {
+      wx.stopPullDownRefresh();
+    }
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+    this.data.page++;
+    let params = {
+      current     : this.data.page,
+      size        : this.data.limit,
+      type        : this.data.type,
+      searchKey   : this.data.searchVal,
+      status      : this.data.appointmentStatusArray[this.data.appointmentStatusIndex].dictValue
+    }
+    app.request.pageOther({
+      url: app.API.bizloadarrivePage,
+      page: this,
+      params: params,
+      loadType: true //加载类型,是否是下拉加载
+    });
+  },
+
+
+  //以下是按钮拖动事件
+  buttonStart: function (e) {
+    startPoint = e.touches[0] //获取拖动开始点
+  },
+  buttonMove: function (e) {
+    var endPoint = e.touches[e.touches.length - 1] //获取拖动结束点
+    //计算在X轴上拖动的距离和在Y轴上拖动的距离
+    var translateX = endPoint.clientX - startPoint.clientX
+    var translateY = endPoint.clientY - startPoint.clientY
+    startPoint = endPoint //重置开始位置
+    var buttonTop = this.data.buttonTop + translateY
+    var buttonLeft = this.data.buttonLeft + translateX
+    //判断是移动否超出屏幕
+    if (buttonLeft + 60 >= this.data.windowWidth) {
+      buttonLeft = this.data.windowWidth - 60;
+    }
+    if (buttonLeft <= 0) {
+      buttonLeft = 0;
+    }
+    if (buttonTop <= this.data.filterHeight) {
+      buttonTop = this.data.filterHeight
+    }
+    if (buttonTop + 60 + 48 + this.data.safeAreaHeight >= this.data.windowHeight) {
+      buttonTop = this.data.windowHeight - 60 - 48 - this.data.safeAreaHeight;
+    }
+    this.setData({
+      buttonTop: buttonTop,
+      buttonLeft: buttonLeft
+    })
+  },
+  buttonEnd: function (e) {},
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  }
+})

+ 15 - 0
otherPages/pipeAppoint/index.json

@@ -0,0 +1,15 @@
+{
+  "navigationBarTitleText": "管桩预约",
+  "backgroundTextStyle": "dark",
+  "enablePullDownRefresh": true,
+  "usingComponents": {
+    "van-field": "@vant/weapp/field/index",
+    "van-popup": "@vant/weapp/popup/index",
+    "van-sticky": "@vant/weapp/sticky/index",
+    "van-search": "@vant/weapp/search/index",
+    "van-icon": "@vant/weapp/icon/index",
+    "van-empty": "@vant/weapp/empty/index",
+    "van-button": "@vant/weapp/button/index",
+    "van-loading": "@vant/weapp/loading/index"
+  }
+}

+ 44 - 0
otherPages/pipeAppoint/index.less

@@ -0,0 +1,44 @@
+/* pages/pipeAppoint/index.wxss */
+page{
+  --cell-vertical-padding:12rpx;
+  --cell-horizontal-padding:0;
+  --cell-background-color:transparent;
+}
+.bottomBtn{
+  padding-top: 20rpx;
+  text-align: right;
+}
+.bottomBtn button {
+  margin-left: 0 !important;
+}
+.orderLoadBox{
+  > .title{
+    height: 100rpx;
+    line-height: 100rpx;
+    font-weight: bold;
+    font-size: 40rpx;
+    color: #14284A;
+    text-align: center;
+    background: linear-gradient( 180deg, #D4E1F6 0%, #FFFFFF 100%);
+  }
+  .dialogUser{
+    height: 50vh;
+    padding-top: 30rpx;
+    .saleItem{
+      width: 700rpx;
+      margin:0 auto 30rpx;
+      padding-bottom: 20rpx;
+      border-bottom: 1px solid #eee;
+      .title{
+        font-size: 36rpx;
+        display: flex;
+        justify-content: space-between;
+      }
+      .time{
+        margin-top: 10rpx;
+        color: #666;
+        font-size: 24rpx;
+      }
+    }
+  }
+}

+ 113 - 0
otherPages/pipeAppoint/index.wxml

@@ -0,0 +1,113 @@
+<!--pages/pipeAppoint/index.wxml-->
+<view class="container listMain">
+  <block wx:if="{{loginStatus}}">
+    <view url="" class="addBtn" catch:tap="changeAdd" hover-class="none" catchtouchmove="buttonMove" bindtouchstart="buttonStart" bindtouchend="buttonEnd" style="top:{{buttonTop}}px;left:{{buttonLeft}}px;" wx:if="{{roleCodeList == 'driver'}}">
+      <van-icon name="plus" size="30px" />
+    </view>
+    <van-sticky>
+      <view class="topSeach">
+        <view class="rightBox" style="position: relative;">
+          <van-search value="{{ searchVal }}" shape="round" placeholder="查询预约单号/计划单号" bind:change="onChange" bind:search="onSearch" bind:cancel="onCancel" use-action-slot>
+            <view slot="label" style="width:160rpx;margin-right: 20rpx;">
+                  <van-field label="" input-align="center" style="width: 100%;">
+                    <view slot="input" style="width: 100%;">
+                      <input name="status" value='{{appointmentStatusArray[appointmentStatusIndex].dictValue}}' hidden='true' />
+                      <picker bindchange="bindPickerChange" value="{{appointmentStatusIndex}}" range="{{appointmentStatusArray}}" range-key="dictLabel" data-pickername='appointmentStatus'>
+                        <view wx:if="{{appointmentStatusArray[appointmentStatusIndex].dictLabel}}" style="font-size: 12px;white-space: nowrap;"> {{appointmentStatusArray[appointmentStatusIndex].dictLabel}}</view>
+                        <view wx:else class="selectPlaceholder" style="font-size: 12px;white-space: nowrap;">{{defaultText}}</view>
+                      </picker>
+                    </view>
+                    <view slot="right-icon">
+                      <van-icon name="arrow-down" />
+                    </view>
+                  </van-field>
+                </view>
+            <van-icon slot="action" class-prefix="iconfont" name="arrow3-right_fill" size="28px" color="#4B70EA" bind:tap="toSearch" />
+          </van-search>
+        </view>
+      </view>
+    </van-sticky>
+
+    <view class="width710">
+      <block wx:if="{{!requestStatu}}">
+        <block wx:if="{{resData.length>0}}">
+          <block wx:for="{{resData}}" wx:key="index">
+            <navigator url="info?id={{item.id}}&planNumber={{item.planNumber}}&index={{index}}" class="listItem">
+              <view class="title van-ellipsis">
+                <van-icon class='iconfont' name='/images/codeNumber.png' size="36rpx"></van-icon>
+                <text>{{item.planNumber}}</text>
+                <text wx:if="{{item.status}}" class="status status{{item.status}}">{{item.statusName}}</text>
+              </view>
+              <view class="info">
+                <text decode="{{true}}">司机:{{item.driverName?item.driverName:'未填写'}} / {{item.driverMobile?item.driverMobile:'未填写'}}</text>
+              </view>
+              <view class="time"><text>出入场时间:{{item.enterTime?filters.tosubStr(item.enterTime,0,16):''}} ~ {{item.leaveTime?filters.tosubStr(item.leaveTime,0,16):''}}</text></view>
+
+              <view class="bottomBtn" wx:if="{{ roleCodeList == 'driver' && (item.status == '2' || item.status == '4') }}">
+                <van-button type="info" size="small" data-url="edit?index={{index}}" catchtap="toLink" style="margin-right: 20rpx;" wx:if="{{ roleCodeList == 'driver' && (item.status == '2' || item.status == '4') }}">修改</van-button>
+
+                <van-button type="danger" size="small" data-id="{{item.id}}" data-plan-number="{{item.planNumber}}" catchtap="delFun" style="margin-right: 20rpx;" wx:if="{{ roleCodeList == 'driver' && (item.status == '2' || item.status == '4') }}">删除</van-button>
+
+                <van-button type="warning" size="small" data-id="{{item.id}}" data-plan-number="{{item.planNumber}}" catchtap="cancelFun" style="margin-right: 20rpx;" wx:if="{{ roleCodeList == 'driver' && item.status == '4' }}">取消</van-button>
+              </view>
+            </navigator>
+          </block>
+          <!-- 底部加载动画 -->
+          <view class='more'>
+            <block wx:if="{{more}}">
+              <van-loading size="24px" color="#1989fa">加载中...</van-loading>
+            </block>
+            <block wx:else>{{nomore}}</block>
+          </view>
+          <view style="height: 200rpx;"> </view>
+        </block>
+        <block wx:else>
+          <van-empty description="未搜索到预约记录" image="/images/null5.png" />
+        </block>
+      </block>
+    </view>
+  </block>
+  <block wx:else>
+    <view>
+      <van-empty image="/images/loginNull.png">
+        <view slot="description" style="text-align: center;">
+          <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
+          <van-button type="info" bindtap="toLogin">立即登录</van-button>
+        </view>
+      </van-empty>
+    </view>
+  </block>
+</view>
+
+<!-- 弹窗 -->
+<van-popup show="{{ show }}" position="bottom" round closeable custom-style="width:100%;padding:0rpx 30rpx 160rpx;" bind:close="onClose">
+  <view style="height: 90rpx;line-height: 90rpx;text-align: center;">审核</view>
+  <form bindsubmit="formSubmit">
+    <view class="part">
+      <view class="height20"> </view>
+      <view class="height20"> </view>
+      <input name="id" value='{{id}}' hidden='true' />
+      <van-field label="审核结果" name="auditFlag" value="{{ auditFlag }}" required input-align="right" class="radioHeight fieldAutoHeight">
+        <view slot="input" class="radioHeightBx">
+          <radio-group class="radio-group" bindchange="dangerStatusChange" data-radioType="auditFlag">
+            <label class="radio">
+              <radio value="true" checked="{{auditFlag=='true'}}" color="#4B70EA" />通过
+            </label>
+            <label class="radio">
+              <radio value="false" checked="{{auditFlag=='false'}}" color="#4B70EA" />不通过
+            </label>
+          </radio-group>
+        </view>
+      </van-field>
+      <van-field label="审核备注" required="{{auditFlag=='false'}}" name="arriveReason" value="{{ arriveReason }}" type="textarea" input-align="right" placeholder="请输入审核备注" autosize></van-field>
+    </view>
+
+    <view class="submitBtn">
+      <view style="padding-top: 60rpx;">
+        <van-button block round type="info" form-type="submit" color="#0396FF">确认</van-button>
+      </view>
+    </view>
+  </form>
+</van-popup>
+
+<wxs module="filters" src="../../utils/filter.wxs"></wxs>

+ 42 - 0
otherPages/pipeAppoint/index.wxss

@@ -0,0 +1,42 @@
+/* pages/pipeAppoint/index.wxss */
+page {
+  --cell-vertical-padding: 12rpx;
+  --cell-horizontal-padding: 0;
+  --cell-background-color: transparent;
+}
+.bottomBtn {
+  padding-top: 20rpx;
+  text-align: right;
+}
+.bottomBtn button {
+  margin-left: 0 !important;
+}
+.orderLoadBox > .title {
+  height: 100rpx;
+  line-height: 100rpx;
+  font-weight: bold;
+  font-size: 40rpx;
+  color: #14284A;
+  text-align: center;
+  background: linear-gradient(180deg, #D4E1F6 0%, #FFFFFF 100%);
+}
+.orderLoadBox .dialogUser {
+  height: 50vh;
+  padding-top: 30rpx;
+}
+.orderLoadBox .dialogUser .saleItem {
+  width: 700rpx;
+  margin: 0 auto 30rpx;
+  padding-bottom: 20rpx;
+  border-bottom: 1px solid #eee;
+}
+.orderLoadBox .dialogUser .saleItem .title {
+  font-size: 36rpx;
+  display: flex;
+  justify-content: space-between;
+}
+.orderLoadBox .dialogUser .saleItem .time {
+  margin-top: 10rpx;
+  color: #666;
+  font-size: 24rpx;
+}

+ 143 - 0
otherPages/pipeAppoint/info.js

@@ -0,0 +1,143 @@
+// pages/pipeAppoint/info.js
+const app = getApp()
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    info: {},
+
+    appointmentStatusArray: [{
+      dictValue: "",
+      dictLabel: "全部状态"
+    }],
+    appointmentStatusIndex: 0,
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad(options) {
+    //预约审核状态
+    let treeData = app.globalData.treeArr
+    for (const element of treeData) {
+      let arrStr;
+      switch (element.dictValue) {
+        case 'appointment_status':
+          arrStr = "appointmentStatusArray";
+          break;
+      }
+      let getArray =[{
+        dictValue: "",
+        dictLabel: "全部状态"
+      }]
+      this.setData({
+        [arrStr]: getArray.concat(element.children)
+      })
+    }
+    //获取详情
+    var pages = getCurrentPages();
+    var prevPage = pages[pages.length - 2];
+    let getInfo = prevPage.data.resData[options.index]
+  
+    this.setData({
+      info     : getInfo
+    })
+
+    app.request.GET({
+      url: app.API.bizpipeplanDetail,
+      params: {'id' : getInfo.orderId},
+      page: this,
+      successFun: true
+    }).then(res => {
+      let getInfo = res.data.data;
+      this.setData({
+        planNumber      : getInfo.planNumber,
+        planName        : getInfo.planName,
+        planCount       : getInfo.planCount,
+        planAlreadyCount: getInfo.planAlreadyCount,
+      })
+    })
+    //this.getInfo(options.id)
+  },
+
+  // //查询详情
+  // getInfo: function (id) {
+  //   app.request.GET({
+  //     url: app.API.bizloadarriveDetail,
+  //     page: this,
+  //     params: {
+  //       'id': id
+  //     },
+  //     successFun: true
+  //   }).then(res => {
+  //     let getInfo = res.data.data;
+  //     //司机回签图片
+  //     let fileList = []
+  //     if(getInfo.unloadImg){
+  //       let unloadImgArr = getInfo.unloadImg.split(',')
+  //       unloadImgArr.forEach(element => {
+  //         fileList.push({
+  //           url: app.host.BASEIMG_URL+element,
+  //           isImage:true
+  //         })
+  //       });
+  //     }
+  //     this.setData({
+  //       info              : getInfo,
+  //       fileList          : fileList,
+  //       accessControlAuth : JSON.parse(getInfo.accessControlAuth)
+  //     })
+  //   })
+  // },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh() {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom() {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  }
+})

+ 16 - 0
otherPages/pipeAppoint/info.json

@@ -0,0 +1,16 @@
+{
+  "navigationBarTitleText": "管桩预约详情",
+  "enablePullDownRefresh": true,
+  "usingComponents": {
+    "van-checkbox": "@vant/weapp/checkbox/index",
+    "van-checkbox-group": "@vant/weapp/checkbox-group/index",
+    "van-uploader": "@vant/weapp/uploader/index",
+    "car-num-input": "/components/CarNumInput/index",
+    "van-icon": "@vant/weapp/icon/index",
+    "van-cell-group": "@vant/weapp/cell-group/index",
+    "van-field": "@vant/weapp/field/index",
+    "van-button": "@vant/weapp/button/index",
+    "van-tag": "@vant/weapp/tag/index",
+    "van-image": "@vant/weapp/image/index"
+  }
+}

+ 1 - 0
otherPages/pipeAppoint/info.less

@@ -0,0 +1 @@
+/* pages/pipeAppoint/info.wxss */

+ 24 - 0
otherPages/pipeAppoint/info.wxml

@@ -0,0 +1,24 @@
+<!--pages/pipeAppoint/info.wxml-->
+<view class="container">
+  <view class="part">
+    <van-field label="管桩计划单号" input-align="right" value="{{info.planNumber }}" readonly></van-field>
+    <van-field label="- 计划名称" input-align="right" value="{{ planName }}" readonly></van-field>
+    <van-field label="- 预约次数" input-align="right" value="{{ planCount }}" readonly></van-field>
+    <van-field label="- 已预约次数" input-align="right" value="{{ planAlreadyCount }}" readonly></van-field>
+
+    <van-field label="车牌号" input-align="right" value="{{ info.licenseNumber }}" readonly></van-field>
+    <van-field label="司机姓名" input-align="right" value="{{ info.driverName }}" readonly></van-field>
+    <van-field label="司机电话" input-align="right" value="{{ info.driverMobile }}" readonly></van-field>
+    <van-field label="入场时间" input-align="right" value="{{ info.enterTime }}" readonly></van-field>
+    <van-field label="出场时间" input-align="right" value="{{ info.leaveTime }}" readonly></van-field>
+    <!-- <van-field label="创建人" input-align="right" value="{{info.createUserName}}" readonly></van-field>
+    <van-field label="创建时间" input-align="right" value="{{info.createTime}}" readonly></van-field> -->
+    <van-field label="预约状态" input-align="right" readonly>
+      <text slot="button" class="status status{{info.status}}">{{filters.codeAnalysis(appointmentStatusArray, info.status, 'dictValue', 'dictLabel')}} 
+      </text>
+    </van-field>
+  </view>
+  <view style="height: 50px;"></view>
+</view>
+
+<wxs module="filters" src="../../utils/filter.wxs"></wxs>

+ 6 - 1
pages/workstand/index.js

@@ -18,13 +18,18 @@ Page({
       
       {url:'/otherPages/loadAppoint/index',flowName:'起卸订单',flowIcon:'',iconfont:'fenpei',color:"#6c5ce7",role:["load","bizAdmin", "dispatcher"]},
 
+      {url:'/otherPages/loadArrive/index',flowName:'报港预约',flowIcon:'',iconfont:'loadArrive',color:"#20A0E3",role:["ship", "bizAdmin"]},
+
       {url:'/pages/reservationMan/index',flowName:'预约管理',flowIcon:'',iconfont:'yuyueguanli2',color:"#FF6160",role:["bizAdmin"]},
+      
+      {url:'/otherPages/pipeAppoint/index',flowName:'管桩预约',flowIcon:'',iconfont:'pipeAppoint',color:"#20A0E3",role:["driver", "bizAdmin"]},
+      
+      {url:'/otherPages/chargestation/index',flowName:'充电桩预约',flowIcon:'',iconfont:'chargestation',color:"#20A0E3",role:["driver", "bizAdmin"]},
 
       {url:'/pages/deliveryConfirm/index',flowName:'发货确认',flowIcon:'',iconfont:'daifahuo1',color:"#FF9237",role:["send"]},
 
       {url:'/pages/signReview/index',flowName:'签收审核',flowIcon:'',iconfont:'qianshou',color:"#e17055",role:["sale"]},
 
-      {url:'/otherPages/loadArrive/index',flowName:'报港预约',flowIcon:'',iconfont:'loadArrive',color:"#20A0E3",role:["ship", "bizAdmin"]},
       
       // 新增功能模块,包含列表、详情、新增,后续其他页面可复制,修改页面参数显示、接口地址即可
       // url:表示页面地址  role:有权限的角色名

+ 24 - 2
utils/api.js

@@ -36,12 +36,13 @@ const api = {
   'appointmentEdit':'/biz/bizappointmentrecord/edit',//编辑预约
   'appointmentList':'/biz/bizappointmentrecord/page',//预约列表
   'appointmentDelete':'/biz/bizappointmentrecord/delete',//删除预约
+  'appointmentCancel':'/biz/bizappointmentrecord/cancel',//取消预约
   'appointmentAudit':'/biz/bizappointmentrecord/auditRecord',//预约审核
+  'appointmentExit':'/biz/bizappointmentrecord/exit',//授权出场
+
   'updateDriverSign':'/biz/record/updateDriverSign',//司机确认
   'updateWeight':'/biz/record/updateWeight',//签收
   'uploadImgMap':'/dev/file/uploadImgMap',//图片上传
-  'appointmentCancel':'/biz/bizappointmentrecord/cancel',//取消预约
-  'appointmentExit':'/biz/bizappointmentrecord/exit',//授权出场
   'loadPointYY':'/biz/bizorderload/getPointList',//装卸点位下拉列表
   'loadTimeYY':'/biz/bizorderload/getLoadTimeList',//装卸时间列表
 
@@ -50,6 +51,27 @@ const api = {
   'tempEdit':'/biz/bizappointmentrecord/editTemp',//临时预约-修改
   'tempAudit':'/biz/bizappointmentrecord/auditTemp',//临时预约-审核
 
+  //起卸预约
+  'loadAdd': '/biz/bizappointmentrecord/addLoad', // POST 新增预约  
+  'loadEdit': '/biz/bizappointmentrecord/editLoad', // POST 编辑预约
+  'bizloaddispatchList': '/biz/bizloaddispatch/getList', // GET 装卸点位不分页列表  ?appointId=1938029722078810114&loadType=2
+  'bizloaddispatchTimeList': '/biz/bizloaddispatch/getListTime', // GET 装卸时间不分页列表   ?orderId=1938029722078810114&loadPointId=1928381326762668034&loadType=2
+  'bizexcessconfigList': '/biz/bizexcessconfig/getList', // GET 车辆轴数下拉列表  
+
+  //管桩预约 /biz/bizpipeplan/page
+  'appointmentPipePage': '/biz/bizappointmentrecord/getPipePage', // GET 分页列表
+  'appointmentPipeAdd': '/biz/bizappointmentrecord/addPipeAppoint', // POST 新增预约  
+  'appointmentPipeEdit': '/biz/bizappointmentrecord/editPipeAppoint', // POST 编辑预约
+  'bizpipeplanList': '/biz/bizpipeplan/getList', // GET 管桩计划单列表
+  'bizpipeplanDetail': '/biz/bizpipeplan/detail', // GET 管桩计划详情
+
+  //充电桩预约
+  'chargestationPage': '/biz/bizchargestationreservation/page', // GET 充电桩预约_分页列表
+  'chargestationAdd': '/biz/bizchargestationreservation/addChargeStationReservation', // POST 充电桩预约_新增
+  'chargestationEdit': '/biz/bizchargestationreservation/editChargeStationReservation', // POST 充电桩预约_编辑
+  'chargestationDelete': '/biz/bizchargestationreservation/deleteChargeStationReservation', // POST 充电桩预约_删除
+  'chargestationExit': '/biz/bizchargestationreservation/bizChargeStationReservationExit', // POST 充电桩预约_强制结束
+
   //过磅记录
   'recordList':'/biz/record/page',//过磅记录列表
 

+ 8 - 0
utils/iconfont.wxss

@@ -294,3 +294,11 @@
   content: "\e7a6";
 }
 
+.iconfont-pipeAppoint:before {
+  content: "\e7a6";
+}
+
+.iconfont-chargestation:before {
+  content: "\e7a6";
+}
+