shasha 10 часов назад
Родитель
Сommit
9431ea70c8
52 измененных файлов с 2368 добавлено и 22 удалено
  1. BIN
      images/loginNull.png
  2. BIN
      images/loginNullTemp.png
  3. BIN
      images/menuImg2.png
  4. BIN
      images/shengchanruku.png
  5. 1 1
      otherPages/loadAppoint/allocation.wxml
  6. 1 1
      otherPages/loadAppoint/dispatch.wxml
  7. 288 0
      otherPages/loadAppoint/endSign.js
  8. 6 0
      otherPages/loadAppoint/endSign.json
  9. 65 0
      otherPages/loadAppoint/endSign.less
  10. 28 0
      otherPages/loadAppoint/endSign.wxml
  11. 57 0
      otherPages/loadAppoint/endSign.wxss
  12. 1 1
      otherPages/loadAppoint/index.wxml
  13. 66 0
      otherPages/loadAppoint/sign.js
  14. 2 0
      otherPages/loadAppoint/sign.wxml
  15. 1 1
      otherPages/loadArrive/index.wxml
  16. 1 1
      otherPages/parkConfig/index.wxml
  17. 1 1
      otherPages/repairDispatch/index.wxml
  18. 1 1
      otherPages/reportFault/index.wxml
  19. 1 1
      otherPages/upDownSubmit/index.wxml
  20. 1 1
      otherPages/workTask/index.wxml
  21. 1 1
      pages/deliveryConfirm/index.wxml
  22. 3 1
      pages/index/index.wxml
  23. 1 1
      pages/logisticsOrderMan/index.wxml
  24. 1 1
      pages/operationExecution/index.wxml
  25. 1 1
      pages/queueCar/index.wxml
  26. 1 1
      pages/reservationChargestation/index.wxml
  27. 1 1
      pages/reservationLoadAppoint/index.wxml
  28. 1 1
      pages/reservationMan/index.wxml
  29. 188 0
      pages/reservationOther/add.js
  30. 18 0
      pages/reservationOther/add.json
  31. 53 0
      pages/reservationOther/add.wxml
  32. 209 0
      pages/reservationOther/add.wxss
  33. 207 0
      pages/reservationOther/edit.js
  34. 20 0
      pages/reservationOther/edit.json
  35. 1 0
      pages/reservationOther/edit.less
  36. 56 0
      pages/reservationOther/edit.wxml
  37. 417 0
      pages/reservationOther/index.js
  38. 15 0
      pages/reservationOther/index.json
  39. 44 0
      pages/reservationOther/index.less
  40. 115 0
      pages/reservationOther/index.wxml
  41. 42 0
      pages/reservationOther/index.wxss
  42. 1 1
      pages/reservationPipe/index.wxml
  43. 288 0
      pages/salesOrderMan/endSign.js
  44. 6 0
      pages/salesOrderMan/endSign.json
  45. 65 0
      pages/salesOrderMan/endSign.less
  46. 28 0
      pages/salesOrderMan/endSign.wxml
  47. 57 0
      pages/salesOrderMan/endSign.wxss
  48. 1 1
      pages/salesOrderMan/index.wxml
  49. 1 1
      pages/signReview/index.wxml
  50. 1 1
      pages/weighingRecord/index.wxml
  51. 1 1
      pages/workstand/index.wxml
  52. 3 0
      utils/api.js

BIN
images/loginNull.png


BIN
images/loginNullTemp.png


BIN
images/menuImg2.png


BIN
images/shengchanruku.png


+ 1 - 1
otherPages/loadAppoint/allocation.wxml

@@ -41,7 +41,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
otherPages/loadAppoint/dispatch.wxml

@@ -42,7 +42,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 288 - 0
otherPages/loadAppoint/endSign.js

