Merge remote-tracking branch 'remotes/origin/master'

# Conflicts:
#	env/.env.development
#	src/pages-process/components/DynamicLink.vue
#	src/pages.json
#	src/types/uni-pages.d.ts
This commit is contained in:
张祥瑞 2025-06-23 16:27:22 +08:00
commit c278e4618a
360 changed files with 88022 additions and 931 deletions

4
env/.env vendored
View File

@ -2,8 +2,12 @@ VITE_APP_TITLE = '数智产销'
VITE_APP_PORT = 9000
VITE_UNI_APPID = '__UNI__9F097F0'
#测试APPID
#VITE_UNI_APPID = '__UNI__1B02D50'
VITE_WX_APPID = 'wx8e287639924edb51'
#发布版本号
# h5部署网站的base配置到 manifest.config.ts 里的 h5.router.base
VITE_APP_PUBLIC_BASE=/

10
env/.env.development vendored
View File

@ -4,6 +4,14 @@ NODE_ENV = 'development'
VITE_DELETE_CONSOLE = false
# 是否开启sourcemap
VITE_SHOW_SOURCEMAP = true
VITE_SERVER_BASEURL = 'http://10.75.15.246:8080/jeecg-boot'
# 是否启用读取配置文件 min
#VITE_WEBAPP = 'D://opt//AppUpdateTest'
VITE_WEBAPP = ''
VITE_SERVER_BASEURL = 'http://10.75.15.249:8080/jeecg-boot'
#VITE_SERVER_BASEURL = 'https://36.112.48.190/jeecg-boot'
#VITE_SERVER_BASEURL = 'https://szcx.zyyt.sinopec.com/jeecg-boot'
#VITE_SERVER_BASEURL = 'https://szcx.zyyt.sinopec.com/wwapi'
#VITE_SERVER_BASEURL = 'https://szcx.zyyt.sinopec.com/yjapi'

6
env/.env.production vendored
View File

@ -4,4 +4,10 @@ NODE_ENV = 'development'
VITE_DELETE_CONSOLE = true
# 是否开启sourcemap
VITE_SHOW_SOURCEMAP = false
# 是否启用读取配置文件 min
#VITE_WEBAPP = 'D://opt//AppUpdateTest'
VITE_WEBAPP = ''
VITE_SERVER_BASEURL = 'https://szcx.zyyt.sinopec.com/jeecg-boot'
#VITE_SERVER_BASEURL = 'https://szcx.zyyt.sinopec.com/wwapi'
#VITE_SERVER_BASEURL = 'https://szcx.zyyt.sinopec.com/yjapi'
#VITE_SERVER_BASEURL = 'http://10.75.15.247:8080/jeecg-boot'

View File

