This commit is contained in:
2025-06-23 17:28:26 +08:00
parent 534adf126a
commit 1ae5c75f5e
6 changed files with 418 additions and 290 deletions

View File

@@ -163,7 +163,7 @@ const system = {
} else { } else {
return request({ return request({
method: MethodsENUM.POST, method: MethodsENUM.POST,
url: "/notice/getNotice", url: "/task/getAllExchangeLog",
data: data, data: data,
}); });
} }

View File

@@ -0,0 +1,40 @@
<script setup>
import BACK_TOP_ICON from "../static/icons/backtop.png";
const emits = defineEmits(['top', 'setScroll']);
const {tabs} = defineProps({
tabs: {
type: [],
default: () => []
}
});
</script>
<template>
<view class="bg-[rgba(29,33,41,1)] rounded-[12rpx] p-[8rpx] fixed top-1/2 -translate-y-1/2 right-0 z-[999]">
<view
@click="emits('top')"
class="py-[18rpx] px-[24rpx] !flex justify-around flex-col items-center h-[100rpx] bg-[rgba(78,89,105,1)] rounded-[8rpx]">
<image class="!h-[12rpx]" :src="BACK_TOP_ICON" mode="heightFix"></image>
<view class="text-[rgba(201,205,212,1)] test-28r">顶部</view>
</view>
<view class="h-[16rpx] !flex justify-center items-center">
<view class="w-[40rpx] bg-[#4E5969] h-[2rpx]"></view>
</view>
<template v-for="(v, index) in tabs">
<view class="py-[18rpx] px-[24rpx]" @click="emits('setScroll', v.value)">
<view :class="['text-[rgba(201,205,212,1)] test-28r', v.now ? 'text-white' : '']">{{ v.name1 }}</view>
<view :class="['text-[rgba(201,205,212,1)] test-28r', v.now ? 'text-white' : '']">{{ v.name2 }}</view>
</view>
<view class="h-[16rpx] !flex justify-center items-center" v-if="index < tabs.length-1">
<view class="w-[40rpx] bg-[#4E5969] h-[2rpx]"></view>
</view>
</template>
</view>
</template>
<style scoped lang="scss">
.text-white {
color: #fff;
}
</style>

View File

