pad-app/pages/shipWork/sign.vue

295 lines
7.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="sign">
<head-view title="单证签名" :url="backUrl"></head-view>
<view class="container contentFixed">
<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 class="sigh-btns">
<view class="btn qx" @click="handleCancel"></view>
<view class="btn qc" @click="handleReset"></view>
<view class="btn bc" @click="handleConfirm"></view>
</view>
</view>
</view>
</template>
<script>
import {
pathToBase64,
base64ToPath
} from '../../js_sdk/mmmm-image-tools/index.js'
import {
compressImgBySize
} from '@/common/compressImg'
import sqlite from "../../common/sqlite.js"
import api from "../../common/api.js"
import {
v4 as uuidv4
} from 'uuid';
var x = 20;
var y = 20;
var tempPoint = []; //用来存放当前画纸上的轨迹点
var id = 0;
var type = '';
let that;
let canvasw;
let canvash;
export default {
data() {
return {
ctx: '', //绘图图像
points: [], //路径点集合,
width: 0,
height: 0,
sginId: "",
signImgUrl: "",
nextUrl: "",
signType: "",
signTable: "",
backUrl: "",
tabsValue: 0,
vvyId: "",
};
},
onLoad(option) {
this.sginId = JSON.parse(decodeURIComponent(option.params)).id
this.nextUrl = JSON.parse(decodeURIComponent(option.params)).url
this.signType = JSON.parse(decodeURIComponent(option.params)).signType
this.signTable = JSON.parse(decodeURIComponent(option.params)).signTable
this.tabsValue = JSON.parse(decodeURIComponent(option.params)).tabsValue
this.vvyId = JSON.parse(decodeURIComponent(option.params)).vvyId
this.backUrl = `/pages/shipWork/${this.nextUrl}`
this.vtpId = uni.getStorageSync('vtpId')
that = this;
id = option.id;
type = option.type;
this.ctx = uni.createCanvasContext('mycanvas', this); //创建绘图对象
//设置画笔样式
this.ctx.lineWidth = 4;
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;
}
});
},
methods: {
//触摸开始,获取到起点
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() {
that.ctx.clearRect(0, 0, that.width, that.height);
that.ctx.draw(true);
tempPoint = [];
},
//将签名笔迹上传到服务器,并将返回来的地址存到本地
handleConfirm: function() {
that = this
if (tempPoint.length == 0) {
uni.showToast({
title: '请先签名',
icon: 'none',
duration: 2000
});
return;
} else {
let signId = that.sginId
uni.canvasToTempFilePath({
canvasId: 'mycanvas',
success: function(res) {
setTimeout(function() {
pathToBase64(res.tempFilePath)
.then(base64 => {
compressImgBySize(base64, 1200).then(baseImg => {
// 输出图片base64
that.signImgUrl = baseImg
let date = new Date().getTime()
let webId = uuidv4()
let webDate = api.getDate(date)
// 供给签名,系解揽签名,指导员作业布置签名
if(that.nextUrl == 'untieSign' || that.nextUrl == 'supplySign' || that.nextUrl == 'workAssignSign') {
let sql2 = `DELETE FROM workSignTable WHERE bizId = '${signId}';`
sqlite.executeSqlCeshi(sql2).then(() => {
console.log('------');
}).catch((error) => {
// 在reject时执行的回调函数
console.error(error);
});
}
// 去除签名 -
if(that.nextUrl == 'mixSign') {
signId = signId.split('-')
signId = signId[0] + signId[1] + signId[2]
}
let sql =
`insert into workSignTable values('${webId}','${that.vtpId}','${signId}','${that.signImgUrl}','${that.signTable}','${that.signType}','${that.vvyId}','${webDate}')`
sqlite.executeSqlCeshi(sql).then((
value) => {
// 在resolve时执行的回调函数
let obj = {
tabsValue: that
.tabsValue,
}
const params =
encodeURIComponent(JSON
.stringify(obj));
uni.navigateTo({
url: `/pages/shipWork/${that.nextUrl}?params=${params}`
})
}).catch((error) => {
// 在reject时执行的回调函数
console.error(error);
});
})
})
.catch(error => {
console.error(error)
})
}, 1000)
}
});
}
},
}
};
</script>
<style lang="scss" scoped>
page {
background-color: #fff;
}
.container {
height: calc(100vh - 68px);
padding-bottom: 30px;
background-color: #fff;
}
.sign-box {
width: 100%;
height: 90%;
margin-left: 10%;
display: flex;
flex-direction: column;
text-align: center;
}
.sign-view {
height: 100%;
}
.sigh-btns {
display: flex;
justify-content: center;
width: 100%;
height: 80px;
background: #FFFFFF;
box-shadow: 0 -3px 7px 0 rgba(0, 0, 0, 0.10);
position: fixed;
bottom: 0;
}
.btn {
margin: 15.5px 17px;
width: 200px;
height: 49px;
border-radius: 2px;
font-size: 18px;
text-align: center;
line-height: 49px;
}
.qx {
background-color: #eee;
}
.qc {
color: #0067CF;
background-color: rgba(0, 103, 207, 0.10);
}
.bc {
color: #fff;
background: #0067CF;
}
.mycanvas {
margin: auto 0rpx;
background-color: #fbfbfb;
border: 1px dashed #eee;
}
.canvsborder {
border: 1rpx solid #333;
position: fixed;
top: 0;
left: 10000rpx;
}
</style>