@@ -0,0 +1,288 @@
+// pages/sign/index.js
+var canvas = null;
+const app = getApp()
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    id:'',
+    ctx: null,
+    points: [], // 存储所有笔画
+    currentStroke: [], // 当前笔画
+    isDrawing: false,
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad(options) {
+    this.setData({
+      id:options.id
+    })
+    this.initCanvas();
+  },
+
+  /**
+   * 初始化画布
+   * 设置画布大小、像素比例和画笔样式
+   */
+  async initCanvas() {
+    // 使用ID获取canvas组件实例
+    const query = wx.createSelectorQuery();
+    query.select('#canvas')
+      .fields({ node: true, size: true })
+      .exec((res) => {
+        canvas = res[0].node;
+        const ctx = canvas.getContext('2d');
+
+        // Canvas 画布的实际绘制宽高
+        const width = res[0].width
+        const height = res[0].height
+        // 设置画布大小,使用新的API获取设备像素比
+        const dpr = wx.getWindowInfo().pixelRatio;
+        canvas.width = width * dpr;
+        canvas.height = height * dpr;
+        ctx.scale(dpr, dpr);
+
+        // 设置画笔样式
+        ctx.strokeStyle = '#000000';
+        ctx.lineWidth = 3;
+        ctx.lineCap = 'round';
+        ctx.lineJoin = 'round';
+
+        //绘制背景
+        ctx.fillStyle = '#fff'
+        ctx.clearRect(0, 0, canvas.width, canvas.height)
+        ctx.fillRect(0, 0, canvas.width, canvas.height)
+
+        this.setData({ ctx });
+      });
+  },
+
+  /**
+   * 处理触摸开始事件
+   * 开始一个新的笔画,记录起始点
+   * @param {Object} e - 触摸事件对象
+   */
+  handleTouchStart(e) {
+    const { x, y } = e.touches[0];
+    this.setData({
+      isDrawing: true,
+      currentStroke: [[x, y]]
+    });
+    this.data.ctx.beginPath();
+    this.data.ctx.moveTo(x, y);
+  },
+
+  /**
+   * 处理触摸移动事件
+   * 继续绘制当前笔画的路径
+   * @param {Object} e - 触摸事件对象
+   */
+  handleTouchMove(e) {
+    if (!this.data.isDrawing) return;
+    const { x, y } = e.touches[0];
+    this.data.currentStroke.push([x, y]);
+    this.data.ctx.lineTo(x, y);
+    this.data.ctx.stroke();
+  },
+
+  /**
+   * 处理触摸结束事件
+   * 完成当前笔画,将其添加到笔画历史中
+   */
+  handleTouchEnd() {
+    if (!this.data.isDrawing) return;
+    this.setData({
+      isDrawing: false,
+      points: [...this.data.points, this.data.currentStroke],
+      currentStroke: []
+    });
+  },
+
+  /**
+   * 清除画布内容
+   * 清空所有笔画记录和画布显示
+   */
+  handleClear() {
+    const { ctx } = this.data;
+    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
+    this.setData({ points: [] });
+  },
+
+  /**
+   * 撤销上一步操作
+   * 移除最后一笔,并重绘剩余的笔画
+   */
+  handleUndo() {
+    if (this.data.points.length === 0) return;
+
+    const { ctx } = this.data;
+    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
+
+    // 移除最后一笔
+    const newPoints = this.data.points.slice(0, -1);
+    this.setData({ points: newPoints });
+
+    // 重绘所有笔画
+    newPoints.forEach(stroke => {
+      ctx.beginPath();
+      ctx.moveTo(stroke[0][0], stroke[0][1]);
+      stroke.forEach(([x, y]) => {
+        ctx.lineTo(x, y);
+      });
+      ctx.stroke();
+    });
+  },
+
+  /**
+   * 提交签名
+   * 将画布内容转换为图片并处理提交逻辑
+   * @returns {Promise<void>}
+   */
+  async handleSubmit() {
+    let that = this
+    if (this.data.points.length === 0) {
+      wx.showToast({
+        title: '请先签名',
+        icon: 'none'
+      });
+      return;
+    }
+
+    try {
+      // 将画布内容转换为图片
+      const tempFilePath = await new Promise((resolve, reject) => {
+        wx.canvasToTempFilePath({
+          canvas: canvas,
+          success: res => resolve(res.tempFilePath),
+          fail: reject
+        });
+      });
+
+      // 这里可以处理签名图片,比如上传到服务器
+      console.log('签名图片路径:', tempFilePath);
+
+      // 将图片转为 Base64
+      that.imageToBase64(tempFilePath, function (error, base64String) {
+        if (error) {
+            console.error('Base64 转换失败', error);
+            return;
+        }
+        that.setData({
+            signature: base64String
+        })
+        let formData = {
+          id:that.data.id,
+          endSign:base64String
+        }
+        // 上传 Base64 编码的图片,订单签名
+        app.request.POST({
+          url: app.API.endSignCustomerLoad,
+          params: formData,
+          page: that,
+          isLoadingTxt: '提交中...',
+          isSubmitting: true,
+          successFun: true
+        }).then(res => {
+          wx.showToast({
+            title: '确认成功',
+            icon: 'success',
+            duration: 2000,
+            complete: function () {
+              setTimeout(() => {
+                wx.navigateBack()
+              }, 1500) //延迟时间  
+            }
+          })
+        })
+        //that.selfConfirm(base64String);
+    });
+      
+      // wx.showToast({
+      //   title: '提交成功',
+      //   icon: 'success'
+      // });
+
+      // // 返回上一页
+      // setTimeout(() => {
+      //   wx.navigateBack();
+      // }, 1500);
+    } catch (error) {
+      console.error('提交签名失败:', error);
+      wx.showToast({
+        title: '提交失败',
+        icon: 'error'
+      });
+    }
+
+    
+  },
+
+  //图片转baose64
+  imageToBase64(tempFilePath, callback) {
+    wx.getFileSystemManager().readFile({
+        filePath: tempFilePath,
+        encoding: 'base64',
+        success: function (res) {
+            // 拼接与 PC 端一致的格式
+            var base64Str = "data:image/png;base64," + res.data;
+            callback(null, base64Str);
+        },
+        fail: function (error) {
+            callback(error);
+        }
+    });
+},
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh() {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom() {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  }
+})

