feat: 交互完善,表单自定义设置弹窗

bak
刘释隆 1 year ago
parent 78c02e74f0
commit 439fe5cb5a

@ -98,7 +98,6 @@ const mock_list = [
0px 0px 0px 0.5px #d4e3fc;
}
.list_box {
opacity: 0.8;
background: #fefefe;
border: 1px dashed #f4f4f4;
border-radius: 8px;

@ -88,6 +88,70 @@ export const workPackageMap: Recordable<PackageEntity> = {
},
}
// 自定义填报信息配置
export const ReportInfoConfig: Recordable<PackageEntity> = {
terminalName: {
label: '拜访终端名称',
isDefault: false,
key: 'upuser',
},
location: {
label: '定位信息',
isDefault: false,
key: 'upuser',
},
visitTime: {
label: '拜访日期',
isDefault: false,
key: 'upuser',
},
distance: {
label: '定位距离',
isDefault: false,
key: 'upuser',
},
visitSum: {
label: '拜访小结',
isDefault: false,
key: 'upuser',
},
projectClassfiy: {
label: '拜访项目类别',
isDefault: false,
key: 'upuser',
},
departName: {
label: '科室名称',
isDefault: false,
key: 'upuser',
},
caseNum: {
label: '病例号',
isDefault: false,
key: 'upuser',
},
level: {
label: '拜访级别',
isDefault: false,
key: 'upuser',
},
isRepeatPic: {
label: '是否为重复图片',
isDefault: false,
key: 'upuser',
},
fileName: {
label: '字段名称',
isDefault: false,
key: 'upuser',
},
fileInfo: {
label: '附件信息',
isDefault: false,
key: 'upuser',
},
}
export const fieldMap = {
field1: '提报人',
field2: '拜访客户类型',

@ -1,24 +1,25 @@
<script lang="ts" setup>
import { computed, nextTick, onBeforeMount, onMounted, onUnmounted, onUpdated, reactive, ref, unref, watch } from 'vue'
import Masonry from 'masonry-layout'
import { useInfiniteScroll } from '@vueuse/core'
import { debounce } from 'lodash-es'
import imagesloaded from 'imagesloaded'
import { useMessage } from 'naive-ui'
import PackageSettingsModal from './modal/PackageSettingsModal.vue'
import { timeOptions, viewOptions } from '@/config/home'
import { useWindowSizeFn } from '@/hooks/event/useWindowSizeFn'
import { getViewportOffset } from '@/utils/domUtils'
import { notEmpty, randomInt } from '@/utils/index'
import { getPictureList, oneClickCheck } from '@/api/home/main'
import img1 from '@/assets/images/1.jpg'
import img2 from '@/assets/images/2.jpg'
import img3 from '@/assets/images/3.jpg'
import img4 from '@/assets/images/4.jpg'
import img5 from '@/assets/images/5.jpg'
import { timeOptions, viewOptions } from '@/config/home'
import { useWindowSizeFn } from '@/hooks/event/useWindowSizeFn'
import { useConfig } from '@/store/modules/asideConfig'
import { getViewportOffset } from '@/utils/domUtils'
import { randomInt } from '@/utils/index'
import emitter from '@/utils/mitt'
import { getImgUrl } from '@/utils/urlUtils'
import { useInfiniteScroll } from '@vueuse/core'
import imagesloaded from 'imagesloaded'
import { debounce } from 'lodash-es'
import Masonry from 'masonry-layout'
import { useMessage } from 'naive-ui'
import { computed, nextTick, onBeforeMount, onMounted, onUnmounted, onUpdated, reactive, ref, unref, watch } from 'vue'
import LoginSuccessModal from './modal/LoginSuccessModal.vue'
import PackageSettingsModal from './modal/PackageSettingsModal.vue'
const deviceHeight = ref(600)
let _masonry: null | Masonry = null
@ -32,6 +33,7 @@ const pagination = reactive({
})
const configStore = useConfig()
const packageModalRef = ref(null)
const LoginSuccessModalRef = ref(null)
const loading = ref(false)
const message = useMessage()
@ -197,6 +199,11 @@ async function oneCheck() {
modal.showModal()
}
async function showLoginSuccessModal(){
const modal = LoginSuccessModalRef.value as any
modal.showModal()
}
async function commitHandler(settingParam) {
const contentParams = {
search_month: timeRange.value,
@ -215,6 +222,8 @@ onMounted(() => {
nextTick(() => {
computeListHeight()
//
showLoginSuccessModal()
})
})
@ -310,6 +319,7 @@ async function refreshHandler() {
</div>
</div>
<PackageSettingsModal ref="packageModalRef" @commit="commitHandler" />
<LoginSuccessModal ref="LoginSuccessModalRef" />
</div>
</template>

@ -73,7 +73,7 @@ defineExpose({
<style lang="less" scoped>
.modal_wrap {
background-image: url(../../../assets/images/approval_modal_bg.png);
background-image: url(../../../../assets/images/approval_modal_bg.png);
background-repeat: no-repeat;
background-size: 100%;
width: 700px;

@ -1,10 +1,14 @@
<script lang="ts" setup>
import { computed, onBeforeMount, reactive, ref } from 'vue'
import TaskList from './TaskList.vue'
import type { TaskListItem } from '/#/task'
import { useTaskStore } from '@/store/modules/task'
import { useUser } from '@/store/modules/user'
import { computed, onBeforeMount, reactive, ref, unref } from 'vue'
import CustomFieldModal from '../modal/CustomFieldModal.vue'
import TaskList from './TaskList.vue'
import type { TaskListItem } from '/#/task'
const CustomFieldModalRef = ref(null);
const collapse = ref(false)
const taskStore = useTaskStore()
const userStore = useUser()
@ -48,6 +52,10 @@ const asideEnter = ref(false)
const showCollapse = computed(() => {
return collapse.value ? true : asideEnter.value
})
const showFilterModal = ()=>{
const modal = unref(CustomFieldModalRef)! as any;
modal.showModal();
}
</script>
<template>
@ -64,10 +72,11 @@ const showCollapse = computed(() => {
</div>
<div class="aside-header-right">
<SvgIcon size="18" name="magnifying-1" />
<SvgIcon style="margin-left: 10px;" size="18" name="filter" />
<SvgIcon style="margin-left: 10px;cursor: pointer;" size="18" name="filter" @click="showFilterModal"/>
</div>
</div>
<TaskList style="height: calc(100vh - 146px);" class="work-sheet-list" :data="data" :active-id="taskStore.getActiveId" />
<CustomFieldModal ref="CustomFieldModalRef" />
</div>
</template>

@ -1,152 +1,156 @@
<script lang="ts" setup>
import { computed, onUnmounted, reactive, ref, unref, watch } from 'vue'
import { useDialog } from 'naive-ui'
import ConfrimModal from '../modal/ConfrimModal.vue'
import BatchModal from '../modal/BatchModal.vue'
import TaskTable from './TaskTable.vue'
import PictureTable from './PictureTable.vue'
import { useTask } from '@/store/modules/task'
import { approval } from '@/api/task/task'
import type { ApprovalParam, PictureSortParam } from '/#/api'
import { getTaskDetailInfo, getTaskDetailPictureList } from '@/api/work/work'
const batch = ref(false)
const selectItems = ref<any[]>([])
import { approval } from "@/api/task/task";
import { getTaskDetailInfo, getTaskDetailPictureList } from "@/api/work/work";
import { useTask } from "@/store/modules/task";
import { useDialog } from "naive-ui";
import { computed, onUnmounted, reactive, ref, unref, watch } from "vue";
import BatchModal from "../modal/BatchModal.vue";
import ConfrimModal from "../modal/ConfrimModal.vue";
import CustomSettingModal from '../modal/CustomSettingModal.vue';
import PictureTable from "./PictureTable.vue";
import TaskTable from "./TaskTable.vue";
import type { ApprovalParam, PictureSortParam } from "/#/api";
const batch = ref(false);
const selectItems = ref<any[]>([]);
const sortBy: PictureSortParam = {
orderbyname: 'asc',
orderbyvalue: 'fromuptime',
}
orderbyname: "asc",
orderbyvalue: "fromuptime",
};
function setBatch(value: boolean) {
batch.value = value
batch.value = value;
if (value === false) {
selectItems.value.forEach(item => item.checked = false)
selectItems.value.length = 0
selectItems.value.forEach((item) => (item.checked = false));
selectItems.value.length = 0;
}
}
function onCheckChange(checked: any, item: any) {
const index = selectItems.value.indexOf(item)
item.checked = checked
if (index === -1 && checked)
selectItems.value.push(item)
const index = selectItems.value.indexOf(item);
item.checked = checked;
else
selectItems.value.splice(index, 1)
if (index === -1 && checked) selectItems.value.push(item);
else selectItems.value.splice(index, 1);
}
const showActions = computed(() => {
return selectItems.value.length > 0 && batch
})
return selectItems.value.length > 0 && batch;
});
const dialog = useDialog()
const dialog = useDialog();
function handleConfirm() {
dialog.info({
title: '确认提示',
content: '确认给该任务审批为【通过】吗?',
positiveText: '确定',
negativeText: '取消',
title: "确认提示",
content: "确认给该任务审批为【通过】吗?",
positiveText: "确定",
negativeText: "取消",
onPositiveClick: () => {
approvalHandler()
approvalHandler();
},
onNegativeClick: () => { },
})
onNegativeClick: () => {},
});
}
const taskpagination = reactive({
pageNo: 1,
pageSize: 10,
})
const taskStore = useTask()
const overTask = ref<any>(null)
const taskDetailInfo = ref<any>({})
const taskDetailPictureList = ref<any[]>([])
});
const taskStore = useTask();
const overTask = ref<any>(null);
const taskDetailInfo = ref<any>({});
const taskDetailPictureList = ref<any[]>([]);
function approvalHandler() {
let ids: any[] = []
let ids: any[] = [];
if (batch.value === true)
ids = selectItems.value.map(item => item.id)
else if (overTask.value !== null)
ids = [overTask.value.id]
if (batch.value === true) ids = selectItems.value.map((item) => item.id);
else if (overTask.value !== null) ids = [overTask.value.id];
const param: ApprovalParam = {
formid: '',
taskId: '',
formid: "",
taskId: "",
approvd: true,
taskComment: '',
}
taskComment: "",
};
approval(param)
approval(param);
}
function rejectHandler(idOrDesc: string, isOther: boolean) {
let ids: any[] = []
let ids: any[] = [];
if (batch.value === true)
ids = selectItems.value.map(item => item.id)
else if (overTask.value !== null)
ids = [overTask.value.id]
if (batch.value === true) ids = selectItems.value.map((item) => item.id);
else if (overTask.value !== null) ids = [overTask.value.id];
const param: ApprovalParam = {
formid: '',
taskId: '',
formid: "",
taskId: "",
approvd: false,
taskComment: '',
}
taskComment: "",
};
if (isOther)
param.taskComment = idOrDesc
else
param.taskComment = idOrDesc
if (isOther) param.taskComment = idOrDesc;
else param.taskComment = idOrDesc;
approval(param)
approval(param);
}
const confrimModalRef = ref(null)
const batchModalRef = ref(null)
const confrimModalRef = ref(null);
const batchModalRef = ref(null);
const CustomSettingModalRef = ref(null);
function showModal(modalRef: any) {
const modal = unref(modalRef)! as any
modal.showModal()
const modal = unref(modalRef)! as any;
modal.showModal();
}
function forwardHandler() {
taskStore.forward()
taskStore.forward();
}
function backHandler() {
taskStore.back()
taskStore.back();
}
watch(() => taskStore.activeId, async (newValue, oldValue) => {
const packageid = taskStore.getPackageid
const taskId = taskStore.getActiveId
taskDetailInfo.value = await getTaskDetailInfo(taskId, packageid)
const res = await getTaskDetailPictureList(packageid, taskId, { ...taskpagination, ...sortBy })
taskDetailPictureList.value = res.data
})
watch(
() => taskStore.activeId,
async (newValue, oldValue) => {
const packageid = taskStore.getPackageid;
const taskId = taskStore.getActiveId;
taskDetailInfo.value = await getTaskDetailInfo(taskId, packageid);
const res = await getTaskDetailPictureList(packageid, taskId, {
...taskpagination,
...sortBy,
});
taskDetailPictureList.value = res.data;
}
);
const currentTaskId = computed(() => {
const index = taskStore.getCurrentIndex
return taskStore.getApprovalList[index]?.formid || ''
})
const index = taskStore.getCurrentIndex;
return taskStore.getApprovalList[index]?.formid || "";
});
function overTaskHandelr(item: any) {
// TODOitem
overTask.value = item
overTask.value = item;
}
function leaveTaskHandler() {
overTask.value = null
overTask.value = null;
}
function showActionsModal(){
const modal = unref(CustomSettingModalRef)! as any;
modal.showModal();
}
onUnmounted(() => {
taskStore.reset()
})
taskStore.reset();
});
</script>
<template>
@ -154,12 +158,22 @@ onUnmounted(() => {
<div class="wrapper-header">
<div class="left">
<span class="font">任务ID{{ currentTaskId }}</span>
<SvgIcon size="22" class="forward" name="arrow-left" @click="backHandler" />
<SvgIcon size="22" class="back" name="arrow-right" @click="forwardHandler" />
<SvgIcon
size="22"
class="forward"
name="arrow-left"
@click="backHandler"
/>
<SvgIcon
size="22"
class="back"
name="arrow-right"
@click="forwardHandler"
/>
</div>
<div class="right">
<div v-show="!showActions" class="btn" @click="setBatch(true)">
<SvgIcon style="margin-right: 6px;" size="14" name="tf" />
<SvgIcon style="margin-right: 6px" size="14" name="tf" />
批量审批
</div>
<div v-show="showActions" class="batch">
@ -169,11 +183,14 @@ onUnmounted(() => {
</template>
返回
</n-button>
<div style="cursor: pointer;margin-left: 16px;" @click="showModal(confrimModalRef)">
<div
style="cursor: pointer; margin-left: 16px"
@click="showModal(confrimModalRef)"
>
<SvgIcon width="64" height="28" name="a1" />
</div>
<SvgIcon size="24" name="vs" />
<div style="cursor: pointer;" @click="handleConfirm">
<div style="cursor: pointer" @click="handleConfirm">
<SvgIcon width="64" height="28" name="a2" />
</div>
</div>
@ -182,38 +199,52 @@ onUnmounted(() => {
</div>
<div class="wrapper-detail">
<div class="left">
<img style="overflow: hidden;" src="../../../assets/images/test.png">
<img style="overflow: hidden" src="../../../assets/images/test.png" />
</div>
<div class="right">
<n-scrollbar style="max-height: 100%;">
<n-scrollbar style="max-height: 100%">
<div class="header">
<span>相似图片(9)</span>
<SvgIcon style="margin-right: 20px;cursor: pointer;" name="max" size="24" @click="showModal(batchModalRef)" />
<SvgIcon
style="margin-right: 20px; cursor: pointer"
name="max"
size="24"
@click="showModal(batchModalRef)"
/>
</div>
<div class="list">
<div v-for="(item, index) in taskDetailPictureList" :key="index" class="item">
<div style="overflow: hidden;">
<img src="../../../assets/images/test.png">
<div
v-for="(item, index) in taskDetailPictureList"
:key="index"
class="item"
>
<div style="overflow: hidden">
<img src="../../../assets/images/test.png" />
</div>
<div class="check">
<n-checkbox
v-show="batch" v-model:checked="item.checked" @click.stop
v-show="batch"
v-model:checked="item.checked"
@click.stop
@update:checked="onCheckChange($event, item)"
/>
</div>
<div class="percent">
96%
</div>
<div class="percent">96%</div>
</div>
</div>
</n-scrollbar>
</div>
</div>
<div class="info-header">
<div class="title">
填报信息
<div class="left_box">
<div class="title">填报信息</div>
<SvgIcon size="12" name="collapse" />
</div>
<div class="right_box" @click="showActionsModal">
自定义设置
<SvgIcon size="16" name="pencil" />
</div>
<SvgIcon size="12" name="collapse" />
</div>
<n-tabs type="line" animated>
<n-tab-pane name="task-info" tab="任务信息">
@ -226,6 +257,8 @@ onUnmounted(() => {
</n-tabs>
<ConfrimModal ref="confrimModalRef" @commit="rejectHandler" />
<BatchModal ref="batchModalRef" />
<CustomSettingModal ref="CustomSettingModalRef" />
</div>
</template>
@ -237,7 +270,7 @@ onUnmounted(() => {
box-sizing: border-box;
margin-left: 16px;
padding: 16px 16px 0px 16px;
background: #FFF;
background: #fff;
border-radius: 3px;
border: 1px solid rgb(239, 239, 245);
height: calc(100vh - 88px);
@ -247,7 +280,7 @@ onUnmounted(() => {
display: flex;
justify-content: space-between;
align-items: center;
background: #FFF;
background: #fff;
box-sizing: border-box;
border-radius: 3px;
margin-bottom: 16px;
@ -278,11 +311,11 @@ onUnmounted(() => {
height: 36px;
background: linear-gradient(135deg, #5b85f8, #3c6cf0);
border-radius: 17px;
box-shadow: 0px 2px 6px 0px rgba(116, 153, 253, 0.30);
box-shadow: 0px 2px 6px 0px rgba(116, 153, 253, 0.3);
display: flex;
align-items: center;
justify-content: center;
color: #FFF;
color: #fff;
margin-right: 6px;
cursor: pointer;
}
@ -304,7 +337,7 @@ onUnmounted(() => {
&-detail {
display: flex;
height: calc((100vh - 88px - 72px)/2);
height: calc((100vh - 88px - 72px) / 2);
.left {
flex: 0.6;
@ -366,7 +399,7 @@ onUnmounted(() => {
z-index: 5;
right: 12px;
top: 2px;
color: #FFF;
color: #fff;
}
}
}
@ -375,22 +408,31 @@ onUnmounted(() => {
display: flex;
padding: 16px 0px;
align-items: center;
.title {
justify-content: space-between;
.left_box {
display: flex;
align-items: center;
margin-right: 8px;
&:before {
content: '';
width: 4px;
height: 18px;
background: #507afd;
border-radius: 3px;
display: inline-block;
margin-right: 10px;
.title {
display: flex;
align-items: center;
margin-right: 8px;
&:before {
content: "";
width: 4px;
height: 18px;
background: #507afd;
border-radius: 3px;
display: inline-block;
margin-right: 10px;
}
}
}
.right_box {
display: flex;
align-items: center;
cursor: pointer;
}
}
}
</style>

@ -0,0 +1,258 @@
<script lang="ts" setup>
import { ReportInfoConfig } from "@/config/workorder";
import { ref } from "vue";
const offList = ref<any[]>([]);
function generatList() {
const keys = Object.keys(ReportInfoConfig);
const hideList: object[] = [];
for (const key of keys) {
const name = ReportInfoConfig[key]?.label;
const isDefault = ReportInfoConfig[key]?.isDefault;
// Y
if (!isDefault) {
hideList.push({
id: key,
name: name || "未配置",
fix: isDefault,
checked: ReportInfoConfig[key].isDefault,
});
}
}
const fixedList = generateDefaultList();
hideList.unshift(...fixedList);
offList.value = hideList;
return { hideList };
}
function generateDefaultList() {
return Object.keys(ReportInfoConfig).reduce((acc, key) => {
const { label, isDefault } = ReportInfoConfig[key];
if (isDefault) {
const config = {
id: key,
name: label || "未配置",
fix: true,
checked: true,
};
return [...acc, config];
} else {
return acc;
}
}, []);
}
const show = ref(false);
const checkAll = ref(false);
function showModal() {
show.value = true;
}
function closeModal() {
show.value = false;
}
async function handleSumbit(e: MouseEvent) {
e.preventDefault();
closeModal();
}
defineExpose({
showModal,
});
generatList();
const selectIds = ref<string[]>([]);
function onCheckAllChange(value) {
const ids: string[] = [];
for (const item of offList.value) {
if (!item.fix) {
item.checked = value;
ids.push(item.id);
}
}
selectIds.value = value ? ids : [];
}
function onCheckChange(checked: any, item: any) {
const index = selectIds.value.indexOf(item.id);
item.checked = checked;
if (index === -1 && checked) selectIds.value.push(item.id);
else selectIds.value.splice(index, 1);
}
</script>
<template>
<n-modal v-model:show="show" transform-origin="center">
<n-card
class="cardstyle"
:bordered="false"
size="huge"
role="dialog"
aria-modal="true"
>
<div class="wrapper">
<span class="wrapper-title">自定义填报信息</span>
<n-grid cols="4" class="mt-4 proCard" responsive="screen" :x-gap="24">
<n-grid-item span="4">
<NCard
title=""
class="dragcardStyle"
:segmented="{ content: true, footer: true }"
size="small"
:bordered="false"
>
<div>
<div class="draggable-ul">
<div class="draggable-li" style="background: #f8f8f8;">
<n-checkbox
v-model:checked="checkAll"
label="全部"
@update:checked="onCheckAllChange"
/>
</div>
<div class="content">
<div
v-for="item in offList"
:key="item.id"
style="width: 170px"
:class="{ 'disable-check': item.fix }"
class="draggable-li"
>
<n-checkbox
v-model:checked="item.checked"
:label="item.name"
:disabled="item.fix"
@update:checked="onCheckChange($event, item)"
/>
</div>
</div>
</div>
</div>
</NCard>
</n-grid-item>
</n-grid>
</div>
<template #footer>
<div class="wrapper-footer">
<n-button type="info" @click="handleSumbit"> </n-button>
<n-button secondary style="margin-left: 15px" @click="closeModal">
取消
</n-button>
</div>
</template>
</n-card>
</n-modal>
</template>
<style lang="less" scoped>
.wrapper {
display: flex;
flex-direction: column;
&-title {
font-weight: bold;
font-size: 16px;
}
&-bar {
background-color: #e8e8e8;
width: 100%;
margin-top: 20px;
}
&-footer {
display: flex;
justify-content: flex-end;
}
&-info {
font-weight: bold;
position: relative;
&:before {
background-color: #1980ff;
content: "";
width: 5px;
border-radius: 2px;
top: 0;
bottom: 0;
position: absolute;
}
}
}
.dragcardStyle {
--n-padding-bottom: 0px !important;
--n-padding-left: 0px !important;
}
.cardstyle {
width: 820px;
--n-padding-bottom: 20px;
--n-padding-left: 24px;
}
.textbtnStyle {
cursor: pointer;
color: #1980ff;
}
.draggable-ul {
width: 100%;
overflow: hidden;
border: 1px solid #cad2dd;
border-radius: 2px;
display: block;
.content {
display: flex;
flex-wrap: wrap;
}
.draggable-li {
padding: 10px 16px;
color: #333;
}
.draggable-item {
padding: 10px 16px;
color: #333;
display: flex;
align-items: center;
}
.disable-check {
color: gainsboro;
}
}
::v-deep(
.n-card.n-card--content-segmented > .n-card__content:not(:first-child)
) {
border: 0px;
}
::v-deep(.n-card > .n-card-header) {
--n-padding-top: 0px;
--n-padding-bottom: 12px;
}
</style>

@ -42,7 +42,12 @@ defineExpose({
<n-modal v-model:show="show" transform-origin="center" class="modal_wrap">
<div class="wrapper">
<div class="closed">
<SvgIcon style="cursor: pointer" name="cut-down" width="32" @click="closeModal"/>
<SvgIcon
style="cursor: pointer"
name="cut-down"
width="32"
@click="closeModal"
/>
</div>
<div class="wrapper-hearder">
<div class="wrapper-title">智能AI审批工具</div>
@ -56,27 +61,26 @@ defineExpose({
<div class="task_id">任务IDYPW34567890-2995</div>
<div class="tag_box">
<div class="tag_item">基线任务</div>
<div class="tag_item">中日友好医院</div>
<div class="tag_item error">相似图片(16)</div>
</div>
<div class="time_box">2023-09-17 13:09:10</div>
</div>
</div>
</n-scrollbar>
<div class="mark_text">
智能识别图片与拜访终端名称不相符建议审批不通过
移至可疑收藏夹
智能识别12张图片来源于网络建议将图片标记为假 快速审批不通过
</div>
<div class="footer">
<SvgIcon
style="cursor: pointer"
name="r1"
name="r3"
width="162"
height="54"
@click="reject"
/>
<SvgIcon
style="cursor: pointer"
name="r5"
name="r2"
width="162"
height="54"
@click="viewRepeat"
@ -99,7 +103,7 @@ defineExpose({
.wrapper {
position: absolute;
left: calc(50% - 350px);
.closed{
.closed {
position: relative;
top: 0px;
left: 90%;
@ -129,7 +133,7 @@ defineExpose({
flex: 1;
border-radius: 8px;
margin: 35px 60px 35px 120px;
.item{
.item {
display: flex;
flex-flow: row nowrap;
align-items: center;
@ -169,6 +173,10 @@ defineExpose({
line-height: 16px;
margin-right: 10px;
}
.error {
background: rgba(255, 78, 79, 0.1);
color: #ff4e4f;
}
}
.time_box {
font-size: 14px;
@ -187,7 +195,7 @@ defineExpose({
color: #666666;
line-height: 16px;
}
.footer{
.footer {
display: flex;
flex-flow: row nowrap;
align-items: center;

@ -56,26 +56,27 @@ defineExpose({
<div class="task_id">任务IDYPW34567890-2995</div>
<div class="tag_box">
<div class="tag_item">基线任务</div>
<div class="tag_item">相似图片(16)</div>
<div class="tag_item error">中日友好医院</div>
</div>
<div class="time_box">2023-09-17 13:09:10</div>
</div>
</div>
</n-scrollbar>
<div class="mark_text">
智能识别12张图片来源于网络建议将图片标记为假 快速审批不通过
智能识别图片与拜访终端名称不相符建议审批不通过
移至可疑收藏夹
</div>
<div class="footer">
<SvgIcon
style="cursor: pointer"
name="r3"
name="r1"
width="162"
height="54"
@click="reject"
/>
<SvgIcon
style="cursor: pointer"
name="r2"
name="r5"
width="162"
height="54"
@click="viewRepeat"
@ -168,6 +169,10 @@ defineExpose({
line-height: 16px;
margin-right: 10px;
}
.error {
background: rgba(255, 78, 79, 0.1);
color: #ff4e4f;
}
}
.time_box {
font-size: 14px;

Loading…
Cancel
Save