detection-user/pages/contract/contract.vue
2024-09-01 18:16:43 +08:00

608 lines
16 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- 线上合同 -->
<template>
<view class="content">
<view class="authentication_top">
<image class="image3" style="width: 100%;margin-top: 50%;" v-if="PreviewContract" :src="contractImg" mode="widthFix"></image>
<!-- 创建合成画布 -->
<view class="bgCoverBox" v-if="publish"><canvas :style="{width:height +'px',height:width +'px'}" canvas-id="mycontract" class="canvsborder2"></canvas></view>
<!-- 创建合成画布 -->
</view>
<!-- <view class="authentication_bottom" v-if="NavAutograph" style="background:#ffe9e9" @click="agreeSign">
<button style="color:#f00">我已阅读上述内容,下一步>></button>
</view> -->
<view class="authentication_bottom" v-if="NavAutograph" style="background:#ffe9e9" @click="agreeSign">
<button style="color:#f00">我已阅读上述内容,下一步>></button>
</view>
<view class="authentication_fun" v-if="Navpreservation" style="background:#fff; ">
<button style="color:#fd972e;" @click="SigningCompleted">签署完成,去提交>></button>
</view>
<!-- 填写信息 -->
<view class="inforMation" v-if="Mation == true">
<view class="in-input" @click="show = true">
<view class="in-left">请选择车辆:</view>
<view class="in-right" >
<text>{{showtext}}</text>
</view>
</view>
<view class="in-box" >
<view class="in-input">
<view class="in-left">请选择人:</view>
<view class="in-right">
<input type="text" v-model="showtext1" @input="getcarlist" @blur="getcarlist" @confirm="getcarlist" placeholder="输入姓名/手机号">
</view>
</view>
<scroll-view class="l-bai" scroll-y="true">
<view class="renname" v-for="(item,index) in columns1" :key="index">
<view class="dix">
<view class="ming">{{item.nickname}}</view>
<view class="tel">{{item.mobile}}</view>
</view>
<view class="anniux" @click="getren(item.id,item.nickname)">
<text>选择</text>
</view>
</view>
<view class="lanzi" v-if="columns1" @click="jja">
<text>点击加载更多</text>
</view>
<view class="lanzi" v-else >
<text>暂无信息</text>
</view>
</scroll-view>
</view>
<view class="anniu" @click="getsignature()">
<text>下一步</text>
</view>
</view>
<!-- 签字弹窗 status -->
<view class="signMask" v-if="autographStatus">
<view class="sigh-btns">
<button class="btn" @tap="handleCancel">取消</button>
<button class="btn" @tap="handleReset">重写</button>
<button class="btn" @tap="handleConfirm">确认</button>
</view>
<view class="sign-box">
<canvas class="mycanvas" :style="{width:width +'px',height:height +'px'}" canvas-id="mycanvas"
@touchstart="touchstart" @touchmove="touchmove" @touchend="touchend"></canvas>
<canvas canvas-id="camCacnvs" :style="{width:height +'px',height:width +'px'}"
class="canvsborder"></canvas>
</view>
</view>
<u-picker :show="show" :columns="columns" keyName="carBrand" @confirm="confirm1" @cancel="close1"></u-picker>
<!-- 签字弹窗 end -->
</view>
</template>
<script>
import request from '../../utils/request'
import { getToken } from '@/utils/auth'
import config from '@/config'
var x = 20;
var y = 20;
var tempPoint = []; //用来存放当前画纸上的轨迹点
var id = 0;
var type = '';
let that;
let canvasw;
let canvash;
export default {
data() {
return {
status: 'loadmore',
searchValue:'',
wtr:'',
sfz:'',
position:'',
carNum:'',
phone:'',
cbgs:'',
kcyPhone:'',
lc:'',
rs:'',
sjqk:'',
jbr:'',
signImage:'',
Mation:false,
contractImg: '../../static/images/ppg.jpg', //合同路径
ctx: '', //绘图图像
points: [], //路径点集合,
width: 0,
height: 0,
autographStatus: false,
publish: false,
PreviewContract:true,
NavAutograph: true,
Navpreservation:false,
show: false,
showtext:'请选择',
columns: [],
show1: false,
showtext1:'',
columns1: null,
wtrId:'',
carnum:'',
pageSize:5,
pageNum:1,
}
},
onLoad(option) {
this.contractImg = 'http://www.nuoyunr.com/lananRsc/detection' + '/inspectionWts.png'
that = this;
id = option.id;
type = option.type;
this.ctx = uni.createCanvasContext('mycanvas', this); //创建绘图对象
//设置画笔样式
this.ctx.lineWidth = 20;
this.ctx.lineCap = 'round';
this.ctx.lineJoin = 'round';
uni.getSystemInfo({
success: function(res) {
that.width = res.windowWidth * 0.8;
that.height = res.windowHeight * 0.85;
}
});
},
onShow() {
const t = this;
this.getcarlist()
uni.getStorage({
key: 'autograph_key',
success: function (res) {
if( res.data !== '' ){
t.contractImg = res.data
t.PreviewContract = true;
t.publish = false;
t.NavAutograph = false
}
}
});
},
methods: {
jja(){
let that = this
this.pageSize ++
that.getcarlist()
console.log(this.pageSize);
},
async getcarlist(){
let resc = await request({
url: '/appInspection/userOwn/getCars',
method: 'get',
})
console.log(resc);
this.columns.push(resc.data)
let data = {
searchValue:this.showtext1,
pageNum: this.pageNum,//第几页
pageSize: this.pageSize,//一页多少张
}
let res = await request({
url: '/appInspection/userOwn/getDbList',
method: 'get',
params: data
})
console.log(res);
this.columns1 = res.rows
},
close1(){
this.show = false
},
confirm1(e){
this.showtext = e.value[0].carBrand
this.carnum = e.value[0].carNo
console.log(e);
this.show = false
},
close2(){
this.show1 = false
},
confirm2(e){
this.showtext1 = e.value[0].nickname
this.wtrId = e.value[0].id
console.log(e);
this.show1 = false
},
getren(ids,names){
this.showtext1 = names
this.wtrId = ids
},
agreeSign() {
this.Mation = true
},
getsignature(){
if(this.wtrId == '' || this.carnum == ''){
uni.showToast({
title:'以上均为必填!!!',
icon:'none'
})
return
}
this.autographStatus = true;
},
//触摸开始,获取到起点
touchstart: function(e) {
let startX = e.changedTouches[0].x;
let startY = e.changedTouches[0].y;
let startPoint = {
X: startX,
Y: startY
};
/* **************************************************
#由于uni对canvas的实现有所不同这里需要把起点存起来
* **************************************************/
this.points.push(startPoint);
//每次触摸开始,开启新的路径
this.ctx.beginPath();
},
//触摸移动,获取到路径点
touchmove: function(e) {
let moveX = e.changedTouches[0].x;
let moveY = e.changedTouches[0].y;
let movePoint = {
X: moveX,
Y: moveY
};
this.points.push(movePoint); //存点
let len = this.points.length;
if (len >= 2) {
this.draw(); //绘制路径
}
tempPoint.push(movePoint);
},
// 触摸结束,将未绘制的点清空防止对后续路径产生干扰
touchend: function() {
this.points = [];
},
/* ***********************************************
# 绘制笔迹
# 1.为保证笔迹实时显示,必须在移动的同时绘制笔迹
# 2.为保证笔迹连续每次从路径集合中区两个点作为起点moveTo和终点(lineTo)
# 3.将上一次的终点作为下一次绘制的起点(即清除第一个点)
************************************************ */
draw: function() {
let point1 = this.points[0];
let point2 = this.points[1];
this.points.shift();
this.ctx.moveTo(point1.X, point1.Y);
this.ctx.lineTo(point2.X, point2.Y);
this.ctx.stroke();
this.ctx.draw(true);
},
handleCancel() {
uni.navigateBack({
delta: 1
});
},
//清空画布
handleReset: function() {
console.log('handleReset');
that.ctx.clearRect(0, 0, that.width, that.height);
that.ctx.draw(true);
tempPoint = [];
},
//将签名笔迹上传到服务器,并将返回来的地址存到本地
async handleConfirm() {
const t = this;
if (tempPoint.length == 0) {
uni.showToast({
title: '请先签名',
icon: 'none',
duration: 2000
});
return;
}
uni.showLoading({
title: '生成中'
});
uni.canvasToTempFilePath({
canvasId: 'mycanvas',
success: function(res) {
console.log('点击确认返回',res);
// t.objectURLToBlob(res)
let tempPath = res.tempFilePath;
const ctx = uni.createCanvasContext('camCacnvs', that);
ctx.translate(0, that.width);
ctx.rotate((270 * Math.PI) / 180);
ctx.drawImage(tempPath, 0, 0, that.width, that.height);
ctx.draw();
t.urlTobase64(res.tempFilePath)
}
});
uni.hideLoading();
// 请求上传
},
async shangchuang(imgs){
uni.showLoading({
title: '加载中'
});
const resx = await request({
method:'post',
url:'/system/history/jcWts',
data:{
wtrId:this.wtrId,
carnum:this.carnum,
signImage:imgs
}
})
console.log('成功',resx);
if(resx.code == 200){
uni.hideLoading();
uni.showToast({
title:'提交成功',
icon:'none',
duration: 2000
})
setTimeout(() => {
uni.navigateBack()
}, 2000);
}
if(resx.code != 200){
uni.hideLoading();
uni.showToast({
title:'网络不佳 请稍后在试'+resx.code,
icon:'none',
duration: 2000
})
setTimeout(() => {
uni.navigateBack()
}, 2000);
}
},
urlTobase64(url) {
uni.getFileSystemManager().readFile({
filePath:url,
encoding:'base64',
success:res=>{
let base64 = 'data:image/jpeg;base64,' + res.data; //不加上这串字符,在页面无法显示
console.log(base64,"base64")
this.shangchuang(base64)
// upFile({
// 'base64': base64
// }).then(res2 => {
// console.log(res2.data.url, "res2res2res2res2")
// })
}
})
},
objectURLToBlob(url) {
// console.log(url.tempFilePath,'121212')
uni.request({
url: url.tempFilePath,
method: "GET",
responseType: "arraybuffer",
success: (ress) => {
console.log(ress);
const base64 = uni.arrayBufferToBase64(ress.data)
// console.log('data:image/png;base64,'+ base64,'signFile')
let imgs ='data:image/png;base64,'+ base64
console.log('转换base格式后',imgs);
// this.shangchuang(imgs)
// upFile({
// 'base64': imgs
// }).then(res2 => {
// console.log(res2, "res2res2res2res2")
// })
// //
},
fail: (res) => {
console.log(res)
}
});
},
preservationImg(){
const t = this;
uni.downloadFile({
url: t.contractImg,
success: res => {
if (res.statusCode == 200) {
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: function() {
uni.showToast({
title: '保存成功',
icon: 'none',
duration: 2000
});
},
fail: function() {
uni.showToast({
title: '保存失败',
icon: 'none',
duration: 2000
});
}
});
} else {
uni.showToast({
title: '第三方网络错误',
icon: 'none',
duration: 2000
});
}
}
});
},
SigningCompleted(){
uni.showToast({
title:'您发起了提交',
icon:'none'
})
const t = this;
let ImgType = t.contractImg.split(".")
uni.getFileSystemManager().readFile({
filePath: t.contractImg,
encoding: 'base64',
success: async(res) =>{
t.contractImg = 'data:image/png;base64,' + res.data;
uni.showLoading ({
title: '提交中',
});
console.log(res.data)
return
const result = await t.$req("/user/upload/img",{
uid: t.user.uid,
type: ImgType[1],
img: res.data,
place: 'sign',
})
let rd = result.data
// console.log(rd)
if(rd.code == 0){
let data = rd.data
t.contractImg = data.url;
uni.hideLoading();
uni.setStorage({
key: 'autograph_key',
data: t.contractImg,
success: function () {
console.log("签字",'success');
}
});
uni.navigateBack({ delta: 1 }); // 返回上一页
}
}
})
},
ReSign:function(){
// console.log(this.ctx)
this.autographStatus = true
}
}
}
</script>
<style>
.lanzi{
margin-top:20px ;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
font-weight: 400;
color: #0D2E8D;
}
.l-bai{
width: 100%;
height: 220px;
box-sizing: border-box;
padding: 15px;
background: #FFFFFF;
border-radius: 5px;
white-space: nowrap;
overflow: hidden;
}
.ming{
font-size: 16px;
font-weight: 400;
color: #333333;
margin-right: 10px;
}
.tel{
font-size: 16px;
font-weight: 400;
color: #999999;
}
.renname{
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 10px;
}
.dix{
display: flex;
align-items: center;
}
.anniux{
width: 55px;
height: 25px;
display: flex;
align-items: center;
justify-content: center;
color: white;
background: #0D2E8D;
border-radius: 50px;
font-size: 15px;
}
.image3 {
}
.in-box{
background-color: white;
width: 100%;
border-bottom: 1px solid #E8E8E8;
box-sizing: border-box;
}
.anniu{ width: 95%; height: 40px; margin: 0 auto; border-radius: 50px; display: flex; justify-content: center; align-items: center; color: #333333;
background: #0D2E8D; margin-top: 10px; color: white;}
.inforMation{width:100%; height: 100%; box-sizing: border-box; padding-top: 88px; background:#F6F6F6;position:fixed;top:0;left:0;right:0;
box-sizing: border-box; }
.in-input{background-color: white; width: 100%;border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between;
align-items: center; box-sizing: border-box;padding: 20px;}
.in-left{font-size: 16px;font-weight: bold;color: #333333;}
.in-right{font-size: 16px;font-weight: 400;color: #C2C2C2; text-align: right;}
.authentication_top{width:100%;height:90%;position:fixed;top:0;left:0;right:0;margin:auto;overflow-y:scroll;padding-bottom:40rpx}
.authentication_top image{width:100%;display:inline-block}
.authentication_bottom{width:100%;height:10%;position:fixed;bottom:0;left:0;right:0;margin:auto;display:flex;flex-direction:column;justify-content:center;align-items:center;background:#ffe9e9}
.authentication_bottom button{background:0 0;border:none;font-size:15px;color:red;width:100%;text-align:center}
.authentication_bottom button:after{display:none}
.authentication_fun{width:100%;height:10%;position:fixed;bottom:30rpx;left:0;right:0;margin:auto;display:flex;flex-direction:row;justify-content:center;align-items:center;background:#ffe9e9;padding:0 3%;width:90%;border-radius:50px;box-shadow:0 3px 13px rgba(0,0,0,.2);border:4px solid #fd972e;box-sizing:border-box}
.authentication_fun button{border:none;font-size:15px;background:0 0;width:100%;text-align:center}
.authentication_fun button:after{display:none}
.signMask{width:100%;height:100%;background:#fff;position:fixed;top:0;bottom:0;left:0;right:0;flex-direction:row}
.sign-box,.signMask{margin:auto;display:flex}
.sign-box{width:80%;height:90%;flex-direction:column;text-align:center}
.sigh-btns,.sign-view{height:100%}
.sigh-btns{margin:auto;display:flex;flex-direction:column;justify-content:space-around}
.btn{margin:auto;padding:8rpx 40rpx;font-size:14px;transform:rotate(90deg);border:1rpx solid grey}
.mycanvas{margin:auto 0rpx;background-color:#ececec}
.canvsborder{border:1rpx solid #333;position:fixed;top:0;left:10000rpx}
.bgCoverBox{width:100%;height:auto}
.canvsborder2{height:700px!important}
</style>