master
xy 1 year ago
parent bcfdfbb7b9
commit 1668d804e1

@ -1,5 +1,5 @@
// const mode = process.env.NODE_ENV; const mode = process.env.NODE_ENV;
const mode = 'development'; //const mode = 'development';
let ROOTPATH = ''; //域名 let ROOTPATH = ''; //域名
switch (mode) { switch (mode) {
case 'development': case 'development':

@ -98,3 +98,74 @@ export const base64ToFile = (dataurl, filename = 'file') => {
}) })
} }
export const writeFile = (base64Str) => new Promise((resolve, reject) => {
// 后台返回的base64格式数据的回车换行换为空字符''
const base64Image = base64Str.split(',')[1].replace(/[\r\n]/g, '')
// 文件管理器
const fsm = uni.getFileSystemManager()
// 文件名
const FILE_BASE_NAME = 'tmp_base64src'
// 文件后缀
const format = 'png'
// 获取当前时间戳用于区分小程序码防止多次写进的小程序码图片都一样建议通过不同的列表ID来区分不同的小程序码
const timestamp = (new Date()).getTime()
// base转二进制
const buffer = uni.base64ToArrayBuffer(base64Image)
// 文件名
const filePath = `${wx.env.USER_DATA_PATH}/${timestamp}share.${format}`
// 写文件
fsm.writeFile({
filePath,
data: buffer,
encoding: 'binary',
success () {
// 读取图片
uni.getImageInfo({
src: filePath,
success (res) {
const img = res.path
// 把需要画出来的图片的临时url暴露出去
resolve(img)
reject()
},
fail (e) {
console.log('读取图片报错')
console.log(e)
},
error (res) {
console.log(res)
}
})
},
fail (e) {
console.log(e)
}
})
}).catch((e) => {
console.log(e)
})
// 删除存储的垃圾数据
export const removeSave = () => new Promise((resolve) => {
// 文件管理器
const fsm = uni.getFileSystemManager()
// 获取文件列表
fsm.readdir({
dirPath: wx.env.USER_DATA_PATH, // 当时写入的文件夹
success (res) {
res.files.forEach((el) => { // 遍历文件列表里的数据
// 删除存储的垃圾数据
if (el !== 'miniprogramLog') { // 过滤掉miniprogramLog
fsm.unlink({
filePath: `${wx.env.USER_DATA_PATH}/${el}`, // 文件夹也要加上,如果直接文件名会无法找到这个文件
fail (e) {
console.log('readdir文件删除失败', e)
}
})
}
})
resolve()
}
})
})

@ -48,7 +48,7 @@
<u-form-item label="所在位置"> <u-form-item label="所在位置">
<view> <view>
<u-button type="primary" size="mini" :throttle-time="3000" @click="getLoaction"></u-button> <u-button type="primary" size="mini" :throttle-time="3000" @click="getLoaction"></u-button>
<view> <view style="word-break: break-all;">
{{ `${(form.lng || form.lat) ? ('(' + form.lng + ',' + form.lat + ')') : ''}${form.address}` }} {{ `${(form.lng || form.lat) ? ('(' + form.lng + ',' + form.lat + ')') : ''}${form.address}` }}
</view> </view>
</view> </view>

@ -25,7 +25,7 @@
<u-form-item label="所在位置"> <u-form-item label="所在位置">
<view> <view>
<u-button type="primary" size="mini" :throttle-time="3000" @click="getLoaction"></u-button> <u-button type="primary" size="mini" :throttle-time="3000" @click="getLoaction"></u-button>
<view> <view style="word-break: break-all;">
{{ `${(form.lng || form.lat) ? ('(' + form.lng + ',' + form.lat + ')') : ''}${form.address}` }} {{ `${(form.lng || form.lat) ? ('(' + form.lng + ',' + form.lat + ')') : ''}${form.address}` }}
</view> </view>
</view> </view>

