mobile-workflow/components/form/sub/ProcessSelect.vue

255 lines
5.9 KiB
Vue
Raw Normal View History

2024-04-28 10:10:03 +08:00
<template>
<view class="content">
<view class="nav-type">
<uni-segmented-control :current="current" :values="tabs" @clickItem="switchItem" styleType="text"
activeColor="#4C87F3"></uni-segmented-control>
</view>
<view class="datas">
<scroll-view v-if="datas.records.length > 0" class="scrool-more"
:refresher-threshold="0" @scrolltolower="toNextPage" :scroll-top="scrollTo.current" @scroll="scroll"
enablePullDownRefresh @scrolltoupper="() => {}" :show-scrollbar="true"
:style="{height: contentHeight + 'px'}" scroll-y="true" scroll-with-animation="true">
<view class="process-item" v-for="(item, i) in datas.records" :key="item.instanceId + i"
@click="showInstance(item)">
<view>
<text>{{(item.owner || item.staterUser).name}}提交的 {{item.processDefName}}</text>
<uni-tag class="process-item-status" circle="true" :text="getStatus(item).text"
:type="getStatus(item).type" inverted></uni-tag>
</view>
<view class="form-content">
<view v-for="fd in item.formAbstracts || []" :key="fd.id">
<text style="color: #b5b5b5;">{{fd.name}}: </text>
<text class="over-tip">{{getFormValText(fd)}}</text>
</view>
</view>
<view class="process-item-footer">
<avatar :name="(item.owner || item.staterUser).name"
2024-05-25 13:53:36 +08:00
:src="getRes((item.owner || item.staterUser).avatar)" :size="30"></avatar>
2024-04-28 10:10:03 +08:00
<text> {{(item.createTime || item.startTime).substring(0, 16)}} 提交 </text>
<view @click.stop="selectProcess(item)">
<uni-icons color="#5976EF" type="checkbox" size="18"></uni-icons>
<text>选择</text>
</view>
</view>
</view>
<uni-load-more :status="status" mode="scaleToFill" :showIcon="false"></uni-load-more>
</scroll-view>
<image v-else class="nodata" src="/static/image/noData.png" mode="aspectFit"></image>
</view>
</view>
</template>
<script setup>
import Avatar from '@/components/Avatar.vue'
import { computed, nextTick, ref } from 'vue';
import taskApi from '@/api/task'
import { onLoad, onPullDownRefresh, onReachBottom } from "@dcloudio/uni-app";
import { getTaskResult, getProcTag } from '@/utils/ProcessUtil.js'
2024-05-25 13:53:36 +08:00
import { getFormValText, getRes } from '@/utils/tool.js'
2024-04-28 10:10:03 +08:00
const tabs = computed(() => {
const navs = ["待我处理", "已处理的", "我发起的", "抄送我的"]
navs[current.value] += `-${datas.value.total}`
return navs
})
const contentHeight = computed(() => {
return uni.getSystemInfoSync().windowHeight - 40
})
const scrollTo = ref({
current: 0,
old: 0
})
const current = ref(0)
const status = ref('more')
const params = ref({
pageSize: 10,
pageNo: 1,
code: ''
})
const datas = ref({
pages: 1,
size: 10,
total: 0,
records: []
})
function getStatus(item) {
switch (current.value) {
case 0:
return {
text: '待处理', type: 'warning'
};
case 1:
return getTaskResult(item);
case 2:
case 3:
return getProcTag(item.result);
}
}
function switchItem(v) {
current.value = v.currentIndex;
params.value.pageNo = 1;
getDataList();
scrollToTop()
}
function scroll(e){
scrollTo.value.old = e.detail.scrollTop
}
function scrollToTop(){
scrollTo.value.current = scrollTo.value.old
nextTick(() => {
scrollTo.value.current = 0
})
}
function selectProcess(item){
uni.$emit('selectProcess', {
id: item.instanceId,
name: item.processDefName,
startUser: item.owner || item.staterUser,
createTime: item.createTime || item.startTime
})
setTimeout(() => uni.navigateBack(), 100)
}
function getDataRequest() {
switch (current.value) {
case 0:
return taskApi.getUserTodoList(params.value);
case 1:
return taskApi.getIdoList(params.value);
case 2:
return taskApi.getUserSubmittedList(params.value);
case 3:
return taskApi.getCcMeList(params.value);
}
}
function getDataList() {
status.value = 'loading'
getDataRequest().then(rsp => {
uni.stopPullDownRefresh()
datas.value.total = rsp.data.total
if (params.value.pageNo === 1) {
datas.value.records.length = 0
}
datas.value.records.push(...rsp.data.records)
status.value = params.value.pageNo * params.value.pageSize < datas.value.total ? 'more' : 'noMore'
}).catch(err => {
uni.stopPullDownRefresh()
})
}
function showInstance(item) {
uni.navigateTo({
url: `/pages/instance/instancePreview?instanceId=${item.instanceId}&nodeId=${item.nodeId}`
})
}
onLoad((v) => {
2024-05-25 22:34:09 +08:00
params.value.code = v.processCode;
2024-04-28 10:10:03 +08:00
getDataList()
})
onPullDownRefresh(() => {
getDataList()
})
function toNextPage() {
params.value.pageNo++
getDataList()
}
</script>
<style lang="less" scoped>
page {
background-color: #F4F5F7;
}
.nav-type {
// position: fixed;
// top: 0;
// width: 100%;
// z-index: 999;
background-color: white;
}
.datas {
.nodata {
width: 100%;
}
.process-item {
margin: 32rpx;
border-radius: 13rpx;
background-color: white;
padding: 26rpx 32rpx;
position: relative;
.uni-tag {
font-weight: 400;
}
.process-item-status {
position: absolute;
right: 32rpx;
}
.form-content {
font-size: 26rpx;
color: #8B8B8B;
margin: 16rpx 16rpx;
.form-content-it {
overflow-x: hidden;
display: flex;
flex-wrap: wrap;
.over-tip {
margin-left: 5px;
}
}
}
.process-item-footer {
display: flex;
align-items: center;
justify-content: space-between;
&>text {
font-size: 22rpx;
color: #8B8B8B;
}
&>view:last-child {
color: #5976EF;
font-size: 32rpx;
display: flex;
align-items: center;
background-color: #5976ef26;
padding: 3px 5px;
border-radius: 5px;
}
}
}
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>