712 lines
16 KiB
Vue

<template>
<!-- autoList.length > 0 -->
<view class="content header_bg" v-if="autoList.length > 0">
<headers :showBack="true" :themeType="'white'">
<view class="headerName"> {{ tabsListName[current] == "待审批" ? '待办' : tabsListName[current]}} </view>
<view class="right" @click="screenData()">
<image class="scancode" src="@/static/bthgIcon/screen.png" mode=""></image>
</view>
</headers>
<!-- <view class="nav-type">
<movable-area style="width: 100%; height: 100%; overflow: hidden">
<movable-view direction="horizontal" style="min-width: 100%; width: 100%; height: 100%">
<uni-segmented-control :current="current" :values="tabs" @clickItem="switchItem" styleType="text"
activeColor="#ffffff"></uni-segmented-control>
</movable-view>
</movable-area>
</view> -->
<swiper :current="current" :duration="300" @change="tabChange" :style="{ height: contentHeight + 'px' }">
<swiper-item class="datas" v-for="(data, i) in pageData" :key="i">
<scroll-view v-if="data.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 data" :key="item.instanceId + i"
@click="showInstance(item)">
<view>
<text v-if="item.isCCme">
<van-badge dot :color="item.ccmeRead == 0 ? '#F49006' : '#67C23A'">
{{ item.processDefName }}
</van-badge>
</text>
<text v-else>
<!-- {{ (item.owner || item.staterUser || {}).name }}提交的 -->
{{ item.processDefName }}
</text>
<text @click.stop="readCcMeSubmit(item)" v-if="item.isCCme">
<uni-tag class="process-item-status" circle="true" :text="item.ccmeRead == 0 ? '待阅' : '已阅'"
:type="item.ccmeRead == 0 ? 'warning' : 'success'" inverted></uni-tag>
</text>
<uni-tag v-else 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" class="form-content-it">
<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"
:src="getRes((item.owner || item.staterUser).avatar)" :size="30"></avatar>
<text>在 {{ item.createTime || item.startTime }} 提交 </text>
</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="widthFix"></image>
</swiper-item>
</swiper>
<!-- closeable
close-icon="arrow-down"
close-icon-position="top-left" -->
<!-- 底部弹出 -->
<van-popup v-model:show="screenInfo.showBottom" :close-on-click-overlay="false" position="bottom" title="展示弹出层" :style="{ height: '70%' }">
<view class="screen_main">
<view class="screen_header">
<van-icon name="arrow-down" @click="cancel"/>
<view>筛选</view>
</view>
<view class="screen_container" @touchmove.stop @touch.stop>
<view class="screen_Itembox">
<view>状态</view>
<view class="screen_Items">
<view class="screen-item screen-item_active">全部</view>
</view>
</view>
<view class="screen_Itembox">
<view>表单</view>
<view v-for="item in screenInfo.groupModelsList" :key="item.id">
<view class="screen_Item_header">{{ item.name }}</view>
<view class="screen_Items">
<view @click="onCodeActive(ele)" :class="{'screen-item_active': screenInfo.code == ele.formId}" class="screen-item" v-for="ele in item.items" :key="ele.formId">
{{ ele.formName }}
</view>
</view>
</view>
</view>
</view>
<view class="screen_footer">
<view class="screen_footer-cancel" @click="cancel">取消</view>
<view class="screen_footer-confirm" @click="confirm">确定</view>
</view>
</view>
</van-popup>
</view>
<!-- <view v-else>
<view v-if="!loading" class="nullText">您无权限查看</view>
</view> -->
</template>
<script setup>
import headers from "@/components/headers/headers.vue";
import Avatar from "@/components/Avatar.vue";
import {
computed,
nextTick,
reactive,
ref
} from "vue";
import taskApi from "@/api/task";
import {
getModuleAndMenuList,
getGroupModelsByUser,
getProcessCountData,
getGroupModels
} from "@/api/model.js";
import {
getFormValText,
getRes
} from "@/utils/tool.js";
import {
onLoad,
onUnload,
onPullDownRefresh,
onReachBottom,
} from "@dcloudio/uni-app";
import {
getTaskResult,
getProcTag
} from "@/utils/ProcessUtil.js";
const tabsListName = ["待审批", "待催办", "已办结"];
const tabs = computed(() => {
const navs = ["待审批", "已审批", "已发起", "我的抄送"];
let arr = JSON.parse(JSON.stringify(autoList.value));
// console.log("autoList", arr)
arr = arr.filter((item) => navs.includes(item));
// pageData.value = arr.map(() => []);
arr[current.value] =
(arr[current.value] || "") + `-${datas.value.total || 0}`;
console.log("arr", arr)
return arr;
});
const contentHeight = computed(() => {
if(window.plus) {
return uni.getSystemInfoSync().windowHeight - uni.upx2px(200);
}
return uni.getSystemInfoSync().windowHeight - uni.upx2px(120);
});
const scrollTo = ref({
current: 0,
old: 0,
});
const current = ref(0);
const status = ref("more");
const params = ref({
pageSize: 10,
pageNo: 1,
code: "",
});
const screenInfo = reactive({
showBottom: false,
code: "",
groupModelsList: [],
});
//点击打开筛选
const screenData = () => {
console.log("screenData");
screenInfo.code = params.value.code;
screenInfo.showBottom = true;
};
const onCodeActive = (item) => {
console.log(item, "onCodeActive");
if(screenInfo.code == item.formId) {
screenInfo.code = "";
return
}
screenInfo.code = item.formId
};
const cancel = () => {
screenInfo.showBottom = false;
};
const confirm = () => {
params.value.code = screenInfo.code;
console.log("我是进来了1")
getDataList();
screenInfo.showBottom = false;
}
const getGroupModelsList = () => {
getGroupModels({}).then(rsp => {
if (rsp.statusCode == 200) {
screenInfo.groupModelsList = rsp.data.filter((item) => item.name != "已停用");
}
console.log(rsp, "getGroupModelsList");
})
};
//定义四组页面数据
const pageData = ref([
[],
[],
[],
[]
]);
const datas = ref({
pages: 1,
size: 10,
total: 0,
records: [],
});
let autoList = ref([]);
let loading = ref(true);
const isHidden = ref(false);
// onMounted(() => {
// getPageData()
// })
// 临时效果-为了隐藏内容
function getPageData() {
const idSet = new Set();
getGroupModelsByUser({}, {
TenantId: JSON.parse(uni.getStorageSync("loginUser")).sn,
})
.then((rsp) => {})
.catch(() => {
isHidden.value = true;
});
getProcessCountData()
.then((rsp) => {})
.catch(() => {
isHidden.value = true;
});
}
const readCcMeSubmit = (row) => {
if (row.ccmeRead != 0) return;
taskApi
.updateReadCcMe({
instanceId: row.instanceId,
nodeId: row.nodeId
})
.then(res => {
// console.log(res);
if (res.data == '成功') {
uni.showToast({
title: '操作成功!',
icon: 'none'
})
params.value.pageNo = 1;
getDataList();
}
});
}
function getStatus(item) {
let navs = tabs.value[current.value];
if (navs.indexOf("-") >= 0) {
navs = navs.split("-")[0];
}
switch (navs) {
case "待审批":
// return {
// text: "待处理",
// type: "warning",
// };
return getProcTag(item.result);
case "已审批":
return getTaskResult(item);
case "已发起":
case "我的抄送":
return getProcTag(item.result);
}
// case 0:
// return {
// text: '待处理', type: 'warning'
// };
// case 1:
// return getTaskResult(item);
// case 2:
// case 3:
// return getProcTag(item.result);
}
function getAuto() {
// 获取工作台显示权限
let loginUser = JSON.parse(uni.getStorageSync("loginUser"));
getModuleAndMenuList({
projectSn: loginUser.sn,
moduleType: 7,
userId: loginUser.userId,
}).then((res) => {
// let list = [];
let list = res.data.result.menuList;
autoList.value = list.map((item) => item.name);
let arr = JSON.parse(JSON.stringify(autoList.value));
const navs = ["待审批", "已审批", "已发起", "我的抄送"];
// arr = arr.filter((item) => navs.includes(item));
arr = navs;
autoList.value = arr;
pageData.value.length = arr.length;
loading.value = false;
console.log(autoList.value);
console.log("我是进来了2")
getDataList();
});
}
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 tabChange(e) {
let index = e.target.current || e.detail.current;
switchItem({
currentIndex: index,
});
}
function getDataRequest() {
// let navs = tabs.value[current.value];
let navs = tabsListName[current.value];
console.log(tabs.value, current.value);
if (navs.indexOf("-") >= 0) {
navs = navs.split("-")[0];
}
switch (navs) {
case "待审批":
// return taskApi.getUserTodoList(params.value);
console.log("我是进来了1", params.value)
return taskApi.getUserTodoListBaotou(params.value);
case "已审批":
return taskApi.getIdoList(params.value);
case "已发起":
return taskApi.getUserSubmittedList(params.value);
case "我的抄送":
return taskApi.getCcMeList(params.value);
case "已办结":
return taskApi.getUserSubmittedList({
...params.value,
customStatus: current.value,
});
case "待催办":
return taskApi.getUserSubmittedList({
...params.value,
customStatus: current.value,
});
}
}
function getDataList() {
status.value = "loading";
try {
getDataRequest().then((rsp) => {
uni.stopPullDownRefresh();
// console.log(JSON.stringify(rsp.data), 888999);
datas.value.total = rsp.data.total;
if (params.value.pageNo === 1) {
//datas.value.records.length = 0
pageData.value[current.value].length = 0;
}
pageData.value[current.value].push(...rsp.data.records);
//datas.value.records.push(...rsp.data.records)
status.value =
params.value.pageNo * params.value.pageSize < datas.value.total ?
"more" :
"noMore";
})
.catch((err) => {
uni.stopPullDownRefresh();
});
} catch (e) {
//TODO handle the exception
console.log(e);
}
}
function showInstance(item) {
uni.navigateTo({
url: `/pages/instance/instancePreview?instanceId=${
item.instanceId
}&nodeId=${current.value === 0 ? item.nodeId : null}`,
});
}
onLoad((v) => {
console.log(JSON.stringify(v), 987);
current.value = parseInt(v.current) || 0;
uni.hideTabBar();
// getDataList();
getAuto();
getGroupModelsList();
// uni.showToast({
// title: '暂未开发,敬请期待',
// icon: 'none'
// })
});
// 监听事件,快速跳转到对应项
uni.$on("to:workspace", (v) => {
switchItem({
currentIndex: v,
});
});
onUnload(() => uni.$off("to:workspace"));
onPullDownRefresh(() => {
getDataList();
});
function toNextPage() {
params.value.pageNo++;
getDataList();
}
</script>
<style lang="less" scoped>
:deep(.van-badge--top-right) {
right: -2rpx;
}
:deep(.uni-tag--circle){
border-radius: 30rpx !important;
}
.screen_main {
// display: flex;
padding: 20rpx 32rpx;
position: relative;
.screen_header {
display: flex;
align-items: center;
padding-bottom: 20rpx;
>view {
text-align: center;
flex: 1;
}
}
.screen_container {
overflow-y: scroll;
height: 58vh;
.screen_Itembox {
margin-top: 30rpx;
>view:first-child {
font-size: 28rpx;
color: #171717;
}
.screen_Item_header {
font-size: 24rpx;
color: #444444;
margin-top: 20rpx;
margin-left: 20rpx;
position: relative;
}
.screen_Item_header::before {
content: "";
display: inline-block;
width: 12rpx;
height: 12rpx;
background: #444444;
border-radius: 50%;
position: absolute;
left: -20rpx;
top: 50%;
transform: translateY(-50%);
}
.screen_Items {
display: flex;
// justify-content: space-between;
flex-wrap: wrap;
.screen-item {
font-size: 26rpx;
color: #444444;
margin-top: 20rpx;
width: calc(30.8% - 20rpx);
border-radius: 8rpx;
border: 2rpx solid #F3F4FE;
padding: 8rpx 10rpx;
display: flex;
justify-content: center;
align-items: center;
}
.screen-item:not(:nth-child(3n + 1)) {
margin-left: 20rpx;
}
.screen-item_active {
background: #2F8FF3;
color: white;
}
}
}
}
.screen_container::-webkit-scrollbar {
display: none; /* Chrome Safari */
}
.screen_footer {
width: calc(100% - 40rpx);
padding: 20rpx 0;
position: fixed;
bottom: 0;
left: 0;
display: flex;
justify-content: space-between;
.screen_footer-cancel {
width: 45%;
height: 60rpx;
border-radius: 8rpx;
border: 1px solid #F3F4FE;
display: flex;
align-items: center;
justify-content: center;
}
.screen_footer-confirm {
width: 45%;
height: 60rpx;
border-radius: 8rpx;
background-color: #2D8EF3;
color: white;
display: flex;
align-items: center;
justify-content: center;
}
}
}
/deep/ .right {
font-size: 24rpx;
position: absolute;
right: 20rpx;
top: 50%;
z-index: 4;
transform: translateY(-50%);
.scancode {
width: 44rpx;
height: 44rpx;
}
}
.header_bg {
width: 100vw;
min-height: 330rpx;
background-image: url(/static/image/main_bg1.png);
background-repeat: no-repeat;
background-size: 100%;
// background: linear-gradient(180deg, #2B8DF3 0%, #F4F5FD 100%);
// position: absolute;
// top: 0;
position: relative;
}
page {
background-color: #f4f5f7;
}
.nullText {
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
font-size: 28rpx;
}
.nav-type {
// position: fixed;
// top: 0;
width: 100%;
height: 72rpx;
// z-index: 999;
// overflow-x: scroll;
// background-color: white;
:deep(.segmented-control) {
width: 100%;
padding: 0 28rpx;
display: flex;
align-items: center;
justify-content: space-between;
.segmented-control__item {
width: max-content;
flex: none;
}
.segmented-control__item:not(:last-child) {
margin-right: 50rpx;
}
.segmented-control__text {
color: rgba(255, 255, 255, 0.7) !important;
}
.segmented-control__item--text {
border-bottom: none;
color: white !important;
}
}
}
.datas {
position: relative;
.nodata {
width: 100%;
height: auto;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.process-item {
margin: 32rpx;
border-radius: 13rpx;
background-color: white;
padding: 26rpx 32rpx;
position: relative;
.uni-tag {
line-height: 14rpx;
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:last-child {
font-size: 22rpx;
color: #8b8b8b;
}
}
}
}
.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>