@ -18,7 +18,7 @@ export default defineManifestConfig({
appid: VITE_UNI_APPID,
description: '',
versionName: '2.0.0',
versionCode: '20250605',
versionCode: '20250616',
transformPx: false,
locale: VITE_FALLBACK_LOCALE, // 'zh-Hans'
/* 5+App特有相关 */
@ -26,9 +26,20 @@ export default defineManifestConfig({
usingComponents: true,
nvueStyleCompiler: 'uni-app',
compilerVersion: 3,
android: {
webView: {
domStorageEnabled: true,
databaseEnabled: true,
allowFileAccess: true
}
},
compatible: {
ignoreVersion: true,
},
webview: {
debug: true,
crossDomain: true //
},
splashscreen: {
alwaysShowBeforeRender: true,
waiting: true,

View File

@ -134,9 +134,13 @@
"@uni-helper/vite-plugin-uni-pages": "0.2.20",
"@uni-helper/vite-plugin-uni-platform": "^0.0.4",
"@unocss/preset-legacy-compat": "^0.59.4",
"@vue/devtools-api": "^7.7.6",
"@vue/devtools-kit": "^7.7.6",
"@vue/devtools-shared": "^7.7.6",
"@vue/runtime-core": "^3.4.21",
"@vue/tsconfig": "^0.1.3",
"autoprefixer": "^10.4.20",
"birpc": "^2.3.0",
"commitlint": "^18.6.1",
"czg": "^1.9.4",
"eslint": "^8.57.1",
@ -146,8 +150,10 @@
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-vue": "^9.32.0",
"hookable": "^5.5.3",
"mockjs": "^1.1.0",
"openapi-ts-request": "^1.1.2",
"perfect-debounce": "^1.0.0",
"postcss": "^8.4.49",
"postcss-html": "^1.7.0",
"postcss-scss": "^4.0.9",

View File

@ -225,6 +225,15 @@ importers:
'@unocss/preset-legacy-compat':
specifier: ^0.59.4
version: 0.59.4
'@vue/devtools-api':
specifier: ^7.7.6
version: 7.7.6
'@vue/devtools-kit':
specifier: ^7.7.6
version: 7.7.6
'@vue/devtools-shared':
specifier: ^7.7.6
version: 7.7.6
'@vue/runtime-core':
specifier: ^3.4.21
version: 3.5.13
@ -234,6 +243,9 @@ importers:
autoprefixer:
specifier: ^10.4.20
version: 10.4.20(postcss@8.4.49)
birpc:
specifier: ^2.3.0
version: 2.3.0
commitlint:
specifier: ^18.6.1
version: 18.6.1(@types/node@20.17.9)(typescript@5.7.2)
@ -261,12 +273,18 @@ importers:
eslint-plugin-vue:
specifier: ^9.32.0
version: 9.32.0(eslint@8.57.1)
hookable:
specifier: ^5.5.3
version: 5.5.3
mockjs:
specifier: ^1.1.0
version: 1.1.0
openapi-ts-request:
specifier: ^1.1.2
version: 1.1.2(@types/node@20.17.9)(@vue/compiler-sfc@3.5.13)(chokidar@3.6.0)(typescript@5.7.2)
perfect-debounce:
specifier: ^1.0.0
version: 1.0.0
postcss:
specifier: ^8.4.49
version: 8.4.49
@ -1234,14 +1252,12 @@ packages:
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
libc: [gnu]
'@dcloudio/uts-linux-x64-musl@3.0.0-4030620241128001':
resolution: {integrity: sha512-HbuOIYCe0KTzW42oqACQDmSuLWmiEG9zUE3rGpp5QP3MKpcB4wJ5BAOusCt3V02akyVv4/IGToktN8dc9N7+Eg==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
libc: [musl]
'@dcloudio/uts-win32-ia32-msvc@3.0.0-4030620241128001':
resolution: {integrity: sha512-pgITm85ya64iJ19mixTUOiYVAyCJQ+V66L5Ue/cmME6CA2dU9DjTtPEP6DdSnoyq9JWcdbQLyVEQkxxtBSOyGA==}
@ -1968,55 +1984,46 @@ packages:
resolution: {integrity: sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==}
cpu: [arm]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.28.0':
resolution: {integrity: sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==}
cpu: [arm]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.28.0':
resolution: {integrity: sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.28.0':
resolution: {integrity: sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==}
cpu: [arm64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-powerpc64le-gnu@4.28.0':
resolution: {integrity: sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.28.0':
resolution: {integrity: sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-s390x-gnu@4.28.0':
resolution: {integrity: sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.28.0':
resolution: {integrity: sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==}
cpu: [x64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.28.0':
resolution: {integrity: sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==}
cpu: [x64]
os: [linux]
libc: [musl]
'@rollup/rollup-win32-arm64-msvc@4.28.0':
resolution: {integrity: sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==}

View File

@ -3,8 +3,8 @@
import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'
import { beforEach } from '@/router/index'
import { jurisdictionApi } from '@/api/system';
import { useAppStore, useUpdateApp } from '@/store'
import { getLocation } from '@/utils';
import { useAppStore } from '@/store'
import { getLocation, useUpdateApp } from '@/utils';
export default {
onLaunch: function (options) {
//
@ -13,30 +13,49 @@
getLocation()
},
onShow: function (options) {
if (uni.getStorageSync('logintime') && uni.getStorageSync('logintime') + 1800000 <= Date.now()) { //
//
//
//jiang 20250605
//
const publicPages = [
'/pages/sljd/index'
]
//
const isPublicPage = publicPages.includes(`/${options.path}`)
//
if (!isPublicPage) {
if (uni.getStorageSync('logintime') && uni.getStorageSync('logintime') + 1800000 <= Date.now()) {
uni.removeStorageSync('logintime')
uni.navigateTo({
url: '/pages/login/login'
})
return
}
//
}
//
setTimeout(() => {
const currentPage = options.path
if (!isPublicPage) {
beforEach({ path: '/' }, { path: currentPage, fullPath: currentPage }, (data) => {
if (data?.path) {
uni.redirectTo({ url: data.path })
}
})
}
}, 100)
//
if (!isPublicPage) {
jurisdictionApi("1827997127165677570").then((res : any) => {
// 0 1
if (res.success) {
const appStore = useAppStore()
appStore.setIsGray(res.result.value) //
appStore.setIsGray(res.result.value)
}
})
}
},
//

92
src/api/bpm/index.ts Normal file
View File

@ -0,0 +1,92 @@
import { http } from '@/utils/http';
/*通过id查询公文数据*/
export function queryDocumentByIdApi(id : string) {
return http({
url: '/cxcoagwfb/cxcOaGwfb/queryById',
method: 'GET',
data: { id }
})
}
/*通过id查询干租车数据*/
export function queryCarRentalByIdApi(id : string) {
return http({
url: '/CarRental/cxcCarRental/queryById',
method: 'GET',
data: { id }
})
}
/*通过id查询指标考核主表数据*/
export function queryZbkhZbByIdApi(id : string) {
return http({
url: '/jxkh.zbkh/cxcJxkhZbkhZb/listById',
method: 'GET',
data: { id }
})
}
/*通过id查询指标考核子表数据*/
export function queryZbkhFbByIdApi(data : object) {
return http({
url: '/jxkh.zbkh/cxcJxkhZbkhZb/listCxcJxkhZbkhDwkhByMainId',
method: 'GET',
data
})
}
/*通过id查询指标考核自定义表头*/
export function queryZbkhBtByIdApi(mainId : string) {
return http({
url: '/jxkh.dwkhbt/cxcJxkhZbkhDwkhBtZb/listByMainId',
method: 'GET',
data: { mainId }
})
}
/*通过id查询考核实施主表数据*/
export function queryKhssZbByIdApi(id : string) {
return http({
url: '/jxkh.khss/cxcJxkhXhss/getAllById',
method: 'GET',
data: { id }
})
}
/*通过id查询考核实施主表自定义表头*/
export function queryKhssZbBtByIdApi(mainId : string) {
return http({
url: '/jxkh.jxkh/cxcJxkhKhssKhjxZb/getByMainId',
method: 'GET',
data: { mainId }
})
}
/*通过id查询考核实施子表数据*/
export function queryKhssFbByIdApi(data : object) {
return http({
url: '/jxkh.khss/cxcJxkhXhss/selectAllByMainId',
method: 'GET',
data
})
}
/*通过id查询总金额*/
export function queryKhssAllSumByIdApi(mainId : string) {
return http({
url: '/jxkh.khss/cxcJxkhXhss/getAllSum',
method: 'GET',
data: { mainId }
})
}
/*通过id查询考核实子表自定义表头*/
export function queryKhssFbBtByIdApi(mainId : string) {
return http({
url: '/jxkh.jxfp.bt/cxcJxkhJxfbBtZb/listByMainId',
method: 'GET',
data: { mainId }
})
}

26
src/api/bpm/sign.ts Normal file
View File

@ -0,0 +1,26 @@
import { http } from '@/utils/http';
/*通过id查询数据*/
export function checkSign(ldhth : string) {
return http({
url: '/cxcesign/cxcEsign/getUserCo',
method: 'GET',
data: { ldhth }
})
}
export function getCompleteNum(procInsId : string) {
return http({
url: '/cxcesign/cxcEsign/getCompleteNum',
method: 'GET',
data: { procInsId }
})
}
export function processHistoryList(processInstanceId : string) {
return http({
url: '/act/task/processHistoryList',
method: 'GET',
data: { processInstanceId }
})
}

View File

@ -49,7 +49,7 @@ export function countByOrgApi(params : object) {
})
}
/*通过id查询请假数据*/
/*通过id查询数据*/
export function queryByIdApi(id : string) {
return http({
url: '/CxcQxj/cxcQxj/queryById',

View File

@ -0,0 +1,11 @@
import { http } from '@/utils/http';
/*新增打卡记录*/
export function addApi(config : Object) {
return http({
url: '/cxc_rlzy.wbxm.wbdk/cxcRlzyWbdk/add',
method: 'POST',
data: config
})
}

View File

@ -0,0 +1,10 @@
import { http } from '@/utils/http';
// API
export function queryUnData(data : Object) {
return http({
url: '/cxcfcggzsq/cxcFcggzsq/queryByIdDict',
method: 'get',
data
})
}

View File

@ -1,18 +1,17 @@
import { http } from '@/utils/http';
export function getListApi(orgCode : string) {
export function getListApi() {
return http({
url: '/sjgl.scnr/cxcSjSc/queryTreeData',
method: 'GET',
data: { orgCode }
method: 'GET'
})
}
export function getJobDesIdByDepAndName(config : Object) {
export function getJobDesIdByDepAndName(jobname : string) {
return http({
url: '/sjgl.tynr/cxcSjJobdescription/queryByNameDep',
method: 'GET',
data: config
data: { jobname }
})
}

View File

@ -26,10 +26,13 @@ export function loginApi(config : LoginParams) {
* @param
* @returns
*/
export function upDateAppApi() {
export function upDateAppApi(path : string) {
return http({
url: '/sys/common/upDateApp',
method: 'GET'
method: 'GET',
data: {
path
}
})
}

View File

@ -0,0 +1,77 @@
<!-- component标签可以变换组件 -->
<template>
<view>
<view v-if="ifH5">
<SinopecEsignPageH5 :valiData="props.valiData" :procInsId="props.procInsId" :path="props.path" ref="signH5" :fileName="props.fileName" @stampSuccess="getStampSuccess"></SinopecEsignPageH5>
</view>
<view v-else>
<SinopecEsignPageAPP :valiData="props.valiData" :procInsId="props.procInsId" :path="props.path" ref="signAPP" :fileName="props.fileName" @stampSuccess="getStampSuccess"></SinopecEsignPageAPP>
</view>
</view>
</template>
<script setup lang="ts">
import {
ref
} from 'vue'
import {
onLoad,
} from '@dcloudio/uni-app';
import SinopecEsignPageH5 from '@/components/Esign/SinopecEsignPageH5.vue'
import SinopecEsignPageAPP from '@/components/Esign/SinopecEsignPageAPP.vue'
const emit = defineEmits(['stampSuccess'])
const ifH5 = ref(null);
const signH5 = ref(null);
const signAPP = ref(null);
const props = defineProps({
fileName: {
type: String,
default: ""
},
valiData: {
type: Object,
default: () => ({})
},
procInsId: { //
type: String,
default: ""
},
path: {//
type: String,
default: ""
}
})
//h5 by
var ifH = false;
onLoad(() => {
//#ifdef H5 || MP-WEIXIN
ifH5.value = true;
//#endif
})
//
const getStampSuccess=(val)=> {
emit('stampSuccess', val)
}
const signValidator = ()=>{
//
if(ifH5.value){
return signH5.value.signValidator();
}else{
return signAPP.value.signValidator()
}
}
defineExpose({ //
signValidator
})
</script>
<style scoped>
</style>

View File

@ -0,0 +1,250 @@
<!-- component标签可以变换组件 -->
<template>
<view>
<view v-if="errorMsg" style="color: red;padding-left: 13px;">{{errorMsg}}</view>
<iframe id="jingeIframe" style="width: 100%;height: 600px;border: none;" ref="iframe" title="金格云阅读"
src="./static/CloudSign/viewer.html" :transmissionData="transmissionData"
:change:transmissionData="renderjs.postMessageToIframe" @load="setConfig"></iframe>
<wd-toast></wd-toast>
</view>
</template>
<script>
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 } from 'wot-design-uni'
export default {
name: 'SinopecEsignPageAPP',
options: {
styleIsolation: 'shared',
},
props: {
fileName: {
type: String,
default: ""
},
valiData: {
type: Object
},
procInsId: { //
type: String,
default: ""
},
path: {//
type: String,
default: ""
}
},
emits: ['message'],
setup(props, { emit }) {
const toast = useToast()
const store = useUserStore();
const iframe = ref(null);
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 transmissionData = ref({});
const errorMsg = ref('');
const setConfig = () => {
transmissionData.value = {
filename: props.fileName,
apiUrl: baseUrl,
userid: username.value,
}
console.log(transmissionData.value)
}
const signValidator = async () => { // by
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 = []
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;
}
})
filterArrNum.value = filterArr.length;
if (props.valiData.num <= filterArrNum.value) {
return true;
} else {
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;
}
} else if (props.path == 'modules/gwjdspd/modules/CxcGwjdSpdFromByProcess') { //
//2024.5.16
//
// let flag = false;
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;
}
const stampingCompleted = (data) => {
console.log(JSON.stringify(data))
let sealArray = data.data.sealArray;
sealArrayTemp.value = sealArray;
console.log(sealArrayTemp.value);
let sealNumMap = {}
sealArray.forEach(item => {
if (sealNumMap[item.keySN]) {
sealNumMap[item.keySN] += 1;
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----", data)
if (data.type === 'successMessage') {
console.log("ev------------", ev)
sign.value = true;
console.log("改变状态后-------this.sign-----", sign.value)
let wjurl = ev.currentTarget[0].data.filename;
if (wjurl.split('/')[0].includes("非常规盖章")) {
let wjdata = ev.currentTarget[0].data;
emit('message', wjdata);
}
} else if (data.type === 'sealArray') {
sign.value = false;
console.log("删除盖章后的参数--this.sign--", sign.value)
}
}
onShow(() => {
setTimeout(()=>{
setConfig()
},500)
})
onLoad(() => {
let userInfo = store.userInfo;
ldhth.value = userInfo.workNo;
checkSign(ldhth.value).then((res) => {
if (res) {
username.value = res
} else {
toast.error("您没有申请电子签章服务!请移步到系统管理-电子签章管理中注册并联系信息化支持中心进行otp绑定。联系电话4874260")
}
})
})
// defineExpose({ //
// signValidator
// })
return {
iframe,
compName,
asyncComponent,
sealArrayTemp,
signNum,
sign,
ldhth,
username,
iframeWin,
baseUrl,
filterArrNum,
transmissionData,
signValidator,
stampingCompleted,
errorMsg
}
}
}
</script>
<script module="renderjs" lang="renderjs">
export default {
mounted() {
this.setupMessageListener()
},
methods: {
postMessageToIframe(data) {
console.log(data)
const iframe = document.getElementById('jingeIframe')
if (iframe && iframe.contentWindow) {
iframe.contentWindow.postMessage(data, '*')
}
},
setupMessageListener() {
let that = this;
window.addEventListener('message', (ev,ev2) => {
console.log(ev.data)
if (ev) {
try {
that.$ownerInstance.callMethod('stampingCompleted', ev.data)
} catch (error) {
console.error('Call method error:', error)
}
}
})
}
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,230 @@
<!-- 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: ""
}
})
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
console.log(props.valiData)
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;
}
} else if (props.path == 'modules/gwjdspd/modules/CxcGwjdSpdFromByProcess') { //
//2024.5.16
//
// let flag = false;
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.keySnkeySn1
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>

4
src/env.d.ts vendored
View File

@ -14,7 +14,9 @@ interface ImportMetaEnv {
/** 服务端口号 */
readonly VITE_SERVER_PORT: string
/** 后台接口地址 */
readonly VITE_SERVER_BASEURL: string
readonly VITE_WEBAPP: string
/** 读取更新配置文件路径 by min */
readonly WEBAPP: string
/** H5是否需要代理 */
readonly VITE_APP_PROXY: 'true' | 'false'
/** H5是否需要代理需要的话有个前缀 */

View File

@ -3,7 +3,7 @@
"appid": "__UNI__9F097F0",
"description": "",
"versionName": "2.0.0",
"versionCode": "20250605",
"versionCode": "20250616",
"transformPx": false,
"app-plus": {
"usingComponents": true,
@ -89,8 +89,19 @@
}
}
},
"android": {
"webView": {
"domStorageEnabled": true,
"databaseEnabled": true,
"allowFileAccess": true
}
},
"compatible": {
"ignoreVersion": true
},
"webview": {
"debug": true,
"crossDomain": true
}
},
"quickapp": {},

View File

@ -0,0 +1,54 @@
<template>
<wd-cell-group title="申请信息">
<wd-cell title="用车单位" :value="info.usingDepart_dictText" />
<wd-cell title="车型" :value="info.vehicleModel" />
<wd-cell title="车牌号" :value="info.carNumber" />
<wd-cell title="驾驶员姓名" :value="info.driverName" />
<wd-cell title="派车领导" :value="info.carLeader_dictText" />
<wd-cell title="出车工作日" :value="info.workingDay + '天'" />
<wd-cell title="劳动合同号" :value="info.ldhth" />
<wd-cell title="开始时间" :value="info.startTime" />
<wd-cell title="结束时间" :value="info.endTime" />
<wd-cell title="附件" v-if="info.path">
<template v-for="(img, index) in image" :key="index">
<wd-img :width="100" :height="100" :src="img" :enable-preview="true" />
</template>
</wd-cell>
<wd-cell title="交办任务" :value="info.taskAssigned" />
<wd-cell title="备注" :value="info.remarks" />
</wd-cell-group>
</template>
<script setup>
import {
queryCarRentalByIdApi
} from '@/api/bpm'
import {
imgUrl
} from '@/utils/index'
const info = ref({})
const image = ref([])
const props = defineProps({
formData: {
type: Object,
default: () => {},
}
})
//
const queryById = () => {
queryCarRentalByIdApi(props.formData.dataId).then((res) => {
if (res.success) {
info.value = res.result.records[0]
if (info.value.fj) {
image.value = info.value.fj.split(',').map(path => imgUrl(path))
}
}
})
}
onMounted(() => {
queryById()
})
</script>

View File

@ -0,0 +1,56 @@
<template>
<wd-cell-group title="申请信息">
<wd-cell title="发文字号" :value="info.fwzh" />
<wd-cell>
<template #title>
<view>
<view style="display: inline-block">发文标题</view>
</view>
</template>
<view style="color: blue;" @click="onlinePreview(info.wjbt)">
{{info.fwbt}}
</view>
</wd-cell>
<wd-cell title="发文日期" :value="info.fwtime" />
<wd-cell title="拟稿人" :value="info.ngr" />
<wd-cell title="拟稿人电话" :value="info.ngrdh" />
<wd-cell title="类别及代号" :value="info.wjlb" />
<wd-cell title="密级" :value="info.mj_dictText" />
<wd-cell title="主题词" :value="info.ztc" />
<wd-cell title="文件描述" :value="info.wjms" />
<wd-cell title="签发人" :value="info.qfr_dictText" />
</wd-cell-group>
</template>
<script setup>
import {
queryDocumentByIdApi
} from '@/api/bpm'
const info = ref({})
const props = defineProps({
formData: {
type: Object,
default: () => {},
}
})
//
const queryById = () => {
queryDocumentByIdApi(props.formData.dataId).then((res) => {
if (res.success) {
info.value = res.result.records[0]
}
})
}
const onlinePreview = (e) => {
uni.navigateTo({
url: `/pages/onlinePreview/detail?data=${e}`
})
}
onMounted(() => {
queryById()
})
</script>

View File

@ -0,0 +1,230 @@
<template>
<!-- 可滚动内容区域 -->
<scroll-view class="content-scroll" :style="{ height: scrollViewHeight }" scroll-y :scroll-top="scrollTop">
<!-- 主表内容 -->
<wd-cell-group border v-if="tabbar == '0'">
<wd-cell size="large" title="年月" :value="zbInfo.assessmentDate" />
<wd-cell size="large" title="单位" :value="zbInfo.templetName_dictText" />
<wd-cell size="large" title="当月人数" :value="zbInfo.monthNumber" />
<wd-cell size="large" title="本次兑现合计" :value="zbInfo.redemptionTotal" />
<wd-collapse v-model="collapse">
<wd-collapse-item title="考核绩效" name="item01">
<wd-cell v-for="(item, index) in zbBtInfo" :key="index" :title="item.name"
:value="getKhjxValue(item.id)" />
</wd-collapse-item>
</wd-collapse>
<wd-cell size="large">
<template #title>
<view style="display: inline-block">考核公报</view>
</template>
<view style="color: blue;" @click="onlinePreview(zbInfo.bmKhgb)">
{{getFilename(zbInfo.bmKhgb)}}
</view>
</wd-cell>
</wd-cell-group>
<!-- 子表内容 -->
<wd-collapse v-model="fbCollapse" v-if="tabbar == '1'">
<div style="display: flex;justify-content: space-between;padding: 10px 15px;font-weight: bold;">
<span>已分配金额: {{ sumJx }}</span>
<span>待分配金额: {{ (allJx - 0) - (sumJx - 0) }}</span>
</div>
<wd-collapse-item v-for="(fbItem, fbIndex) in fbInfo" :key="fbIndex" :title="fbItem.userName"
:name="'item' + (fbIndex + 1)">
<wd-cell-group border>
<wd-cell size="large" title="单位/部门" :value="fbItem.depart_dictText" />
<wd-cell size="large" title="劳动合同号" :value="fbItem.ldhth" />
<wd-cell size="large" title="岗位/职务" :value="fbItem.gw" />
<wd-cell size="large" title="绩效工资合计" :value="fbItem.jxgz" />
<wd-collapse v-model="fbCollapse2">
<wd-collapse-item title="绩效详情" :name="'item0' + (fbIndex + 1)">
<wd-cell v-for="(item, index) in fbBtInfo" :key="index" :title="item.name"
:value="getJxDetailValue(fbItem.id, item.id)" />
</wd-collapse-item>
</wd-collapse>
<wd-cell size="large" title="备注" :value="fbItem.bz" />
</wd-cell-group>
</wd-collapse-item>
</wd-collapse>
<wd-pagination v-if="tabbar == '1'" v-model="page" :total="total" @change="handleChange" />
<!-- 底部占位视图 -->
<view class="bottom-spacer" :style="{ height: safeAreaBottom }"></view>
</scroll-view>
<!-- 固定在底部的TabBar -->
<wd-tabbar fixed v-model="tabbar" class="safe-area-tabbar">
<wd-tabbar-item title="考核实施主表" icon="cart"></wd-tabbar-item>
<wd-tabbar-item title="考核实施子表" icon="user"></wd-tabbar-item>
</wd-tabbar>
</template>
<script setup>
import {
queryKhssZbByIdApi,
queryKhssZbBtByIdApi,
queryKhssFbByIdApi,
queryKhssFbBtByIdApi,
queryKhssAllSumByIdApi
} from '@/api/bpm'
import {
getFilename
} from '@/utils'
//
const tabbar = ref(0)
const zbInfo = ref({})
const fbInfo = ref([])
const zbBtInfo = ref([])
const fbBtInfo = ref([])
const collapse = ref([''])
const fbCollapse = ref([''])
const fbCollapse2 = ref([''])
const jxxqList = ref([])
const sumJx = ref(0)
const allJx = ref(0)
const page = ref(1)
const total = ref(0)
const scrollTop = ref(0)
const tabbarHeight = ref(50)
const systemInfo = ref({})
const scrollViewHeight = ref('100vh')
const props = defineProps({
formData: {
type: Object,
default: () => ({})
}
})
//
const safeAreaBottom = computed(() => {
// #ifdef H5
return `${tabbarHeight.value}px`
// #endif
// #ifdef APP-PLUS || MP-WEIXIN
return `calc(${tabbarHeight.value}px + env(safe-area-inset-bottom))`
// #endif
})
//
const getSystemInfo = () => {
uni.getSystemInfo({
success: (res) => {
systemInfo.value = res
const safeBottom = res.safeAreaInsets?.bottom || 0
scrollViewHeight.value =
`calc(${res.windowHeight}px - ${tabbarHeight.value + safeBottom}px)`
}
})
}
// TabBar
const initTabbarHeight = () => {
const query = uni.createSelectorQuery().select('.safe-area-tabbar')
query.boundingClientRect(data => {
if (data) {
tabbarHeight.value = data.height
getSystemInfo()
}
}).exec()
}
//
const queryById = async () => {
const zbRes = await queryKhssZbByIdApi(props.formData.dataId)
if (zbRes.success) {
zbInfo.value = zbRes.result.records[0]
allJx.value = zbInfo.value.redemptionTotal
if (zbInfo.value.jxxqs) {
jxxqList.value = zbInfo.value.jxxqs
}
if (zbInfo.value.khjxZbId) {
const btRes = await queryKhssZbBtByIdApi(zbInfo.value.khjxZbId)
zbBtInfo.value = btRes.result
}
if (zbInfo.value.jxfpBtId) {
const btRes = await queryKhssFbBtByIdApi(zbInfo.value.jxfpBtId)
fbBtInfo.value = btRes.result
}
}
const fbRes = await queryKhssFbByIdApi({
mainId: props.formData.dataId
})
fbInfo.value = fbRes.result.records
total.value = fbRes.result.total
queryKhssAllSumByIdApi(props.formData.dataId).then(res => {
sumJx.value = res.result
})
}
//
const getKhjxValue = (khjxId) => {
if (!jxxqList.value || jxxqList.value.length === 0) return ''
const item = jxxqList.value.find(item => item.khjxId === khjxId)
return item ? item.numValue : ''
}
//
const getJxDetailValue = (mainId, jxfpBtId) => {
if (!fbInfo.value || fbInfo.value.length === 0) return ''
const currentItem = fbInfo.value.find(item => item.id === mainId)
if (!currentItem || !currentItem.jxxfpSaves) return ''
const detail = currentItem.jxxfpSaves.find(save => save.jxfpBt === jxfpBtId)
return detail ? detail.value : ''
}
const handleChange = (value) => {
fbInfo.value = []
queryKhssFbByIdApi({
mainId: props.formData.dataId,
pageNo: value.value
}).then(res => {
fbInfo.value = res.result.records
scrollTop.value = scrollTop.value ? 0 : 1 //
})
}
const onlinePreview = (e) => {
uni.navigateTo({
url: `/pages/onlinePreview/detail?data=${e}`
})
}
onMounted(() => {
queryById()
})
onReady(() => {
initTabbarHeight()
getSystemInfo()
})
</script>
<style lang="scss" scoped>
/* 滚动内容区域 */
.content-scroll {
width: 100%;
flex: 1;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
/* 底部占位视图 */
.bottom-spacer {
width: 100%;
}
/* 安全区域适配 */
.safe-area-tabbar {
/* #ifdef APP-PLUS || MP-WEIXIN */
padding-bottom: env(safe-area-inset-bottom);
/* #endif */
/* #ifdef H5 */
position: sticky;
bottom: 0;
/* #endif */
}
</style>

View File

@ -26,13 +26,6 @@
import {
imgUrl
} from '@/utils/index'
defineOptions({
name: 'index',
options: {
styleIsolation: 'shared',
},
})
const info = ref({})
const image = ref([])
const props = defineProps({
@ -48,140 +41,18 @@
});
}
//
const qjQueryById = () => {
const queryById = () => {
queryByIdApi(props.formData.dataId).then((res) => {
if (res.success) {
info.value = res.result.records[0]
if(info.value.path){
image.value = info.value.path.split(',').map(path => imgUrl(path))
}
}
})
}
onMounted(() => {
qjQueryById()
queryById()
})
</script>
<style lang="scss" scoped>
.info_box {
padding: 40rpx 30rpx 16rpx 30rpx;
width: 630rpx;
background: #FFFFFF;
box-shadow: 0rpx 2rpx 4rpx 0rpx rgba(0, 0, 0, 0.5);
border-radius: 16rpx;
margin-top: 30rpx;
.title {
font-size: 28rpx;
color: #333333;
background-image: url(../../static/index/line.png);
background-size: 44rpx 12rpx;
background-repeat: no-repeat;
background-position: left bottom;
margin-bottom: 30rpx;
display: flex;
justify-content: space-between;
}
.info {
font-size: 28rpx;
margin-bottom: 24rpx;
view {
color: #666666;
}
text {
color: #333333;
}
}
}
.progress {
background: #FFFFFF;
box-shadow: 0rpx 2rpx 4rpx 0rpx rgba(0, 0, 0, 0.5);
border-radius: 16rpx;
width: 630rpx;
padding: 40rpx 30rpx 16rpx 30rpx;
margin-top: 30rpx;
margin-bottom: 30rpx;
.status {
padding: 4rpx 8rpx;
display: inline-block;
color: #FFFFFF;
font-size: 20rpx;
margin-left: 8rpx;
border-radius: 8rpx;
}
.complete {
background-color: #7AC756;
}
.refuse {
background-color: #FE4600;
}
.title {
font-size: 28rpx;
color: #333333;
background-image: url(../../static/index/line.png);
background-size: 44rpx 12rpx;
background-repeat: no-repeat;
background-position: left bottom;
margin-bottom: 40rpx;
}
// .box:not(:first-child) {
// padding-top: 60rpx;
// }
.box:not(:last-child) {
position: relative;
padding-bottom: 60rpx;
&::before {
position: absolute;
content: ' ';
width: 1px;
height: 100%;
background: #efefef;
left: -42rpx;
top: 10rpx;
}
}
.box {
margin-left: 50rpx;
.topic {
position: relative;
font-size: 28rpx;
color: #333333;
&::before {
position: absolute;
content: ' ';
width: 18rpx;
height: 18rpx;
background: #01508B;
border-radius: 14rpx;
left: -50rpx;
top: 50%;
transform: translateY(-50%);
}
}
.name_time {
font-size: 24rpx;
color: #888888;
margin-top: 12rpx;
}
}
}
</style>

View File

@ -0,0 +1,51 @@
<template>
<wd-cell-group title="申请信息">
<wd-cell title="申请人" :value="info.sqr" />
<wd-cell title="业务类别" :value="info.ywlb" />
<wd-cell title="申请事由" :value="info.sqsy" />
<wd-cell title="部门审批领导" :value="info.bmspld_dictText" />
<wd-cell title="申请部门" :value="info.sqbm" />
<wd-cell title="申请时间" :value="info.sqsj" />
<wd-cell title="申请盖章领导" :value="info.gzld" />
<wd-cell title="申请盖章厂领导" :value="info.gzcld" />
<wd-cell title="盖章位置" :value="info.gzwz" />
<wd-cell title="盖章文件" >
<view style="color: #4d80f0;" @click="onlinePreView(info.wj)" plain>{{info.wj.match(/([^\/]+)(?=\.\w+$)/)[0]}}</view>
</wd-cell>
</wd-cell-group>
</template>
<script setup>
import {
queryUnData
} from '@/api/integrated/unconventional'
import {
imgUrl
} from '@/utils/index'
const info = ref({})
const image = ref([])
const props = defineProps({
formData: {
type: Object,
default: () => {},
}
})
const queryData = ()=>{
queryUnData({id:props.formData.dataId}).then(res=>{
info.value = res.result.records[0]
})
}
const onlinePreView = (fileUrl) => {
uni.navigateTo({
url: `/pages/onlinePreview/detail?data=${fileUrl}`
});
};
onMounted(() => {
queryData();
})
</script>

View File

@ -0,0 +1,115 @@
<template>
<wd-collapse v-model="value">
<wd-collapse-item title="表单数据" name="item1">
<wd-cell title="申请人" :value="info.sqr" />
<wd-cell title="业务类别" :value="info.ywlb" />
<wd-cell title="申请事由" :value="info.sqsy" />
<wd-cell title="部门审批领导" :value="info.bmspld_dictText" />
<wd-cell title="申请部门" :value="info.sqbm" />
<wd-cell title="申请时间" :value="info.sqsj" />
<wd-cell title="申请盖章领导" :value="info.gzld" />
<wd-cell title="申请盖章厂领导" :value="info.gzcld" />
<wd-cell title="盖章位置" :value="info.gzwz" />
</wd-collapse-item>
<wd-collapse-item custom-body-style="padding:0;" title="盖章文件" name="item2">
<SinopecEsignPage :valiData="valiData" ref="sign" :procInsId="props.formData.procInsId" :path="props.formData.path" :fileName="info.wjdict" @stampSuccess="getStampSuccess" ></SinopecEsignPage>
</wd-collapse-item>
</wd-collapse>
</template>
<script setup>
import {
queryUnData
} from '@/api/integrated/unconventional'
import {
processHistoryList
} from '@/api/bpm/sign'
import {
imgUrl
} from '@/utils/index'
import SinopecEsignPage from '@/components/Esign/SinopecEsignPage.vue'
import { useUserStore } from '@/store/user'
const userStore = useUserStore()
const emit = defineEmits(['getStampSuc'])
const sign = ref(null);
const value = ref([]);
const info = ref({});
const valiData = ref({});
const ifEsign = ref(true);
const props = defineProps({
formData: {
type: Object,
default: () => {},
},
fileName: {
type: String,
default: ""
}
})
const queryData = ()=>{
queryUnData({id:props.formData.dataId}).then(res=>{
info.value = res.result.records[0]
initValiData(info.value); //data by
let lj = info.value.wj.split("/");
let ljurl = lj[2] + '/' + lj[3];
info.value.wjdict = ljurl;
})
}
const initValiData = (data)=>{
//data by
let name = userStore.userInfo.realname;
let num = null;
if(data.lds){
let ldsMap = JSON.parse(data.lds);
if(ldsMap[name]) num = ldsMap[name]
}
if(data.clds){
let cldsMap = JSON.parse(data.clds);
if(cldsMap[name]) num = cldsMap[name]
}
if(num){
valiData.value.flag = true;
valiData.value.num = num;
valiData.value.name = name;
}
}
const initValtime = ()=>{
processHistoryList(props.formData.procInsId).then(res=>{
if (res.success) {
valiData.value.time = res.result.records[0].startTime
} else {
console.log("加载失败")
}
})
}
//
const getStampSuccess=(val)=> {
emit('getStampSuc', val)
}
const signValidator = (procInsId,path)=>{
//
return sign.value.signValidator();
}
onMounted(() => {
queryData();
initValtime();
})
defineExpose({ //
signValidator,
ifEsign
})
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,195 @@
<template>
<!-- 可滚动内容区域 -->
<scroll-view class="content-scroll" :style="{ height: scrollViewHeight }" scroll-y :scroll-top="scrollTop">
<!-- 主表内容 -->
<wd-cell-group border v-if="tabbar == '0'">
<wd-cell size="large" title="年月" :value="zbInfo.year + '年' + zbInfo.month + '月'" />
<wd-cell size="large" title="考核指标" :value="zbInfo.assessmentIndicators" />
<wd-cell size="large" title="指标类别" :value="zbInfo.indicatorCategory_dictText" />
<wd-collapse v-model="khdxCollapse">
<wd-collapse-item title="考核对象" name="考核对象">{{zbInfo.templetName_dictText}}</wd-collapse-item>
</wd-collapse>
<wd-cell size="large" title="考核周期" :value="zbInfo.assessmentCycle_dictText" />
<wd-cell size="large" title="考核部门" :value="zbInfo.assessmentDepart_dictText" />
<wd-collapse v-model="zbCollapse">
<wd-collapse-item title="评价方法" name="评价方法">{{zbInfo.evaluationMethod}}</wd-collapse-item>
</wd-collapse>
<wd-cell size="large">
<template #title>
<view>
<view style="display: inline-block">考核附件</view>
</view>
</template>
<view style="color: blue;" @click="onlinePreview(zbInfo.khfj)">
{{getFilename(zbInfo.khfj)}}
</view>
</wd-cell>
</wd-cell-group>
<!-- 子表内容 -->
<wd-collapse v-model="collapse" v-if="tabbar == '1'">
<wd-collapse-item v-for="(fbItem, fbIndex) in fbInfo" :key="fbIndex" :title="fbItem.depart_dictText"
:name="'item' + (fbIndex + 1)">
<wd-cell v-for="(btItem, btIndex) in btInfo" :key="btIndex" :title="btItem.name"
:value="getDwkhValue(fbItem, btItem.id)" />
<wd-cell>
<template #title>
<view>
<view style="display: inline-block">附件</view>
</view>
</template>
<view style="color: blue;" @click="onlinePreview(fbItem.annex)">
{{getFilename(fbItem.annex)}}
</view>
</wd-cell>
</wd-collapse-item>
</wd-collapse>
<wd-pagination v-if="tabbar == '1'" v-model="page" :total="total" @change="handleChange" />
<!-- 底部占位视图 -->
<view class="bottom-spacer" :style="{ height: safeAreaBottom }"></view>
</scroll-view>
<wd-tabbar fixed v-model="tabbar" class="safe-area-tabbar">
<wd-tabbar-item title="指标考核主表" icon="cart"></wd-tabbar-item>
<wd-tabbar-item title="指标考核子表" icon="user"></wd-tabbar-item>
</wd-tabbar>
</template>
<script setup>
import {
queryZbkhZbByIdApi,
queryZbkhFbByIdApi,
queryZbkhBtByIdApi
} from '@/api/bpm'
import {
getFilename
} from '@/utils'
const tabbar = ref(0)
const zbInfo = ref({})
const fbInfo = ref([])
const btInfo = ref([])
const btDataInfo = ref([])
const zbCollapse = ref(['评价方法'])
const khdxCollapse = ref(['考核对象'])
const collapse = ref(['item01'])
const page = ref(1)
const total = ref(0)
const scrollTop = ref(0)
const tabbarHeight = ref(50)
const systemInfo = ref({})
const scrollViewHeight = ref('100vh')
const props = defineProps({
formData: {
type: Object,
default: () => {},
}
})
//
const safeAreaBottom = computed(() => {
// #ifdef H5
return `${tabbarHeight.value}px`
// #endif
// #ifdef APP-PLUS || MP-WEIXIN
return `calc(${tabbarHeight.value}px + env(safe-area-inset-bottom))`
// #endif
})
//
const getSystemInfo = () => {
uni.getSystemInfo({
success: (res) => {
systemInfo.value = res
const safeBottom = res.safeAreaInsets?.bottom || 0
scrollViewHeight.value =
`calc(${res.windowHeight}px - ${tabbarHeight.value + safeBottom}px)`
}
})
}
// TabBar
const initTabbarHeight = () => {
const query = uni.createSelectorQuery().select('.safe-area-tabbar')
query.boundingClientRect(data => {
if (data) {
tabbarHeight.value = data.height
getSystemInfo()
}
}).exec()
}
const queryById = async () => {
// 1.
const zbRes = await queryZbkhZbByIdApi(props.formData.dataId);
if (zbRes.success) {
zbInfo.value = zbRes.result.records[0];
// 2. btInfo
if (zbInfo.value.dwkhBtId) {
const btRes = await queryZbkhBtByIdApi(zbInfo.value.dwkhBtId);
btInfo.value = btRes.result;
}
}
// 3. fbInfo
const fbRes = await queryZbkhFbByIdApi({
mainId: props.formData.dataId
});
fbInfo.value = fbRes.result.records;
total.value = fbRes.result.total
};
const getDwkhValue = (fbItem, btId) => {
if (!fbItem.dwkhSaves) return ''; // dwkhSaves
const found = fbItem.dwkhSaves.find(item => item.dwkhBtId === btId);
return found ? found.value : '';
};
const handleChange = (value) => {
fbInfo.value = []
queryZbkhFbByIdApi({
mainId: props.formData.dataId,
pageNo: value.value
}).then(res => {
fbInfo.value = res.result.records
scrollTop.value = scrollTop.value ? 0 : 1 //
})
}
const onlinePreview = (e) => {
uni.navigateTo({
url: `/pages/onlinePreview/detail?data=${e}`
})
}
onMounted(() => {
queryById()
getSystemInfo()
})
</script>
<style lang="scss" scoped>
/* 滚动内容区域 */
.content-scroll {
width: 100%;
flex: 1;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
/* 底部占位视图 */
.bottom-spacer {
width: 100%;
}
/* 安全区域适配 */
.safe-area-tabbar {
/* #ifdef APP-PLUS || MP-WEIXIN */
padding-bottom: env(safe-area-inset-bottom);
/* #endif */
/* #ifdef H5 */
position: sticky;
bottom: 0;
/* #endif */
}
</style>

View File

@ -25,8 +25,8 @@
:rules="[{ required: true, message: '请选择开始时间' }]" :min-date="minBegintime" />
<wd-calendar label="结束时间" prop="endtime" v-model="model.endtime"
:rules="[{ required: true, message: '请选择结束时间' }]" :min-date="minEndtime" />
<wd-picker :label="examineleader" prop="examineleader" v-model="model.examineleader"
:columns="examineleaderData" :rules="[{ required: true, message: '请选择' + examineleader }]" />
<wd-picker label="审批领导" prop="examineleader" v-model="model.examineleader" v-if="zwmc == '0'"
:columns="examineleaderData" :rules="[{ required: true, message: '请选择审批领导'}]" />
<wd-picker label="单位劳资员" prop="hr" v-model="model.hr" :columns="hrData" v-if="zwmc == '0'"/>
<SelectUser label="班组长" v-model="model.teamleader" isRadioSelection v-if="zwmc == '0'"></SelectUser>
<wd-input label="出发地" prop="departure" v-model="model.departure"
@ -88,7 +88,6 @@
type: [], //[]0 form使
begintime: null,
endtime: null,
examineleader: '',
hr: '',
teamleader: '',
departure: appStore.location,
@ -101,8 +100,6 @@
const typeData = ref([])
const examineleaderData = ref([])
const hrData = ref([])
/**判断显示审批 / 分管领导*/
const examineleader = ref('')
const zwmc = ref('')
const ifOk = ref(true)
const minBegintime = ref(0)
@ -251,11 +248,6 @@
}
})
zwmc.value = res.result.zwmc
if (zwmc.value == '2') {
examineleader.value = '分管领导';
} else {
examineleader.value = '审批领导';
}
} else {
toast.warning(res.message)
setTimeout(() => {

View File

@ -67,8 +67,10 @@
if (res.success) {
info.value = res.result.records[0]
minDate.value = dateStringToTimestamp(info.value.begintime)
if(image.value.path){
image.value = info.value.path.split(',').map(path => imgUrl(path))
}
}
})
}

View File

@ -19,7 +19,7 @@
<wd-card title="解读材料">
<view style="color: blue;"
@click="onlinePreview(`/pages/onlinePreview/detail?data=${dataSource.jdwj}`)">
{{dataSource.jdwj}}
{{getFilename(dataSource.jdwj)}}
</view>
</wd-card>
</view>
@ -33,6 +33,9 @@
import {
queryDataById
} from '@/api/pages/file'
import {
getFilename
} from '@/utils'
const appStore = useAppStore()
const dataSource = ref({})

View File

@ -83,10 +83,7 @@
new base64().encode(baseUrl + url))
}
} else if (/^-?\d+$/.test(quote) && !insFlag) {
getJobDesIdByDepAndName({
jobname: quote,
jobdep: useUserStore().userInfo.orgCode
}).then((res) => {
getJobDesIdByDepAndName(quote).then((res) => {
fileUrl.value = getEnvBaseUrl() + '/jmreport/view/929517863011811328?id=' + res
.id +
"&token=" + useUserStore().userInfo.token;
@ -113,7 +110,7 @@
}
const getList = () => {
getListApi(useUserStore().userInfo.orgCode).then(res => {
getListApi().then(res => {
data.value = res.result
dataSource.value = [data.value.map(item => {
return {

View File

@ -1,16 +1,20 @@
<!-- component标签可以变换组件 -->
<template>
<view>
<component :is="asyncComponent" :formData="formData" :history="history" :activeKey="activeKey" v-if="asyncComponent"
@getStampSuc="getStampSuccess"></component>
<component ref="comptRef" :is="asyncComponent" :formData="formData" :history="history" :activeKey="activeKey"
v-if="asyncComponent" @getStampSuc="getStampSuccess"></component>
<view v-else>该模块暂未建立审批页面</view>
</view>
<wd-tabbar v-if="false">
<wd-tabbar-item></wd-tabbar-item>
</wd-tabbar>
<wd-pagination v-if="false"/>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted, computed, watch, nextTick } from 'vue';
<script setup>
const compName = ref('');
const asyncComponent = ref(null);
const modules = import.meta.glob('/src/pages-bpm/**/*.vue');
const comptRef = ref();
defineOptions({
@ -40,20 +44,31 @@
})
// option
watch(() => props.path, (newVal) => {
console.log("newVal----",newVal)
if (newVal) {
compName.value = newVal;
if(newVal.indexOf('index')==-1){
compName.value = newVal+'/index'
}
}
//
const comp = modules[`/src/pages-bpm/${compName.value}.vue`]
if (!comp) {
console.log(newVal)
if (newVal.indexOf('index') == -1) {
compName.value = newVal + '/index'
console.log(compName.value)
const comp2 = modules[`/src/pages-bpm/${compName.value}.vue`]
comp2().then((myModule) => {
asyncComponent.value = myModule.default
}).catch(() => {
})
}
} else {
comp().then((myModule) => {
asyncComponent.value = myModule.default
}).catch(() => {
})
}
}, {
deep: true,
// #ifdef MP-WEIXIN
@ -61,6 +76,17 @@
// #endif
});
const signValidator = () => {
console.log(comptRef.value)
//
if (!comptRef.value.signValidator) {
console.log(123124)
return null;
} else {
console.log(12)
return comptRef.value.signValidator()
}
}
const getStampSuccess = (val) => {
// this.$emit('getStampSuc', val)
@ -70,6 +96,10 @@
// esignTag: val
// });
}
defineExpose({ //
signValidator
})
</script>
<style lang="scss" scoped>

View File

@ -189,13 +189,14 @@
</template>
<script setup lang="ts">
import { ref, reactive, onMounted, computed, watch, nextTick } from 'vue';
import SelectUserModal from '@/components/SelectUser/components/SelectUserModal.vue'
import { getFileAccessHttpUrl } from '@/common/uitls'
import { useQueue } from 'wot-design-uni'
import Mupload from '@/components/Mupload/Mupload.vue'
import { getProcessTaskTransInfo, processComplete, taskEntrust, callBackProcessApi, sendMessageApi } from '@/api/process'
import { useToast, useMessage, useNotify, dayjs } from 'wot-design-uni'
const emit = defineEmits(['dataSubmit'])
defineOptions({
name: 'taskDeal',
@ -368,6 +369,25 @@
}
const handleProcessComplete = (nextNode) => {
emit('dataSubmit', val=>{
console.log(val)
let valiData = val
if (model.value.processModel == 3) {
valiData.flag = true;
}
console.log(valiData)
if (!valiData.flag) { // by
switch (valiData.type) {
case 0:
toast.error("请确认是否填写完表单或验证是否正确!")
break;
case 1:
toast.error("请确认是否盖章!")
break;
}
return
}
if (model.value.processModel == 4) { //4
message
.confirm({
@ -443,6 +463,9 @@
})
})
}
})
}
const handleManyProcessComplete = () => { //

View File

@ -14,7 +14,7 @@
<DynamicLink ref="linkRef" :path="path" :formData="formData"></DynamicLink>
</wd-tab>
<wd-tab title="任务处理" v-if="type!='history'">
<taskDeal :formData="formData" :useData="useData"></taskDeal>
<taskDeal :formData="formData" :useData="useData" @dataSubmit="dataSubmit"></taskDeal>
</wd-tab>
<wd-tab title="流程图">
<view class="container">
@ -52,16 +52,6 @@
</template>
<script setup lang="ts">
import {
ref,
computed
} from 'vue'
import {
onLoad,
onShow,
onReachBottom,
onPullDownRefresh
} from '@dcloudio/uni-app';
import { useToast, useMessage } from 'wot-design-uni'
import {
useAppStore
@ -93,6 +83,9 @@
const tab = ref(0)
const completedNum = ref(0);
const popup = ref(false)
const linkRef = ref();
const showFullScreen = () => {
popup.value = true
};
@ -123,6 +116,7 @@
formData.value = data;//
let tempFormUrl = res.result.formUrlMobile;
path.value = tempFormUrl; //url
formData.value.path = tempFormUrl; //path
}
})
} else {
@ -164,6 +158,29 @@
})
})
const dataSubmit = async (callback)=> { // by
//1.formform
//2.form
let callData = {
flag: false,
type: 0,
}
console.log(linkRef.value)
// if(linkRef.value.ifEsign){
let data = await linkRef.value.signValidator()
if(data==false||data==true){
callData.flag = data;
callData.type = 1;
}else{
callData.flag = true;
}
// }else{
// callData.flag = true;
// }
callback(callData);
}
const imgPath = computed(() => {
var params = qs.stringify({
'processInstanceId': formData.value.procInsId

View File

@ -22,8 +22,7 @@
"fontSize": "11px",
"iconWidth": "24px",
"spacing": "3px",
"list": [
{
"list": [{
"iconPath": "static/tabbar/tabbar-home-2.png",
"selectedIconPath": "static/tabbar/tabbar-home.png",
"pagePath": "pages/index/index",
@ -49,8 +48,7 @@
}
]
},
"pages": [
{
"pages": [{
"path": "pages/login/login",
"type": "home",
"style": {
@ -148,6 +146,15 @@
"navigationBarTitleText": "生产数据"
}
},
{
"path": "pages/sljd/index",
"type": "page",
"layout": "default",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": "实流检定"
}
},
{
"path": "pages/user/people",
"type": "page",
@ -208,24 +215,20 @@
"type": "page"
}
],
"subPackages": [
{
"subPackages": [{
"root": "pages-home",
"pages": [
{
"pages": [{
"path": "home/home",
"type": "page",
"layout": "default",
"style": {
"navigationBarTitleText": ""
}
}
]
}]
},
{
"root": "pages-message",
"pages": [
{
"pages": [{
"path": "chat/chat",
"type": "page",
"layout": "default",
@ -266,8 +269,7 @@
},
{
"root": "pages-user",
"pages": [
{
"pages": [{
"path": "userEdit/userEdit",
"type": "page",
"layout": "default",
@ -275,13 +277,11 @@
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
}
]
}]
},
{
"root": "pages-work",
"pages": [
{
"pages": [{
"path": "dragPage/index",
"type": "page",
"layout": "default",
@ -321,8 +321,7 @@
},
{
"root": "pages-sub",
"pages": [
{
"pages": [{
"path": "online/online",
"type": "page",
"layout": "default",
@ -353,8 +352,7 @@
},
{
"root": "pages-operate",
"pages": [
{
"pages": [{
"path": "file/detail",
"type": "page",
"layout": "default",
@ -385,8 +383,7 @@
},
{
"root": "pages-humanResource",
"pages": [
{
"pages": [{
"path": "absence/add",
"type": "page",
"layout": "default",
@ -447,8 +444,7 @@
},
{
"root": "pages-integrated",
"pages": [
{
"pages": [{
"path": "duty/index",
"type": "page",
"layout": "default",
@ -456,13 +452,11 @@
"navigationStyle": "custom",
"navigationBarTitleText": "干部值班"
}
}
]
}]
},
{
"root": "pages-politics",
"pages": [
{
"pages": [{
"path": "health/add",
"type": "page",
"layout": "default",
@ -470,13 +464,11 @@
"navigationStyle": "custom",
"navigationBarTitleText": "健康填报"
}
}
]
}]
},
{
"root": "pages-process",
"pages": [
{
"pages": [{
"path": "approvalTabbar",
"type": "page",
"layout": "default",
@ -507,15 +499,39 @@
},
{
"root": "pages-bpm",
"pages": [
"pages": [{
"path": "carRental/index",
"type": "page"
},
{
"path": "lawsAndRegulations/index",
"path": "document/index",
"type": "page"
},
{
"path": "khss/index",
"type": "page"
},
{
"path": "leaveApplication/index",
"type": "page"
},
{
"path": "unconventional/index",
"type": "page"
},
{
"path": "unconventional/stamp",
"type": "page"
},
{
"path": "zbkh/index",
"type": "page"
},
{
"path": "lawsAndRegulations/index",
"type": "page"
},
{
"path": "OfficeEquipmentMaintenanceApplication/index",
"type": "page"

View File

@ -103,7 +103,9 @@
import {
taskListApi
} from '@/api/process'
import { isH5 } from '@/utils/platform'
import {
isH5
} from '@/utils/platform'
defineOptions({
name: 'index',
@ -148,7 +150,6 @@
})
}
const goPageMore = (page) => {
router.replace({
name: 'more',
@ -159,19 +160,69 @@
})
}
const queryCarousel = () => {
//
queryCarouselApi({
const queryCarousel = async () => {
// 1.
const cachedData = await getCarouselCache();
// 2. 使
if (cachedData) {
carouselList.value = cachedData.data;
// 3. (25%)
const cacheAge = Date.now() - cachedData.timestamp;
if (cacheAge > 24 * 60 * 60 * 1000 * 7 * 0.75) { // 24 * 7
fetchAndUpdateCarousel(); //
}
return;
}
// 4.
await fetchAndUpdateCarousel();
};
const fetchAndUpdateCarousel = async () => {
try {
const res = await queryCarouselApi({
zslb: 6
}).then((res) => {
});
if (res.success) {
let arr = res.result.records[0].wenjian.split(',')
carouselList.value = arr.map((item) => {
return getEnvBaseUrl() + '/sys/common/static/' + item
})
const arr = res.result.records[0].wenjian.split(',');
const newData = arr.map(item => getEnvBaseUrl() + '/sys/common/static/' + item);
carouselList.value = newData;
setCarouselCache(newData);
}
})
} catch (error) {
console.error('更新轮播图失败:', error);
}
};
//
const getCarouselCache = () => {
const cacheStr = uni.getStorageSync('carousel_data')
if (!cacheStr) return null;
try {
const {
data,
timestamp
} = JSON.parse(cacheStr);
if (Date.now() - timestamp < 24 * 60 * 60 * 1000 * 7) {
return {
data,
timestamp
};
}
uni.removeStorageSync('carousel_data');
return null;
} catch {
return null;
}
};
//
const setCarouselCache = (data) => {
const cacheData = {
data,
timestamp: Date.now()
};
uni.setStorageSync('carousel_data', JSON.stringify(cacheData))
};
const queryModule = () => {
getUserPermissionApi({

View File

@ -105,9 +105,9 @@
let pw = Base64.encode(encodeURIComponent(password.value))
loading.value = true
/*生产环境 begin */
loginApi({ username: un, password: pw })
// loginApi({ username: un, password: pw })
/*开发环境 begin */
// loginApi({ username: userName.value, password: password.value, captcha: 'app' })
loginApi({ username: userName.value, password: password.value, captcha: 'app' })
.then((res : any) => {
if (res.success) {
const { result } = res

View File

@ -58,7 +58,6 @@
}
onLoad((options) => {
console.log(2222)
detail.value = options.data
detailArr.value = options.data.split(",");
//#ifdef H5 || MP-WEIXIN
@ -78,7 +77,6 @@
onShow (()=>{
//
console.log(ifBackAll.value)
if(ifBackAll.value){
//
uni.navigateBack({

137
src/pages/sljd/index.vue Normal file
View File

@ -0,0 +1,137 @@
<route lang="json5" type="page">
{
layout: 'default',
style: {
navigationStyle: 'custom',
navigationBarTitleText: '实流检定',
},
}
</route>
<template>
<view class="cert-status">
<view class="placeholder">
<view style="width: 100%; display: grid; place-items: center">
<uni-title :title=" '天然气产销厂天然气计量化验中心'" type="h1" color="white" />
<uni-title :title=" '证书防伪查询系统'" type="h1" color="red" />
<!-- 添加证书状态显示区域 -->
<view>
<span class="status-tag" :class="status === '有效' ? 'valid' : 'invalid'">{{ status }}</span>
<span>| {{ queryCount }}次查询</span>
<span>| 查询时间{{ queryTime }}</span>
</view>
</view>
</view>
<view navTitle="在线预览">
<iframe id="bdIframe" :src="fileUrl" ref="bdIframe" style="border: none;" class="iframe" />
</view>
</view>
</template>
<script setup>
import {
onLoad
} from '@dcloudio/uni-app';
import {
Base64
} from 'js-base64'
import {
ref,
watch
} from 'vue'
//
const status = ref('');
const queryCount = ref(0);
const queryTime = ref('');
var fileUrl = ref("");
const baseUrl = 'https://10.75.166.6/jeecg-boot/sys/common/static/';
onLoad((options) => {
let url = JSON.parse(options.data)
url = baseUrl + url;
fileUrl.value = 'https://szcx.zyyt.sinopec.com/preview/onlinePreview?url=' + encodeURIComponent(Base64
.encode(url))
//
//
loadCertificateStatus(options.certId || 'default-cert-id');
})
//
const loadCertificateStatus = (certId) => {
// API
const mockData = {
status: '有效', // ''
queryCount: 5,
queryTime: new Date().toISOString().split('T')[0]
};
//
status.value = mockData.status;
queryCount.value = mockData.queryCount;
queryTime.value = mockData.queryTime;
//
if (status.value === '无效') {
console.warn('证书无效ID:', certId);
}
}
// URL
watch(() => fileUrl.value, () => {
// URLID
// URL
})
</script>
<style>
#bdIframe {
position: absolute;
top: 20;
left: 0;
width: 100%;
height: 100%;
}
.placeholder {
height: v-bind(cusnavbarheight);
}
/* 证书状态样式 */
.cert-status {
margin-top: 20rpx;
font-size: 32rpx;
color: #fff;
padding: 16rpx 30rpx;
border-radius: 10rpx;
/* 深蓝色背景 */
background-color: #0a2463;
/* 科技感底纹 - 使用线性渐变和背景图案 */
background-image:
linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%),
linear-gradient(45deg, rgba(255, 255, 255, 0.05) 25%, transparent 25%, transparent 75%, rgba(255, 255, 255, 0.05) 75%);
background-size: 20rpx 20rpx;
background-position: 0 0, 10rpx 10rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.3);
}
.status-tag {
padding: 2rpx 10rpx;
border-radius: 4rpx;
font-weight: bold;
}
.valid {
color: #00b42a;
border: 1rpx solid #00b42a;
}
.invalid {
color: #e64340;
border: 1rpx solid #e64340;
}
</style>

View File

@ -52,9 +52,7 @@
</template>
<script lang="ts" setup>
import { ref, watch, onBeforeUnmount } from 'vue'
import { getFileAccessHttpUrl } from '@/common/uitls'
import { onLoad } from '@dcloudio/uni-app'
import { useToast, useMessage } from 'wot-design-uni'
import { useRouter } from '@/plugin/uni-mini-router'
import { http } from '@/utils/http'
@ -62,20 +60,22 @@
import useUpload from '@/hooks/useUpload'
import { getEnvBaseUrl } from '@/utils/index'
import { queryPostByUserIdApi, editUserApi } from '@/api/system/user'
import { useAppStore } from '@/store'
import { addApi } from '@/api/humanResource/clockin'
const appStore = useAppStore();
const userStore = useUserStore()
const toast = useToast()
const router = useRouter()
const message = useMessage()
const loading = ref(false)
const post = ref('')
let stopWatch : any = null
const dataSource = [
// { key: 'collect', title: '', class: 'cuIcon-favorfill text-yellow' },
// { key: 'redPacket', title: '', class: 'cuIcon-redpacket_fill text-red' },
{ key: 'setting', title: '个人资料', class: 'cuIcon-settingsfill text-cyan' },
{ key: 'clockin', title: '打卡', class: 'cuIcon-location text-cyan' },
{ key: 'scan', title: '扫码', class: 'cuIcon-scan text-red' },
// { key: 'location', title: '', class: 'cuIcon-location text-cyan' },
{ key: 'exit', title: '退出', class: 'cuIcon-exit text-cyan' },
]
@ -156,8 +156,28 @@
toast.warning('H5暂不支持')
// #endif
}
const clockin = () => {
// #ifndef H5
if (loading.value) return
addApi({
weizhi: appStore.clockin
}).then((res : any) => {
if(res.success){
toast.success(res.message)
}else{
toast.warning(res.message)
}
loading.value = true
})
// #endif
// #ifdef H5
toast.warning('H5暂不支持')
// #endif
}
const exit = () => {
console.log(message)
message
.confirm({
title: '提示',
@ -180,6 +200,9 @@
case 'exit':
exit()
break
case 'clockin':
clockin()
break
default:
toast.show('功能暂未开发~')
}

View File

@ -10,7 +10,7 @@ setRouteName(routes)
const router = createRouter({
routes: [...routes], //
})
export const whiteList = ['/pages/login/login']
export const whiteList = ['/pages/login/login','/pages/sljd/index' ]// 访 jiang20250605
export const loginPage = '/pages/login/login'
export const beforEach = (to, from, next) => {

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,3 @@
àRCopyright 1990-2009 Adobe Systems Incorporated.
All rights reserved.
See ./LICENSEáCNS2-H

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More