| @@ -51,3 +51,12 @@ export function generateContractorCode(params) { | |||
| params: params | |||
| }); | |||
| } | |||
| // 承包方调查签字 | |||
| export function contractorSignature(data) { | |||
| return request({ | |||
| url: '/service/cbf/surveySign', | |||
| method: 'post', | |||
| data: data | |||
| }); | |||
| } | |||
| @@ -26,3 +26,12 @@ export function updateFbf(data) { | |||
| data: data | |||
| }) | |||
| } | |||
| // 发包方调查签字 | |||
| export function manualSignature(data) { | |||
| return request({ | |||
| url: '/service/fbf/surveySign', | |||
| method: 'post', | |||
| data: data | |||
| }); | |||
| } | |||
| @@ -3,24 +3,128 @@ | |||
| <van-nav-bar left-arrow fixed placeholder @click-left="goBack"> | |||
| <template #title> | |||
| <div class="tb_main"> | |||
| {{ contractorName }}<p><span class="tb">签字完成</span><span class="tb">异常挂起</span></p> | |||
| {{ contractorName }}<p><span class="tb" @click="handleSign">签字完成</span><span class="tb">异常挂起</span></p> | |||
| </div> | |||
| </template> | |||
| </van-nav-bar> | |||
| <van-popup v-model="showSignPopup" closeable position="right" :style="{ height: '100%' }" > | |||
| <van-cell-group style="width: 100%;height:100%;overflow: hidden;padding-top: 10px;padding-bottom: 10px;"> | |||
| <div class="signature-box" @mousedown="canvasTTdown" @touchstart="canvasTTdown"> | |||
| <vue-esign | |||
| ref="esign" | |||
| class="mySign" | |||
| :width="500" | |||
| :height="height" | |||
| :isCrop="signature.isCrop" | |||
| :lineWidth="signature.lineWidth" | |||
| :lineColor="signature.lineColor" | |||
| :bgColor.sync="signature.bgColor" | |||
| /> | |||
| </div> | |||
| <img src="../../../../assets/images/sunVillage_info/signature_icon_10.png" id="canvasTT" style="position:absolute;top: 50%;left: 50%;transform: translate(-50%,-50%)" alt=""> | |||
| <div class="signature-footer"> | |||
| <van-button @click="handleReset" class="clearBtn" type="info" plain size="small">清空画板</van-button> | |||
| <van-button @click="handleGenerate" type="info" size="small">保存签字</van-button> | |||
| </div> | |||
| </van-cell-group> | |||
| </van-popup> | |||
| </div> | |||
| </template> | |||
| <script> | |||
| import { getDept } from "@/api/contracted"; | |||
| import { contractorSignature } from "@/api/contracted/cbf"; | |||
| import vueEsign from "vue-esign"; | |||
| import $ from "jquery"; | |||
| export default { | |||
| name: 'contractedVillageHeader', | |||
| props: ['deptId', 'contractorCode', 'contractorName', 'surveyStatus'], | |||
| components: { | |||
| vueEsign | |||
| }, | |||
| data() { | |||
| return { | |||
| // 控制签字面板的显示和隐藏 | |||
| showSignPopup: false, | |||
| height: null, | |||
| //电子签名 | |||
| signature: { | |||
| lineWidth: 6, // 画笔的线条粗细 | |||
| lineColor: "#000000", // 画笔的颜色 | |||
| bgColor: "", // 画布的背景颜色 | |||
| resultImg: "", // 最终画布生成的base64图片 | |||
| isCrop: false, // 是否裁剪,在画布设定尺寸基础上裁掉四周空白部分 | |||
| }, | |||
| }; | |||
| }, | |||
| created() { | |||
| this.height = window.screen.height * 1.28 - 20; | |||
| }, | |||
| methods: { | |||
| goBack() { | |||
| getDept(this.deptId).then(response => { | |||
| this.$router.push({path:'/contracted/village/contractor', query: { deptId: this.deptId, deptName: response.data.deptName }}); | |||
| }); | |||
| } | |||
| }, | |||
| handleSign() { | |||
| this.showSignPopup = true; | |||
| this.handleReset(); | |||
| }, | |||
| canvasTTdown() { | |||
| $('#canvasTT').css('display', 'none'); | |||
| }, | |||
| // 清空画板 | |||
| handleReset() { | |||
| if (this.$refs.esign) { | |||
| this.$refs.esign.reset(); | |||
| } | |||
| $('#canvasTT').css('display', 'block') | |||
| }, | |||
| // 生成签字图片 | |||
| handleGenerate() { | |||
| this.$refs.esign | |||
| .generate() // 使用生成器调用把签字的图片转换成为base64图片格式 | |||
| .then((res) => { | |||
| this.signature.resultImg = res; | |||
| let wj = this.dataURLtoBlob(res); | |||
| let param = new FormData() // 创建form对象 | |||
| param.append('file', wj) // 通过append向form对象添加数据 | |||
| param.append('cbfbm', this.contractorCode); | |||
| contractorSignature(param).then(response => { | |||
| if (response.code === 200) { | |||
| this.$toast({ | |||
| icon: 'success', // 找到自己需要的图标 | |||
| message: '签字成功', | |||
| duration: "1000", | |||
| onClose: () => { | |||
| this.showSignPopup = false; | |||
| this.goBack(); | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| }) | |||
| .catch((err) => { | |||
| // 画布没有签字时会执行这里提示一下 | |||
| this.$toast.fail('请签名后再保存签字'); | |||
| }); | |||
| }, | |||
| dataURLtoBlob(dataurl, filename = 'file') { | |||
| let arr = dataurl.split(',') | |||
| let mime = arr[0].match(/:(.*?);/)[1] | |||
| let suffix = mime.split('/')[1] | |||
| let bstr = atob(arr[1]) | |||
| let n = bstr.length | |||
| let u8arr = new Uint8Array(n) | |||
| while (n--) { | |||
| u8arr[n] = bstr.charCodeAt(n) | |||
| } | |||
| return new File([u8arr], `${filename}.${suffix}`, { | |||
| type: mime | |||
| }) | |||
| }, | |||
| } | |||
| } | |||
| </script> | |||
| @@ -43,4 +147,25 @@ | |||
| border-radius: 50PX; | |||
| margin-right: 5PX; | |||
| } | |||
| .signature-box { | |||
| border: 1px dashed #666; | |||
| margin: 2px 20px; | |||
| height: 100%; | |||
| /*canvas{*/ | |||
| /* height: 100%!important;*/ | |||
| /*}*/ | |||
| } | |||
| .signature-footer { | |||
| transform: rotate(90deg); | |||
| width: auto; | |||
| position: absolute; | |||
| top: 50%; | |||
| left: 0PX; | |||
| .clearBtn { | |||
| margin-left: 15px; | |||
| } | |||
| } | |||
| </style> | |||
| @@ -52,19 +52,45 @@ | |||
| </van-form> | |||
| <div class="btn_main"> | |||
| <p class="btn" @click="submitForm">保存</p> | |||
| <p class="btn1">签字</p> | |||
| <p class="btn1" @click="handleSign">签字</p> | |||
| </div> | |||
| </div> | |||
| <van-popup v-model="showSignPopup" closeable position="right" :style="{ height: '100%' }" > | |||
| <van-cell-group style="width: 100%;height:100%;overflow: hidden;padding-top: 10px;padding-bottom: 10px;"> | |||
| <div class="signature-box" @mousedown="canvasTTdown" @touchstart="canvasTTdown"> | |||
| <vue-esign | |||
| ref="esign" | |||
| class="mySign" | |||
| :width="500" | |||
| :height="height" | |||
| :isCrop="signature.isCrop" | |||
| :lineWidth="signature.lineWidth" | |||
| :lineColor="signature.lineColor" | |||
| :bgColor.sync="signature.bgColor" | |||
| /> | |||
| </div> | |||
| <img src="../../../../assets/images/sunVillage_info/signature_icon_10.png" id="canvasTT" style="position:absolute;top: 50%;left: 50%;transform: translate(-50%,-50%)" alt=""> | |||
| <div class="signature-footer"> | |||
| <van-button @click="handleReset" class="clearBtn" type="info" plain size="small">清空画板</van-button> | |||
| <van-button @click="handleGenerate" type="info" size="small">保存签字</van-button> | |||
| </div> | |||
| </van-cell-group> | |||
| </van-popup> | |||
| </div> | |||
| </template> | |||
| <script> | |||
| import Cookies from "js-cookie"; | |||
| import { listFbf, addFbf, updateFbf } from "@/api/contracted/fbf"; | |||
| import { listFbf, addFbf, updateFbf, manualSignature } from "@/api/contracted/fbf"; | |||
| import vueEsign from "vue-esign"; | |||
| import $ from "jquery"; | |||
| export default { | |||
| name: "contractedVillageContractor", | |||
| components: { | |||
| vueEsign | |||
| }, | |||
| data() { | |||
| return { | |||
| form: {}, // 发包方信息表单 | |||
| @@ -72,9 +98,22 @@ | |||
| credentialTypeOptions: [], // 证件类型字典 | |||
| credentialTypeText: null, // 证件类型标签名 | |||
| showCredentialType: false, // 控制证件类型字典弹出层的显示和隐藏 | |||
| // 控制签字面板的显示和隐藏 | |||
| showSignPopup: false, | |||
| height: null, | |||
| //电子签名 | |||
| signature: { | |||
| lineWidth: 6, // 画笔的线条粗细 | |||
| lineColor: "#000000", // 画笔的颜色 | |||
| bgColor: "", // 画布的背景颜色 | |||
| resultImg: "", // 最终画布生成的base64图片 | |||
| isCrop: false, // 是否裁剪,在画布设定尺寸基础上裁掉四周空白部分 | |||
| }, | |||
| }; | |||
| }, | |||
| created() { | |||
| this.height = window.screen.height * 1.28 - 20; | |||
| this.getDicts("cert_type").then(response => { | |||
| this.credentialTypeOptions = response.data; | |||
| }); | |||
| @@ -145,7 +184,64 @@ | |||
| fbfdcjs: null, | |||
| fbfdcqz: null | |||
| } | |||
| } | |||
| }, | |||
| handleSign() { | |||
| this.showSignPopup = true; | |||
| this.handleReset(); | |||
| }, | |||
| canvasTTdown() { | |||
| $('#canvasTT').css('display', 'none'); | |||
| }, | |||
| // 清空画板 | |||
| handleReset() { | |||
| if (this.$refs.esign) { | |||
| this.$refs.esign.reset(); | |||
| } | |||
| $('#canvasTT').css('display', 'block') | |||
| }, | |||
| // 生成签字图片 | |||
| handleGenerate() { | |||
| this.$refs.esign | |||
| .generate() // 使用生成器调用把签字的图片转换成为base64图片格式 | |||
| .then((res) => { | |||
| this.signature.resultImg = res; | |||
| let wj = this.dataURLtoBlob(res); | |||
| let param = new FormData(); // 创建form对象 | |||
| param.append('file', wj); // 通过append向form对象添加数据 | |||
| param.append('deptId', this.$route.query.deptId); | |||
| manualSignature(param).then(response => { | |||
| if (response.code === 200) { | |||
| this.$toast({ | |||
| icon: 'success', // 找到自己需要的图标 | |||
| message: '签字成功', | |||
| duration: "1000", | |||
| onClose: () => { | |||
| this.showSignPopup = false; | |||
| this.form.fbfdcqz = response.data; | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| }) | |||
| .catch((err) => { | |||
| // 画布没有签字时会执行这里提示一下 | |||
| this.$toast.fail('请签名后再保存签字'); | |||
| }); | |||
| }, | |||
| dataURLtoBlob(dataurl, filename = 'file') { | |||
| let arr = dataurl.split(',') | |||
| let mime = arr[0].match(/:(.*?);/)[1] | |||
| let suffix = mime.split('/')[1] | |||
| let bstr = atob(arr[1]) | |||
| let n = bstr.length | |||
| let u8arr = new Uint8Array(n) | |||
| while (n--) { | |||
| u8arr[n] = bstr.charCodeAt(n) | |||
| } | |||
| return new File([u8arr], `${filename}.${suffix}`, { | |||
| type: mime | |||
| }) | |||
| }, | |||
| }, | |||
| }; | |||
| </script> | |||
| @@ -308,4 +404,25 @@ | |||
| margin: 2vh auto; | |||
| } | |||
| .signature-box { | |||
| border: 1px dashed #666; | |||
| margin: 2px 20px; | |||
| height: 100%; | |||
| /*canvas{*/ | |||
| /* height: 100%!important;*/ | |||
| /*}*/ | |||
| } | |||
| .signature-footer { | |||
| transform: rotate(90deg); | |||
| width: auto; | |||
| position: absolute; | |||
| top: 50%; | |||
| left: 0PX; | |||
| .clearBtn { | |||
| margin-left: 15px; | |||
| } | |||
| } | |||
| </style> | |||