+ 6 - 0
otherPages/loadAppoint/endSign.json

@@ -0,0 +1,6 @@
+{
+  "navigationBarTitleText": "客户手签",
+  "usingComponents": {
+    "van-button": "@vant/weapp/button/index"
+  }
+}

+ 65 - 0
otherPages/loadAppoint/endSign.less

@@ -0,0 +1,65 @@
+/* pages/sign/index.wxss */
+/* 页面容器 签字区域只自改这里的高度 */
+.signature-page {
+  width: 100vw;
+  height: calc(50vh - 44rpx);
+  // background-color: #f6f6f6;
+  display: flex;
+  flex-direction: column;
+  padding: 16rpx;
+  box-sizing: border-box;
+}
+
+/* 顶部操作栏 */
+.action-bar {
+  display: flex;
+  justify-content: flex-end;
+  gap: 16rpx;
+  margin-bottom: 20rpx;
+  padding: 0 10rpx;
+}
+
+/* 自定义按钮样式 */
+.action-bar .t-button {
+  min-width: auto;
+  padding: 0 16rpx;
+  font-size: 18rpx !important;
+  height: 35rpx !important;
+  line-height: 35rpx !important;
+}
+
+/* 按钮图标样式 */
+.action-bar .t-icon,
+.action-bar .t-button__icon,
+.action-bar .t-button .t-icon {
+  font-size: 20rpx !important;
+}
+
+/* 签名区域-大尺寸 */
+.signature-area-large {
+  flex: 1;
+  background-color: #ffffff;
+  border-radius: 16rpx;
+  box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.2);
+  overflow: hidden;
+  position: relative;
+  margin: 0 auto;
+  width: 94vw;
+  height: 100vh;
+}
+
+/* 签名画布-大尺寸 */
+.signature-canvas-large {
+  width: 100%;
+  height: 100%;
+  background-color: #ffffff;
+}
+
+/* 提示文本 */
+.signature-tips {
+  text-align: center;
+  color: #999999;
+  font-size: 12px;
+  margin-top: 16rpx;
+}
+

+ 28 - 0
otherPages/loadAppoint/endSign.wxml

@@ -0,0 +1,28 @@
+<!--pages/sign/index.wxml-->
+<!-- 电子签名页面 -->
+<view class="signature-page">
+  <!-- 顶部操作栏 -->
+  <!-- <view class="action-bar">
+    <van-button type="primary" bind:tap="handleClear">重写</van-button>
+    <van-button type="danger" bind:tap="handleUndo">撤销</van-button>
+    <van-button type="info" bind:tap="handleSubmit">提交</van-button>
+  </view> -->
+
+  <!-- 签名区域 -->
+  <view class="signature-area-large">
+    <canvas type="2d" id="canvas" class="signature-canvas-large" disable-scroll="{{true}}" bindtouchstart="handleTouchStart" bindtouchmove="handleTouchMove" bindtouchend="handleTouchEnd"></canvas>
+  </view>
+
+  <!-- 提示文本 -->
+  <view class="signature-tips">请在上方区域书写您的签名</view>
+
+  <view style="display: grid;grid-template-columns: 1fr 1fr;grid-gap: 30rpx;padding: 30rpx 0;">
+    <view><van-button type="primary" block bind:tap="handleClear">重写</van-button></view>
+    <view><van-button type="danger" block bind:tap="handleUndo">撤销</van-button></view>
+  </view>
+
+  <view class="fixedBtn submitBtn">
+    <van-button round block type="info" bind:tap="handleSubmit">提交</van-button>
+  </view>
+
+</view>

