2025-06-12 04:34:30 +00:00
|
|
|
|
<!-- component标签可以变换组件 -->
|
|
|
|
|
<template>
|
|
|
|
|
<view>
|
|
|
|
|
<view v-if="errorMsg" style="color: red;padding-left: 13px;">{{errorMsg}}</view>
|
|
|
|
|
<iframe id="jingeIframe" class="App-iframe" width="100%" ref="iframe" title="金格云阅读"
|
|
|
|
|
src="./static/CloudSign/viewer.html" @load="setConfig"></iframe>
|
|
|
|
|
<wd-toast></wd-toast>
|
|
|
|
|
</view>
|
|
|
|
|
</template>
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
import {
|
|
|
|
|
getCompleteNum
|
|
|
|
|
} from '@/api/bpm/sign'
|
|
|
|
|
import { ref, reactive, onMounted, computed, watch, nextTick } from 'vue';
|
|
|
|
|
import {
|
|
|
|
|
onLoad,
|
|
|
|
|
onShow,
|
|
|
|
|
onReachBottom,
|
|
|
|
|
onPullDownRefresh
|
|
|
|
|
} from '@dcloudio/uni-app';
|
|
|
|
|
import {
|
|
|
|
|
useUserStore
|
|
|
|
|
} from '@/store/user'
|
|
|
|
|
import { checkSign } from '@/api/bpm/sign'
|
|
|
|
|
import { useToast, useMessage, useNotify, dayjs } from 'wot-design-uni'
|
|
|
|
|
const emit = defineEmits(['message'])
|
|
|
|
|
const iframe = ref(null); //ref
|
|
|
|
|
const toast = useToast()
|
|
|
|
|
const store = useUserStore();
|
|
|
|
|
const compName = ref('');
|
|
|
|
|
const asyncComponent = ref(null);
|
|
|
|
|
const sealArrayTemp = ref([]); //签章数据
|
|
|
|
|
const signNum = ref(0);
|
|
|
|
|
const sign = ref(false);
|
|
|
|
|
const ldhth = ref('');
|
|
|
|
|
const username = ref('');
|
|
|
|
|
const iframeWin = ref(null);
|
|
|
|
|
const baseUrl = import.meta.env.VITE_SERVER_BASEURL
|
|
|
|
|
const filterArrNum = ref(0); //过滤后的数据
|
|
|
|
|
const errorMsg = ref('');
|
|
|
|
|
|
|
|
|
|
defineOptions({
|
|
|
|
|
name: 'SinopecEsignPage',
|
|
|
|
|
options: {
|
|
|
|
|
styleIsolation: 'shared',
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
const props = defineProps({
|
|
|
|
|
fileName: {
|
|
|
|
|
type: String,
|
|
|
|
|
default: ""
|
|
|
|
|
},
|
|
|
|
|
valiData: {
|
|
|
|
|
type: Object
|
|
|
|
|
},
|
|
|
|
|
procInsId: { //签章验证
|
|
|
|
|
type: String,
|
|
|
|
|
default: ""
|
|
|
|
|
},
|
|
|
|
|
path: {//签章验证
|
|
|
|
|
type: String,
|
|
|
|
|
default: ""
|
2025-07-25 09:21:01 +00:00
|
|
|
|
},
|
|
|
|
|
taskDefKey: { //流程节点
|
|
|
|
|
type: String,
|
|
|
|
|
default: ""
|
2025-06-12 04:34:30 +00:00
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
onShow(() => {
|
|
|
|
|
setTimeout(()=>{
|
|
|
|
|
setConfig()
|
|
|
|
|
},500)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const setConfig = () => {
|
|
|
|
|
// //给html传值
|
|
|
|
|
iframeWin.value = iframe.value.contentWindow
|
|
|
|
|
console.log(iframe.value)
|
|
|
|
|
console.log(iframe.value.contentWindow)
|
|
|
|
|
try {
|
|
|
|
|
iframeWin.value.postMessage({
|
|
|
|
|
filename: props.fileName,
|
|
|
|
|
apiUrl: baseUrl,
|
|
|
|
|
userid: username.value,
|
|
|
|
|
}, '*')
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('PostMessage error:', error);
|
|
|
|
|
// 可以在这里添加备用通信方式
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const signValidator = async () => { //签章验证 by 闵
|
|
|
|
|
|
2025-07-25 09:21:01 +00:00
|
|
|
|
console.log(props.path)
|
2025-06-12 04:34:30 +00:00
|
|
|
|
errorMsg.value = '';
|
|
|
|
|
let flag = false;
|
|
|
|
|
if (props.path == 'unconventional/stamp') { //非常规验证
|
|
|
|
|
if (props.valiData.flag) { //先判断数量验证
|
|
|
|
|
if (props.valiData && props.valiData.flag) {//有flag需要正常验证
|
|
|
|
|
let nowTime = new Date(props.valiData.time).getTime();
|
|
|
|
|
let filterArr = []
|
|
|
|
|
console.log(sealArrayTemp.value)
|
|
|
|
|
filterArr = sealArrayTemp.value.filter(item => {
|
|
|
|
|
let sealTime = new Date(item.createTime).getTime();
|
|
|
|
|
if (sealTime >= nowTime && item.userName == props.valiData.name) {
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
console.log(filterArr)
|
|
|
|
|
filterArrNum.value = filterArr.length;
|
|
|
|
|
if (props.valiData.num <= filterArrNum.value) {
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
console.log(324325)
|
|
|
|
|
errorMsg.value = "您需要签章(签字或盖章)" + props.valiData.num + "次,目前只签章了" + filterArrNum.value + "次。";
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//2024.3.22张祥瑞
|
|
|
|
|
//如果签章路径是非常规盖章则走这里,验证机制为跳过签章个数验证,只要没签章则不能提交流程
|
|
|
|
|
// let flag = false;
|
|
|
|
|
if (sign.value) {
|
|
|
|
|
return flag = true; //只要执行了签章成功操作就返回成功,否则加载个数验证
|
|
|
|
|
} else {
|
|
|
|
|
return flag = false;
|
|
|
|
|
}
|
2025-07-25 09:21:01 +00:00
|
|
|
|
} else if (props.path == 'officialReceptions/index') { //判断公务接待模块
|
2025-06-12 04:34:30 +00:00
|
|
|
|
//2024.5.16张祥瑞
|
|
|
|
|
//如果签章路径是非常规盖章则走这里,验证机制为跳过签章个数验证,只要没签章则不能提交流程
|
|
|
|
|
// let flag = false;
|
2025-07-25 09:21:01 +00:00
|
|
|
|
console.log(2222)
|
|
|
|
|
if(props.taskDefKey=='task1715564108096'){ //如果是综合办审核,不需要该区
|
|
|
|
|
return flag = true; //只要执行了签章成功操作就返回成功,否则加载个数验证
|
|
|
|
|
}
|
2025-08-13 01:26:00 +00:00
|
|
|
|
return flag = true; //只要执行了签章成功操作就返回成功,否则加载个数验证
|
2025-06-12 04:34:30 +00:00
|
|
|
|
if (sign.value) {
|
|
|
|
|
return flag = true; //只要执行了签章成功操作就返回成功,否则加载个数验证
|
|
|
|
|
} else {
|
|
|
|
|
return flag = false;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (sign.value) {
|
|
|
|
|
return true; //只要执行了签章成功操作就返回成功,否则加载个数验证
|
|
|
|
|
} else {
|
|
|
|
|
// let flag = false;
|
|
|
|
|
await getCompleteNum(props.procInsId).then(res => {
|
|
|
|
|
console.log("res--------132------", res);
|
|
|
|
|
// console.log("flag--132------",flag);
|
|
|
|
|
if (res) {
|
|
|
|
|
if (signNum.value >= (Number(res.result.nrOfCompletedInstances) + 1)) {
|
|
|
|
|
flag = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
console.log("flag--142------", flag);
|
|
|
|
|
return flag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
onLoad(() => {
|
|
|
|
|
//获取当前登录人所属部门
|
|
|
|
|
//这里是要去esign表中使用劳动合同号查询当前使用人的userid
|
|
|
|
|
let userInfo = store.userInfo;
|
|
|
|
|
ldhth.value = userInfo.workNo;
|
|
|
|
|
checkSign(ldhth.value).then((res) => {
|
|
|
|
|
if (res) {
|
|
|
|
|
username.value = res
|
|
|
|
|
} else {
|
|
|
|
|
toast.error("您没有申请电子签章服务!请移步到系统管理-电子签章管理中注册,并联系信息化支持中心进行otp绑定。联系电话:4874260")
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
|
|
|
|
|
//接收html盖完章后传过来的值
|
|
|
|
|
window.addEventListener("message", (ev) => {
|
|
|
|
|
console.log(ev)
|
|
|
|
|
//1.获取签章信息
|
|
|
|
|
let sealArray = ev.data.data.sealArray;
|
|
|
|
|
sealArrayTemp.value = sealArray;
|
|
|
|
|
console.log(sealArrayTemp.value);
|
|
|
|
|
//2.循环数组,转换为正确个数(以keySn为比对核心,相同的keySn为个数1)
|
|
|
|
|
let sealNumMap = {}
|
|
|
|
|
sealArray.forEach(item => {
|
|
|
|
|
if (sealNumMap[item.keySN]) {
|
|
|
|
|
sealNumMap[item.keySN] += 1;
|
|
|
|
|
//个数为2为一组
|
|
|
|
|
if (sealNumMap[item.keySN] > 2) {
|
|
|
|
|
let remainder = Math.ceil(sealNumMap[item.keySN] / 2) - 1
|
|
|
|
|
sealNumMap[item.keySN + remainder] = sealNumMap[item.keySN] - remainder * 2;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
sealNumMap[item.keySN] = 1;
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
signNum.value = Object.keys(sealNumMap).length;
|
|
|
|
|
console.log(sealNumMap)
|
|
|
|
|
console.log("ev.data----", ev.data)
|
|
|
|
|
if (ev.data.type === 'successMessage') {
|
|
|
|
|
console.log("ev------------", ev)
|
|
|
|
|
sign.value = true;
|
|
|
|
|
console.log("改变状态后-------this.sign-----", sign.value)
|
|
|
|
|
let wjurl = ev.currentTarget[0].data.filename;
|
|
|
|
|
//切割盖章文件,用来判断是否是非常规盖章--张祥瑞2024.1.11
|
|
|
|
|
// let wjurl1=wjurl.split('/');
|
|
|
|
|
if (wjurl.split('/')[0].includes("非常规盖章")) {
|
|
|
|
|
let wjdata = ev.currentTarget[0].data;
|
|
|
|
|
emit('message', wjdata);
|
|
|
|
|
}
|
|
|
|
|
} else if (ev.data.type === 'sealArray') { //添加删除盖章后签章,改为false --张祥瑞 2024.3.22
|
|
|
|
|
sign.value = false;
|
|
|
|
|
console.log("删除盖章后的参数--this.sign--", sign.value)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
defineExpose({ //暴露方法
|
|
|
|
|
signValidator
|
|
|
|
|
})
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
.App-iframe {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 700px;
|
|
|
|
|
border: none;
|
|
|
|
|
}
|
|
|
|
|
</style>
|