@ -83,25 +83,25 @@
<u-form-item label="服务对象/家属签名" required prop="sign_image_id"> <u-form-item label="服务对象/家属签名" required prop="sign_image_id">
<view> <view>
<u-button type="primary" size="mini" :throttle-time="3000" @click="pageTo('/pages/sign/sign?key=vuex_sign_image')"></u-button> <u-button type="primary" size="mini" :throttle-time="3000" @click="pageTo('/pages/sign/sign?key=vuex_sign_image')"></u-button>
<image v-if="vuex_sign_image" <image v-if="vuex_sign_image || (detail.sign_image && detail.sign_image.url)"
:src="vuex_sign_image" :src="vuex_sign_image || (detail.sign_image && detail.sign_image.url)"
style="height: 260rpx;object-fit: cover" style="width: 260rpx;object-fit: cover;transform: rotate(270deg);"
@click="showimg(vuex_sign_image)"></image> @click="showimg(vuex_sign_image || (detail.sign_image && detail.sign_image.url))"></image>
</view> </view>
</u-form-item> </u-form-item>
<u-form-item label="调查人员签名" required prop="admin_sign_image_id"> <u-form-item label="调查人员签名" required prop="admin_sign_image_id">
<view> <view>
<u-button type="primary" size="mini" :throttle-time="3000" @click="pageTo('/pages/sign/sign?key=vuex_admin_sign_image')"></u-button> <u-button type="primary" size="mini" :throttle-time="3000" @click="pageTo('/pages/sign/sign?key=vuex_admin_sign_image')"></u-button>
<image v-if="vuex_admin_sign_image" <image v-if="vuex_admin_sign_image || (detail.admin_sign_image && detail.admin_sign_image.url)"
:src="vuex_admin_sign_image" :src="vuex_admin_sign_image || (detail.admin_sign_image && detail.admin_sign_image.url)"
style="height: 260rpx;object-fit: cover" style="width: 260rpx;object-fit: cover;transform: rotate(270deg);"
@click="showimg(vuex_admin_sign_image)"></image> @click="showimg(vuex_admin_sign_image || (detail.admin_sign_image && detail.admin_sign_image.url))"></image>
</view> </view>
</u-form-item> </u-form-item>
<u-form-item label="所在位置"> <u-form-item label="所在位置">
<view> <view>
<u-button type="primary" size="mini" :throttle-time="3000" @click="getLoaction"></u-button> <u-button type="primary" size="mini" :throttle-time="3000" @click="getLoaction"></u-button>
<view> <view style="word-break: break-all;">
{{ `${(form.lng || form.lat) ? ('(' + form.lng + ',' + form.lat + ')') : ''}${form.address}` }} {{ `${(form.lng || form.lat) ? ('(' + form.lng + ',' + form.lat + ')') : ''}${form.address}` }}
</view> </view>
</view> </view>
@ -124,6 +124,7 @@ export default {
fileList: [], fileList: [],
id: "", id: "",
type: "add", type: "add",
detail: {},
form: { form: {
customer_id: "", customer_id: "",
satisfy: 1, satisfy: 1,
@ -147,10 +148,10 @@ export default {
sign_image_id: [ sign_image_id: [
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (!this.vuex_sign_image) { if (this.vuex_sign_image || value) {
callback(new Error('请签名'))
} else {
callback() callback()
} else {
callback(new Error('请签名'))
} }
} }
} }
@ -158,10 +159,10 @@ export default {
admin_sign_image_id: [ admin_sign_image_id: [
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (!this.vuex_admin_sign_image) { if (this.vuex_admin_sign_image || value) {
callback(new Error('请签名'))
} else {
callback() callback()
} else {
callback(new Error('请签名'))
} }
} }
} }
@ -357,56 +358,68 @@ export default {
submit () { submit () {
const uploadSignImage = () => { const uploadSignImage = () => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
uni.uploadFile({ if (this.vuex_sign_image) {
url: `${ROOTPATH}/api/admin/upload-file`, uni.uploadFile({
header: { url: `${ROOTPATH}/api/admin/upload-file`,
Authorization: `Bearer ${this.vuex_token}` header: {
}, Authorization: `Bearer ${this.vuex_token}`
filePath: this.vuex_sign_image, },
name: 'file', filePath: this.vuex_sign_image,
success: (res) => { name: 'file',
if (res.statusCode === 200) { success: (res) => {
const response = JSON.parse(res.data) if (res.statusCode === 200) {
resolve(response) const response = JSON.parse(res.data)
} else { resolve(response)
reject(res.data) } else {
reject(res.data)
}
},
fail: (err) => {
reject(err)
} }
}, })
fail: (err) => { } else {
reject(err) resolve()
} }
})
}) })
} }
const uploadAdminSignImage = () => { const uploadAdminSignImage = () => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
uni.uploadFile({ if (this.vuex_admin_sign_image) {
url: `${ROOTPATH}/api/admin/upload-file`, uni.uploadFile({
header: { url: `${ROOTPATH}/api/admin/upload-file`,
Authorization: `Bearer ${this.vuex_token}` header: {
}, Authorization: `Bearer ${this.vuex_token}`
filePath: this.vuex_admin_sign_image, },
name: 'file', filePath: this.vuex_admin_sign_image,
success: (res) => { name: 'file',
if (res.statusCode === 200) { success: (res) => {
const response = JSON.parse(res.data) if (res.statusCode === 200) {
resolve(response) const response = JSON.parse(res.data)
} else { resolve(response)
reject(res.data) } else {
reject(res.data)
}
},
fail: (err) => {
reject(err)
} }
}, })
fail: (err) => { } else {
reject(err) resolve()
} }
})
}) })
} }
this.$refs.uForm.validate(valid => { this.$refs.uForm.validate(valid => {
if (valid) { if (valid) {
Promise.all([uploadSignImage(),uploadAdminSignImage()]).then(res => { Promise.all([uploadSignImage(),uploadAdminSignImage()]).then(res => {
console.log(res) console.log(res)
this.form.sign_image_id = res[0].id if (res[0]?.id) {
this.form.admin_sign_image_id = res[1].id this.form.sign_image_id = res[0].id
}
if (res[1]?.id) {
this.form.admin_sign_image_id = res[1].id
}
this.form.file_ids = this.$refs.uUpload.lists.filter(i => i.progress === 100).map(i => i.response?.id) this.form.file_ids = this.$refs.uUpload.lists.filter(i => i.progress === 100).map(i => i.response?.id)
if (this.type === 'add') { if (this.type === 'add') {
delete this.form.id delete this.form.id
@ -435,6 +448,7 @@ export default {
async getDetail () { async getDetail () {
const res = await this.$u.api.adminLongInsuranceDetail(this.id) const res = await this.$u.api.adminLongInsuranceDetail(this.id)
this.detail = res;
for (let key in this.form) { for (let key in this.form) {
this.form[key] = res[key] this.form[key] = res[key]
} }
@ -447,27 +461,24 @@ export default {
this.temp2 = /工作证/g.test(res.accessory) this.temp2 = /工作证/g.test(res.accessory)
let resTools = res.tools?.split('|')?.filter(i => i.trim()) let resTools = res.tools?.split('|')?.filter(i => i.trim())
this.tools.forEach(item => { this.tools.forEach(item => {
item.checked = res.tools.indexOf(item.name) !== -1 item.checked = res.tools?.indexOf(item.name) !== -1
}) })
this.otherTool.name = resTools.find(i => !this.tools.find(j => j.name === i)) this.otherTool.name = resTools?.find(i => !this.tools.find(j => j.name === i))
this.otherTool.checked = !!this.otherTool.name this.otherTool.checked = !!this.otherTool.name
//serve //serve
let resServes = res.serve?.split('|')?.filter(i => i.trim()) let resServes = res.serve?.split('|')?.filter(i => i.trim())
this.serves.forEach(item => { this.serves.forEach(item => {
item.checked = res.serve.indexOf(item.name) !== -1 item.checked = res.serve?.indexOf(item.name) !== -1
}) })
this.otherServe.name = resServes.find(i => !this.serves.find(j => j.name === i)) this.otherServe.name = resServes?.find(i => !this.serves.find(j => j.name === i))
this.otherServe.checked = !!this.otherServe.name this.otherServe.checked = !!this.otherServe.name
//other //other
let resOthers = res.other?.split('|')?.filter(i => i.trim()) let resOthers = res.other?.split('|')?.filter(i => i.trim())
this.others.forEach(item => { this.others.forEach(item => {
item.checked = res.other.indexOf(item.name) !== -1 item.checked = res.other?.indexOf(item.name) !== -1
}) })
this.otherOther.name = resOthers.find(i => !this.others.find(j => j.name === i)) this.otherOther.name = resOthers?.find(i => !this.others.find(j => j.name === i))
this.otherOther.checked = !!this.otherOther.name this.otherOther.checked = !!this.otherOther.name
this.$u.vuex('vuex_admin_sign_image', res.admin_sign_image?.url)
this.$u.vuex('vuex_sign_image', res.sign_image?.url)
} }
}, },
onLoad(option) { onLoad(option) {

@ -95,7 +95,7 @@
<view class="bottom-item__value"> <view class="bottom-item__value">
<u-image :width="300" <u-image :width="300"
:height="300" :height="300"
style="margin-bottom: 10rpx" style="margin-bottom: 10rpx;"
:border-radius="8" :border-radius="8"
v-for="img in detail.files" v-for="img in detail.files"
:key="img.id" :key="img.id"
@ -103,23 +103,23 @@
@click="showimg(img.url)"></u-image> @click="showimg(img.url)"></u-image>
</view> </view>
</view> </view>
<view class="bottom-item"> <view class="bottom-item sign">
<view class="bottom-item__title">服务对象/家属签名</view> <view class="bottom-item__title">服务对象/家属签名</view>
<view class="bottom-item__value"> <view class="bottom-item__value">
<u-image :width="300" <u-image :width="300"
:height="300" :height="300"
style="margin-bottom: 10rpx" style="margin-bottom: 10rpx;"
:border-radius="8" :border-radius="8"
:src="detail.sign_image ? detail.sign_image.url : ''" :src="detail.sign_image ? detail.sign_image.url : ''"
@click="showimg(detail.sign_image ? detail.sign_image.url : '')"></u-image> @click="showimg(detail.sign_image ? detail.sign_image.url : '')"></u-image>
</view> </view>
</view> </view>
<view class="bottom-item"> <view class="bottom-item sign">
<view class="bottom-item__title">调查人员签名</view> <view class="bottom-item__title">调查人员签名</view>
<view class="bottom-item__value"> <view class="bottom-item__value">
<u-image :width="300" <u-image :width="300"
:height="300" :height="300"
style="margin-bottom: 10rpx" style="margin-bottom: 10rpx;"
:border-radius="8" :border-radius="8"
:src="detail.admin_sign_image ? detail.admin_sign_image.url : ''" :src="detail.admin_sign_image ? detail.admin_sign_image.url : ''"
@click="showimg(detail.admin_sign_image ? detail.admin_sign_image.url : '')"></u-image> @click="showimg(detail.admin_sign_image ? detail.admin_sign_image.url : '')"></u-image>
@ -375,4 +375,8 @@ export default {
} }
} }
} }
.sign ::v-deep .u-image {
transform: rotate(270deg);
}
</style> </style>

@ -1,7 +1,7 @@
<template> <template>
<view class="sign"> <view class="sign">
<canvas canvas-id="sign-cnv" :style="{ height: cnv.height + 'px', width: cnv.width + 'px' }"></canvas> <canvas canvas-id="sign-cnv" :style="{ height: cnv.height + 'px', width: cnv.width + 'px' }"></canvas>
<image ref="resultImg" :src="src" alt="" @load="resultImgLoad"></image> <image class="hide-img" ref="resultImg" :src="src" alt="" @load="resultImgLoad"></image>
<view class="sign-bkg"> <view class="sign-bkg">
<view class="sign-bkg__word"> <view class="sign-bkg__word">
<span></span> <span></span>
@ -30,7 +30,7 @@
<script> <script>
import { import {
base64ToFile base64ToFile, writeFile
} from '@/common/util.js' } from '@/common/util.js'
import { import {
ROOTPATH ROOTPATH
@ -56,11 +56,11 @@ export default {
}, },
methods: { methods: {
resultImgLoad (e) { resultImgLoad (e) {
this.Img = e.detail; // this.Img = e.detail;
let rate = this.Img.width / this.Img.height; // let rate = this.Img.width / this.Img.height;
this.cnv.width = 300 / rate; // this.cnv.width = this.Img.height;
this.cnv.height = 300; // this.cnv.height = this.Img.width ;
this.rotateImage(this.src, 270) // this.rotateImage(this.src, 270)
}, },
pageBack () { pageBack () {
uni.navigateBack() uni.navigateBack()
@ -110,7 +110,15 @@ export default {
// app | H5 | base64 // app | H5 | base64
if (res.tempFilePath) { if (res.tempFilePath) {
//this.$u.vuex('vuex_sign_base64', res.tempFilePath) //this.$u.vuex('vuex_sign_base64', res.tempFilePath)
this.src = res.tempFilePath; writeFile(res.tempFilePath).then(url => {
// console.log(url)
// this.src = url
this.$u.vuex(this.saveKey, url)
setTimeout(() => {
this.pageBack()
}, 500)
})
// this.rotateBase64Img(res.tempFilePath, -90).then(res => { // this.rotateBase64Img(res.tempFilePath, -90).then(res => {
// this.$u.vuex(this.saveKey, res) // this.$u.vuex(this.saveKey, res)
// this.pageBack() // this.pageBack()
@ -132,6 +140,14 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.hide-img {
position: fixed;
width: 200px;
object-fit: contain;
top: 0;
left: 0;
z-index: 999999999;
}
@media screen and (orientation: portrait) { @media screen and (orientation: portrait) {
.sign { .sign {
height: 100vh; height: 100vh;

Loading…
Cancel
Save