+ 57 - 0
otherPages/loadAppoint/endSign.wxss

@@ -0,0 +1,57 @@
+/* pages/sign/index.wxss */
+/* 页面容器 签字区域只自改这里的高度 */
+.signature-page {
+  width: 100vw;
+  height: calc(50vh - 44rpx);
+  display: flex;
+  flex-direction: column;
+  padding: 16rpx;
+  box-sizing: border-box;
+}
+/* 顶部操作栏 */
+.action-bar {
+  display: flex;
+  justify-content: flex-end;
+  gap: 16rpx;
+  margin-bottom: 20rpx;
+  padding: 0 10rpx;
+}
+/* 自定义按钮样式 */
+.action-bar .t-button {
+  min-width: auto;
+  padding: 0 16rpx;
+  font-size: 18rpx !important;
+  height: 35rpx !important;
+  line-height: 35rpx !important;
+}
+/* 按钮图标样式 */
+.action-bar .t-icon,
+.action-bar .t-button__icon,
+.action-bar .t-button .t-icon {
+  font-size: 20rpx !important;
+}
+/* 签名区域-大尺寸 */
+.signature-area-large {
+  flex: 1;
+  background-color: #ffffff;
+  border-radius: 16rpx;
+  box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.2);
+  overflow: hidden;
+  position: relative;
+  margin: 0 auto;
+  width: 94vw;
+  height: 100vh;
+}
+/* 签名画布-大尺寸 */
+.signature-canvas-large {
+  width: 100%;
+  height: 100%;
+  background-color: #ffffff;
+}
+/* 提示文本 */
+.signature-tips {
+  text-align: center;
+  color: #999999;
+  font-size: 12px;
+  margin-top: 16rpx;
+}

+ 1 - 1
otherPages/loadAppoint/index.wxml

@@ -65,7 +65,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 66 - 0
otherPages/loadAppoint/sign.js

@@ -0,0 +1,66 @@
+// otherPages/loadAppoint/sign.js
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad(options) {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh() {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom() {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  }
+})

+ 2 - 0
otherPages/loadAppoint/sign.wxml

@@ -0,0 +1,2 @@
+<!--otherPages/loadAppoint/sign.wxml-->
+<text>otherPages/loadAppoint/sign.wxml</text>

+ 1 - 1
otherPages/loadArrive/index.wxml

@@ -75,7 +75,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
otherPages/parkConfig/index.wxml

@@ -80,7 +80,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
otherPages/repairDispatch/index.wxml

@@ -51,7 +51,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
otherPages/reportFault/index.wxml

@@ -51,7 +51,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
otherPages/upDownSubmit/index.wxml

@@ -52,7 +52,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
otherPages/workTask/index.wxml

@@ -52,7 +52,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
pages/deliveryConfirm/index.wxml

@@ -76,7 +76,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 3 - 1
pages/index/index.wxml

@@ -96,6 +96,8 @@
                   <van-button type="danger" size="small" data-id="{{item.id}}" data-license-number="{{item.licenseNumber}}" catchtap="overFun" wx:if="{{ roleCodeList=='driver' && item.appointmentType == '4' && item.status == '5' }}">充电结束</van-button>
 
                   <van-button data-index="{{index}}" type="info" data-url="sign?id={{item.recordId}}" catchtap="toLink" size="small" wx:if="{{ item.status == '8' }}">司机确认</van-button>
+
+                  <van-button type="warning" size="small" data-id="{{item.id}}" data-license-number="{{item.licenseNumber}}" catchtap="cancelFun" wx:if="{{ item.status == '8' }}">司机取消</van-button>
                   
                   <van-button type="info" size="small" data-url="signFor?id={{item.recordId}}&index={{index}}" catchtap="toLink" wx:if="{{ item.status == '10' && item.orderType == '1' }}">司机回签</van-button>
                 </view>
@@ -118,7 +120,7 @@
     </block>
     <block wx:else>
       <view>
-        <van-empty image="/images/loginNull.png">
+        <van-empty image="/images/loginNullTemp.png">
           <view slot="description" style="text-align: center;">
             <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
             <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
pages/logisticsOrderMan/index.wxml

@@ -47,7 +47,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
pages/operationExecution/index.wxml

@@ -53,7 +53,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
pages/queueCar/index.wxml

@@ -52,7 +52,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
pages/reservationChargestation/index.wxml

@@ -71,7 +71,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
pages/reservationLoadAppoint/index.wxml

@@ -69,7 +69,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
pages/reservationMan/index.wxml