@@ -3,6 +3,7 @@ import {computed} from 'vue';
import messageIcon from "../static/icons/messageIcon.png"; import messageIcon from "../static/icons/messageIcon.png";
import XActionsheet from "./XActionsheet.vue"; import XActionsheet from "./XActionsheet.vue";
import OpenTypeFun from "./OpenTypeFun.js"; import OpenTypeFun from "./OpenTypeFun.js";
import {toPage} from "../utils/uils.js";
const itemList = computed(() => { const itemList = computed(() => {
const item = []; const item = [];
@@ -36,7 +37,7 @@ const selectActionsheet = (e) => {
@success="selectActionsheet" @success="selectActionsheet"
:itemList="itemList"> :itemList="itemList">
<view <view
@click.stop="OpenTypeFun(data)" @click.stop="type === 0 ? toPage(`/pages/taskDetails/index?id=${data.task_id}&task_children_id=${data.task_children_id}&tab=3`) : OpenTypeFun(data)"
class="!py-[30rpx] !px-[24rpx] bg-[#fff] rounded-[8rpx] !flex items-center gap-[20rpx] overflow-hidden relative !mb-[20rpx]"> class="!py-[30rpx] !px-[24rpx] bg-[#fff] rounded-[8rpx] !flex items-center gap-[20rpx] overflow-hidden relative !mb-[20rpx]">
<image class="!size-[72rpx] flex-shrink-0" mode="aspectFill" :src="messageIcon"></image> <image class="!size-[72rpx] flex-shrink-0" mode="aspectFill" :src="messageIcon"></image>
<view class="flex-grow !flex flex-col gap-[12rpx]"> <view class="flex-grow !flex flex-col gap-[12rpx]">

View File

@@ -54,7 +54,8 @@ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
<view class="px-[24rpx] py-[16rpx] bg-[#fff] rounded-[8rpx]" v-if="v.pattern===1"> <view class="px-[24rpx] py-[16rpx] bg-[#fff] rounded-[8rpx]" v-if="v.pattern===1">
<view v-html="v.content"></view> <view v-html="v.content"></view>
<view v-if="v.image_arr.length > 0"> <view v-if="v.image_arr.length > 0">
<x-image v-for="v in v.image_arr"></x-image> <x-image v-for="v in v.image_arr" :src="v"
style="width: 70rpx;height: 70rpx"></x-image>
</view> </view>
</view> </view>
<view class="px-[24rpx] py-[16rpx] bg-[#fff] rounded-[8rpx] test-24r text-[#4E5969]" v-else> <view class="px-[24rpx] py-[16rpx] bg-[#fff] rounded-[8rpx] test-24r text-[#4E5969]" v-else>

View File

@@ -1,7 +1,7 @@
<script setup> <script setup>
import goodsIcon from '../../static/icons/goodsIcon.png'; import goodsIcon from '../../static/icons/goodsIcon.png';
import XNav from "../../components/XNav.vue"; import XNav from "../../components/XNav.vue";
import {computed, defineAsyncComponent, getCurrentInstance, nextTick, onMounted, ref} from 'vue'; import {computed, defineAsyncComponent, getCurrentInstance, nextTick, onMounted, ref, reactive} from 'vue';
import {onLoad} from "@dcloudio/uni-app"; import {onLoad} from "@dcloudio/uni-app";
import XLink from "../../components/XLink.vue"; import XLink from "../../components/XLink.vue";
import XNoticeBar from "../../components/XNoticeBar.vue"; import XNoticeBar from "../../components/XNoticeBar.vue";
@@ -9,10 +9,12 @@ import XImage from "../../components/XImage.vue";
import Api from "../../api/index.js"; import Api from "../../api/index.js";
import dayjs from "dayjs"; import dayjs from "dayjs";
import XPrompt from "../../components/XPrompt.vue"; import XPrompt from "../../components/XPrompt.vue";
import {numberToCharacter, toPage} from "../../utils/uils.js"; import {numberToCharacter} from "../../utils/uils.js";
import AcceptAssignmentModal from "../../components/AcceptAssignmentModal.vue"; import AcceptAssignmentModal from "../../components/AcceptAssignmentModal.vue";
import ICON from "../../static/icons/prompt.png"; import ICON from "../../static/icons/prompt.png";
import XConfirmModal from "../../components/XConfirmModal.vue"; import XConfirmModal from "../../components/XConfirmModal.vue";
import LeftMenu from "../../components/LeftMenu.vue";
import {v4} from "uuid";
// #ifdef APP-PLUS // #ifdef APP-PLUS
// #endif // #endif
@@ -24,11 +26,13 @@ const MyBackfill = defineAsyncComponent(() => import('./components/MyBackfill.vu
const ReviewCommunication = defineAsyncComponent(() => import('./components/ReviewCommunication.vue')); const ReviewCommunication = defineAsyncComponent(() => import('./components/ReviewCommunication.vue'));
// #endif // #endif
const ScrollViewRef = ref();
const details = ref(null); const details = ref(null);
const home = ref(false); const home = ref(false);
const showInitModal = ref(false); const showInitModal = ref(false);
const mainDetailWidth = ref(0); const mainDetailWidth = ref(0);
const currentTabs = ref(0); const currentTabs = ref(0);
const HTYQ = ref();
const tabs = computed(() => [ const tabs = computed(() => [
{ {
name: "任务详情", name: "任务详情",
@@ -50,6 +54,45 @@ const tabs = computed(() => [
}, },
]); ]);
const delta = ref(1); const delta = ref(1);
const menuTabs = reactive([
{
id: v4(),
name1: '案例',
name2: '概览',
scroll: 'mainDetailBox',
now: true,
},
{
id: v4(),
name1: '回填',
name2: '要求',
scroll: 'HTYQ',
now: false,
},
{
id: v4(),
name1: '时间',
name2: '要求',
scroll: 'SJYQ',
now: false,
},
{
id: v4(),
name1: '扣款',
name2: '说明',
scroll: 'KKSM',
value: 9999,
now: false,
},
{
id: v4(),
name1: '其他',
name2: '说明',
scroll: 'QTSM',
value: 9999,
now: false,
},
]);
const getData = async (id, task_children_id) => { const getData = async (id, task_children_id) => {
const {data} = await Api.system.getTaskinfo(id || details.value.id, task_children_id || details.value?.children?.id); const {data} = await Api.system.getTaskinfo(id || details.value.id, task_children_id || details.value?.children?.id);
@@ -65,27 +108,68 @@ onLoad((options) => {
}); });
onMounted(() => { onMounted(() => {
nextTick(() => { setTimeout(() => {
const instancs = getCurrentInstance(); const instancs = getCurrentInstance();
uni.createSelectorQuery() let ALGL = 0;
.in(instancs) let HTYQ = 0;
.select("#mainDetailBox") let SJYQ = 0;
.boundingClientRect()
.exec((result) => { const mainDetailBox = document.querySelector('#mainDetailBox');
mainDetailWidth.value = result[0].width; const taskHeader = document.querySelector('#taskHeader');
}) const fbyq = document.querySelector('#FBYQ');
}); const htyq = document.querySelector('#HTYQ');
mainDetailWidth.value = mainDetailBox.clientWidth;
ALGL += taskHeader.clientHeight + 12.5;
HTYQ += ALGL + mainDetailBox.clientHeight + fbyq.clientHeight + 25;
SJYQ += HTYQ + htyq.clientHeight + 12.5;
menuTabs[0].value = ALGL;
menuTabs[1].value = HTYQ;
menuTabs[2].value = SJYQ;
}, 500);
if (home.value) showInitModal.value = true; if (home.value) showInitModal.value = true;
}) })
const scrollState = reactive({
top: 0,
});
const topTop = () => {
scrollState.top = 10;
nextTick(() => {
scrollState.top = 0;
});
}
const setScroll = (value) => {
nextTick(() => {
scrollState.top = value;
});
}
const scroll = ({detail: {scrollTop}}) => {
let last = menuTabs[0];
for (const k of menuTabs) {
if (scrollTop + 300 > k.value) {
last = k;
}
}
menuTabs.forEach(v => v.now = false);
menuTabs.find(v => v.id === last.id).now = true;
}
</script> </script>
<template> <template>
<!--任务详情--> <!--任务详情-->
<XNav :delta="delta"></XNav> <XNav :delta="delta"></XNav>
<x-notice-bar></x-notice-bar> <x-notice-bar></x-notice-bar>
<left-menu :tabs="menuTabs" @top="topTop" @setScroll="setScroll"></left-menu>
<view class="!p-[20rpx] !flex flex-col gap-[20rpx] box-border" v-if="details"> <scroll-view
<view class="rounded-[16rpx] !p-[24rpx] bg-[#fff] !flex flex-col gap-[20rpx]"> scroll-y
@scroll="scroll"
scroll-with-animation
:scroll-top="scrollState.top"
class="h-[calc(100vh-180rpx)]"
v-if="details">
<view class="!p-[20rpx] !flex flex-col gap-[20rpx] box-border">
<view id="taskHeader" class="rounded-[16rpx] !p-[24rpx] bg-[#fff] !flex flex-col gap-[20rpx]">
<view class="!flex gap-[30rpx]"> <view class="!flex gap-[30rpx]">
<image class="!size-[84rpx]" :src="goodsIcon"></image> <image class="!size-[84rpx]" :src="goodsIcon"></image>
<view class="flex-grow"> <view class="flex-grow">
@@ -192,7 +276,7 @@ onMounted(() => {
</view> </view>
<template v-if="currentTabs === 0"> <template v-if="currentTabs === 0">
<view class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]"> <view id="FBYQ" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full"> <view class="w-full">
<view class="title"> <view class="title">
发布要求 发布要求
@@ -254,7 +338,7 @@ onMounted(() => {
</view> </view>
</view> </view>
<view class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]"> <view id="HTYQ" ref="HTYQ" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full"> <view class="w-full">
<view class="title"> <view class="title">
回填要求 回填要求
@@ -286,7 +370,7 @@ onMounted(() => {
</view> </view>
</view> </view>
<view class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]"> <view id="SJYQ" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full"> <view class="w-full">
<view class="title"> <view class="title">
时间要求 时间要求
@@ -328,7 +412,7 @@ onMounted(() => {
</view> </view>
</view> </view>
<view class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]"> <view id="KKSM" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full"> <view class="w-full">
<view class="title"> <view class="title">
扣款说明 扣款说明
@@ -337,7 +421,8 @@ onMounted(() => {
v-for="(v, index) in details.settlement" v-for="(v, index) in details.settlement"
:key="v.id" :key="v.id"
class="block !flex !gap-0"> class="block !flex !gap-0">
<view class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)]"> <view
class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)]">
{{ index + 1 }}. {{ index + 1 }}.
</view> </view>
<view <view
@@ -355,7 +440,7 @@ onMounted(() => {
</view> </view>
</view> </view>
<view class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]"> <view id="QTSM" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden !p-[24rpx]">
<view class="w-full"> <view class="w-full">
<view class="title"> <view class="title">
其他说明 其他说明
@@ -391,6 +476,7 @@ onMounted(() => {
</view> </view>
</template> </template>
</view> </view>
</scroll-view>
<x-confirm-modal <x-confirm-modal
title="注意" title="注意"

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B