473 lines
11 KiB
Vue

<template>
<view>
<!-- v-if="autoList.length > 0 && autoList.includes('审批列表') && !isHidden" -->
<view
class="header_box"
v-if="autoList.length > 0 && autoList.includes('创建审批') && !isHidden"
>
<view class="header_bg">
<headers :showBack="true" :themeType="'white'">
<view class="headerName">
<!-- 个人中心 -->
创建审批
</view>
</headers>
<view class="search">
<uni-search-bar
v-model="searchValue"
bgColor="#EEEEEE"
radius="5"
placeholder="搜索流程"
clearButton="auto"
cancelButton="none"
></uni-search-bar>
</view>
<!-- <uni-notice-bar show-icon show-close scrollable text="欢迎体验 wflow-pro工作流 移动端" /> -->
<!-- <view class="process-count">
<view class="count-item todo-item" @click="to(0)">
<view class="item-text">
<view>待我处理</view>
<view>{{ counter.todo }}</view>
</view>
<image mode="aspectFit" src="/static/image/pending1.png"></image>
</view>
<view>
<view class="count-item" @click="to(2)">
<view class="item-text">
<view>我发起的</view>
<view>{{ counter.mySubmited }}</view>
</view>
<image mode="aspectFit" src="/static/image/submit1.png"></image>
</view>
<view class="count-item" @click="to(3)">
<view class="item-text">
<view>抄送我的</view>
<view>{{ counter.cc }}</view>
</view>
<image mode="aspectFit" src="/static/image/cc1.png"></image>
</view>
</view>
</view> -->
</view>
<view class="w-app-items">
<uni-collapse v-if="dataList.length > 0">
<uni-collapse-item
class="w-group"
:open="true"
v-for="(group, index) in dataList"
:key="'group_' + index + group.items.length"
:border="false"
title-border="none"
>
<template #title>
<text class="w-group-title">{{ group.name }}</text>
<text>({{ group.items.length }})</text>
</template>
<view class="w-form-items">
<view
class="w-form-item"
v-for="(item, i) in group.items"
:key="'item_' + index"
@click="toSubmit(item)"
>
<view
class="w-form-icon"
:style="'background-color: ' + item.logo.background"
>
<l-icon
class="w-form-icon-ico"
color="#FFFFFF"
size="64rpx"
:name="item.logo.icon"
/>
</view>
<view class="w-form-name">{{ item.formName }} </view>
</view>
<!-- 用来占位的 -->
<view
class="w-form-item"
style="height: 0"
v-for="(item, i) in 2"
:key="'item_' + index"
>
</view>
</view>
</uni-collapse-item>
</uni-collapse>
<image
v-else
class="nodata"
src="/static/image/noData.png"
mode="widthFix"
></image>
</view>
</view>
<!-- <view v-else>
<view v-if="!loading" class="nullText">您无权限查看</view>
</view> -->
</view>
</template>
<script setup>
import headers from "@/components/headers/headers.vue";
import { computed, onMounted, ref, watch } from "vue";
import {
getGroupModelsByUser,
getProcessCountData,
getModuleAndMenuList,
} from "@/api/model.js";
import { onPullDownRefresh } from "@dcloudio/uni-app";
import { debounce } from "@/utils/tool.js";
const isHidden = ref(false);
const searchValue = ref(null);
const searchResult = ref([]);
const appList = ref([]);
const recentlyUsed = ref([]);
const counter = ref({
cc: 0,
mySubmited: 0,
todo: 0,
});
const autoList = ref([]);
const loading = ref(true);
onMounted(() => {
getPageData();
recentlyUsed.value = uni.getStorageSync("recentlyUsed") || [];
getAuto();
// uni.showToast({
// title: '暂未开发,敬请期待',
// icon: 'none'
// })
});
onPullDownRefresh(() => {
getPageData();
});
const searchDebounce = debounce(() => doSearch(), 800);
function getAuto() {
// 获取工作台显示权限
let loginUser = JSON.parse(uni.getStorageSync("loginUser"));
getModuleAndMenuList({
projectSn: loginUser.sn,
moduleType: 7,
userId: loginUser.userId,
}).then((res) => {
console.log(JSON.stringify(res), 777888);
let list = res.data.result.menuList;
console.log("我的数据啊啊啊", JSON.stringify(list));
autoList.value = list.map((item) => item.name);
loading.value = false;
});
}
async function filterRecentlyUsed(collect) {
recentlyUsed.value = recentlyUsed.value.filter((v) => collect.has(v.formId));
recentlyUsedStore();
}
const dataList = computed(() => {
if ((searchValue.value || "").trim() === "") {
if (recentlyUsed.value.length > 0) {
return [
{
id: 0,
name: "最近使用",
items: recentlyUsed.value,
},
...appList.value,
];
}
return appList.value;
}
return [
{
id: 0,
name: "搜索结果",
items: searchResult.value,
},
];
});
function doSearch() {
searchResult.value.length = 0;
appList.value.forEach((group) => {
group.items.forEach((item) => {
if (item.formName.indexOf(searchValue.value) > -1) {
searchResult.value.push(item);
}
});
});
}
function getPageData() {
const idSet = new Set();
getGroupModelsByUser(
{},
{
TenantId: JSON.parse(uni.getStorageSync("loginUser")).sn,
}
)
.then((rsp) => {
appList.value = rsp.data
.filter((v) => v.items.length > 0 && v.id !== 0)
.map((group) => {
group.items.forEach((item) => {
idSet.add(item.formId);
item.logo = JSON.parse(item.logo || "{}");
});
return group;
});
filterRecentlyUsed(idSet);
uni.stopPullDownRefresh();
})
.catch(() => {
recentlyUsed.value.length = 0;
isHidden.value = true;
uni.stopPullDownRefresh();
uni.showToast({
title: "暂未开发,敬请期待",
icon: "none",
});
});
getProcessCountData()
.then((rsp) => {
counter.value = rsp.data;
uni.stopPullDownRefresh();
})
.catch(() => {
uni.stopPullDownRefresh();
isHidden.value = true;
uni.showToast({
title: "暂未开发,敬请期待",
icon: "none",
});
});
}
function to() {
// uni.switchTab({
// url: '/pages/workspace/workspace'
// })
// console.log(JSON.stringify(webUni));
// webUni.webView.postMessage({
// data: {
// typee: "topage",
// url: "/pages/workspace/workspace"
// }
// })
// setTimeout(() => {
// uni.$emit('to:workspace', v)
// }, 200)
}
function toSubmit(item) {
if (!item.processDefId) {
uni.showToast({
icon: "none",
title: "该流程还未发布😢",
});
return;
}
const i = recentlyUsed.value.findIndex((v) => item.formId === v.formId);
if (i > -1) {
recentlyUsed.value.splice(i, 1);
}
if (recentlyUsed.value.length > 10) {
recentlyUsed.value.splice(recentlyUsed.value.length - 1, 1);
}
recentlyUsed.value.unshift(item);
recentlyUsedStore();
uni.navigateTo({
url: `/pages/submit/InitiateProcess?code=${item.formId}`,
});
}
function recentlyUsedStore() {
uni.setStorageSync("recentlyUsed", recentlyUsed.value);
}
watch(searchValue, async () => {
searchDebounce();
});
</script>
<style>
page {
background-color: #f4f5f7 !important;
}
</style>
<style lang="less" scoped>
.header_box::-webkit-scrollbar {
display: none; /* Chrome Safari */
}
.header_box {
position: relative;
height: 100vh;
overflow-y: auto;
background-image: url(/static/image/main_bg1.png);
background-repeat: no-repeat;
background-size: 100%;
background-attachment: fixed;
.header_bg {
width: 100vw;
// min-height: 330rpx;
// background: linear-gradient(180deg, #2B8DF3 0%, #F4F5FD 100%);
// position: absolute;
// top: 0;
position: relative;
}
}
.nullText {
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
font-size: 28rpx;
}
.w-group {
padding: 38rpx 0;
width: auto;
background-color: white;
margin: 6rpx 0;
border-radius: 10rpx;
}
.w-group-title {
font-weight: 600;
font-size: 35rpx;
margin-left: 32rpx;
}
.search {
.uni-searchbar {
padding: 20rpx 28rpx;
}
/deep/ .uni-searchbar__box {
background-color: white !important;
}
// background-color: white;
}
.w-app-items {
padding: 0 16rpx;
position: relative;
min-height: 50vh;
:deep(.uni-collapse) {
background: none;
}
.nodata {
width: 100%;
height: auto;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
}
.process-count {
display: flex;
padding: 28rpx;
& > view:first-child {
width: 40%;
}
& > view:last-child {
width: 60%;
}
.todo-item {
image {
width: 96rpx;
height: 96rpx;
}
.item-text {
display: block;
height: 100%;
& > view:first-child {
margin-bottom: 38rpx;
}
& > view:last-child {
color: #ec8151 !important;
font-weight: bold;
font-size: 58rpx !important;
}
}
}
.count-item {
display: flex;
justify-content: space-between;
align-items: center;
margin: 6rpx;
background-color: #ffffff;
border-radius: 10rpx;
padding: 24rpx;
.item-text {
& > view:last-child {
color: #b9b8b8;
font-weight: bold;
font-size: 38rpx;
}
}
}
image {
width: 58rpx;
height: 58rpx;
}
}
.w-form-items {
display: flex;
flex-wrap: wrap;
padding: 32rpx;
// justify-content: space-between;
.w-form-item {
width: 144rpx;
display: flex;
align-items: center;
flex-direction: column;
justify-content: center;
}
.w-form-name {
width: 128rpx;
padding: 6rpx 0;
overflow: hidden;
text-align: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.w-form-icon {
width: 96rpx;
height: 96rpx;
border-radius: 16rpx;
background-color: burlywood;
display: flex;
justify-content: center;
align-items: center;
.w-form-icon-ico {
color: white;
}
}
}
</style>