@@ -116,7 +116,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 188 - 0
pages/reservationOther/add.js

@@ -0,0 +1,188 @@
+// pages/reservationPipe/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({
+          driverName  : this.data.driverArray[this.data.driverIndex].name,
+          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 < 7) {
+      warn = "请选择车牌号!";
+    } else if (value.licenseNumber.length == 7 && !xreg.test(value.licenseNumber)) {
+      warn = "车牌号格式错误!";
+    } else if(value.driverId == ''){
+      warn = "请选择司机!";
+    } 
+    
+    if (warn != '') {
+      app.util.checkForm(warn);
+    } else {
+      app.request.POST({
+        url: app.API.otherAdd,
+        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
pages/reservationOther/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"
+  }
+}

+ 53 - 0
pages/reservationOther/add.wxml

@@ -0,0 +1,53 @@
+<!--pages/reservationOther/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' />
+
+        <!-- 司机 -->
+        <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="driverName" readonly value="{{ driverName }}" placeholder="选择司机自动填入" input-align="right"></van-field>
+
+        <van-field label="司机电话" wx:if="{{driverArray[driverIndex].id}}" name="driverMobile" readonly value="{{ driverMobile }}" placeholder="选择司机自动填入" input-align="right"></van-field>
+
+        <van-field label="是否过磅" name="isWeigh" value="{{ isWeigh }}" required input-align="right" class="radioHeight fieldAutoHeight">
+          <view slot="input" class="radioHeightBx">
+            <radio-group class="radio-group" bindchange="dangerStatusChange" data-radioType="isWeigh">
+              <label class="radio">
+                <radio value="1" checked="{{isWeigh=='1'}}" color="#4B70EA" />是
+              </label>
+              <label class="radio">
+                <radio value="2" checked="{{isWeigh=='2'}}" color="#4B70EA" />否
+              </label>
+            </radio-group>
+          </view>
+        </van-field>
+        <van-field label="备注" name="remark" value="{{ remark }}" type="textarea" input-align="right" placeholder="请输入备注" autosize></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
pages/reservationOther/add.wxss

@@ -0,0 +1,209 @@
+/* pages/reservationPipe/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;
+}

+ 207 - 0
pages/reservationOther/edit.js

@@ -0,0 +1,207 @@
+// pages/reservationOther/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,
+      isWeigh:getInfo.isWeigh,
+      driverMobile: getInfo.driverMobile,
+      driverName: getInfo.driverName,
+      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({
+          driverName  : this.data.driverArray[this.data.driverIndex].name,
+          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 < 7) {
+      warn = "请选择车牌号!";
+    } else if (value.licenseNumber.length == 7 && !xreg.test(value.licenseNumber)) {
+      warn = "车牌号格式错误!";
+    } else if(value.driverId == ''){
+      warn = "请选择司机!";
+    } 
+
+    if (warn != '') {
+      app.util.checkForm(warn);
+    } else {
+      app.request.POST({
+        url: app.API.otherEdit,
+        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
pages/reservationOther/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
pages/reservationOther/edit.less

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

+ 56 - 0
pages/reservationOther/edit.wxml

@@ -0,0 +1,56 @@
+<!--pages/reservationOther/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="driverName" readonly value="{{ driverName }}" placeholder="选择司机自动填入" input-align="right"></van-field>
+
+        <van-field label="司机电话" wx:if="{{driverArray[driverIndex].id}}" name="driverMobile" readonly value="{{ driverMobile }}" placeholder="选择司机自动填入" input-align="right"></van-field>
+
+        <van-field label="是否过磅" name="isWeigh" value="{{ isWeigh }}" required input-align="right" class="radioHeight fieldAutoHeight">
+          <view slot="input" class="radioHeightBx">
+            <radio-group class="radio-group" bindchange="dangerStatusChange" data-radioType="isWeigh">
+              <label class="radio">
+                <radio value="1" checked="{{ isWeigh=='1'}}" color="#4B70EA" />是
+              </label>
+              <label class="radio">
+                <radio value="2" checked="{{ isWeigh=='2'}}" color="#4B70EA" />否
+              </label>
+            </radio-group>
+          </view>
+        </van-field>
+        <van-field label="备注" name="remark" value="{{ info.remark }}" type="textarea" input-align="right" placeholder="请输入备注" autosize></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
pages/reservationOther/index.js

@@ -0,0 +1,417 @@
+// pages/reservationOther/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
pages/reservationOther/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
pages/reservationOther/index.less

@@ -0,0 +1,44 @@
+/* pages/reservationOther/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
pages/reservationOther/index.wxml

@@ -0,0 +1,115 @@
+<!--pages/reservationOther/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/loginNullTemp.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
pages/reservationOther/index.wxss

@@ -0,0 +1,42 @@
+/* pages/reservationOther/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;
+}

+ 1 - 1
pages/reservationPipe/index.wxml

@@ -69,7 +69,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 288 - 0
pages/salesOrderMan/endSign.js

@@ -0,0 +1,288 @@
+// pages/sign/index.js
+var canvas = null;
+const app = getApp()
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    id:'',
+    ctx: null,
+    points: [], // 存储所有笔画
+    currentStroke: [], // 当前笔画
+    isDrawing: false,
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad(options) {
+    this.setData({
+      id:options.id
+    })
+    this.initCanvas();
+  },
+
+  /**
+   * 初始化画布
+   * 设置画布大小、像素比例和画笔样式
+   */
+  async initCanvas() {
+    // 使用ID获取canvas组件实例
+    const query = wx.createSelectorQuery();
+    query.select('#canvas')
+      .fields({ node: true, size: true })
+      .exec((res) => {
+        canvas = res[0].node;
+        const ctx = canvas.getContext('2d');
+
+        // Canvas 画布的实际绘制宽高
+        const width = res[0].width
+        const height = res[0].height
+        // 设置画布大小,使用新的API获取设备像素比
+        const dpr = wx.getWindowInfo().pixelRatio;
+        canvas.width = width * dpr;
+        canvas.height = height * dpr;
+        ctx.scale(dpr, dpr);
+
+        // 设置画笔样式
+        ctx.strokeStyle = '#000000';
+        ctx.lineWidth = 3;
+        ctx.lineCap = 'round';
+        ctx.lineJoin = 'round';
+
+        //绘制背景
+        ctx.fillStyle = '#fff'
+        ctx.clearRect(0, 0, canvas.width, canvas.height)
+        ctx.fillRect(0, 0, canvas.width, canvas.height)
+
+        this.setData({ ctx });
+      });
+  },
+
+  /**
+   * 处理触摸开始事件
+   * 开始一个新的笔画,记录起始点
+   * @param {Object} e - 触摸事件对象
+   */
+  handleTouchStart(e) {
+    const { x, y } = e.touches[0];
+    this.setData({
+      isDrawing: true,
+      currentStroke: [[x, y]]
+    });
+    this.data.ctx.beginPath();
+    this.data.ctx.moveTo(x, y);
+  },
+
+  /**
+   * 处理触摸移动事件
+   * 继续绘制当前笔画的路径
+   * @param {Object} e - 触摸事件对象
+   */
+  handleTouchMove(e) {
+    if (!this.data.isDrawing) return;
+    const { x, y } = e.touches[0];
+    this.data.currentStroke.push([x, y]);
+    this.data.ctx.lineTo(x, y);
+    this.data.ctx.stroke();
+  },
+
+  /**
+   * 处理触摸结束事件
+   * 完成当前笔画,将其添加到笔画历史中
+   */
+  handleTouchEnd() {
+    if (!this.data.isDrawing) return;
+    this.setData({
+      isDrawing: false,
+      points: [...this.data.points, this.data.currentStroke],
+      currentStroke: []
+    });
+  },
+
+  /**
+   * 清除画布内容
+   * 清空所有笔画记录和画布显示
+   */
+  handleClear() {
+    const { ctx } = this.data;
+    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
+    this.setData({ points: [] });
+  },
+
+  /**
+   * 撤销上一步操作
+   * 移除最后一笔,并重绘剩余的笔画
+   */
+  handleUndo() {
+    if (this.data.points.length === 0) return;
+
+    const { ctx } = this.data;
+    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
+
+    // 移除最后一笔
+    const newPoints = this.data.points.slice(0, -1);
+    this.setData({ points: newPoints });
+
+    // 重绘所有笔画
+    newPoints.forEach(stroke => {
+      ctx.beginPath();
+      ctx.moveTo(stroke[0][0], stroke[0][1]);
+      stroke.forEach(([x, y]) => {
+        ctx.lineTo(x, y);
+      });
+      ctx.stroke();
+    });
+  },
+
+  /**
+   * 提交签名
+   * 将画布内容转换为图片并处理提交逻辑
+   * @returns {Promise<void>}
+   */
+  async handleSubmit() {
+    let that = this
+    if (this.data.points.length === 0) {
+      wx.showToast({
+        title: '请先签名',
+        icon: 'none'
+      });
+      return;
+    }
+
+    try {
+      // 将画布内容转换为图片
+      const tempFilePath = await new Promise((resolve, reject) => {
+        wx.canvasToTempFilePath({
+          canvas: canvas,
+          success: res => resolve(res.tempFilePath),
+          fail: reject
+        });
+      });
+
+      // 这里可以处理签名图片,比如上传到服务器
+      console.log('签名图片路径:', tempFilePath);
+
+      // 将图片转为 Base64
+      that.imageToBase64(tempFilePath, function (error, base64String) {
+        if (error) {
+            console.error('Base64 转换失败', error);
+            return;
+        }
+        that.setData({
+            signature: base64String
+        })
+        let formData = {
+          id:that.data.id,
+          endSign:base64String
+        }
+        // 上传 Base64 编码的图片,订单签名
+        app.request.POST({
+          url: app.API.endSignOrder,
+          params: formData,
+          page: that,
+          isLoadingTxt: '提交中...',
+          isSubmitting: true,
+          successFun: true
+        }).then(res => {
+          wx.showToast({
+            title: '确认成功',
+            icon: 'success',
+            duration: 2000,
+            complete: function () {
+              setTimeout(() => {
+                wx.navigateBack()
+              }, 1500) //延迟时间  
+            }
+          })
+        })
+        //that.selfConfirm(base64String);
+    });
+      
+      // wx.showToast({
+      //   title: '提交成功',
+      //   icon: 'success'
+      // });
+
+      // // 返回上一页
+      // setTimeout(() => {
+      //   wx.navigateBack();
+      // }, 1500);
+    } catch (error) {
+      console.error('提交签名失败:', error);
+      wx.showToast({
+        title: '提交失败',
+        icon: 'error'
+      });
+    }
+
+    
+  },
+
+  //图片转baose64
+  imageToBase64(tempFilePath, callback) {
+    wx.getFileSystemManager().readFile({
+        filePath: tempFilePath,
+        encoding: 'base64',
+        success: function (res) {
+            // 拼接与 PC 端一致的格式
+            var base64Str = "data:image/png;base64," + res.data;
+            callback(null, base64Str);
+        },
+        fail: function (error) {
+            callback(error);
+        }
+    });
+},
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh() {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom() {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  }
+})

