Merge branch 'test' of https://git.mcnetmart.com/guoxiangbin/ocr-web into fix/suspiciousSort

pull/168/head
raofuzi 1 year ago
commit 939a7344c8

@ -38,5 +38,6 @@
"json",
"jsonc",
"yaml"
]
],
"vue3snippets.enable-compile-vue-file-on-did-save-code": true
}

@ -1,13 +1,13 @@
<script lang="ts" setup>
import { dateZhCN, zhCN,NModalProvider } from "naive-ui";
import { computed, onMounted, nextTick,inject } from "vue";
import { dateZhCN, zhCN, NModalProvider } from "naive-ui";
import { computed, onMounted, nextTick, inject } from "vue";
import { AppProvider } from "@/components/Application";
import { lighten } from "@/utils/index";
import mouseTrapBind from '@/hooks/event/mouseTrapBind'
const mousetrap = inject('mousetrap') as any
onMounted(()=>{
import mouseTrapBind from "@/hooks/event/mouseTrapBind";
const mousetrap = inject("mousetrap") as any;
onMounted(() => {
mouseTrapBind(mousetrap);
})
});
const getThemeOverrides = computed(() => {
const theme = "#1980FF";
@ -49,8 +49,6 @@ const getThemeOverrides = computed(() => {
},
};
});
</script>
<template>
@ -59,10 +57,10 @@ const getThemeOverrides = computed(() => {
:date-locale="dateZhCN"
:theme-overrides="getThemeOverrides"
>
<NModalProvider>
<AppProvider>
<RouterView />
</AppProvider>
<NModalProvider>
<AppProvider>
<RouterView />
</AppProvider>
</NModalProvider>
</NConfigProvider>
</template>
@ -80,14 +78,28 @@ const getThemeOverrides = computed(() => {
color: #666666 !important;
font-size: 14px !important;
}
::v-deep(.n-base-clear > .n-base-clear__clear){
::v-deep(.n-base-clear > .n-base-clear__clear) {
color: #c9c9c9 !important;
}
.n-form-item.n-form-item--top-labelled .n-form-item-label{
.n-form-item.n-form-item--top-labelled .n-form-item-label {
flex-direction: row-reverse !important;
justify-content: flex-end !important;
}
.n-form-item .n-form-item-label .n-form-item-label__asterisk{
transform:rotate(-90deg) !important;
.n-form-item .n-form-item-label .n-form-item-label__asterisk {
transform: rotate(-90deg) !important;
}
.n-scrollbar-content {
padding: 0 7.97px 0 4px;
}
.n-form-item .n-form-item-label {
font-size: 14px !important;
color: #333333 !important;
}
.n-slider-dots > .n-slider-dot:nth-child(2) {
display: none !important;
}
.n-collapse-item-arrow i svg {
width: 14px !important;
height: 14px !important;
}
</style>

@ -43,6 +43,10 @@ function showModal(value) {
function closeModal() {
show.value = false
emit('close')
formData.disposeTypeId='262403670085013522'
formData.failCauseId= '260402999231251188'
formData.comment= ''
}
defineExpose({
@ -114,6 +118,9 @@ async function handleSumbit(e: MouseEvent) {
}
}
})
formData.disposeTypeId='262403670085013522'
formData.failCauseId= '260402999231251188'
formData.comment= ''
}
async function selectChange(id) {

@ -1,21 +1,17 @@
<script lang="ts" setup>
import { computed, unref } from 'vue'
import { Logo } from './components/Logo'
import { MainView } from './components/Main'
import { AsideMenu } from './components/Menu'
import { PageHeader } from './components/Header'
import { useProjectSetting } from '@/hooks/setting/useProjectSetting'
import { computed, unref } from "vue";
import { Logo } from "./components/Logo";
import { MainView } from "./components/Main";
import { AsideMenu } from "./components/Menu";
import { PageHeader } from "./components/Header";
import { useProjectSetting } from "@/hooks/setting/useProjectSetting";
const {
menuSetting,
} = useProjectSetting()
const { menuSetting } = useProjectSetting();
const leftMenuWidth = computed(() => {
const { minMenuWidth } = unref(menuSetting)
return minMenuWidth
})
const { minMenuWidth } = unref(menuSetting);
return minMenuWidth;
});
</script>
<template>
@ -45,12 +41,12 @@ const leftMenuWidth = computed(() => {
display: flex;
flex-direction: row;
flex: auto;
background-image: url('../assets/images/bg.png');
background-image: url("../assets/images/bg.png");
background-size: cover;
// height: 1100px;
// width: 1440px;
height: 100%;
max-height:1100px;
max-height: 1100px;
overflow: hidden;
.layout-sider {
min-height: 100vh;
@ -76,7 +72,7 @@ const leftMenuWidth = computed(() => {
display: flex;
flex: auto;
height: 100%;
padding: 0px 16px 24px 16px;
// padding: 0px 16px 24px 16px;
overflow-x: hidden;
box-sizing: border-box;
}

@ -1,7 +1,7 @@
import { defineStore } from 'pinia'
import type { TaskState } from '/#/task'
import { getApprovalList } from '@/api/task/task'
import { store } from '@/store'
import { defineStore } from 'pinia'
import type { TaskState } from '/#/task'
export const useTaskStore = defineStore({
id: 'task-store',
@ -12,6 +12,7 @@ export const useTaskStore = defineStore({
packageid: '',
immersion: false,
inFile: false, // 是否进入文件夹
inFileId:"",
}),
getters: {
getActiveId: (state: TaskState) => state.activeId,
@ -19,6 +20,7 @@ export const useTaskStore = defineStore({
getCurrentIndex: (state: TaskState) => state.currentIndex,
getApprovalList: (state: TaskState) => state.approvalList,
getInFile: (state: TaskState) => state.inFile,
getInFileId: (state: TaskState) => state.inFileId,
},
actions: {
setApprovalList(list: any[]) {
@ -27,6 +29,9 @@ export const useTaskStore = defineStore({
setInFile(flag: any) {
this.inFile = flag
},
setInFileId(id: any) {
this.inFileId = id
},
setActive(index: number, taskId?: string) {
this.currentIndex = index
const task = this.approvalList[index]

@ -254,13 +254,13 @@ const moveEnd = () => {
});
};
const setCurrentlySelectedAdvanced = (value:string)=>{
const setCurrentlySelectedAdvanced = (value: string) => {
currentlySelectedAdvanced.value = value;
}
};
defineExpose({
setCurrentlySelectedAdvanced
})
setCurrentlySelectedAdvanced,
});
</script>
<template>
@ -277,9 +277,15 @@ defineExpose({
>
<template #trigger>
<div class="wrapper-left-dropdown" @click="showClick">
<span style="font-size: 20px; color: #333333; font-weight: Medium;font-size:17px;font-weight:600">{{
currentlySelectedAdvanced
}}</span>
<span
style="
color: #333333;
font-weight: Medium;
font-size: 17px;
font-weight: 600;
"
>{{ currentlySelectedAdvanced }}</span
>
<SvgIcon
:style="{ marginLeft: '5px' }"
name="down"
@ -293,8 +299,12 @@ defineExpose({
<n-form :rules="rules" ref="ruleformRef" :model="ruleForm">
<n-form-item path="keyword">
<n-input
:style="{ '--n-border': '0px', '--n-display': 'block' }"
placeholder="请输入关键字"
:style="{
'--n-border': '0px',
'--n-display': 'block',
'--n-height': '40px',
}"
placeholder="请输入关键词"
@input="inputHandler"
:value="ruleForm.keyword"
:minlength="2"
@ -304,7 +314,7 @@ defineExpose({
</template>
<template #suffix>
<SvgIcon
size="14px"
size="16"
style="cursor: pointer"
name="setting"
@click="emit('show-filter')"
@ -362,13 +372,13 @@ defineExpose({
class="cursor-move draggable-li fix"
:draggable="true"
>
<SvgIcon name="drag" size="18" style="margin-right: 3px" />
<SvgIcon name="drag" size="10" style="margin-right: 3px" />
<SvgIcon
v-if="item.favorite && !item.isDefaultFilter"
name="favorite-fill"
color="#fd9b0a"
width="13"
height="12"
height="12"
fill="#666666"
style="cursor: pointer !important; margin-right: 3px"
@click="unFavoriteHandler($event, item)"
@ -377,7 +387,7 @@ defineExpose({
v-else-if="!item.favorite && !item.isDefaultFilter"
name="favorite-unfill"
width="13"
height="12"
height="12"
fill="#666666"
style="cursor: pointer !important; margin-right: 3px"
@click="favoriteHandler($event, item)"
@ -414,9 +424,9 @@ defineExpose({
align-items: center;
position: absolute;
left: 0;
top: -10px;
width: 100%;
padding: 12px 16px;
padding: 17px 16px;
border-bottom: 1px solid #e8e8e8;
z-index: 10;
background: #ffffff;
@ -457,8 +467,6 @@ defineExpose({
line-height: 22px;
padding: 8px 12px;
&:hover {
background-color: #f3f8ff;
}
@ -471,6 +479,10 @@ defineExpose({
align-items: center;
}
}
.wrapper-left-popover {
width: 248px;
height: 288px;
}
::v-deep(.wrapper-left-popover .n-form-item) {
display: block !important;
}

@ -10,12 +10,12 @@ configUseStore.$subscribe(() => {
return;
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izsimilarity']) {
range.value = asideValue['izsimilarity']
}else {
if (asideValue["izsimilarity"]) {
range.value = asideValue["izsimilarity"];
} else {
range.value = [0, 100];
}
console.log(range.value, 'range.value')
console.log(range.value, "range.value");
// else {
// range.value = [0, 100];
// }

@ -1,54 +1,53 @@
<script lang="ts" setup>
import dayjs from 'dayjs';
import { onUpdated, watch } from 'vue';
import { onMounted, ref } from 'vue';
import { useConfig } from '@/store/modules/asideConfig'
import dayjs from "dayjs";
import { onUpdated, watch } from "vue";
import { onMounted, ref } from "vue";
import { useConfig } from "@/store/modules/asideConfig";
const configUseStore = useConfig()
const configUseStore = useConfig();
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
if (isLoadValue.value) {
isLoadValue.value = false;
return
return;
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izyear']) {
time.value = asideValue['izyear']
}else {
if (asideValue["izyear"]) {
time.value = asideValue["izyear"];
} else {
time.value = null;
}
});
const props = defineProps<{
value: [number, number] | null
label: string
}>()
value: [number, number] | null;
label: string;
}>();
const emit = defineEmits<{
(e: 'update:value', value: number[]): void
}>()
(e: "update:value", value: number[]): void;
}>();
const time = ref<[number, number] | null>(props.value)
const isLoadValue = ref(false)
const time = ref<[number, number] | null>(props.value);
const isLoadValue = ref(false);
function onChange(value: [number, number]) {
isLoadValue.value = true;
emit('update:value', value)
emit("update:value", value);
}
onMounted(() => {
if(!props.value) {
//
const currentDate = dayjs();
//
const endDate = currentDate.toDate();
const startDate = currentDate.subtract(3, 'month').toDate();
//
time.value = [startDate.getTime(), endDate.getTime()];
console.log('time init', startDate.getTime(), endDate.getTime());
setTimeout(() => {
emit('update:value', [startDate.getTime(), endDate.getTime()])
},300)
}
})
if (!props.value) {
//
const currentDate = dayjs();
//
const endDate = currentDate.toDate();
const startDate = currentDate.subtract(3, "month").toDate();
//
time.value = [startDate.getTime(), endDate.getTime()];
console.log("time init", startDate.getTime(), endDate.getTime());
setTimeout(() => {
emit("update:value", [startDate.getTime(), endDate.getTime()]);
}, 300);
}
});
</script>
<template>
@ -56,10 +55,14 @@ onMounted(() => {
<n-collapse :default-expanded-names="['1']" arrow-placement="right">
<n-collapse-item :title="label" name="1">
<n-space>
<n-date-picker v-model:value="time" type="daterange" :clearable="false" @update:value="onChange">
<template #separator>
</template>
<n-date-picker
v-model:value="time"
type="daterange"
:clearable="false"
@update:value="onChange"
placeholder="请选择"
>
<template #separator> </template>
</n-date-picker>
</n-space>
</n-collapse-item>
@ -79,15 +82,20 @@ onMounted(() => {
::v-deep(.n-input__separator) {
color: #999999 !important;
}
::v-deep(.n-collapse .n-collapse-item:not(.n-collapse-item--disabled).n-collapse-item--trigger-area-main .n-collapse-item__header .n-collapse-item__header-main){
::v-deep(.n-collapse
.n-collapse-item:not(.n-collapse-item--disabled).n-collapse-item--trigger-area-main
.n-collapse-item__header
.n-collapse-item__header-main) {
margin-left: 10px;
}
::v-deep(.n-collapse .n-collapse-item:not(.n-collapse-item--disabled).n-collapse-item--trigger-area-main .n-collapse-item__header .n-collapse-item__header-main::before){
content: '*';
::v-deep(.n-collapse
.n-collapse-item:not(.n-collapse-item--disabled).n-collapse-item--trigger-area-main
.n-collapse-item__header
.n-collapse-item__header-main::before) {
content: "*";
position: absolute;
left: 0;
top: 2px;
color: red;
}
</style>

@ -378,7 +378,7 @@ async function tasksLoadingCloseCallback() {
async function showLoginSuccessModal() {
const modal = LoginSuccessModalRef.value as any;
modal.showModal()
modal.showModal();
}
// id
@ -623,9 +623,8 @@ const loadImgOver = (item) => {
};
defineExpose({
showLoginSuccessModal
})
showLoginSuccessModal,
});
</script>
<template>
@ -633,7 +632,7 @@ defineExpose({
<div class="wrapper-header">
<div class="left">
<SvgIcon size="32" name="magnifying" />
<span class="font" style="margin-left: 19.2px;" >AI一键查重</span>
<span class="font" style="margin-left: 19.2px">AI一键查重</span>
</div>
<div class="flex-btn-icon">
<SvgIcon

@ -1,73 +1,120 @@
<script lang="ts" setup>
import { defineOptions, onMounted, ref, onBeforeUnmount } from 'vue';
import { useRouter } from 'vue-router';
defineOptions({ name: 'ShortcutModal' })
import { defineOptions, onMounted, ref, onBeforeUnmount } from "vue";
import { useRouter } from "vue-router";
defineOptions({ name: "ShortcutModal" });
const emit = defineEmits<{
(e: 'refresh', value: any),
(e: 'cancel', value: any)
}>()
(e: "refresh", value: any);
(e: "cancel", value: any);
}>();
const show = ref(false)
const isFold = ref(false)
const router = useRouter()
const show = ref(false);
const isFold = ref(false);
const router = useRouter();
const cardStyle = {
'width': '29vw',
'--n-padding-bottom': '10px',
'--n-padding-left': '10px',
}
width: "29vw",
"--n-padding-bottom": "10px",
"--n-padding-left": "10px",
};
function toggle() {
isFold.value = !isFold.value
isFold.value = !isFold.value;
}
function showModal() {
show.value = true
show.value = true;
}
function closeModal() {
show.value = false
show.value = false;
}
function refresh() {
emit('refresh', true)
emit("refresh", true);
}
function cancel() {
closeModal()
emit('cancel', true)
closeModal();
emit("cancel", true);
}
const time = ref();
onMounted(() => {
time.value = setInterval(() => {
// console.log("00000000-----------");
show.value && refresh();
}, 5000);
time.value = setInterval(() => {
// console.log("00000000-----------");
show.value && refresh();
}, 5000);
});
onBeforeUnmount(() => {
onBeforeUnmount(() => {
clearInterval(time.value);
time.value = null;
time.value = null;
});
defineExpose({
showModal,
closeModal
})
closeModal,
});
</script>
<template>
<template>
<div class="removeMask">
<!-- <n-modal v-model:show="show" :show-mask="false" :mask-closable="false" transform-origin="center" style="position: fixed;right: 0;bottom: 0;"> -->
<div v-if="show" style="position: fixed;right: 0;bottom: 0; float: left; z-index: 999;" >
<n-card :style="cardStyle" :bordered="false" size="huge" role="dialog" aria-modal="true" style="padding: 8px 8px 0 8px;">
<div
v-if="show"
style="
position: fixed;
right: 0;
bottom: 0;
float: left;
z-index: 999;
width: 360px;
height: 157px;
"
>
<n-card
:style="cardStyle"
:bordered="false"
size="huge"
role="dialog"
aria-modal="true"
style="padding: 8px 8px 0 8px"
>
<div class="wrapper">
<div class="title">查重进度</div>
<div class="icon-list">
<svg-icon size="20" name="refresh" @click="refresh" style="margin-right: 16px;cursor: pointer;" />
<svg-icon v-show="!isFold" size="20" name="down-line" style="margin-right: 16px;cursor: pointer;" @click="toggle"/>
<svg-icon v-show="isFold" size="20" name="top-line" style="margin-right: 16px;cursor: pointer;" @click="toggle"/>
<svg-icon size="20" name="close-none-border" @click="cancel" style="margin-right: 16px;cursor: pointer;"/>
<svg-icon
size="16"
name="refresh"
@click="refresh"
style="margin-right: 16px; cursor: pointer"
/>
<svg-icon
v-show="!isFold"
size="16"
name="down-line"
style="margin-right: 16px; cursor: pointer"
@click="toggle"
/>
<svg-icon
v-show="isFold"
size="16"
name="top-line"
style="margin-right: 16px; cursor: pointer"
@click="toggle"
/>
<svg-icon
size="16"
name="close-none-border"
@click="cancel"
style="margin-right: 25.7px; cursor: pointer"
/>
</div>
</div>
<div v-show="!isFold" style="display: flex;background-color: #F9F9F9;height: 54px;margin-top: 24px;margin-bottom: 6px;">
<div
v-show="!isFold"
style="
display: flex;
background-color: #f9f9f9;
height: 54px;
margin-top: 24px;
margin-bottom: 6px;
"
>
<div><svg-icon size="40" name="robot2" /></div>
<div class="msg">
<div>正在查重中</div>
@ -80,19 +127,22 @@ defineExpose({
</template>
<style lang="less" scoped>
.wrapper{
.wrapper {
display: flex;
justify-content: space-between;
width: 357px;
border-bottom: 1px solid rgba(0, 0, 0, 0.09);
margin: 0 -18px;
}
.icon-list{
.icon-list {
}
.title {
padding-left: 24px;
padding-top: 6px;
padding-bottom: 10px;
color: #333333;
font-size: 16px
font-size: 16px;
font-weight: 500;
}
.msg {

@ -74,7 +74,6 @@ defineExpose({
<div class="num_box">{{ 83 }}</div>
<div class="title_box">重复图片</div>
</div>
</div>
<div class="footer" @click="viewRepeat"></div>
<!-- <div class="footer">
@ -106,7 +105,7 @@ defineExpose({
left: calc(50% - 286px);
.wrapper-hearder {
margin-top: 80px;
margin-left:18px;
margin-left: 18px;
.wrapper-title {
text-align: center;
font-size: 16px;
@ -214,8 +213,9 @@ defineExpose({
position: relative;
bottom: -30px;
left: 20px;
font-size: 24px;
font-size: 20px;
font-weight: 400;
font-family: YouSheBiaoTiHei, YouSheBiaoTiHei-Regular;
text-align: center;
color: #ffffff;

@ -121,7 +121,9 @@ function afterLeave() {
&-bar {
background-color: #f8f8f8;
width: 100%;
margin-top: 20px;
margin-top: 24px;
font-size: 16px;
margin-bottom: 16px;
span {
color: #333;
}
@ -137,6 +139,7 @@ function afterLeave() {
::v-deep(.n-form-item-label) {
color: #666;
font-weight: 500;
margin-bottom: 8px;
}
}
@ -160,6 +163,10 @@ function afterLeave() {
display: flex;
justify-content: flex-end;
padding-bottom:6px ;
button{
font-size: 14px !important;
font-weight: 500 !important;
}
}
&-info {
@ -177,4 +184,8 @@ function afterLeave() {
}
}
}
::v-deep(.n-button--info-type){
}
</style>

@ -1,63 +1,72 @@
<script lang="ts" setup>
import { ref } from 'vue';
import { useConfig } from '@/store/modules/asideConfig'
import { ref } from "vue";
import { useConfig } from "@/store/modules/asideConfig";
const emit = defineEmits<{
(e: 'closeCallback', value: any),
}>()
(e: "closeCallback", value: any);
}>();
const show = ref(false)
const show = ref(false);
const stys = {
'width': '424px',
'height': '232px',
'--n-padding-bottom': '20px',
'--n-padding-left': '0px',
'background': 'linear-gradient(132deg, rgba(255, 255, 255, 0.32) 21%, rgba(152, 172, 255, 0.14) 100%)',
'border-radius': '4px',
'box-shadow': '0px 12px 48px 16px rgba(0, 0, 0, 0.03)',
'backdrop-filter': ' blur(10px)',
}
width: "424px",
height: "232px",
"--n-padding-bottom": "20px",
"--n-padding-left": "0px",
background:
"linear-gradient(132deg, rgba(255, 255, 255, 0.32) 21%, rgba(152, 172, 255, 0.14) 100%)",
"border-radius": "4px",
"box-shadow": "0px 12px 48px 16px rgba(0, 0, 0, 0.03)",
"backdrop-filter": " blur(10px)",
};
function showModal() {
show.value = true
show.value = true;
}
function closeModal() {
show.value = false
emit('closeCallback', true)
show.value = false;
emit("closeCallback", true);
}
function closeOnlyModal() {
show.value = false
show.value = false;
}
defineExpose({
showModal,
closeModal,
closeOnlyModal,
})
});
const configStore = useConfig()
const configStore = useConfig();
const percent = ref(0);
configStore.$subscribe(() => {
percent.value = configStore.getTimeNum;
});
</script>
<template>
<n-modal v-model:show="show" :mask-closable="false" :show-mask="false" transform-origin="center">
<n-modal
v-model:show="show"
:mask-closable="false"
:show-mask="false"
transform-origin="center"
>
<n-card :style="stys" :bordered="false" role="dialog" aria-modal="true">
<svg-icon size="15" name="close" @click="closeModal" style="position:absolute; right:6px;top:6px;cursor: pointer;"/>
<svg-icon
size="15"
name="close"
@click="closeModal"
style="position: absolute; right: 15.7px; top: 6px; cursor: pointer"
/>
<div class="wrapper">
<svg-icon size="90" name="robot2" />
<span style="margin-top: 24px;">正在查重中</span>
<span style="margin-top: 24px">正在查重中</span>
</div>
<div style="padding: 0 20px;">
<n-progress type="line" :percentage="percent" :show-indicator="false"/>
<div style="padding: 0 20px">
<n-progress type="line" :percentage="percent" :show-indicator="false" />
</div>
</n-card>
</n-modal>
@ -71,5 +80,4 @@ configStore.$subscribe(() => {
justify-content: center;
align-items: center;
}
</style>

@ -20,7 +20,7 @@ const showLoginModal = ()=>{
<Content ref="contentRef"/>
<!-- 机器人 -->
<Robot :canClick="true" @click="showLoginModal"/>
<!-- <Robot :canClick="true" @click="showLoginModal"/> -->
</div>
</template>

@ -1,6 +1,6 @@
<script lang="ts" setup>
import { format } from 'date-fns'
import { computed } from 'vue'
import { computed,watch ,ref} from 'vue'
defineOptions({ name: 'ListItem' })
@ -18,9 +18,19 @@ const props = defineProps({
default: () => [],
},
})
const listItem = ref(props.listItem)
const svgName = computed(() => {
return props.selected ? 'task-select' : 'task'
})
watch(
() => props.listItem,
(newVal) => {
console.log(props.listItem)
listItem.value = newVal
},
)
</script>
<template>

@ -26,8 +26,11 @@ const pagination = reactive({
pageSize: 30,
})
function selectHandler(id: string, index: number) {
taskStore.setActive(index)
function selectHandler(item, index: number) {
activeId.value = item.id
console.log(activeId.value,item.id)
console.log(index)
taskStore.setActive(index,item.id)
}
useInfiniteScroll(
@ -73,10 +76,39 @@ async function fetchList() {
watch(
() => taskStore.activeId,
(newVal) => {
activeId.value = newVal
// activeId.value = newVal
},
)
watch(
() => taskStore.inFileId,
async (newVal) => {
let newlist=[]
let filterid=newVal.taskname
console.log(filterid)
const index = data.value.findIndex(person => person.fromtaskname === filterid);
let ovelist = data.value.filter(item => item. fromtaskname !== filterid);
ovelist.map((item)=>{
newlist.push(item)
})
data.value=newlist
activeId.value = newlist[index].id
taskStore.setActive(index,newlist[index].id)
//taskStore.setActive(index)
// activeId.value = data[index+1].id
//selectHandler(data[index].id, index)
/* let ovelist = data.value.filter(item => item. fromtaskname !== filterid);
let newlist=[]
ovelist.map((item)=>{
newlist.push(item)
})
data.value=newlist
taskStore.setActive(2)
alert(1)*/
}
);
function reset() {
pagination.pageNo = 0
pagination.pageSize = 30
@ -103,6 +135,8 @@ onMounted(() => {
await reset();
searchId.value = id;
data.value = await fetchList();
activeId.value = data.value[0].id
console.log(data.value)
})
})
@ -128,14 +162,17 @@ defineExpose({
<template>
<n-spin :show="isLoading">
<div ref="el" class="list">
<ListItem
v-for="(item, index) in data"
:key="item.id"
:show-field-list="showFieldList"
:selected="activeId === item.id"
:list-item="item"
@click="selectHandler(item.id, index)"
/>
@click="selectHandler(item, index)"
>
</ListItem>
</div>
</n-spin>
</template>

@ -7,6 +7,7 @@ import {
ref,
unref,
watch,
nextTick,
} from "vue";
import { chunk, clone } from "lodash-es";
import { useDialog, useMessage } from "naive-ui";
@ -20,7 +21,7 @@ import NotPassed from "@/components/Approval/NotPassed.vue";
import { getAllfieldList, getfieldList } from "@/api/home/filter";
import { TASK_STATUS_OBJ } from "@/enums/index";
import { useFinal } from "@/store/modules/final";
import { useInfiniteScroll } from "@vueuse/core";
import {
audit,
dubiousfileyd,
@ -52,11 +53,16 @@ const taskTableData = ref<any[]>([]);
const route = useRoute();
const isDetail = ref(false); //
const finalStore = useFinal();
const imgbigshow = ref(true);
const sortBy: any = {
orderType: "desc",
orderName: "similarityScore",
};
const el = ref<HTMLDivElement | null>(null);
const pagination = reactive({
pageNo: 0,
pageSize: 30,
});
function onCheckChange(checked: any, item: any) {
const index = selectItems.value.indexOf(item);
item.checked = checked;
@ -105,6 +111,9 @@ onMounted(() => {
let lastKeyPressTime = 0;
let keyPressTimer = null;
function changeimgbigshow() {
imgbigshow.value = !imgbigshow.value;
}
const doubleClickInterval = 300; //
//
function handleKeydown(event) {
@ -116,6 +125,9 @@ function handleKeydown(event) {
isFullScreen.value = false;
// batchModalRef.value.closeModal()
} else if (event.keyCode === 27) {
overTask.value = null;
overTasktwo.value = null;
} else if (event.key === "p" || event.key === "P") {
//
const now = Date.now();
@ -157,7 +169,7 @@ function handleKeydown(event) {
//
if (now - lastKeyPressTime < doubleClickInterval) {
const item = taskDetailInfo.value;
const item = taskDetailInfo.value;
if (
item?.userapprove?.statshis === 2 ||
item?.userapprove?.statshis == 3
@ -278,24 +290,25 @@ function approvalHandler(items?: any) {
negativeText: "取消",
onPositiveClick: () => {
doAudit(param);
overTask.value = null;
overTask.value = null;
},
onNegativeClick: () => {
overTask.value = null;
},
onNegativeClick: () => {overTask.value = null;},
});
}
function approvalHandlerx(item?:any){
console.log(item)
alert(1)
function approvalHandlerx(item?: any) {
console.log(item);
alert(1);
}
function singleRejectHandlex(item?:any){
console.log(item)
const modal = unref(notPassModalRef)! as any;
function singleRejectHandlex(item?: any) {
console.log(item);
const modal = unref(notPassModalRef)! as any;
modal.showModal([item]);
modal.showModal([item]);
}
function rejectHandler(items?: any) {
console.log(items)
console.log(items);
const modal = unref(notPassModalRef)! as any;
modal.showModal(items);
}
@ -345,17 +358,18 @@ async function handleDragEnd(event, item) {
message.error(res.message);
}
taskStore.setInFile(false);
taskStore.setInFile(item.pictureId);
}
}
async function addSuspicious() {
console.log(taskDetailInfo.value.ocrPicture)
if (taskDetailInfo.value.ocrPicture.pictureid) {
taskStore.setInFileId(taskDetailInfo.value.ocrPicture);
console.log(taskDetailInfo.value.ocrPicture);
if (taskDetailInfo.value.ocrPicture.pictureid) {
const res = await dubiousfileyd({
pictureid: taskDetailInfo.value.ocrPicture.id,
});
if (res.code === "OK") {
if (res.code === "OK") {
message.success("加入成功");
setBatch(false);
getTableData();
@ -364,8 +378,8 @@ async function addSuspicious() {
message.error(res.message);
}
taskStore.setInFile(false);
}}
}
}
async function getTableData() {
const useInfo = userStore.getUserInfo;
const listData = [];
@ -431,7 +445,7 @@ function overTaskHandle() {
function leaveTaskHandler() {
overTask.value = null;
overTasktwo.value = null;
overTasktwo.value = null;
}
function showActionsModal() {
@ -451,6 +465,12 @@ function immersionHandler() {
//
function toggleFullScreen() {
isFullScreen.value = !isFullScreen.value;
if (isFullScreen.value) {
fetchData();
window.addEventListener("scroll", checkBottom);
} else {
window.removeEventListener("scroll", checkBottom);
}
}
function previewHandler(event: MouseEvent) {
event.stopImmediatePropagation();
@ -482,7 +502,7 @@ async function getDetail() {
function notPassSuccess(param) {
batchModalRef.value.reload();
reloadList(param, "不通过");
overTask.value=null
overTask.value = null;
}
function reloadList(param, text) {
@ -529,13 +549,106 @@ function overTaskHandelr(item: any) {
if (validate([item]) == null && batchtwo.value === false)
overTasktwo.value = item;
}
function closePassno(){
overTask.value=null
function closePassno() {
console.log(notPassModalRef.value)
overTask.value = null;
}
//const loadingx = ref(false);
const items = ref([]);
const scrollContainer = ref(null);
let debounceTimer;
async function fetchData() {
if (loading.value) {
return; //
}
loading.value = true;
try {
loadMore();
} finally {
loading.value = false;
}
}
//const throttledCheckScroll = throttle(checkBottom, 200);
let num = 1;
//
function checkBottom() {
const container = scrollContainer.value;
// console.log(1)
if (!container) {
return;
}
//const { scrollTop, clientHeight, scrollHeight } = container;
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
//
const clientHeight =
window.innerHeight || document.documentElement.clientHeight;
//
const scrollHeight = document.documentElement.scrollHeight;
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
if (scrollTop + clientHeight >= scrollHeight - 10) {
num = num + 1;
console.log(num);
fetchData(); //
}
}, 500);
}
async function loadMore() {
console.log(loading.value);
if (loading.value) {
const more = await fetchList();
taskDetailPictureList.value.push(...more);
console.log(taskDetailPictureList);
}
}
let canloadMore = true;
async function fetchList() {
try {
pagination.pageNo += 1;
const { data, pageCount, total } = await getSimilarityList({
...pagination,
...sortBy,
pictureId: taskDetailInfo.value.ocrPicture.id,
});
canloadMore = pageCount >= pagination.pageNo && pageCount > 0;
totalCount.value = total;
return data;
} catch (error) {
canloadMore = false;
return [];
}
}
async function reset() {
pagination.pageNo = 0;
pagination.pageSize = 30;
taskDetailPictureList.value.length = 0;
loading.value = false;
canloadMore = true;
// layout()
}
async function refreshHandler() {
getImgList();
}
function sortHandler(orderby: "similarityScore" | "createdate") {
sortBy.orderName = orderby;
sortBy.orderType = sortBy.orderType === "asc" ? "desc" : "asc";
refreshHandler();
}
</script>
<template>
<div class="wrapper fullscreen-container" :style="fullscreenStyles">
<div
ref="scrollContainer"
@scroll="checkBottom"
class="wrapper fullscreen-container"
:style="fullscreenStyles"
>
<div class="wrapper-header">
<div class="left">
<span class="font">任务ID{{ taskDetailInfo.fromtaskname }}</span>
@ -633,15 +746,49 @@ function closePassno(){
</n-button>
</div>
</div>
<div class="wrapper-detail">
<div
class="wrapper-detail"
:style="
isFullScreen
? {
height: '596px',
}
: {}
"
>
<div
v-show="!imgbigshow"
class="aside-collapse-btn"
@click="collapseHandler"
:style="{
position: 'fixed',
right: '0px',
top: '155px',
cursor: 'pointer',
zIndex: 100,
}"
>
<SvgIcon
:name="false ? 'expand-cir' : 'collapse-cir'"
size="40"
@click="changeimgbigshow"
/>
</div>
<div
class="left"
:style="
isFullScreen
? {
height: '395px',
'background-image': `url(${taskDetailInfo?.ocrPicture?.imgurl})`,
}
? imgbigshow
? {
position: 'relative',
flex: 2,
'background-image': `url(${taskDetailInfo?.ocrPicture?.imgurl})`,
}
: {
height: '92vh',
flex: 2,
'background-image': `url(${taskDetailInfo?.ocrPicture?.imgurl})`,
}
: {
'background-image': `url(${taskDetailInfo?.ocrPicture?.imgurl})`,
}
@ -753,12 +900,9 @@ function closePassno(){
size="16"
name="camera-time"
/>
 
<span>{{
taskDetailInfo?.ocrPicture?.photoDateTimestamp
? formatToDateHMS(
Number(taskDetailInfo.ocrPicture.photoDateTimestamp)
)
: "-"
taskDetailInfo?.ocrPicture?.photoDateTimestamp ?? "-"
}}</span>
</div>
<div class="time-item time-item2">
@ -768,6 +912,7 @@ function closePassno(){
size="16"
name="submit-time"
/>
<span>{{
taskDetailInfo?.ocrPicture?.submitDateTimestamp
? formatToDateHMS(
@ -786,7 +931,36 @@ function closePassno(){
</div>
<div class="leftback"></div>
</div>
<div class="right">
<div
class="right"
v-show="imgbigshow"
:style="
isFullScreen
? {
width: '320px',
borderLeft: '2px solid #507AFD',
position: 'relative',
}
: {}
"
>
<div
v-show="isFullScreen"
class="aside-collapse-btn"
@click="collapseHandler"
:style="{
position: 'absolute',
left: '-20px',
top: '85px',
cursor: 'pointer',
}"
>
<SvgIcon
:name="true ? 'expand-cir' : 'collapse-cir'"
size="40"
@click="changeimgbigshow"
/>
</div>
<n-scrollbar v-if="totalCount > 0" style="max-height: 100%">
<div class="right-card">
<div class="header" v-show="!isFullScreen">
@ -978,6 +1152,7 @@ function closePassno(){
</n-tabs>
<div v-else class="imgbottom">
<div
v-show="imgbigshow"
style="
display: flex;
justify-content: space-between;
@ -1007,139 +1182,135 @@ function closePassno(){
<div style="cursor: pointer" @click="sortHandler('createdate')">
<span>时间排序</span>
<SvgIcon
v-if="true"
style="margin-left: 5px"
name="sort"
size="12"
/>
<SvgIcon
v-else
style="margin-left: 5px"
name="active-sort"
size="12"
/>
</div>
<div
style="margin-left: 15px; cursor: pointer"
@click="sortHandler('similarityScore')"
>
<span>相似度排序</span>
<SvgIcon
v-if="true"
style="margin-left: 5px"
name="sort"
size="12"
/>
<SvgIcon
v-else
style="margin-left: 5px"
name="active-sort"
size="12"
/>
</div>
</div>
</div>
<div class="allview">
<div class="list" >
<div class="allview" v-show="imgbigshow">
<div class="list">
<div
v-for="item in taskDetailPictureList"
:key="item.id"
class="item"
draggable="true"
@dragend="
(event) => {
handleDragEnd(event, item);
}
"
>
<div
class="img-wrapper"
:style="{
'background-image': `url(${item.serverThumbnailUrl})`,
}"
@mouseover="overTaskHandelr(item)"
@mouseleave="leaveTaskHandler"
>
<div
v-for="item in taskDetailPictureList"
:key="item.id"
class="item"
draggable="true"
@dragend="
(event) => {
handleDragEnd(event, item);
}
"
v-show="overTasktwo && overTasktwo.id === item.id && !batch"
class="action"
>
<div
class="img-wrapper"
:style="{
'background-image': `url(${item.serverThumbnailUrl})`,
}"
@mouseover="overTaskHandelr(item)"
@mouseleave="leaveTaskHandler"
>
<div
v-show="overTasktwo&& overTasktwo.id === item.id&&!batch"
class="action"
>
<SvgIcon
style="cursor: pointer"
name="t1"
@click.stop="approvalHandler([item])"
<SvgIcon
style="cursor: pointer"
name="t1"
@click.stop="approvalHandler([item])"
/>
<SvgIcon
style="cursor: pointer; margin-left: 40px"
name="t2"
@click.stop="singleRejectHandlex(item)"
/>
</div>
</div>
<div class="small-mark" />
<div class="check">
<n-checkbox
v-show="batch && item.historyStates === 1"
v-model:checked="item.checked"
@click.stop
@update:checked="onCheckChange($event, item)"
/>
</div>
<img
v-if="item.historyStates === 2"
class="tag-status"
src="@/assets/images/task/tag-pass.png"
alt=""
/>
<SvgIcon
style="cursor: pointer; margin-left: 40px"
name="t2"
@click.stop="singleRejectHandlex(item)"
<img
v-if="item.historyStates === 3"
class="tag-status"
src="@/assets/images/task/tag-not-pass.png"
alt=""
/>
</div>
</div>
<div class="small-mark" />
<div class="check">
<n-checkbox
v-show="batch && item.historyStates === 1"
v-model:checked="item.checked"
@click.stop
@update:checked="onCheckChange($event, item)"
/>
</div>
<img
v-if="item.historyStates === 2"
class="tag-status"
src="@/assets/images/task/tag-pass.png"
alt=""
<div class="time">
<div class="time-item">
<SvgIcon
class="svg-time"
color="#FFF"
size="16"
name="camera-time"
/>
<img
v-if="item.historyStates === 3"
class="tag-status"
src="@/assets/images/task/tag-not-pass.png"
alt=""
<span>{{
item.photoDateTimestamp
? formatToDateHMS(Number(item.photoDateTimestamp))
: "-"
}}</span>
</div>
<div class="time-item time-item2">
<SvgIcon
class="svg-time"
color="#FFF"
size="16"
name="submit-time"
/>
<div class="time">
<div class="time-item">
<SvgIcon
class="svg-time"
color="#FFF"
size="16"
name="camera-time"
/>
<span>{{
item.photoDateTimestamp
? formatToDateHMS(Number(item.photoDateTimestamp))
: "-"
}}</span>
</div>
<div class="time-item time-item2">
<SvgIcon
class="svg-time"
color="#FFF"
size="16"
name="submit-time"
/>
<span>{{
item.submitDateTimestamp
? formatToDateHMS(Number(item.submitDateTimestamp))
: "-"
}}</span>
</div>
</div>
<div
:class="{ 'percent-red': item.similarityScore === 100 }"
class="percent"
>
{{ item.similarityScore }}<span class="percent-unit">%</span>
</div>
<span>{{
item.submitDateTimestamp
? formatToDateHMS(Number(item.submitDateTimestamp))
: "-"
}}</span>
</div>
</div>
</div>
<!-- <div class="wrapper-list">
<div
:class="{ 'percent-red': item.similarityScore === 100 }"
class="percent"
>
{{ item.similarityScore }}<span class="percent-unit">%</span>
</div>
</div>
</div>
</div>
<!-- <div class="wrapper-list">
<div
v-for="(item, index) in taskDetailPictureList"
:key="index"
@ -1220,7 +1391,12 @@ function closePassno(){
</div>
</div>-->
</div>
<NotPassed ref="notPassModalRef" @success="notPassSuccess" @close="closePassno"/>
<NotPassed
ref="notPassModalRef"
@success="notPassSuccess"
@close="closePassno"
/>
<BatchModal
ref="batchModalRef"
@reject="rejectHandler"
@ -1232,6 +1408,7 @@ function closePassno(){
<style lang="less" scoped>
.fullscreen-container {
overflow-y: auto;
/* 可添加其他样式 */
width: 100vw;
height: 100vh;
@ -1882,145 +2059,147 @@ function closePassno(){
margin: 3px 0 10px 0;
max-width: 650px;
}
.allview {
flex: 0.5;
background: #f6f9fd;
border-radius: 8px;
// margin-left: 20px;
padding-top: 24px;
.action {
position: absolute;
z-index: 10;
width: 100%;
height: 100%;
display: flex;
border-radius: 8px;
align-items: center;
justify-content: center;
background-color: rgba(0, 0, 0, 0.5);
}
.right-card {
padding: 3px;
}
.header {
display: flex;
justify-content: space-between;
font-size: 17px;
font-weight: bold;
color: #333333;
margin-bottom: 16px;
}
.list {
display: flex;
flex-wrap: wrap;
flex-direction: row;
justify-content: flex-start;
flex-shrink: 0;
}
.item {
// flex-basis: calc((100% - 48px) / 3);
box-sizing: border-box;
border-radius: 8px;
position: relative;
// overflow: hidden;
margin: 0px 16px 27px 0px;
.small-mark {
width: 100%;
height: 53px;
background: linear-gradient(
180deg,
rgba(0, 0, 0, 0.01),
rgba(0, 0, 0, 0.44) 88%
);
border-radius: 0px 8px 8px 8px;
position: absolute;
left: 0;
bottom: 0;
z-index: 0;
}
.tag-status {
width: 46px;
height: 22px;
position: absolute;
left: -4px;
top: 4px;
}
.time {
position: absolute;
z-index: 3;
left: 3px;
bottom: 3px;
.allview {
// overflow-y: auto;
//height: 400px;
flex: 0.5;
background: #f6f9fd;
border-radius: 8px;
// margin-left: 20px;
padding-top: 24px;
.action {
position: absolute;
z-index: 10;
width: 100%;
height: 100%;
display: flex;
border-radius: 8px;
align-items: center;
justify-content: center;
background-color: rgba(0, 0, 0, 0.5);
}
.right-card {
padding: 3px;
}
.time-item {
display: flex;
align-items: center;
font-size: 16px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 500;
color: #ffffff;
margin-bottom: 2px;
line-height: 12px;
}
.header {
display: flex;
justify-content: space-between;
font-size: 17px;
font-weight: bold;
color: #333333;
margin-bottom: 16px;
}
.time-item2 {
margin-bottom: 0;
}
.list {
display: flex;
flex-wrap: wrap;
flex-direction: row;
justify-content: flex-start;
flex-shrink: 0;
}
.svg-time {
margin-right: 5px;
}
}
.item {
// flex-basis: calc((100% - 48px) / 3);
box-sizing: border-box;
border-radius: 8px;
position: relative;
// overflow: hidden;
margin: 0px 16px 27px 0px;
.small-mark {
width: 100%;
height: 53px;
background: linear-gradient(
180deg,
rgba(0, 0, 0, 0.01),
rgba(0, 0, 0, 0.44) 88%
);
border-radius: 0px 8px 8px 8px;
position: absolute;
left: 0;
bottom: 0;
z-index: 0;
}
.img-wrapper {
position: relative;
width: 230px;
height: 130px;
overflow: hidden;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border-radius: 8px;
cursor: n-resize;
}
.tag-status {
width: 46px;
height: 22px;
position: absolute;
left: -4px;
top: 4px;
}
.check {
position: absolute;
z-index: 5;
left: 6px;
top: 4px;
}
}
.time {
position: absolute;
z-index: 3;
left: 3px;
bottom: 3px;
.percent {
position: absolute;
.time-item {
display: flex;
align-items: center;
justify-content: center;
width: 35px;
height: 18px;
opacity: 0.9;
background: #6f92fd;
border-radius: 6px 0px 6px 0px;
z-index: 5;
right: 12px;
top: 2px;
color: #fff;
font-size: 14px;
font-size: 16px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 500;
color: #ffffff;
margin-bottom: 2px;
line-height: 12px;
}
.percent-unit {
font-size: 8px;
margin-top: 4px;
.time-item2 {
margin-bottom: 0;
}
.percent-red {
background: #ff4e4f;
.svg-time {
margin-right: 5px;
}
}
.img-wrapper {
position: relative;
width: 230px;
height: 130px;
overflow: hidden;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border-radius: 8px;
cursor: n-resize;
}
.check {
position: absolute;
z-index: 5;
left: 6px;
top: 4px;
}
}
.percent {
position: absolute;
display: flex;
align-items: center;
justify-content: center;
width: 35px;
height: 18px;
opacity: 0.9;
background: #6f92fd;
border-radius: 6px 0px 6px 0px;
z-index: 5;
right: 12px;
top: 2px;
color: #fff;
font-size: 14px;
}
.percent-unit {
font-size: 8px;
margin-top: 4px;
}
.percent-red {
background: #ff4e4f;
}
}
</style>

@ -29,6 +29,9 @@ function setAsideItemName(text) {
</template>
<style lang="less" scoped>
:deep(.wrapper){
top:0
}
.main {
display: flex;
flex-direction: row;

@ -4,15 +4,17 @@ import { useWindowSizeFn } from "@/hooks/event/useWindowSizeFn";
import { useUser } from "@/store/modules/user";
import { useWorkOrder } from "@/store/modules/workOrder";
import { getViewportOffset } from "@/utils/domUtils";
import { debounce } from 'lodash-es';
import { debounce } from "lodash-es";
import {
computed, defineEmits, defineOptions,
inject,
nextTick,
onMounted,
ref,
unref,
watch
computed,
defineEmits,
defineOptions,
inject,
nextTick,
onMounted,
ref,
unref,
watch,
} from "vue";
import CustomFieldModalVue from "../modal/CustomFieldModal.vue";
import WorkSheetList from "./WorkSheetList.vue";
@ -20,63 +22,63 @@ import WorkSheetList from "./WorkSheetList.vue";
defineOptions({ name: "AsideContent" });
const emit = defineEmits(["ApprovalOver"]);
const collapse = ref(false)
const workStore = useWorkOrder()
const filterModalRef = ref(null)
const packageListRef = ref<HTMLDivElement | null>(null)
const collapse = ref(false);
const workStore = useWorkOrder();
const filterModalRef = ref(null);
const packageListRef = ref<HTMLDivElement | null>(null);
//
const showFieldList = ref<any[]>([])
const reviewType = 1
const dicts = ref<any>([])
const showFieldList = ref<any[]>([]);
const reviewType = 1;
const dicts = ref<any>([]);
function collapseHandler() {
collapse.value = !collapse.value
collapse.value = !collapse.value;
}
const mousetrap = inject('mousetrap') as any
mousetrap.bind('[', collapseHandler)
const mousetrap = inject("mousetrap") as any;
mousetrap.bind("[", collapseHandler);
const searchKeyword = ref('')
const searchKeyword = ref("");
const asideWidth = computed(() => {
return collapse.value ? 0 : 308
})
return collapse.value ? 0 : 308;
});
const asideStyle = computed(() => {
return {
width: `${asideWidth.value}px`,
}
})
};
});
const collapseIcon = computed(() => {
return collapse.value ? 'expand-cir' : 'collapse-cir'
})
return collapse.value ? "expand-cir" : "collapse-cir";
});
const listHeight = ref(700)
const listHeight = ref(700);
function computeListHeight() {
const listEl = document.querySelector('.work-sheet-list')!
const { bottomIncludeBody } = getViewportOffset(listEl)
const height = bottomIncludeBody
listHeight.value = height - 25
const listEl = document.querySelector(".work-sheet-list")!;
const { bottomIncludeBody } = getViewportOffset(listEl);
const height = bottomIncludeBody;
listHeight.value = height - 25;
}
const listStyle = computed(() => {
return {
height: `${listHeight.value}px`,
}
})
};
});
useWindowSizeFn(computeListHeight, 280)
useWindowSizeFn(computeListHeight, 280);
async function getshowFieldList() {
showFieldList.value = []
const userStore = useUser()
const userInfo = userStore.getUserInfo
let res
res = await getAllfieldList(reviewType) //
const allList = res.data
dicts.value = res.data
res = await getfieldList(reviewType, userInfo.id) //
const useList = res.data
showFieldList.value = [];
const userStore = useUser();
const userInfo = userStore.getUserInfo;
let res;
res = await getAllfieldList(reviewType); //
const allList = res.data;
dicts.value = res.data;
res = await getfieldList(reviewType, userInfo.id); //
const useList = res.data;
/**
* name 标题
* id 键值
@ -84,20 +86,19 @@ async function getshowFieldList() {
* checked 是否选中
*/
if (useList.userFieldFixed) {
useList.userFieldFixed?.split(',').map((v) => {
let item = allList.find(v2 => v2.name == v)
useList.userFieldFixed?.split(",").map((v) => {
let item = allList.find((v2) => v2.name == v);
if (item) {
item = {
name: item.fieldDesc,
id: item.name,
fix: item.isrequired == 2,
checked: true,
}
showFieldList.value.push(item)
};
showFieldList.value.push(item);
}
})
}
else {
});
} else {
//
allList.map((v) => {
if (v.isrequired == 2) {
@ -106,45 +107,45 @@ async function getshowFieldList() {
id: v.name,
fix: v.isrequired == 2,
checked: true,
}
showFieldList.value.push(item)
};
showFieldList.value.push(item);
}
})
});
}
}
onMounted(() => {
nextTick(() => {
computeListHeight()
getshowFieldList()
})
})
const asideEnter = ref(false)
computeListHeight();
getshowFieldList();
});
});
const asideEnter = ref(false);
const showCollapse = computed(() => {
return collapse.value ? true : asideEnter.value
})
return collapse.value ? true : asideEnter.value;
});
function showFilter() {
const modal = unref(filterModalRef)! as any
modal.showModal()
const modal = unref(filterModalRef)! as any;
modal.showModal();
}
watch(
() => workStore.immersion,
() => {
collapse.value = true
},
)
collapse.value = true;
}
);
const showSearch = ref(false)
const showSearch = ref(false);
function setShowSearch(value: boolean) {
showSearch.value = value
showSearch.value = value;
if (value === false) {
(packageListRef.value as any).search('')
searchKeyword.value = ''
};
(packageListRef.value as any).search("");
searchKeyword.value = "";
}
}
const inputHandler = debounce((word) => {
@ -152,9 +153,9 @@ const inputHandler = debounce((word) => {
(packageListRef.value as any).search(word);
}, 500);
const ApprovalOver = (packageId)=>{
emit('ApprovalOver',packageId)
}
const ApprovalOver = (packageId) => {
emit("ApprovalOver", packageId);
};
</script>
<template>
@ -174,7 +175,7 @@ const ApprovalOver = (packageId)=>{
<div class="left">
<svg-icon name="all-worksheet" size="32" />
<!-- j -->
<span style="margin-left: 8px;color: #333333;">所有任务包</span>
<span style="margin-left: 8px; color: #333333">所有任务包</span>
</div>
<div class="right">
<SvgIcon

@ -5,7 +5,7 @@ import { useWorkOrder } from "@/store/modules/workOrder";
import { isEmpty } from "@/utils";
import { useInfiniteScroll } from "@vueuse/core";
import { useMessage } from "naive-ui";
import { reactive, ref, watch } from "vue";
import { onMounted, reactive, ref, watch } from "vue";
import ApprovalModal from "../modal/ApprovalModal.vue";
import ListItem from "./ListItem.vue";
import type { PackageListItem } from "/#/workorder";
@ -72,6 +72,12 @@ async function loadMore() {
}
}
// onMounted(() => {
// console.log("onMounted");
// reset();
// fetchList();
// });
async function fetchList() {
try {
pagination.pageNo += 1;
@ -139,7 +145,7 @@ function dismisClick(packageId: string) {
});
}
const ApprovalOver = (packageId) => {
emit("ApprovalOver",packageId);
emit("ApprovalOver", packageId);
};
defineExpose({

@ -1,17 +1,15 @@
<script lang="ts" setup>
import { audit } from '@/api/task/task';
import {
getPictureSimilarityList, getTaskDetailInfo
} from "@/api/work/work";
import NotPassed from '@/components/Approval/NotPassed.vue';
import { TASK_STATUS_OBJ } from '@/enums/index';
import { audit } from "@/api/task/task";
import { getPictureSimilarityList, getTaskDetailInfo } from "@/api/work/work";
import NotPassed from "@/components/Approval/NotPassed.vue";
import { TASK_STATUS_OBJ } from "@/enums/index";
import { useWorkOrder } from "@/store/modules/workOrder";
import { isEmpty } from "@/utils";
import { formatToDateHMS } from "@/utils/dateUtil";
import { hideDownload } from "@/utils/image";
import emitter from '@/utils/mitt';
import emitter from "@/utils/mitt";
import { useInfiniteScroll } from "@vueuse/core";
import { format } from 'date-fns';
import { format } from "date-fns";
import imagesloaded from "imagesloaded";
import { clone, cloneDeep, debounce, pickBy } from "lodash-es";
import { useDialog, useMessage } from "naive-ui";
@ -68,10 +66,10 @@ const imageRef = ref<ComponentElRef | null>();
const listData = ref<any[]>([]);
const loading = ref(false);
const el = ref<HTMLDivElement | null>(null);
const selectedSortName = ref('');
const selectedSortName = ref("");
const isFullScreen = ref(false);
const notPassModalRef = ref(null)
const mainImageModalRef = ref(null)
const notPassModalRef = ref(null);
const mainImageModalRef = ref(null);
let canloadMore = true;
@ -131,13 +129,15 @@ async function loadMore() {
}
async function featchList() {
loading.value = true;
try {
taskpagination.pageNo += 1;
const { data, total, pageCount } = await getPictureSimilarityList(
{ ...taskpagination, ...sortBy, checkDuplicateId: workStore.activeId, pictureId: taskDetailInfo.value.id }
);
const { data, total, pageCount } = await getPictureSimilarityList({
...taskpagination,
...sortBy,
checkDuplicateId: workStore.activeId,
pictureId: taskDetailInfo.value.id,
});
totalCount.value = total;
canloadMore = pageCount >= taskpagination.pageNo && pageCount > 0;
@ -165,14 +165,13 @@ const layout = debounce(() => {
});
}, 300);
const fullscreenStyles = computed<any>(() => ({
'width': isFullScreen.value ? '100vw' : '',
'height': isFullScreen.value ? '100vh' : '',
'position': isFullScreen.value ? 'fixed' : '',
'top': isFullScreen.value ? '0' : '',
'left': isFullScreen.value ? '0' : '',
'zIndex': isFullScreen.value ? '100' : '',
width: isFullScreen.value ? "100vw" : "",
height: isFullScreen.value ? "100vh" : "",
position: isFullScreen.value ? "fixed" : "",
top: isFullScreen.value ? "0" : "",
left: isFullScreen.value ? "0" : "",
zIndex: isFullScreen.value ? "100" : "",
}));
//
@ -180,7 +179,6 @@ const toggleFullScreen = () => {
isFullScreen.value = !isFullScreen.value;
};
onUpdated(() => {
layout();
});
@ -192,10 +190,10 @@ watch(
if (isEmpty(packageid)) {
listData.value.length = 0;
totalCount.value = 0;
taskDetailInfo.value = {}
taskDetailInfo.value = {};
return;
}
queryDetail(packageid)
queryDetail(packageid);
// const res = await getPackageTaskList(newValue, packagepagination);
// const { data } = res;
// taskList.value = data;
@ -273,7 +271,7 @@ function immersionHandler() {
function showAction() {
const item = taskDetailInfo.value;
if (item.historyStates === 2 || item.historyStates === 3) {
return
return;
}
if (batch.value === false) overTask.value = item;
}
@ -290,161 +288,157 @@ function previewHandler(event: MouseEvent) {
(imageRef.value as any).mergedOnClick();
}
function rejectHandler() {
const modal = unref(notPassModalRef)! as any
modal.showModal(selectItems.value)
const modal = unref(notPassModalRef)! as any;
modal.showModal(selectItems.value);
}
function singleRejectHandler(item) {
const modal = unref(notPassModalRef)! as any
modal.showModal([item])
const modal = unref(notPassModalRef)! as any;
modal.showModal([item]);
}
function reject(idOrDesc: string, backId: string, isOther: boolean) {
const formIds: string[] = processItems.map(item => item.id)
const taskIds: string[] = processItems.map(item => item.taskId)
const tasknames: string[] = processItems.map(item => item.taskname)
const formIds: string[] = processItems.map((item) => item.id);
const taskIds: string[] = processItems.map((item) => item.taskId);
const tasknames: string[] = processItems.map((item) => item.taskname);
const param: ApprovalParam = {
formid: formIds,
taskId: taskIds,
approvd: false,
taskComment: idOrDesc,
taskname: isOther ? tasknames : ['其他'],
}
taskname: isOther ? tasknames : ["其他"],
};
doAudit(param)
doAudit(param);
}
function handleRejectMainImage() {
const modal = unref(mainImageModalRef)! as any
const params = cloneDeep(taskDetailInfo.value)
params.id = params.taskchildpictureid
modal.showModal([params])
const modal = unref(mainImageModalRef)! as any;
const params = cloneDeep(taskDetailInfo.value);
params.id = params.taskchildpictureid;
modal.showModal([params]);
}
async function reloadDetailInfo(){
async function reloadDetailInfo() {
const packageid = workStore.getActiveId;
taskDetailInfo.value = await getTaskDetailInfo(packageid);
}
function handleApproveMainImage(items?: any) {
let cloneItem: any
let cloneItem: any;
if (overTask.value) {
cloneItem = clone(overTask.value)
cloneItem.id = cloneItem.taskchildpictureid
processItems = [cloneItem]
cloneItem = clone(overTask.value);
cloneItem.id = cloneItem.taskchildpictureid;
processItems = [cloneItem];
}
const msg = validate(processItems)
const msg = validate(processItems);
if (msg !== null) {
message.error(msg)
return
message.error(msg);
return;
}
const list: any = []
const list: any = [];
processItems.forEach((item) => {
list.push({
formId: item.id,
taskId: item.taskId,
taskName: item.fromTaskName,
})
})
});
});
const param = {
result: true,
comment: '',
disposeType: '',
disposeTypeId: '',
failCauseId: '',
failCauseName: '',
comment: "",
disposeType: "",
disposeTypeId: "",
failCauseId: "",
failCauseName: "",
flowTaskInfoList: list,
}
};
dialog.info({
title: '确认提示',
content: '确认给该任务审批为【通过】吗?',
positiveText: '确定',
negativeText: '取消',
title: "确认提示",
content: "确认给该任务审批为【通过】吗?",
positiveText: "确定",
negativeText: "取消",
onPositiveClick: () => {
audit(param).then(async(res) => {
const { code } = res
if (code === 'OK') {
message.info(res.message)
audit(param).then(async (res) => {
const { code } = res;
if (code === "OK") {
message.info(res.message);
const packageid = workStore.getActiveId;
taskDetailInfo.value = await getTaskDetailInfo(packageid);
}
else message.error(res.message)
})
} else message.error(res.message);
});
},
onNegativeClick: () => { },
})
onNegativeClick: () => {},
});
}
function approvalHandler(items?: any) {
let cloneItem: any
let cloneItem: any;
if (batch.value) {
processItems = selectItems.value
}
else if (overTask.value) {
cloneItem = clone(overTask.value)
processItems = [cloneItem]
processItems = selectItems.value;
} else if (overTask.value) {
cloneItem = clone(overTask.value);
processItems = [cloneItem];
}
// => => /
if (items !== undefined && !(items instanceof PointerEvent))
processItems = [items]
if (items !== undefined && !(items instanceof PointerEvent)) processItems = [items];
const msg = validate(processItems)
const msg = validate(processItems);
if (msg !== null) {
message.error(msg)
return
message.error(msg);
return;
}
const list: any = []
const list: any = [];
processItems.forEach((item) => {
list.push({
formId: item.id,
taskId: item.taskId,
taskName: item.fromTaskName,
})
})
});
});
const param = {
result: true,
comment: '',
disposeType: '',
disposeTypeId: '',
failCauseId: '',
failCauseName: '',
comment: "",
disposeType: "",
disposeTypeId: "",
failCauseId: "",
failCauseName: "",
flowTaskInfoList: list,
}
};
dialog.info({
title: '确认提示',
content: '确认给该任务审批为【通过】吗?',
positiveText: '确定',
negativeText: '取消',
title: "确认提示",
content: "确认给该任务审批为【通过】吗?",
positiveText: "确定",
negativeText: "取消",
onPositiveClick: () => {
doAudit(param)
doAudit(param);
},
onNegativeClick: () => { },
})
onNegativeClick: () => {},
});
}
function doAudit(param: any) {
audit(param).then((res) => {
const { code } = res
setBatch(false)
if (code === 'OK') {
message.info(res.message)
emitter.emit('refresh')
refreshHandler()
}
else message.error(res.message)
})
const { code } = res;
setBatch(false);
if (code === "OK") {
message.info(res.message);
emitter.emit("refresh");
refreshHandler();
} else message.error(res.message);
});
}
function reloadList() {
setBatch(false)
refreshHandler()
setBatch(false);
refreshHandler();
}
defineExpose({
queryDetail
})
queryDetail,
});
</script>
<template>
@ -462,8 +456,20 @@ defineExpose({
批量审批
</div>
<div class="icon-wrap">
<SvgIcon size="20" v-if="isFullScreen" name="power-off" @click="immersionHandler" style="cursor: pointer;" />
<SvgIcon size="20" v-else name="immersion-model" @click="immersionHandler" style="cursor: pointer;" />
<SvgIcon
size="20"
v-if="isFullScreen"
name="power-off"
@click="immersionHandler"
style="cursor: pointer"
/>
<SvgIcon
size="20"
v-else
name="immersion-model"
@click="immersionHandler"
style="cursor: pointer"
/>
</div>
</div>
@ -489,50 +495,73 @@ defineExpose({
<div ref="el" class="scroll">
<div class="wrapper-detail">
<!-- 左侧大图 图片信息 -->
<div class="left" :style="{ 'background-image': `url(${taskDetailInfo?.imgurl})` }" @click="showAction"
@mouseleave="leaveTaskHandler">
<div
class="left"
:style="{ 'background-image': `url(${taskDetailInfo?.imgurl})` }"
@click="showAction"
@mouseleave="leaveTaskHandler"
>
<div class="footer-times">
<div class="time" style="margin-bottom: 4px;">
<div class="time" style="margin-bottom: 4px">
<SvgIcon color="#FFF" size="16" name="camera" />
<span class="time-value">{{ taskDetailInfo?.photoDateTimestamp ? format(
taskDetailInfo.photoDateTimestamp, 'yyyy-MM-dd HH:mm:ss') : '-' }} </span>
<span class="time-value">{{ taskDetailInfo?.photoDateTimestamp }} </span>
</div>
<div class="time">
<SvgIcon color="#FFF" size="16" name="save" />
<span class="time-value">{{
taskDetailInfo?.submitDateTimestamp ? format(taskDetailInfo?.submitDateTimestamp, 'yyyy-MM-dd HH:mm:ss')
:
'-'
}} </span>
<span class="time-value"
>{{
taskDetailInfo?.submitDateTimestamp
? format(taskDetailInfo?.submitDateTimestamp, "yyyy-MM-dd HH:mm:ss")
: "-"
}}
</span>
</div>
</div>
<div class="status">
<img v-show="taskDetailInfo?.historyStates === 2" class="img-status" src="@/assets/images/task/pass.png"
alt="">
<img v-show="taskDetailInfo?.historyStates === 3" class="img-status" src="@/assets/images/task/not_pass.png"
alt="">
<img
v-show="taskDetailInfo?.historyStates === 2"
class="img-status"
src="@/assets/images/task/pass.png"
alt=""
/>
<img
v-show="taskDetailInfo?.historyStates === 3"
class="img-status"
src="@/assets/images/task/not_pass.png"
alt=""
/>
</div>
<!-- 右下信息 -->
<div class="info img-info">
<n-grid x-gap="12" y-gap="10" :cols="12">
<n-gi span="4" class="gi1">
<span>
<img class="icon-status" src="@/assets/images/task/status.png" alt="">
<img
class="icon-status"
src="@/assets/images/task/status.png"
alt=""
/>
</span>
</n-gi>
<n-gi span="8" class="gi2">
<span class="value">{{ TASK_STATUS_OBJ[taskDetailInfo.historyStates] }}</span>
<span class="value">{{
TASK_STATUS_OBJ[taskDetailInfo.historyStates]
}}</span>
<span class="label">审批状态</span>
</n-gi>
<n-gi span="4" class="gi1">
<span>
<img class="icon-status" src="@/assets/images/task/similarity.png" alt="">
<img
class="icon-status"
src="@/assets/images/task/similarity.png"
alt=""
/>
</span>
</n-gi>
<n-gi span="8" class="gi2">
<span class="value num">{{
totalCount
}}<span class="unit"></span> </span>
<span class="value num"
>{{ totalCount }}<span class="unit"></span>
</span>
<span class="label">相似匹配</span>
</n-gi>
</n-grid>
@ -543,73 +572,150 @@ defineExpose({
</div>
<!-- 预览大图组件 -->
<div style="display: none">
<n-image ref="imageRef" :img-props="{ onClick: hideDownload }" :src="taskDetailInfo?.imgurl" />
<n-image
ref="imageRef"
:img-props="{ onClick: hideDownload }"
:src="taskDetailInfo?.imgurl"
/>
</div>
<!-- 操作 -->
<div v-show="overTask && overTask.id === taskDetailInfo.id" class="action" @click.stop="hideAction">
<SvgIcon style="cursor: pointer" name="t1" @click.stop="handleApproveMainImage" />
<SvgIcon style="cursor: pointer; margin-left: 30px" name="t2" @click.stop="handleRejectMainImage" />
<div
v-show="overTask && overTask.id === taskDetailInfo.id"
class="action"
@click.stop="hideAction"
>
<SvgIcon
style="cursor: pointer"
name="t1"
@click.stop="handleApproveMainImage"
/>
<SvgIcon
style="cursor: pointer; margin-left: 30px"
name="t2"
@click.stop="handleRejectMainImage"
/>
</div>
</div>
<PictureInfo :taskDetailInfo="taskDetailInfo"></PictureInfo>
</div>
<div style="display: flex; justify-content: space-between; padding: 12px 0px 3px 0">
<div
style="display: flex; justify-content: space-between; padding: 12px 0px 3px 0"
>
<div>
<span
style="font-size: 18px; font-weight: Medium;color: #333333;font-family: PingFang SC, PingFang SC-Medium;">任务包图片</span>
style="
font-size: 18px;
font-weight: Medium;
color: #333333;
font-family: PingFang SC, PingFang SC-Medium;
"
>任务包图片</span
>
</div>
<div style="display: flex; align-items: center;font-size: 14px;margin-right: 25px;color:#323233">
<div
style="
display: flex;
align-items: center;
font-size: 14px;
margin-right: 25px;
color: #323233;
"
>
<div style="cursor: pointer" @click="sortHandler('createdate')">
<span>时间排序</span>
<SvgIcon style="margin-left: 5px" name="sort" size="12" v-show="selectedSortName !== 'createdate'" />
<SvgIcon style="margin-left: 5px" name="active-sort" size="12" v-show="selectedSortName === 'createdate'" />
<SvgIcon
style="margin-left: 5px"
name="sort"
size="12"
v-show="selectedSortName !== 'createdate'"
/>
<SvgIcon
style="margin-left: 5px"
name="active-sort"
size="12"
v-show="selectedSortName === 'createdate'"
/>
</div>
<div style="margin-left: 15px; cursor: pointer" @click="sortHandler('similarityScore')">
<div
style="margin-left: 15px; cursor: pointer"
@click="sortHandler('similarityScore')"
>
<span>相似度排序</span>
<SvgIcon style="margin-left: 5px" name="sort" size="12" v-show="selectedSortName !== 'similarityScore'" />
<SvgIcon style="margin-left: 5px" name="active-sort" size="12"
v-show="selectedSortName === 'similarityScore'" />
<SvgIcon
style="margin-left: 5px"
name="sort"
size="12"
v-show="selectedSortName !== 'similarityScore'"
/>
<SvgIcon
style="margin-left: 5px"
name="active-sort"
size="12"
v-show="selectedSortName === 'similarityScore'"
/>
</div>
</div>
</div>
<div class="wrapper-list">
<div v-for="(item, index) in listData" :key="index" :class="{ 'item-selected': item === selectTask }"
class="grid-item" @click="handleSelect(item)" @mouseover="overTaskHandelr(item)"
@mouseleave="leaveTaskHandler">
<div class="img-wrapper" :style="{ 'background-image': `url(${item.imgurl})` }" />
<div
v-for="(item, index) in listData"
:key="index"
:class="{ 'item-selected': item === selectTask }"
class="grid-item"
@click="handleSelect(item)"
@mouseover="overTaskHandelr(item)"
@mouseleave="leaveTaskHandler"
>
<div
class="img-wrapper"
:style="{ 'background-image': `url(${item.imgurl})` }"
/>
<div class="time-wrapper">
<div class="time">
<SvgIcon color="#FFF" size="16" name="camera" />
<span class="current-time">{{ item.photoDateTimestamp ? formatToDateHMS(Number(item.photoDateTimestamp) ||
0) : '-'
<span class="current-time">{{
item.photoDateTimestamp
? formatToDateHMS(Number(item.photoDateTimestamp) || 0)
: "-"
}}</span>
</div>
<div class="time">
<SvgIcon color="#FFF" size="16" name="save" />
<span class="current-time">{{ item.submitDateTimestamp ? formatToDateHMS(Number(item.submitDateTimestamp)
|| 0) : '-'
<span class="current-time">{{
item.submitDateTimestamp
? formatToDateHMS(Number(item.submitDateTimestamp) || 0)
: "-"
}}</span>
</div>
</div>
<div class="check">
<n-checkbox v-show="batch && item.historyStates !== 2 && item.historyStates !== 3"
v-model:checked="item.checked" @click.stop @update:checked="onCheckChange($event, item)" />
<n-checkbox
v-show="batch && item.historyStates !== 2 && item.historyStates !== 3"
v-model:checked="item.checked"
@click.stop
@update:checked="onCheckChange($event, item)"
/>
</div>
<div class="percent" :class="{ 'percent-red': item?.maxSimilarity >= 100 }">
<div class="val">
{{ item?.maxSimilarity && Number(item?.maxSimilarity).toFixed(0) }}<span class="percent-unit">%</span>
{{ item?.maxSimilarity && Number(item?.maxSimilarity).toFixed(0)
}}<span class="percent-unit">%</span>
</div>
</div>
<div class="pass-status" v-if="item.historyStates === 2">
<SvgIcon name="pass-icon" style="width:52;height:24px" />
<SvgIcon name="pass-icon" style="width: 52; height: 24px" />
</div>
<div class="pass-status" v-else-if="item.historyStates === 3">
<SvgIcon name="no-pass-icon" style="width:52;height:24px" />
<SvgIcon name="no-pass-icon" style="width: 52; height: 24px" />
</div>
<div v-show="overTask && overTask.id === item.id" class="action">
<SvgIcon style="cursor: pointer" name="t1" @click.stop="approvalHandler" />
<SvgIcon style="cursor: pointer;margin-left: 40px;" name="t2" @click.stop="singleRejectHandler(item)" />
<SvgIcon
style="cursor: pointer; margin-left: 40px"
name="t2"
@click.stop="singleRejectHandler(item)"
/>
</div>
</div>
</div>
@ -732,7 +838,7 @@ defineExpose({
z-index: 3;
width: 30px;
height: 30px;
background: rgba(255, 255, 255, 0.20);
background: rgba(255, 255, 255, 0.2);
border-radius: 6px;
backdrop-filter: blur(10px);
display: flex;
@ -772,7 +878,11 @@ defineExpose({
.footer-times {
width: 100%;
height: 80px;
background: linear-gradient(180deg, rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 0.71) 100%);
background: linear-gradient(
180deg,
rgba(0, 0, 0, 0.01),
rgba(0, 0, 0, 0.71) 100%
);
border-radius: 0px 8px 8px 0px;
position: absolute;
bottom: 0;
@ -824,7 +934,7 @@ defineExpose({
justify-content: center;
width: 30px;
height: 30px;
background: rgba(80, 122, 253, .1);
background: rgba(80, 122, 253, 0.1);
border-radius: 8px;
margin-left: 10px;
cursor: pointer;
@ -863,7 +973,6 @@ defineExpose({
.unit {
font-size: 11px;
}
}
}
@ -885,7 +994,6 @@ defineExpose({
padding: 24px;
// background: lime;
.task-name {
display: inline-block;
width: 100%;
@ -926,18 +1034,18 @@ defineExpose({
}
.tag-submited {
color: #507AFD;
border: 1px solid #507AFD;
color: #507afd;
border: 1px solid #507afd;
}
.tag-submiting {
color: #FFB800;
border: 1px solid #FFB800;
color: #ffb800;
border: 1px solid #ffb800;
}
.tag-passed {
color: #02C984;
border: 1px solid #02C984;
color: #02c984;
border: 1px solid #02c984;
}
.tag-not-passed {
@ -965,7 +1073,8 @@ defineExpose({
margin-right: 32px;
}
.top {}
.top {
}
.property-content {
flex: 1;
@ -1007,7 +1116,11 @@ defineExpose({
bottom: 9px;
width: calc(100% - 11px);
height: 58px;
background: linear-gradient(180deg, rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 0.71) 100%);
background: linear-gradient(
180deg,
rgba(0, 0, 0, 0.01),
rgba(0, 0, 0, 0.71) 100%
);
border-radius: 8px;
display: flex;
flex-direction: column;
@ -1077,7 +1190,6 @@ defineExpose({
}
}
.action {
position: absolute;
z-index: 5;
@ -1091,8 +1203,6 @@ defineExpose({
justify-content: center;
background-color: rgba(0, 0, 0, 0.48);
}
}
}
}

3
types/task.d.ts vendored

@ -11,7 +11,8 @@ export interface TaskState {
currentIndex: number
approvalList: any[]
immersion: boolean
inFile: boolean
inFile: boolean,
inFileId:string
}
export interface TaskEntity {

Loading…
Cancel
Save