领导审批不同意后短信通知

This commit is contained in:
yangzhq68909 2025-05-28 14:52:04 +08:00
parent 3cefc4add1
commit 77c86f3a8f
5 changed files with 142 additions and 111 deletions

View File

@ -4,5 +4,5 @@ NODE_ENV = 'development'
VITE_DELETE_CONSOLE = false VITE_DELETE_CONSOLE = false
# 是否开启sourcemap # 是否开启sourcemap
VITE_SHOW_SOURCEMAP = true VITE_SHOW_SOURCEMAP = true
VITE_SERVER_BASEURL = 'http://10.75.15.247:8080/jeecg-boot' 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://36.112.48.190/jeecg-boot'

View File

@ -111,3 +111,11 @@ export function callBackProcessApi(config : object) { // 取回流程
data: config data: config
}) })
} }
export function sendMessageApi(config : object) { //
return http({
url: '/myAct/processInstance/sendMessage',
method: 'GET',
data: config
})
}

View File

@ -74,8 +74,7 @@
<label class="uni-list-cell uni-list-cell-pd uni-label-pointer"> <label class="uni-list-cell uni-list-cell-pd uni-label-pointer">
<!-- 点击的文字 --> <!-- 点击的文字 -->
<radio value="1" style="transform: scale(0.7);" :checked="true"></radio> <radio value="1" style="transform: scale(0.7);" :checked="true"></radio>
<view class="margin-left-sm text-sm">同意</view>
<view class="margin-left-sm text-sm">同意</view>
</label> </label>
<label class="uni-list-cell uni-list-cell-pd uni-label-pointer" v-if="resultObj.histListSize>0"> <label class="uni-list-cell uni-list-cell-pd uni-label-pointer" v-if="resultObj.histListSize>0">
<!-- 点击的文字 --> <!-- 点击的文字 -->
@ -195,7 +194,7 @@
import { getFileAccessHttpUrl } from '@/common/uitls' import { getFileAccessHttpUrl } from '@/common/uitls'
import { useQueue } from 'wot-design-uni' import { useQueue } from 'wot-design-uni'
import Mupload from '@/components/Mupload/Mupload.vue' import Mupload from '@/components/Mupload/Mupload.vue'
import { getProcessTaskTransInfo, processComplete, taskEntrust } from '@/api/process' import { getProcessTaskTransInfo, processComplete, taskEntrust, callBackProcessApi, sendMessageApi } from '@/api/process'
import { useToast, useMessage, useNotify, dayjs } from 'wot-design-uni' import { useToast, useMessage, useNotify, dayjs } from 'wot-design-uni'
defineOptions({ defineOptions({
@ -254,9 +253,13 @@
const props = defineProps({ const props = defineProps({
formData: { formData: {
type: Object, type: Object,
default: () => { }, default: () => { }
} },
useData: {
type: Object,
default: () => { }
}
}) })
const usePath = ref('流程办理附件') const usePath = ref('流程办理附件')
@ -365,7 +368,6 @@
} }
const handleProcessComplete = (nextNode) => { const handleProcessComplete = (nextNode) => {
console.log('-----', model.value)
if (model.value.processModel == 4) { //4 if (model.value.processModel == 4) { //4
message message
.confirm({ .confirm({
@ -373,7 +375,28 @@
title: '提示', title: '提示',
}) })
.then(() => { .then(() => {
let param = {
reason: model.value.reason,
bpmBizTitle: props.useData.bpmBizTitle,
processApplyUser: props.useData.processApplyUserId,
processApplyUserName: props.useData.processApplyUserName,
taskAssigneeName: props.useData.taskAssigneeName,
taskName: props.useData.taskName,
taskBeginTime: props.useData.taskBeginTime
}
callBackProcessApi({
processInstanceId: props.formData.procInsId
}).then((res) => {
if (res.success) {
sendMessageApi(param) //
toast.success(res.message)
setTimeout(() => { //2s
uni.navigateBack()
}, 2000)
} else {
toast.warning(res.message)
}
})
}) })
} else { } else {
if (!model.value.reason || model.value.reason.length == 0) { if (!model.value.reason || model.value.reason.length == 0) {
@ -394,7 +417,7 @@
toast.success(res.message) toast.success(res.message)
setTimeout(() => { //0.5s setTimeout(() => { //0.5s
uni.navigateBack() uni.navigateBack()
}, 1000) }, 2000)
} else { } else {
toast.error(res.message) toast.error(res.message)
} }

View File

@ -102,7 +102,6 @@
/**流程取回*/ /**流程取回*/
const callBackProcess = (id) => { const callBackProcess = (id) => {
console.log('----',id)
message message
.confirm({ .confirm({
msg: '确认取回流程吗?', msg: '确认取回流程吗?',

View File

@ -10,17 +10,18 @@
<template> <template>
<PageLayout :nav-title="type=='history'?'历史任务':'流程办理'"> <PageLayout :nav-title="type=='history'?'历史任务':'流程办理'">
<wd-tabs v-model="tab" color="#39b54a" autoLineWidth> <wd-tabs v-model="tab" color="#39b54a" autoLineWidth>
<wd-tab title="单据"> <wd-tab title="单据">
<DynamicLink ref="linkRef" :path="path" :formData="formData" ></DynamicLink> <DynamicLink ref="linkRef" :path="path" :formData="formData"></DynamicLink>
</wd-tab> </wd-tab>
<wd-tab title="任务处理" v-if="type!='history'"> <wd-tab title="任务处理" v-if="type!='history'">
<taskDeal :formData="formData"></taskDeal> <taskDeal :formData="formData" :useData="useData"></taskDeal>
</wd-tab> </wd-tab>
<wd-tab title="流程图"> <wd-tab title="流程图">
<view class="container"> <view class="container">
<view style="margin-bottom: 20px;height: 400px;overflow: hidden;overflow-y: auto;overflow-x: auto;background-color: #fff;"> <view
style="margin-bottom: 20px;height: 400px;overflow: hidden;overflow-y: auto;overflow-x: auto;background-color: #fff;">
<img :src="imgPath" style="border:2px;cursor:hand;" alt="流程图" usemap="#planetmap"> <img :src="imgPath" style="border:2px;cursor:hand;" alt="流程图" usemap="#planetmap">
<!-- <map name="planetmap"> <!-- <map name="planetmap">
<template v-for="(item, key, index) in nodePositionInfo.positionList"> <template v-for="(item, key, index) in nodePositionInfo.positionList">
<area shape="rect" :coords="item.coords" title="Venus" @touchstart="showNodeInfo(nodePositionInfo.hisTasks,item.id)"> <area shape="rect" :coords="item.coords" title="Venus" @touchstart="showNodeInfo(nodePositionInfo.hisTasks,item.id)">
</template> </template>
@ -28,17 +29,18 @@
</view> </view>
<wd-card title="流程历史追踪" type="rectangle"> <wd-card title="流程历史追踪" type="rectangle">
<wd-steps :active="completedNum" vertical> <wd-steps :active="completedNum" vertical>
<wd-step v-for="item in dataSource" > <wd-step v-for="item in dataSource">
<template #title> <template #title>
<view :class="{'content':true, 'shadow-blur':true, 'text-sm':true,'bg-green':item.endTime,'bg-gray':!item.endTime}"> <view
<text>流程节点{{item.name=='start'?'开始':item.name=='end'?'结束':item.name}}<br></text> :class="{'content':true, 'shadow-blur':true, 'text-sm':true,'bg-green':item.endTime,'bg-gray':!item.endTime}">
<text>负责人{{item.assigneeName}}<br></text> <text>流程节点{{item.name=='start'?'开始':item.name=='end'?'结束':item.name}}<br></text>
<text>开始时间{{item.startTime}}<br></text> <text>负责人{{item.assigneeName}}<br></text>
<text v-if="item.endTime">结束时间{{item.endTime}}<br></text> <text>开始时间{{item.startTime}}<br></text>
<text>{{item.deleteReason}}</text> <text v-if="item.endTime">结束时间{{item.endTime}}<br></text>
</view> <text>{{item.deleteReason}}</text>
</template> </view>
</wd-step> </template>
</wd-step>
</wd-steps> </wd-steps>
</wd-card> </wd-card>
</view> </view>
@ -77,10 +79,11 @@
import DynamicLink from './components/DynamicLink.vue' import DynamicLink from './components/DynamicLink.vue'
import taskDeal from './components/taskDeal.vue' import taskDeal from './components/taskDeal.vue'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const type = ref(''); const type = ref('');
const formData = ref({}) const formData = ref({})
const useData = ref({})
const nodePositionInfo = ref({}) const nodePositionInfo = ref({})
const dataSource = ref([]) const dataSource = ref([])
const path = ref('') //url const path = ref('') //url
@ -88,54 +91,50 @@
const tab = ref(0) const tab = ref(0)
const completedNum = ref(0); const completedNum = ref(0);
const handleClickLeft = () => { const handleClickLeft = () => {
uni.navigateBack() uni.navigateBack()
} }
const showNodeInfo= (data,taskId)=>{ const showNodeInfo = (data, taskId) => {
// this.$refs.nodeInfoModel.close(); // this.$refs.nodeInfoModel.close();
// this.$refs.nodeInfoModel.showInfo(data,taskId); // this.$refs.nodeInfoModel.showInfo(data,taskId);
} }
onLoad((options) => { onLoad((options) => {
console.log(options)
type.value = ''; type.value = '';
if(options.data){ if (options.data) {
type.value = options.data type.value = options.data
} }
const eventChannel = proxy.getOpenerEventChannel(); const eventChannel = proxy.getOpenerEventChannel();
eventChannel.on('taskData',(params)=>{ eventChannel.on('taskData', (params) => {
let useData = JSON.parse(params); useData.value = JSON.parse(params);
if(type.value!='history'){ if (type.value != 'history') {
getProcessNodeInfo({taskId:useData.id}).then(res=>{ getProcessNodeInfo({ taskId: useData.value.id }).then(res => {
if(res.success){ if (res.success) {
let data = { let data = {
dataId:res.result.dataId, dataId: res.result.dataId,
taskId:useData.id, taskId: useData.value.id,
taskDefKey:useData.taskId, taskDefKey: useData.value.taskId,
procInsId:useData.processInstanceId, procInsId: useData.value.processInstanceId,
tableName:res.result.tableName, tableName: res.result.tableName,
permissionList:res.result.permissionList, permissionList: res.result.permissionList,
vars:res.result.records, vars: res.result.records,
} }
formData.value = data;// formData.value = data;//
let tempFormUrl = res.result.formUrlMobile; let tempFormUrl = res.result.formUrlMobile;
path.value = tempFormUrl; //url path.value = tempFormUrl; //url
} }
}) })
}else{ } else {
getHisProcessNodeInfo({procInstId:useData.processInstanceId}).then(res=>{ getHisProcessNodeInfo({ procInstId: useData.value.processInstanceId }).then(res => {
if(res.success){ if (res.success) {
let data = { let data = {
dataId:res.result.dataId, dataId: res.result.dataId,
taskId:useData.id, taskId: useData.value.id,
taskDefKey:useData.taskId, taskDefKey: useData.value.taskId,
procInsId:useData.processInstanceId, procInsId: useData.value.processInstanceId,
tableName:res.result.tableName, tableName: res.result.tableName,
vars:res.result.records vars: res.result.records
} }
formData.value = data;// formData.value = data;//
console.log(res) console.log(res)
@ -146,30 +145,29 @@
}) })
} }
// getNodePositionInfo({processInstanceId:useData.processInstanceId}).then((res)=>{ // getNodePositionInfo({processInstanceId:useData.value.processInstanceId}).then((res)=>{
// if (res.success) { // if (res.success) {
// nodePositionInfo.value = res.result // nodePositionInfo.value = res.result
// } // }
// }) // })
getHisInfo({processInstanceId:useData.processInstanceId}).then((res)=>{ getHisInfo({ processInstanceId: useData.value.processInstanceId }).then((res) => {
if (res.success) { if (res.success) {
console.log(res) dataSource.value = res.result.records
dataSource.value = res.result.records //
// completedNum.value = res.result.records.length
completedNum.value = res.result.records.length res.result.records.forEach((item, index) => {
res.result.records.forEach((item,index)=>{ if (item.endTime) completedNum.value = index + 1
if(item.endTime) completedNum.value = index+1 })
})
} }
}) })
}) })
}) })
const imgPath = computed(()=>{ const imgPath = computed(() => {
var params = qs.stringify({ var params = qs.stringify({
'processInstanceId': formData.value.procInsId 'processInstanceId': formData.value.procInsId
}) })
let url = `${getEnvBaseUrl()}/act/task/traceImage?${params}`; let url = `${getEnvBaseUrl()}/act/task/traceImage?${params}`;
return url; return url;
@ -177,16 +175,17 @@
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
::v-deep .wd-tabs__line{ ::v-deep .wd-tabs__line {
background: #39b54a; background: #39b54a;
} }
::v-deep .wd-step.is-finished .wd-step__icon-outer{
::v-deep .wd-step.is-finished .wd-step__icon-outer {
border-color: #39b54a; border-color: #39b54a;
color: #fff; color: #fff;
background-color: #39b54a; background-color: #39b54a;
} }
::v-deep .wd-step.is-process .wd-step__icon-outer{ ::v-deep .wd-step.is-process .wd-step__icon-outer {
border-color: #f0f0f0; border-color: #f0f0f0;
color: #fff; color: #fff;
background-color: #f0f0f0; background-color: #f0f0f0;
@ -200,47 +199,49 @@
} }
.bg-green { .bg-green {
background-color: #39b54a; background-color: #39b54a;
color: #fff; color: #fff;
} }
.bg-green { .bg-green {
background-color: #39b54a; background-color: #39b54a;
color: #fff; color: #fff;
} }
.bg-gray { .bg-gray {
background-color: #f0f0f0; background-color: #f0f0f0;
color: #333; color: #333;
} }
.content{
.content {
padding: 5px 25px 5px 15px; padding: 5px 25px 5px 15px;
} }
.shadow-blur{
.shadow-blur {
position: relative; position: relative;
} }
.shadow-blur::before { .shadow-blur::before {
content: ""; content: "";
display: block; display: block;
background: inherit; background: inherit;
-webkit-filter: blur(5px); -webkit-filter: blur(5px);
filter: blur(5px); filter: blur(5px);
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 100%; height: 100%;
top: 5px; top: 5px;
left: 5px; left: 5px;
z-index: -1; z-index: -1;
opacity: .4; opacity: .4;
-webkit-transform-origin: 0 0; -webkit-transform-origin: 0 0;
transform-origin: 0 0; transform-origin: 0 0;
border-radius: inherit; border-radius: inherit;
-webkit-transform: scale(1); -webkit-transform: scale(1);
transform: scale(1); transform: scale(1);
}
.text-sm{
font-size: 12px;
} }
.text-sm {
font-size: 12px;
}
</style> </style>