+ 6 - 0
pages/salesOrderMan/endSign.json

@@ -0,0 +1,6 @@
+{
+  "navigationBarTitleText": "客户手签",
+  "usingComponents": {
+    "van-button": "@vant/weapp/button/index"
+  }
+}

+ 65 - 0
pages/salesOrderMan/endSign.less

@@ -0,0 +1,65 @@
+/* pages/sign/index.wxss */
+/* 页面容器 签字区域只自改这里的高度 */
+.signature-page {
+  width: 100vw;
+  height: calc(50vh - 44rpx);
+  // background-color: #f6f6f6;
+  display: flex;
+  flex-direction: column;
+  padding: 16rpx;
+  box-sizing: border-box;
+}
+
+/* 顶部操作栏 */
+.action-bar {
+  display: flex;
+  justify-content: flex-end;
+  gap: 16rpx;
+  margin-bottom: 20rpx;
+  padding: 0 10rpx;
+}
+
+/* 自定义按钮样式 */
+.action-bar .t-button {
+  min-width: auto;
+  padding: 0 16rpx;
+  font-size: 18rpx !important;
+  height: 35rpx !important;
+  line-height: 35rpx !important;
+}
+
+/* 按钮图标样式 */
+.action-bar .t-icon,
+.action-bar .t-button__icon,
+.action-bar .t-button .t-icon {
+  font-size: 20rpx !important;
+}
+
+/* 签名区域-大尺寸 */
+.signature-area-large {
+  flex: 1;
+  background-color: #ffffff;
+  border-radius: 16rpx;
+  box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.2);
+  overflow: hidden;
+  position: relative;
+  margin: 0 auto;
+  width: 94vw;
+  height: 100vh;
+}
+
+/* 签名画布-大尺寸 */
+.signature-canvas-large {
+  width: 100%;
+  height: 100%;
+  background-color: #ffffff;
+}
+
+/* 提示文本 */
+.signature-tips {
+  text-align: center;
+  color: #999999;
+  font-size: 12px;
+  margin-top: 16rpx;
+}
+

+ 28 - 0
pages/salesOrderMan/endSign.wxml

@@ -0,0 +1,28 @@
+<!--pages/sign/index.wxml-->
+<!-- 电子签名页面 -->
+<view class="signature-page">
+  <!-- 顶部操作栏 -->
+  <!-- <view class="action-bar">
+    <van-button type="primary" bind:tap="handleClear">重写</van-button>
+    <van-button type="danger" bind:tap="handleUndo">撤销</van-button>
+    <van-button type="info" bind:tap="handleSubmit">提交</van-button>
+  </view> -->
+
+  <!-- 签名区域 -->
+  <view class="signature-area-large">
+    <canvas type="2d" id="canvas" class="signature-canvas-large" disable-scroll="{{true}}" bindtouchstart="handleTouchStart" bindtouchmove="handleTouchMove" bindtouchend="handleTouchEnd"></canvas>
+  </view>
+
+  <!-- 提示文本 -->
+  <view class="signature-tips">请在上方区域书写您的签名</view>
+
+  <view style="display: grid;grid-template-columns: 1fr 1fr;grid-gap: 30rpx;padding: 30rpx 0;">
+    <view><van-button type="primary" block bind:tap="handleClear">重写</van-button></view>
+    <view><van-button type="danger" block bind:tap="handleUndo">撤销</van-button></view>
+  </view>
+
+  <view class="fixedBtn submitBtn">
+    <van-button round block type="info" bind:tap="handleSubmit">提交</van-button>
+  </view>
+
+</view>

+ 57 - 0
pages/salesOrderMan/endSign.wxss

@@ -0,0 +1,57 @@
+/* pages/sign/index.wxss */
+/* 页面容器 签字区域只自改这里的高度 */
+.signature-page {
+  width: 100vw;
+  height: calc(50vh - 44rpx);
+  display: flex;
+  flex-direction: column;
+  padding: 16rpx;
+  box-sizing: border-box;
+}
+/* 顶部操作栏 */
+.action-bar {
+  display: flex;
+  justify-content: flex-end;
+  gap: 16rpx;
+  margin-bottom: 20rpx;
+  padding: 0 10rpx;
+}
+/* 自定义按钮样式 */
+.action-bar .t-button {
+  min-width: auto;
+  padding: 0 16rpx;
+  font-size: 18rpx !important;
+  height: 35rpx !important;
+  line-height: 35rpx !important;
+}
+/* 按钮图标样式 */
+.action-bar .t-icon,
+.action-bar .t-button__icon,
+.action-bar .t-button .t-icon {
+  font-size: 20rpx !important;
+}
+/* 签名区域-大尺寸 */
+.signature-area-large {
+  flex: 1;
+  background-color: #ffffff;
+  border-radius: 16rpx;
+  box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.2);
+  overflow: hidden;
+  position: relative;
+  margin: 0 auto;
+  width: 94vw;
+  height: 100vh;
+}
+/* 签名画布-大尺寸 */
+.signature-canvas-large {
+  width: 100%;
+  height: 100%;
+  background-color: #ffffff;
+}
+/* 提示文本 */
+.signature-tips {
+  text-align: center;
+  color: #999999;
+  font-size: 12px;
+  margin-top: 16rpx;
+}

+ 1 - 1
pages/salesOrderMan/index.wxml

@@ -99,7 +99,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
pages/signReview/index.wxml

@@ -80,7 +80,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
pages/weighingRecord/index.wxml

@@ -75,7 +75,7 @@
   </block>
   <block wx:else>
     <view>
-      <van-empty image="/images/loginNull.png">
+      <van-empty image="/images/loginNullTemp.png">
         <view slot="description" style="text-align: center;">
           <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
           <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 1 - 1
pages/workstand/index.wxml

@@ -57,7 +57,7 @@
   <block wx:else>
     <view class="width700">
       <view class="menuBox" style="margin-top: 500rpx;">
-        <van-empty image="/images/loginNull.png">
+        <van-empty image="/images/loginNullTemp.png">
           <view slot="description" style="text-align: center;">
             <text style="display:block;margin-bottom: 20rpx;">您还未登录,登录后查看更多~</text>
             <van-button type="info" bindtap="toLogin">立即登录</van-button>

+ 3 - 0
utils/api.js

@@ -50,6 +50,9 @@ const api = {
   'loadPointYY':'/biz/bizorderload/getPointList',//装卸点位下拉列表
   'loadTimeYY':'/biz/bizorderload/getLoadTimeList',//装卸时间列表
 
+  //砂石预约
+  'stoneAppointCancel':'/biz/bizappointmentrecord/cloudCancel',//司机取消预约
+
   //临时预约
   'tempAdd':'/biz/bizappointmentrecord/addTemp',//临时预约-新增
   'tempEdit':'/biz/bizappointmentrecord/editTemp',//临时预约-修改