Compare commits

..

1 Commits

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

1
components.d.ts vendored

@ -53,7 +53,6 @@ declare module 'vue' {
NUpload: typeof import('naive-ui')['NUpload']
NUploadDragger: typeof import('naive-ui')['NUploadDragger']
Quill: typeof import('./src/components/RichEditor/Quill.vue')['default']
Robot: typeof import('./src/components/Robot/index.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
Search: typeof import('./src/components/Search/Search.vue')['default']

@ -119,6 +119,5 @@
<div class="selection-box" style="border: 1px dotted black;position: absolute;display: none;"></div>
<script>var globalThis = window;</script>
<script src="/src/main.ts" type="module"></script>
<script src="https://map.qq.com/api/js?v=2.exp&key=GIABZ-YUQKX-JOI4L-ZAGIS-673KS-NKBMC"></script>
</body>
</html>

@ -23,7 +23,7 @@ const adminInfo = {
value: 'task-main',
},
{
label: '图审审批',
label: '图审审批管理',
value: 'worksheet-main',
},
],

13477
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -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 } 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,6 +49,8 @@ const getThemeOverrides = computed(() => {
},
};
});
</script>
<template>
@ -57,11 +59,9 @@ const getThemeOverrides = computed(() => {
:date-locale="dateZhCN"
:theme-overrides="getThemeOverrides"
>
<NModalProvider>
<AppProvider>
<RouterView />
</AppProvider>
</NModalProvider>
<AppProvider>
<RouterView />
</AppProvider>
</NConfigProvider>
</template>
@ -78,28 +78,7 @@ 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 {
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-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>

@ -26,7 +26,8 @@ export async function getPictureTypeList(): Promise<any> {
url: `/static/admin/web/distionary/bytypecode/izpicturetype`,
method: 'get',
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data[0].distionaryList
return list
}
@ -72,7 +73,7 @@ export async function getTFList() {
method: 'get',
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data[0].distionaryList
return list
}
@ -144,7 +145,7 @@ export async function getIztaskrromList(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data[0].distionaryList
return list
}
@ -160,7 +161,7 @@ export async function getIztaskstatusList(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data[0].distionaryList
return list
}
@ -190,7 +191,7 @@ export async function getIzfirmList(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data[0].distionaryList
return list
}
@ -206,7 +207,7 @@ export async function getIzproductnameList(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data[0].distionaryList
return list
}
@ -222,7 +223,7 @@ export async function getizcustomnameList(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data[0].distionaryList
return list
}
@ -236,7 +237,7 @@ export async function getIzCustomtypeList(): Promise<any> {
method: 'get',
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data[0].distionaryList
return list
}
@ -252,7 +253,7 @@ export async function getIzcustomlevel(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data[0].distionaryList
return list
}
@ -268,7 +269,7 @@ export async function getIzprojecttypeList(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data[0].distionaryList
return list
}
@ -297,7 +298,8 @@ export async function getRejectList() {
method: 'get',
})
return res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data[0].distionaryList
return list
}
/**
@ -310,14 +312,14 @@ export async function getBackList() {
method: 'get',
})
return res.data&&res.data.length?res.data[0].distionaryList:[]
return res.data[0].distionaryList
}
/**
*
* @returns
*/
export async function getBusinessList(field: string, page: PageParam = { pageNo: 1, pageSize: 10000 }) {
export async function getBusinessList(field: string, page: PageParam = { pageNo: 1, pageSize: 200 }) {
const res = await http.request({
url: `/ocr/dictionary/getDictionaryByField`,
method: 'get',
@ -363,7 +365,7 @@ export async function getRelationTypeList() {
method: 'get',
})
return res.data&&res.data.length?res.data[0].distionaryList:[]
return res.data[0].distionaryList
}
/**
@ -375,7 +377,7 @@ export async function getizstatusList() {
url: `/static/admin/web/distionary/bytypecode/izstatus`,
method: 'get',
})
return res.data&&res.data.length?res.data[0].distionaryList:[]
return res.data[0].distionaryList
}
/**
@ -387,5 +389,5 @@ export async function getizApprovalStatusList() {
url: `/static/admin/web/distionary/bytypecode/izApprovalStatus`,
method: 'get',
})
return res.data&&res.data.length?res.data[0].distionaryList:[]
return res.data[0].distionaryList
}

@ -15,7 +15,6 @@ export async function getApprovalList(page: any) {
pageSize: page.pageSize,
currPage: page.pageNo,
keyword: page.keyword,
userSearchId:page.userSearchId
},
})

@ -22,7 +22,7 @@ export async function getPackageList(params: PageParam, packageName: string) {
}
/**
* -
* -
* @returns
*/
export async function getPackagePicture(params: PageParam, packagename: string) {
@ -62,11 +62,12 @@ export async function getPackageTaskList(packageid: string, params: PageParam) {
}
/**
* -
* -
* @param checkDuplicateId id
* @returns
*/
export async function getTaskDetailInfo(checkDuplicateId: string) {
const res = await http.request({
url: `/ocr/ocrPicture/getPackagePicture?checkDuplicateId=${checkDuplicateId}`,
method: 'get',
@ -74,18 +75,7 @@ export async function getTaskDetailInfo(checkDuplicateId: string) {
return res.data
}
/**
*
* @param pictureid id xx,xx,xx,xx
* @returns
*/
export async function dubiousfileyd(pictureid: string) {
const res = await http.request({
url: `/ocr/dubiousfile/dubiousfileyd?pictureid=${pictureid}`,
method: 'get',
})
return res.data
}
/**
* ()
* @param packageid id
@ -94,6 +84,7 @@ export async function dubiousfileyd(pictureid: string) {
* @returns
*/
export async function getPictureSimilarityList(params: PageParam & PictureSortParam & SimilarityPictureSortParam) {
const res = await http.request({
url: `/backstage/jifen/ocrtaskchildpicture/getPictureSimilarityList`,
method: 'get',
@ -103,7 +94,7 @@ export async function getPictureSimilarityList(params: PageParam & PictureSortPa
const { data: { records, pages, total } } = res
// 精简一下数据
const list = records.map((item, index) => {
const list = records.map((item,index) => {
return {
id: item.id,
checkDuplicateId: item.checkDuplicateId,
@ -117,9 +108,9 @@ export async function getPictureSimilarityList(params: PageParam & PictureSortPa
iztrueorfalse: item.iztrueorfalse,
states: item.states,
history: item.ocpictureid && item.picturecompare && hasHistory(item.ocpictureid, item.picturecompare),
historyStates: item.historyStates,
submitDateTimestamp: item.submitDateTimestamp,
photoDateTimestamp: item.photoDateTimestamp,
historyStates:item.historyStates,
submitDateTimestamp:item.submitDateTimestamp,
photoDateTimestamp:item.photoDateTimestamp,
}
})
return {

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="48px" height="37px" viewBox="0 0 48 37" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>形状 2</title>
<g id="index" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="index_图片加载中" transform="translate(-893.000000, -298.000000)" fill="#F0F0F0" fill-rule="nonzero">
<g id="编组-24" transform="translate(410.000000, 62.000000)">
<g id="编组-27" transform="translate(16.000000, 132.000000)">
<g id="编组-18备份-2" transform="translate(400.000000, 0.000000)">
<g id="形状-3" transform="translate(67.000000, 104.000000)">
<g id="形状-2" transform="translate(0.000000, 0.462637)">
<path d="M12.8421882,20.0575479 C12.1281936,19.0374348 10.9742024,19.0374348 10.2622078,20.0575479 L0.346282996,34.2309071 C-0.367711589,35.249016 0.0582851799,36.0747264 1.29427581,36.0747264 L46.7139313,36.0747264 C47.9519219,36.0747264 48.3659188,35.2510201 47.6479242,34.2349153 L31.9400434,12.0389379 C31.2160489,11.0168206 30.0540576,11.0208289 29.3340631,12.0389379 L18.2181474,27.7454729 L12.8401882,20.0575479 L12.8421882,20.0575479 Z M6.54623594,4.5093408 C6.54623594,7.00050109 8.50022111,9.0186816 10.9102029,9.0186816 C13.3201846,9.0186816 15.2721698,7.00050109 15.2721698,4.5093408 C15.2721698,2.01818051 13.3221846,0 10.9122029,0 C8.50222115,0 6.54823594,2.01818051 6.54823594,4.5093408 L6.54623594,4.5093408 Z" id="形状"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>小结重复数</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-2504.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="小结重复数" transform="translate(2504.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<path d="M39.4637452,37.4192503 L42.4384908,40.9882633 L38.4168391,44.1717731 C38.238099,44.3210001 38.0082903,44.383178 37.7784816,44.3583068 L37.7784816,44.3583068 L35.4931621,44.1344663 C35.0463119,44.0971595 34.8292703,43.8360123 34.8803389,43.4007668 L34.8803389,43.4007668 L35.1229147,41.1872326 C35.148449,40.9633921 35.2633534,40.7519871 35.4420935,40.6151957 L35.4420935,40.6151957 L39.4637452,37.4192503 Z M36.3996296,40.9509565 C36.2847253,40.8141651 36.0804509,40.7892939 35.9400123,40.9012142 C35.7995736,41.0131344 35.7740393,41.2121038 35.8889437,41.3488952 L35.8889437,41.3488952 L37.7401802,43.574865 C37.8550845,43.7116564 38.0593589,43.7365276 38.1997975,43.6246073 C38.3402362,43.512687 38.3657705,43.3137177 38.2508661,43.1769262 L38.2508661,43.1769262 Z M34.7015988,24.1007387 C36.0676837,24.1877878 36.3613282,24.3743216 36.2847253,25.6924936 L36.2847253,38.0161584 L33.6546927,40.1302079 C33.2844454,41.0006988 33.1184724,41.8090119 33.1823082,42.5800182 L21.3982301,42.5800182 C19.840638,42.5800182 19.6363636,41.9582389 19.6363636,40.8887786 L19.6363636,26.0655611 C19.6363636,24.8344382 19.751268,24.1256099 21.2322572,24.1007387 L34.7015988,24.1007387 Z M40.8936659,36.3000477 C41.4809547,35.8523666 42.3235865,35.9394157 42.795971,36.499017 L42.795971,36.499017 L44.0599187,38.028594 C44.0726858,38.028594 44.0726858,38.0410296 44.085453,38.0534652 C44.5323032,38.6130665 44.430166,39.4338151 43.8556443,39.8690606 L43.8556443,39.8690606 L43.0002454,40.5530178 L40.0254998,36.9840049 Z M27.2300894,35.6641158 L23.5186803,35.6641158 C23.1851396,35.6441576 22.8663348,35.8038546 22.6825894,36.082934 C22.4997429,36.3503649 22.4997429,36.7025941 22.6825894,36.9700249 C22.864953,37.2412522 23.1786803,37.3896158 23.5186803,37.3896158 L23.5186803,37.3896158 L27.2300894,37.3896158 C27.5700894,37.3896158 27.8838166,37.2412522 28.066953,36.9700249 C28.2500894,36.6987977 28.2500894,36.3533886 28.066953,36.082934 C27.8838166,35.810934 27.5700894,35.6641158 27.2300894,35.6641158 L27.2300894,35.6641158 Z M36.093218,19.6363636 C39.182868,19.7109771 40.6383229,20.5814681 40.6766243,23.5287018 L40.6766243,34.6088081 L40.56172,34.5590658 L37.6252759,36.9218269 L37.6252759,24.1629166 C37.6252759,23.3670392 37.0762885,22.5711617 36.1570538,22.533855 L24.0665642,22.533855 C23.798454,22.533855 23.5175768,22.2851433 23.4920425,22.023996 L23.4920425,21.36491 C23.4920425,20.4819834 24.30914,19.6736704 25.2411418,19.6487992 L25.3049776,19.6487992 L36.093218,19.6363636 Z M32.8238621,31.2997522 L23.5186803,31.2997522 C23.1850199,31.2801224 22.8662573,31.4400929 22.6825894,31.7193431 C22.4997429,31.986774 22.4997429,32.3390032 22.6825894,32.606434 C22.864953,32.8776613 23.1786803,33.0260249 23.5186803,33.0260249 L23.5186803,33.0260249 L32.7983621,33.0260249 C33.1375894,33.0260249 33.4520894,32.8537067 33.6607257,32.606434 C33.8438621,32.3359795 33.8438621,31.9897977 33.6607257,31.7193431 C33.4775894,31.4481158 33.1638621,31.2997522 32.8238621,31.2997522 L32.8238621,31.2997522 Z M23.5186803,26.911434 C23.1786803,26.8867067 22.864953,27.0597977 22.6825894,27.3310249 C22.4997429,27.5984558 22.4997429,27.950685 22.6825894,28.2181158 C22.864953,28.4901158 23.1786803,28.636934 23.5186803,28.636934 L23.5186803,28.636934 L32.7983621,28.636934 C33.1375894,28.662434 33.4513166,28.4901158 33.634453,28.2428431 C33.7913166,27.9716158 33.7913166,27.6262067 33.634453,27.3557522 C33.4513166,27.0845249 33.1638621,26.911434 32.8238621,26.911434 L32.8238621,26.911434 Z" id="形状结合"></path>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>卡片模式</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-3040.000000, -6389.000000)" fill-rule="nonzero">
<g id="卡片模式" transform="translate(3040.000000, 6389.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="64" height="64"></rect>
<path d="M52.8,52.8 L52.8,38.95 L38.95,38.95 L38.95,52.8 L52.8,52.8 M25.05,52.8 L25.05,38.95 L11.2,38.95 L11.2,52.8 L25.05,52.8 M52.8,25.05 L52.8,11.2 L38.95,11.2 L38.95,25.05 L52.8,25.05 M25.05,25.05 L25.05,11.2 L11.2,11.2 L11.2,25.05 L25.05,25.05 M54.55,58 L37.2,58 C35.3,58 33.75,56.45 33.75,54.55 L33.75,37.2 C33.75,35.3 35.3,33.75 37.2,33.75 L54.55,33.75 C56.45,33.75 58,35.3 58,37.2 L58,54.55 C58,56.45 56.45,58 54.55,58 L54.55,58 Z M26.8,58 L9.45,58 C7.55,58 6,56.45 6,54.55 L6,37.2 C6,35.3 7.55,33.75 9.45,33.75 L26.8,33.75 C28.7,33.75 30.25,35.3 30.25,37.2 L30.25,54.55 C30.25,56.45 28.7,58 26.8,58 L26.8,58 Z M54.55,30.25 L37.2,30.25 C35.3,30.25 33.75,28.7 33.75,26.8 L33.75,9.45 C33.75,7.55 35.3,6 37.2,6 L54.55,6 C56.45,6 58,7.55 58,9.45 L58,26.8 C58,28.7 56.45,30.25 54.55,30.25 L54.55,30.25 Z M26.8,30.25 L9.45,30.25 C7.55,30.25 6,28.7 6,26.8 L6,9.45 C6,7.55 7.55,6 9.45,6 L26.8,6 C28.7,6 30.25,7.55 30.25,9.45 L30.25,26.8 C30.25,28.7 28.7,30.25 26.8,30.25 L26.8,30.25 Z" id="形状" fill="#333333"></path>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>任务总数</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-930.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="任务总数" transform="translate(930.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<path d="M42.8077595,20.3636364 L21.1922405,20.3636364 C20.9718752,20.364003 20.7607017,20.4519898 20.60527,20.6082013 C20.4498384,20.7644129 20.3629095,20.9760242 20.3636409,21.1963887 L20.3636409,27.0159562 L43.6363591,27.0159562 L43.6363591,21.1963887 C43.6370905,20.9760242 43.5501616,20.7644129 43.39473,20.6082013 C43.2392983,20.4519898 43.0281248,20.364003 42.8077595,20.3636364 L42.8077595,20.3636364 Z M23.6724827,24.7283119 C23.097779,24.7283119 22.6318895,24.2624221 22.6318895,23.6877179 C22.6318895,23.1130136 23.097779,22.6471238 23.6724827,22.6471238 C24.2468039,22.6471238 24.7123832,23.1127035 24.7123832,23.6870251 C24.7123832,24.2613467 24.2468039,24.7269264 23.6724827,24.7269264 L23.6724827,24.7283119 Z M20.3636456,42.8036113 C20.3636456,43.2664054 20.7349891,43.6363636 21.1922405,43.6363636 L42.8036027,43.6363636 C43.0239675,43.6363636 43.2352865,43.5487295 43.390978,43.3927781 C43.5466694,43.2368266 43.6339511,43.0253615 43.6335843,42.8049968 L43.6335843,36.9854294 L20.3636456,36.9854294 L20.3636456,42.8049968 L20.3636456,42.8036113 Z M23.6724827,39.2730736 C24.2464213,39.2730736 24.7116904,39.7383431 24.7116904,40.3122821 C24.7116904,40.8862211 24.2464213,41.3514906 23.6724827,41.3514906 C23.0985442,41.3514906 22.6332751,40.8862211 22.6332751,40.3122821 C22.6332751,39.7383431 23.0985442,39.2730736 23.6724827,39.2730736 L23.6724827,39.2730736 Z M20.3636456,35.3240815 L43.6363544,35.3240815 L43.6363544,28.6759185 L20.3636456,28.6759185 L20.3636456,35.3254671 L20.3636456,35.3240815 Z M23.6724827,30.9594059 C24.2468039,30.9594059 24.7123832,31.4249856 24.7123832,31.9993072 C24.7123832,32.5736288 24.2468039,33.0392084 23.6724827,33.0392084 C23.0985442,33.0392084 22.6332751,32.573939 22.6332751,32 C22.6332751,31.426061 23.0985442,30.9607916 23.6724827,30.9607916 L23.6724827,30.9594059 Z" id="形状"></path>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>新建</title>
<defs>
<rect id="path-1" x="0" y="0" width="64" height="64"></rect>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-664.000000, -3118.000000)">
<g id="新建" transform="translate(664.000000, 3118.000000)">
<g transform="translate(0.000000, 0.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="蒙版" fill="#FFFFFF" fill-rule="nonzero" opacity="0" xlink:href="#path-1"></use>
<g id="编组" mask="url(#mask-2)" fill="#FFFFFF">
<g transform="translate(7.000000, 7.000000)" id="形状结合">
<path d="M48,0 C49.1045695,-2.02906125e-16 50,0.8954305 50,2 L50,22 C50,22.5522847 49.5522847,23 49,23 L46,23 C45.4477153,23 45,22.5522847 45,22 L45,5 L5,5 L5,45 L22,45 C22.5522847,45 23,45.4477153 23,46 L23,49 C23,49.5522847 22.5522847,50 22,50 L2,50 C0.8954305,50 1.3527075e-16,49.1045695 0,48 L0,2 C-1.3527075e-16,0.8954305 0.8954305,2.02906125e-16 2,0 L48,0 Z M40.8724299,28.8483283 C41.4247147,28.8483283 41.8724299,29.2960436 41.8724299,29.8483283 L41.8724299,36.8483283 L48.8724299,36.8483283 C49.4247147,36.8483283 49.8724299,37.2960436 49.8724299,37.8483283 L49.8724299,40.8483283 C49.8724299,41.4006131 49.4247147,41.8483283 48.8724299,41.8483283 L41.8724299,41.8483283 L41.8724299,48.8483283 C41.8724299,49.4006131 41.4247147,49.8483283 40.8724299,49.8483283 L37.8724299,49.8483283 C37.3201452,49.8483283 36.8724299,49.4006131 36.8724299,48.8483283 L36.8724299,41.8483283 L29.8724299,41.8483283 C29.3201452,41.8483283 28.8724299,41.4006131 28.8724299,40.8483283 L28.8724299,37.8483283 C28.8724299,37.2960436 29.3201452,36.8483283 29.8724299,36.8483283 L36.8724299,36.8483283 L36.8724299,29.8483283 C36.8724299,29.2960436 37.3201452,28.8483283 37.8724299,28.8483283 L40.8724299,28.8483283 Z"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>已审批</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-1458.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="已审批" transform="translate(1458.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<g id="编组" transform="translate(20.363636, 20.363636)">
<path d="M17.1722301,12.6691268 C20.5422747,12.6691268 23.2771277,15.3748997 23.272722,18.704746 C23.2638945,22.025864 20.5334526,24.7229086 17.1810522,24.7272727 C13.8110075,24.7272727 11.0761546,22.025864 11.0761546,18.6960177 C11.0761546,15.3705356 13.8065965,12.6691268 17.1722301,12.6691268 Z M10.5909387,21.9560376 C10.8291356,22.4971922 11.1290872,22.9990694 11.4907936,23.4616693 L0,23.4616693 L0,21.9560376 L10.5909387,21.9560376 Z M19.6159535,15.9160543 L16.4444063,19.258993 L14.596175,17.5133331 L13.4757675,18.5389083 L16.4929279,21.4847094 L20.8686926,17.1423804 L19.6159535,15.9160543 Z M10.0130907,0 C13.1317053,0 15.6636499,2.50502198 15.6636499,5.59047588 C15.6636499,6.55495299 15.4166309,7.46269615 14.9843477,8.25260726 L14.9799366,8.25697141 C14.8255498,8.536277 14.6402855,8.80249013 14.4417881,9.05561082 C13.5860438,10.4041331 12.8096985,11.4733498 13.2552148,12.760774 C11.2967072,14.0263774 9.99985758,16.2128165 9.99985758,18.6960177 C9.99985758,19.1629817 10.0483792,19.1760742 10.1321892,19.6168533 L0,19.6168533 L0,14.6286301 L5.58880439,14.6286301 C8.62802004,12.2588968 6.77096665,10.897282 5.56674913,9.03379007 C4.81687008,8.08240542 4.3625316,6.89099252 4.3625316,5.59047588 C4.3625316,2.50502198 6.89447614,0 10.0130907,0 Z" id="形状结合"></path>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="44px" viewBox="0 0 64 44" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>标签</title>
<defs>
<polygon id="path-1" points="0 0 25.9047619 0 25.9047619 3.03448276 0 3.03448276"></polygon>
<polygon id="path-3" points="0 0 25.9047619 0 25.9047619 9.10344828 0 9.10344828"></polygon>
<linearGradient x1="6.6483347%" y1="5.51282194%" x2="77.9785156%" y2="89.1343284%" id="linearGradient-5">
<stop stop-color="#FFA0A0" offset="0%"></stop>
<stop stop-color="#FF4E4F" offset="100%"></stop>
</linearGradient>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="无法上传iconfont" transform="translate(-1335.000000, -540.000000)">
<g id="标签" transform="translate(1335.000000, 540.000000)">
<g id="编组">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Clip-2"></g>
<path d="M5.19743462,-3.10020716e-05 L2.80500448,-3.10020716e-05 C2.80500448,-3.10020716e-05 0.0824975911,0.592186069 0,7.32785113 L7.0949656,7.32785113 L13.942352,7.32785113 L25.9047619,5.84750222 L6.84747283,2.07245748 L5.19743462,-3.10020716e-05 Z" id="Fill-1" fill="#D44242" mask="url(#mask-2)"></path>
</g>
<g id="编组" transform="translate(38.095238, 0.000000)">
<mask id="mask-4" fill="white">
<use xlink:href="#path-3"></use>
</mask>
<g id="Clip-4"></g>
<path d="M23.0998499,-3.85141222e-05 L20.7074101,-3.85141222e-05 L19.0573653,1.06613433 L0,3.00817174 L11.9623713,3.76972377 L18.8098716,3.76972377 L25.9047792,3.76972377 C25.8222813,0.304622169 23.0998499,-3.85141222e-05 23.0998499,-3.85141222e-05" id="Fill-3" fill="#D44242" mask="url(#mask-4)"></path>
</g>
<path d="M3.04761905,0 C5.4656579,0.257580711 5.47255535,6.18211688 5.47255535,6.18211688 L5.47255535,6.18211688 L5.47255535,35.4136167 C5.47255535,40.1557989 9.20573842,44 13.810795,44 L13.810795,44 L13.8762772,44 L50.1236355,44 L50.1890304,44 C54.794087,44 58.52727,40.1557989 58.52727,35.4136167 L58.52727,35.4136167 L58.52727,6.18211688 C58.52727,6.18211688 58.5341675,0.257580711 60.952381,0 L60.952381,0 L3.04761905,0 Z" id="Fill-5" fill="url(#linearGradient-5)"></path>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

@ -1,61 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="48px" height="48px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>编组 33</title>
<defs>
<rect id="path-1" x="0" y="0" width="32" height="32"></rect>
<linearGradient x1="103.941749%" y1="-9.86447236%" x2="15.6759798%" y2="100%" id="linearGradient-3">
<stop stop-color="#94B3FF" offset="0%"></stop>
<stop stop-color="#3955FF" offset="100%"></stop>
</linearGradient>
<path d="M4.81965071,11.9835294 C4.81965071,18.6007843 10.107091,23.964183 16.6334651,23.964183 C23.1570041,23.964183 28.4444444,18.6007843 28.4444444,11.9835294 C28.4444444,5.36339869 23.1570041,0 16.6334651,0 C10.107091,0 4.81965071,5.36339869 4.81965071,11.9835294 Z" id="path-4"></path>
<filter x="0.0%" y="0.0%" width="100.0%" height="100.0%" filterUnits="objectBoundingBox" id="filter-5">
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.328065454 0 0 0 0 0.41948512 0 0 0 0 1 0 0 0 1 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
<rect id="path-6" x="0" y="0" width="28.3508865" height="28.7581699"></rect>
<path d="M2.26807092,15.4345098 C2.26807092,22.0517647 7.55551126,27.4151634 14.0818853,27.4151634 C20.6054243,27.4151634 25.8928647,22.0517647 25.8928647,15.4345098 C25.8928647,8.81437908 20.6054243,3.45098039 14.0818853,3.45098039 C7.55551126,3.45098039 2.26807092,8.81437908 2.26807092,15.4345098 Z" id="path-8"></path>
<linearGradient x1="50.4938081%" y1="35.9999974%" x2="0%" y2="114.811198%" id="linearGradient-9">
<stop stop-color="#FFFFFF" offset="0%"></stop>
<stop stop-color="#FFFFFF" stop-opacity="0" offset="100%"></stop>
</linearGradient>
<filter x="-338.5%" y="-333.7%" width="776.9%" height="767.3%" filterUnits="objectBoundingBox" id="filter-10">
<feGaussianBlur stdDeviation="5.75725631" in="SourceGraphic"></feGaussianBlur>
</filter>
</defs>
<g id="-index备份" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="index_1.0备份-21" transform="translate(-836.000000, -367.000000)">
<g id="编组-8备份-2" transform="translate(473.000000, 206.000000)">
<g id="画板-8" transform="translate(28.881832, 57.745953)">
<g id="画板-4" transform="translate(236.118168, 103.254047)">
<g id="编组-54备份" transform="translate(98.000000, 0.000000)">
<g id="编组-26" transform="translate(0.063866, 1.000000)">
<path d="M48,24 C48,37.2548455 37.2548455,48 24,48 C10.7451553,48 0,37.2548455 0,24 C0,10.7451553 10.7451553,0 24,0 C37.2548455,0 48,10.7451553 48,24 C48,24 48,24 48,24 Z" id="Ellipse-930" fill="#E9EEFF" fill-rule="nonzero"></path>
<g id="Group-1" transform="translate(7.936134, 8.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="蒙版"></g>
<g transform="translate(0.888889, 1.777778)">
<g id="路径">
<use fill="black" fill-opacity="1" filter="url(#filter-5)" xlink:href="#path-4"></use>
<use fill="url(#linearGradient-3)" fill-rule="evenodd" xlink:href="#path-4"></use>
</g>
<g id="user-person-profile-block-account-circle-svgrepo-com-1" transform="translate(0.000000, 0.575163)">
<mask id="mask-7" fill="white">
<use xlink:href="#path-6"></use>
</mask>
<g id="路径"></g>
<path id="路径" d="M14.0818853,3.20098039 C20.7447477,3.20098039 26.1428647,8.67755358 26.1428647,15.4345098 C26.1428647,22.189044 20.7443,27.6651634 14.0818853,27.6651634 C7.41708336,27.6651634 2.01807092,22.1894977 2.01807092,15.4345098 C2.01807092,8.6770998 7.41663558,3.20098039 14.0818853,3.20098039 Z M14.0818853,3.70098039 C7.69438694,3.70098039 2.51807092,8.95165837 2.51807092,15.4345098 C2.51807092,21.9149209 7.69481587,27.1651634 14.0818853,27.1651634 C20.4665486,27.1651634 25.6428647,21.9144854 25.6428647,15.4345098 C25.6428647,8.9520939 20.4669775,3.70098039 14.0818853,3.70098039 Z" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M11.3638777,13.9269889 C11.5944007,13.9269889 11.7907721,14.0082723 11.9529919,14.1708392 C12.1152118,14.333406 12.1963217,14.5301975 12.1963217,14.7612135 C12.1963217,14.9836734 12.1152118,15.1783258 11.9529919,15.3451707 C11.7907721,15.5120157 11.5944007,15.5954381 11.3638777,15.5954381 C11.1333548,15.5954381 10.9369834,15.5120157 10.7747636,15.3451707 C10.6125437,15.1783258 10.5314338,14.9836734 10.5314338,14.7612135 C10.5314338,14.5301975 10.6125437,14.333406 10.7747636,14.1708392 C10.9369834,14.0082723 11.1333548,13.9269889 11.3638777,13.9269889 Z M17.8185202,9.13982315 C18.1941872,9.13982315 18.5271648,9.20613331 18.817453,9.33875363 C19.1077411,9.47137395 19.3532054,9.64249695 19.5538457,9.85212262 C19.7544861,10.0617483 19.908168,10.2991814 20.0148916,10.5644221 C20.1216152,10.8296627 20.174977,11.0906253 20.174977,11.3473098 L20.174977,17.9055986 C20.174977,18.10239 20.1301531,18.2949034 20.0405053,18.4831387 C19.9508575,18.671374 19.8313271,18.8424969 19.681914,18.9965076 C19.532501,19.1505183 19.3617433,19.2745825 19.1696408,19.3687002 C18.9775384,19.4628178 18.7790325,19.5098766 18.5741232,19.5098766 L18.5741232,12.3355451 C18.5741232,12.1130852 18.5314338,11.9055986 18.4460549,11.7130852 C18.360676,11.5205718 18.2454146,11.3515879 18.1002705,11.2061333 C17.9551264,11.0606788 17.7865031,10.9451707 17.5944007,10.8596092 C17.4022982,10.7740478 17.1952545,10.731267 16.9732694,10.731267 L9.77583079,10.731267 C9.77583079,10.5430317 9.81852022,10.3547964 9.90389909,10.1665611 C9.98927796,9.97832582 10.1045394,9.80720283 10.2496835,9.65319214 C10.3948276,9.49918144 10.5655853,9.37511727 10.7619567,9.28099962 C10.9583281,9.18688197 11.1675064,9.13982315 11.3894914,9.13982315 L17.8185202,9.13982315 L17.8185202,9.13982315 Z M16.704326,11.5398232 C17.0885309,11.5398232 17.3617433,11.644636 17.5239631,11.8542617 C17.686183,12.0638873 17.7672929,12.3441012 17.7672929,12.6949034 L17.7672929,20.2542617 C17.7672929,20.4681654 17.6776451,20.6692349 17.4983495,20.8574702 C17.3190538,21.0457055 17.0927998,21.1398232 16.8195875,21.1398232 L9.05864829,21.1398232 C8.82812535,21.1398232 8.62321606,21.0457055 8.44392044,20.8574702 C8.26462481,20.6692349 8.174977,20.4424969 8.174977,20.1772563 L8.174977,12.4767215 C8.174977,12.2029248 8.24968351,11.9783258 8.39909653,11.8029248 C8.54850955,11.6275237 8.74701542,11.5398232 8.99461414,11.5398232 L16.704326,11.5398232 Z M16.1792459,13.4906253 C16.1792459,13.3965076 16.1493633,13.3195023 16.0895981,13.2596092 C16.0298329,13.1997162 15.9529919,13.1697697 15.8590752,13.1697697 L10.0831947,13.1697697 C9.98927796,13.1697697 9.91243698,13.1997162 9.85267177,13.2596092 C9.79290656,13.3195023 9.76302396,13.3965076 9.76302396,13.4906253 L9.76302396,16.3526574 C9.83986494,16.446775 9.91030251,16.5515879 9.97433666,16.6670959 C10.0383708,16.7826039 10.1173463,16.8916948 10.211263,16.9943686 C10.3051798,17.0970424 10.4289791,17.1847429 10.5826611,17.2574702 C10.7363431,17.3301975 10.9497902,17.3665611 11.2230026,17.3665611 C11.6242833,17.3665611 11.9508575,17.30239 12.2027251,17.1740478 C12.4545928,17.0457055 12.6765779,16.8831387 12.8686803,16.6863472 C13.0607828,16.4895558 13.2400784,16.2777911 13.4065672,16.0510531 C13.573056,15.8243151 13.7715618,15.6104114 14.0020848,15.4093419 C14.2326077,15.2082723 14.5186269,15.0371494 14.8601424,14.8959729 C15.2016579,14.7547964 15.6413591,14.675652 16.1792459,14.6585397 L16.1792459,13.4906253 L16.1792459,13.4906253 Z" id="形状" fill="url(#linearGradient-9)" fill-rule="nonzero" mask="url(#mask-7)"></path>
</g>
<path d="M15.5929876,24.1568627 C14.1839485,24.1568627 13.0414078,25.315817 13.0414078,26.745098 C13.0414078,28.1743791 14.1839485,29.3333333 15.5929876,29.3333333 C17.0020266,29.3333333 18.1445674,28.1743791 18.1445674,26.745098 C18.1445674,25.315817 17.0020266,24.1568627 15.5929876,24.1568627 Z" id="路径" fill="#8B9CFF" filter="url(#filter-10)"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.9 KiB

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>图片重复数</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-2250.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="图片重复数" transform="translate(2250.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<path d="M26.2074318,29.5008264 C26.6824488,29.5008264 27.0870929,29.6683196 27.4213641,30.0033058 C27.7556353,30.338292 27.9227709,30.7438017 27.9227709,31.2198347 C27.9227709,31.6782369 27.7556353,32.0793388 27.4213641,32.4231405 C27.0870929,32.7669421 26.6824488,32.938843 26.2074318,32.938843 C25.7324149,32.938843 25.3277708,32.7669421 24.9934996,32.4231405 C24.6592284,32.0793388 24.4920928,31.6782369 24.4920928,31.2198347 C24.4920928,30.7438017 24.6592284,30.338292 24.9934996,30.0033058 C25.3277708,29.6683196 25.7324149,29.5008264 26.2074318,29.5008264 Z M39.5079072,19.6363636 C40.282009,19.6363636 40.9681446,19.7730028 41.5663142,20.046281 C42.1644837,20.3195592 42.6702888,20.6721763 43.0837295,21.1041322 C43.4971702,21.5360882 43.8138482,22.0253444 44.0337635,22.5719008 C44.2536787,23.1184573 44.3636364,23.6561983 44.3636364,24.185124 L44.3636364,37.6991736 C44.3636364,38.1046832 44.271272,38.5013774 44.0865431,38.8892562 C43.9018143,39.277135 43.6555092,39.6297521 43.3476278,39.9471074 C43.0397465,40.2644628 42.687882,40.5201102 42.2920345,40.7140496 C41.8961871,40.907989 41.4871447,41.0049587 41.0649073,41.0049587 L41.0649073,26.2214876 C41.0649073,25.7630854 40.9769412,25.3355372 40.801009,24.938843 C40.6250768,24.5421488 40.3875683,24.1939394 40.0884836,23.8942149 C39.7893988,23.5944904 39.4419327,23.3564738 39.0460852,23.1801653 C38.6502377,23.0038567 38.2236021,22.9157025 37.7661783,22.9157025 L22.9350927,22.9157025 C22.9350927,22.5278237 23.0230588,22.1399449 23.198991,21.7520661 C23.3749232,21.3641873 23.6124317,21.0115702 23.9115164,20.6942149 C24.2106012,20.3768595 24.5624656,20.1212121 24.9671097,19.9272727 C25.3717538,19.7333333 25.8027877,19.6363636 26.2602115,19.6363636 L39.5079072,19.6363636 L39.5079072,19.6363636 Z M37.2119919,24.5818182 C38.0036868,24.5818182 38.5666699,24.7977961 38.9009411,25.2297521 C39.2352123,25.661708 39.4023479,26.2391185 39.4023479,26.9619835 L39.4023479,42.538843 C39.4023479,42.9796143 39.2176191,43.3939394 38.8481614,43.7818182 C38.4787038,44.169697 38.0124834,44.3636364 37.4495003,44.3636364 L21.4572621,44.3636364 C20.9822451,44.3636364 20.5600078,44.169697 20.1905501,43.7818182 C19.8210925,43.3939394 19.6363636,42.9267218 19.6363636,42.3801653 L19.6363636,26.5123967 C19.6363636,25.9482094 19.7903043,25.4853994 20.0981857,25.1239669 C20.4060671,24.7625344 20.8151095,24.5818182 21.3253129,24.5818182 L37.2119919,24.5818182 Z M36.1300087,28.6016529 C36.1300087,28.4077135 36.0684325,28.2490358 35.9452799,28.1256198 C35.8221274,28.0022039 35.6637884,27.9404959 35.4702629,27.9404959 L23.5684486,27.9404959 C23.3749232,27.9404959 23.2165842,28.0022039 23.0934316,28.1256198 C22.9702791,28.2490358 22.9087028,28.4077135 22.9087028,28.6016529 L22.9087028,34.4991736 C23.0670418,34.6931129 23.2121859,34.9090909 23.3441351,35.1471074 C23.4760842,35.385124 23.6388215,35.6099174 23.8323469,35.8214876 C24.0258724,36.0330579 24.2809741,36.2137741 24.5976521,36.3636364 C24.9143301,36.5134986 25.3541606,36.5884298 25.9171437,36.5884298 C26.7440251,36.5884298 27.4169658,36.4561983 27.9359658,36.1917355 C28.4549659,35.9272727 28.9123896,35.5922865 29.3082371,35.1867769 C29.7040846,34.7812672 30.0735423,34.3449036 30.4166101,33.877686 C30.7596779,33.4104683 31.1687203,32.969697 31.6437373,32.5553719 C32.1187542,32.1410468 32.7081272,31.7884298 33.411856,31.4975207 C34.1155849,31.2066116 35.0216358,31.0435262 36.1300087,31.0082645 L36.1300087,28.6016529 L36.1300087,28.6016529 Z" id="形状"></path>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>不通过</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-1986.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="不通过" transform="translate(1986.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<path d="M39.7482333,33.8946117 C42.6991808,33.8946117 45.0909091,36.2863399 45.0909091,39.2372874 C45.0909091,42.188235 42.6991808,44.5799632 39.7482333,44.5799632 C36.7972858,44.5799632 34.4055575,42.188235 34.4055575,39.2372874 C34.4055575,36.2863399 36.7979127,33.8946117 39.7482333,33.8946117 Z M37.4198247,20.3636364 C38.6352542,20.3636364 39.6249811,21.3102054 39.7053482,22.4981668 L39.7106177,22.6544293 L39.7106177,32.0301294 C38.2617883,32.0301294 36.9145212,32.4608286 35.7891864,33.200603 C35.6989537,32.68191 35.2735706,32.2783575 34.7434337,32.2233535 L34.6193398,32.2169538 L25.7790357,32.2169538 C25.1226427,32.2169538 24.5903813,32.7492152 24.5903813,33.4062352 C24.5903813,34.0221914 25.0576381,34.5284965 25.657413,34.5893786 L25.7790357,34.5955165 L34.2256293,34.5955165 C33.8327226,35.0663736 33.5019239,35.5857486 33.2413532,36.1408927 L33.1838326,36.136661 L33.1838326,36.136661 L33.1253717,36.1352504 L25.8699402,36.1352504 C25.2135472,36.1352504 24.6812858,36.6675118 24.6812858,37.3245318 C24.6812858,37.940488 25.1485426,38.4467931 25.7483175,38.5076752 L25.8699402,38.5138131 L32.6006334,38.5138131 C32.5805717,38.73073 32.5699139,38.9501547 32.5699139,39.172087 C32.5699139,40.7766294 33.098884,42.2566435 33.9946204,43.4540581 L34.1786098,43.6897262 L22.6544293,43.6897262 C21.4389998,43.6897262 20.4492729,42.7431572 20.3689058,41.5551958 L20.3636364,41.3989333 L20.3636364,27.8083999 C20.3636364,27.1795133 20.8413624,26.6619308 21.4543271,26.5996896 L21.5786218,26.5934145 L25.2536705,26.5934145 C25.9184095,26.5934145 26.4652323,26.0881379 26.5309885,25.4407351 L26.537618,25.3094671 L26.537618,21.5786218 C26.537618,20.9497352 27.015344,20.4321527 27.6283087,20.3699115 L27.7526034,20.3636364 L37.4198247,20.3636364 Z M41.5917907,36.6918329 C41.4158995,36.691476 41.2470992,36.7611422 41.1226598,36.8854509 L39.7104097,38.2970645 L38.2981597,36.8854509 C38.0376994,36.6296854 37.6201068,36.6305359 37.3606905,36.8873602 C37.2358759,37.0112923 37.1655227,37.1798074 37.1651631,37.3556986 C37.1648063,37.5315897 37.2344724,37.7003901 37.3587811,37.8248295 L38.7703947,39.2370795 L37.3587811,40.6493295 C37.1030156,40.9097899 37.1038661,41.3273824 37.3606905,41.5867988 C37.6216289,41.8477373 38.039767,41.8477373 38.2981597,41.5887081 L39.7104097,40.1770945 L41.1226598,41.5887081 C41.3831201,41.8444736 41.8007126,41.8436231 42.060129,41.5867988 C42.3210675,41.3258603 42.3210675,40.9077223 42.0620383,40.6493295 L40.6504247,39.2370795 L42.0620383,37.8248295 C42.3178038,37.5643691 42.3169533,37.1467766 42.060129,36.8873602 C41.936197,36.7625457 41.7676818,36.6921925 41.5917907,36.6918329 Z M34.5735741,28.300538 L28.9036422,28.300538 C28.2472491,28.300538 27.7149877,28.8327994 27.7149877,29.4898193 C27.7149877,30.1057756 28.1822446,30.6120807 28.7820195,30.6729628 L28.9036422,30.6791007 L34.5735741,30.6791007 C35.2305941,30.6791007 35.7622285,30.1468393 35.7622285,29.4898193 C35.7622285,28.8327994 35.2305941,28.300538 34.5735741,28.300538 Z M25.4646994,21.1427154 L25.4668259,21.2131231 L25.2818823,24.0261466 C25.2372137,24.7049914 24.7274923,25.2543489 24.066794,25.3601429 L23.9327344,25.3752944 L21.1197109,25.560238 C20.8274662,25.5793352 20.6570162,25.2544162 20.8090505,25.0277874 L20.8538936,24.9734339 L24.8800218,20.9473058 C25.0877759,20.7401304 25.4296108,20.8721636 25.4646994,21.1427154 Z" id="形状结合"></path>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.1 KiB

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>通过</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-1720.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="通过" transform="translate(1720.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<path d="M39.7482333,33.8946117 C42.6991808,33.8946117 45.0909091,36.2863399 45.0909091,39.2372874 C45.0909091,42.188235 42.6991808,44.5799632 39.7482333,44.5799632 C36.7972858,44.5799632 34.4055575,42.188235 34.4055575,39.2372874 C34.4055575,36.2863399 36.7979127,33.8946117 39.7482333,33.8946117 Z M37.4198247,20.3636364 C38.6352542,20.3636364 39.6249811,21.3102054 39.7053482,22.4981668 L39.7106177,22.6544293 L39.7106177,32.0301294 C38.2617883,32.0301294 36.9145212,32.4608286 35.7891864,33.200603 C35.6989537,32.68191 35.2735706,32.2783575 34.7434337,32.2233535 L34.6193398,32.2169538 L25.7790357,32.2169538 C25.1226427,32.2169538 24.5903813,32.7492152 24.5903813,33.4062352 C24.5903813,34.0221914 25.0576381,34.5284965 25.657413,34.5893786 L25.7790357,34.5955165 L34.2256293,34.5955165 C33.8327226,35.0663736 33.5019239,35.5857486 33.2413532,36.1408927 L33.1838326,36.136661 L33.1838326,36.136661 L33.1253717,36.1352504 L25.8699402,36.1352504 C25.2135472,36.1352504 24.6812858,36.6675118 24.6812858,37.3245318 C24.6812858,37.940488 25.1485426,38.4467931 25.7483175,38.5076752 L25.8699402,38.5138131 L32.6006334,38.5138131 C32.5805717,38.73073 32.5699139,38.9501547 32.5699139,39.172087 C32.5699139,40.7766294 33.098884,42.2566435 33.9946204,43.4540581 L34.1786098,43.6897262 L22.6544293,43.6897262 C21.4389998,43.6897262 20.4492729,42.7431572 20.3689058,41.5551958 L20.3636364,41.3989333 L20.3636364,27.8083999 C20.3636364,27.1795133 20.8413624,26.6619308 21.4543271,26.5996896 L21.5786218,26.5934145 L25.2536705,26.5934145 C25.9184095,26.5934145 26.4652323,26.0881379 26.5309885,25.4407351 L26.537618,25.3094671 L26.537618,21.5786218 C26.537618,20.9497352 27.015344,20.4321527 27.6283087,20.3699115 L27.7526034,20.3636364 L37.4198247,20.3636364 Z M41.4753711,37.4183387 L41.4127373,37.4748619 L39.4603946,39.3561686 L38.0870331,37.9835709 C37.8080077,37.7045508 37.3637172,37.6801971 37.0558662,37.9270477 L36.9924686,37.9835709 C36.7098525,38.266187 36.6915206,38.7107345 36.9359453,39.0147378 L36.9924686,39.0781355 L38.9127305,40.9976335 C39.1945827,41.2802496 39.6398941,41.2985815 39.9438973,41.0541567 L40.0065312,40.9976335 L42.506538,38.5686626 C42.7950286,38.2777623 42.80676,37.8124072 42.5332936,37.5073402 C42.2598271,37.2022731 41.7959628,37.1632489 41.4753711,37.4183387 Z M34.5735741,28.300538 L28.9036422,28.300538 C28.2472491,28.300538 27.7149877,28.8327994 27.7149877,29.4898193 C27.7149877,30.1057756 28.1822446,30.6120807 28.7820195,30.6729628 L28.9036422,30.6791007 L34.5735741,30.6791007 C35.2305941,30.6791007 35.7622285,30.1468393 35.7622285,29.4898193 C35.7622285,28.8327994 35.2305941,28.300538 34.5735741,28.300538 Z M25.4646994,21.1427154 L25.4668259,21.2131231 L25.2818823,24.0261466 C25.2372137,24.7049914 24.7274923,25.2543489 24.066794,25.3601429 L23.9327344,25.3752944 L21.1197109,25.560238 C20.8274662,25.5793352 20.6570162,25.2544162 20.8090505,25.0277874 L20.8538936,24.9734339 L24.8800218,20.9473058 C25.0877759,20.7401304 25.4296108,20.8721636 25.4646994,21.1427154 Z" id="形状结合"></path>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="96px" height="96px" viewBox="0 0 96 96" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>可疑文件夹</title>
<defs>
<radialGradient cx="49.9999974%" cy="50.0000039%" fx="49.9999974%" fy="50.0000039%" r="110.414469%" gradientTransform="translate(0.500000,0.500000),rotate(75.075110),scale(1.000000,1.409640),translate(-0.500000,-0.500000)" id="radialGradient-1">
<stop stop-color="#FFFCFC" stop-opacity="0.1" offset="0%"></stop>
<stop stop-color="#FFFFFF" stop-opacity="0.41" offset="100%"></stop>
</radialGradient>
<linearGradient x1="-0.00164029895%" y1="20.3389764%" x2="49.9999972%" y2="99.9999913%" id="linearGradient-2">
<stop stop-color="#3964EA" stop-opacity="0.18" offset="0%"></stop>
<stop stop-color="#A37D7D" stop-opacity="0" offset="100%"></stop>
</linearGradient>
<rect id="path-3" x="0" y="0" width="95.9411163" height="95.9411163" rx="15.9901861"></rect>
<rect id="path-4" x="0" y="0" width="95.9411163" height="95.9411163" rx="15.9901861"></rect>
<filter x="-1.6%" y="-1.6%" width="103.1%" height="103.1%" filterUnits="objectBoundingBox" id="filter-5">
<feOffset dx="3" dy="0" in="SourceAlpha" result="shadowOffsetInner1"></feOffset>
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
<feColorMatrix values="0 0 0 0 0.80541166 0 0 0 0 0.85265276 0 0 0 0 1 0 0 0 0.37 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
</filter>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-6">
<stop stop-color="#92C0FF" offset="0%"></stop>
<stop stop-color="#507AFD" offset="100%"></stop>
</linearGradient>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="无法上传iconfont" transform="translate(-392.000000, -80.000000)">
<g id="Frame-18" transform="translate(392.000000, 80.000000)">
<g id="路径">
<use fill="url(#radialGradient-1)" xlink:href="#path-3"></use>
<use fill="url(#linearGradient-2)" xlink:href="#path-3"></use>
</g>
<g id="路径" fill="black" fill-opacity="1">
<use filter="url(#filter-5)" xlink:href="#path-4"></use>
</g>
<g id="编组-50" transform="translate(24.930558, 27.327848)">
<g id="编组" fill="url(#linearGradient-6)">
<path d="M46.0573921,37.8007842 L46.0573921,8.94799551 C46.0573921,5.44326823 42.8673831,5.77157479 42.8673831,5.77157479 C42.8673831,5.77157479 23.8138175,5.79417887 24.8215345,5.77157479 C23.7282311,5.79417887 23.188438,5.20029046 23.188438,5.20029046 C23.188438,5.20029046 22.4280135,3.8954361 21.0648136,1.83035047 C19.6341878,-0.333523352 17.9784228,0.0217020285 17.9784228,0.0217020294 L3.93665198,0.0217020294 C0.0450149641,0.0217020294 0,3.76509234 0,3.76509234 L0,37.6073294 C0,41.7824512 3.15381664,41.2650045 3.15381664,41.2650045 L43.1554403,41.2650045 C46.5298238,41.2650045 46.0573921,37.8007842 46.0573921,37.8007842 Z" id="形状"></path>
</g>
<path d="M43.7347101,9.15040185 C43.7347101,9.30411916 43.6736461,9.4515406 43.5649516,9.56023515 C43.456257,9.6689297 43.3088356,9.72999366 43.1551183,9.72999366 L3.35648058,9.72999366 C3.20276327,9.72999366 3.05534183,9.6689297 2.94664728,9.56023515 C2.83795273,9.4515406 2.77688877,9.30411916 2.77688877,9.15040185 C2.77688877,8.83030213 3.03638086,8.57081004 3.35648058,8.57081004 L43.1551183,8.57081004 C43.3088356,8.57081004 43.456257,8.631874 43.5649516,8.74056855 C43.6736461,8.8492631 43.7347101,8.99668455 43.7347101,9.15040185 L43.7347101,9.15040185 Z" id="路径" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M33.616325,23.2641708 C33.616325,23.46252 33.5442625,23.6350452 33.3973681,23.7818751 L27.5087797,29.6731039 C27.3620142,29.819805 27.1892958,29.8920608 26.9909466,29.8920608 C26.7925974,29.8920608 26.6200079,29.819805 26.4732424,29.6731039 C26.3264768,29.5261452 26.2542855,29.3562604 26.2542855,29.1552708 L26.2542855,26.2057925 L23.6758103,26.2057925 C22.9236289,26.2057925 22.251238,26.2316165 21.6588308,26.2753435 C21.0637832,26.3217108 20.4738875,26.4041417 19.8865678,26.5227004 C19.3018241,26.6411947 18.7917833,26.803416 18.358957,27.0094287 C17.9261307,27.2181462 17.5217688,27.4835348 17.1456782,27.8080418 C16.772099,28.1351248 16.4655594,28.5215194 16.2261235,28.9698658 C15.9890061,29.4180191 15.8036011,29.9486032 15.6670106,30.5643229 C15.5330605,31.1774666 15.4661499,31.870272 15.4661499,32.6482131 C15.4661499,33.0680951 15.4867576,33.5395609 15.5227567,34.0624815 C15.5227567,34.1088488 15.5330605,34.1989431 15.5536682,34.3329576 C15.574276,34.4669078 15.5845798,34.5674347 15.5845798,34.6369857 C15.5845798,34.7528397 15.5510923,34.8481504 15.4892692,34.9254937 C15.4248701,35.0026438 15.3347113,35.0413476 15.2188574,35.0413476 C15.0952111,35.0413476 14.9895322,34.9769485 14.8968619,34.8455744 C14.8452783,34.7760234 14.7938234,34.691081 14.7449445,34.590554 C14.6985127,34.492603 14.6496338,34.3742375 14.5903867,34.2427989 C14.5336511,34.1114892 14.495076,34.0187545 14.469252,33.9671708 C13.4929618,31.7879056 13.0086806,30.0594984 13.0086806,28.784332 C13.0086806,27.259426 13.2121817,25.9816836 13.619184,24.9538742 C14.8633744,21.8678698 18.2146386,20.322356 23.6808978,20.322356 L26.2568614,20.322356 L26.2568614,17.3754536 C26.2568614,17.1771044 26.328924,17.0045149 26.4756895,16.8577494 C26.6225838,16.7107906 26.792533,16.6387924 26.9935226,16.6387924 C27.1918718,16.6387924 27.3644614,16.710855 27.5112269,16.8577494 L33.3999441,22.7463378 C33.5416221,22.8956792 33.616325,23.0658216 33.616325,23.2641708 L33.616325,23.2641708 Z" id="路径" fill="#FFFFFF" fill-rule="nonzero" transform="translate(23.312503, 25.840070) scale(-1, 1) translate(-23.312503, -25.840070) "></path>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.1 KiB

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>待审批</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-1194.000000, -6389.000000)" fill="#507AFD" fill-rule="nonzero">
<g id="待审批" transform="translate(1194.000000, 6389.000000)">
<path d="M64,32 C64,49.6731274 49.6731274,64 32,64 C14.3268738,64 0,49.6731274 0,32 C0,14.3268738 14.3268738,0 32,0 C49.6731274,0 64,14.3268738 64,32 C64,32 64,32 64,32 Z" id="Ellipse-930" fill-opacity="0.1"></path>
<g id="待提交" transform="translate(18.909091, 18.909091)">
<rect id="矩形" opacity="0" x="0" y="0" width="26.1818182" height="26.1818182"></rect>
<path d="M23.4605455,15.3130909 C22.6325455,15.9136364 20.1436364,18.4876364 19.2485455,18.6234545 C17.5823972,18.6788919 15.9145922,18.5885479 14.2641818,18.3534545 C12.3332727,18.1341818 13.086,17.1916364 13.392,17.0901818 C13.698,16.9903636 17.3929091,16.7465455 18.6267273,16.5763636 C19.7378182,16.4225455 19.5774545,15.0987273 18.3289091,15.048 C17.0787273,14.9989091 11.4054545,14.5325455 9.49909091,14.6863636 C7.59272727,14.8401818 4.79945455,17.9214545 4.79945455,17.9214545 L4.90254545,18.4107273 L8.96727273,22.7667273 L9.50890909,22.7127273 C10.0701391,22.3256833 10.68478,22.0224973 11.3334545,21.8127273 C12.1630909,21.6032727 16.74,22.212 18.3223636,21.9354545 C19.9047273,21.6589091 23.9776364,17.5418182 24.8727273,16.6385455 C25.308,16.2 25.6172727,15.5683636 25.5272727,15.4047273 C25.092,14.6061818 23.9956364,14.9236364 23.4605455,15.3130909 L23.4605455,15.3130909 Z M7.91509091,22.9876364 C7.58781818,22.6227273 4.35272727,19.1667273 3.97636364,18.7592727 C3.85570076,18.5959645 3.66899983,18.4943709 3.46634331,18.4817444 C3.26368679,18.4691178 3.06581911,18.5467507 2.92581818,18.6938182 C2.67054545,18.9392727 1.60527273,19.9374545 1.30090909,20.1910909 C0.831272727,20.5838182 1.24690909,21.2350909 1.51690909,21.5427273 C1.78690909,21.8503636 4.66690909,25.0772727 5.09563636,25.5845455 C5.52436364,26.0934545 5.96127273,26.0378182 6.28036364,25.7121818 C6.60109091,25.3849091 7.344,24.6158182 7.81854545,24.2132727 C8.01876568,24.0816036 8.14705882,23.8649412 8.16624482,23.6260755 C8.18543081,23.3872099 8.09336453,23.1528479 7.91672727,22.9909091 L7.91672727,22.9876364 L7.91509091,22.9876364 Z" id="形状"></path>
<path d="M4.90909091,14.6667273 L4.90909091,2.18618182 C4.90909091,1.11763636 5.77636364,0.252 6.84490909,0.250363636 L21.4036364,0.250363636 C22.4721818,0.250363636 23.3394545,1.11763636 23.3394545,2.18618182 L23.3394545,13.8109091 C23.3067273,13.8305455 23.2756364,13.8534545 23.2445455,13.8763636 L18.1963636,13.608 C17.892,13.5949091 17.3225455,13.5572727 16.6025455,13.5098182 C14.8336364,13.3936364 12.1614545,13.2169091 10.4809091,13.2169091 C10.0881818,13.2169091 9.76581818,13.2267273 9.522,13.2463636 C7.86574971,13.5382965 6.31867571,14.2708532 5.04327273,15.3670909 C4.95470166,15.1442097 4.90909091,14.9065623 4.90909091,14.6667273 Z M10.2567273,7.12636364 C9.83468131,7.12636364 9.49254545,7.46849949 9.49254545,7.89054545 C9.49254545,8.31259142 9.83468131,8.65472727 10.2567273,8.65472727 L17.8985455,8.65472727 C18.3205914,8.65472727 18.6627273,8.31259142 18.6627273,7.89054545 C18.6627273,7.46849949 18.3205914,7.12636364 17.8985455,7.12636364 L10.2567273,7.12636364 L10.2567273,7.12636364 Z M10.2567273,3.30545455 C9.83468131,3.30545455 9.49254545,3.6475904 9.49254545,4.06963636 C9.49254545,4.49168233 9.83468131,4.83381818 10.2567273,4.83381818 L17.8985455,4.83381818 C18.3205914,4.83381818 18.6627273,4.49168233 18.6627273,4.06963636 C18.6627273,3.6475904 18.3205914,3.30545455 17.8985455,3.30545455 L10.2567273,3.30545455 L10.2567273,3.30545455 Z" id="形状"></path>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="64px" height="64px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>删除</title>
<defs>
<rect id="path-1" x="0" y="0" width="64" height="64"></rect>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-1984.000000, -3431.000000)">
<g id="删除" transform="translate(1984.000000, 3431.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="蒙版" fill="#000000" fill-rule="nonzero" opacity="0" xlink:href="#path-1"></use>
<path d="M52.9231991,16 C53.4754839,16 53.9231991,16.4477153 53.9231991,17 L53.9231991,20 C53.9231991,20.5522847 53.4754839,21 52.9231991,21 L49.862,21 L46.8906837,54.9640327 C46.8414748,55.5264927 46.5639593,56.0141255 46.1574353,56.3436103 C45.7935798,56.7212522 45.2824394,56.9564221 44.7163722,56.9564221 L19.2763722,56.9564221 C18.8012585,56.9564221 18.3648389,56.7907533 18.0217296,56.5140319 C17.5531495,56.1861769 17.2269494,55.6610416 17.1731938,55.0466129 L14.194,21 L11,21 C10.4477153,21 10,20.5522847 10,20 L10,17 C10,16.4477153 10.4477153,16 11,16 L52.9231991,16 Z M42.134,51.956 L44.843,21 L19.213,21 L21.922,51.956 L42.134,51.956 Z M39,7 C39.5522847,7 40,7.44771525 40,8 L40,11 C40,11.5522847 39.5522847,12 39,12 L25,12 C24.4477153,12 24,11.5522847 24,11 L24,8 C24,7.44771525 24.4477153,7 25,7 L39,7 Z" id="形状结合" fill="#FFFFFF" mask="url(#mask-2)"></path>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

@ -4,7 +4,7 @@ import { useMessage } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { audit } from '@/api/task/task'
const emit = defineEmits(['success','close'])
const emit = defineEmits(['success'])
const message = useMessage()
const loading = ref(false)
@ -42,11 +42,6 @@ function showModal(value) {
function closeModal() {
show.value = false
emit('close')
formData.disposeTypeId='262403670085013522'
formData.failCauseId= '260402999231251188'
formData.comment= ''
}
defineExpose({
@ -118,9 +113,6 @@ async function handleSumbit(e: MouseEvent) {
}
}
})
formData.disposeTypeId='262403670085013522'
formData.failCauseId= '260402999231251188'
formData.comment= ''
}
async function selectChange(id) {

@ -1,128 +1,98 @@
<script lang="ts" setup>
import { defineProps, onMounted } from 'vue'
<template>
<div class="header_wrap">
<div v-for="(item, index) in data" :key="index" class="header_item">
<img :src="item.link" />
<div class="data_wrap">
<div class="data_title">{{ item.count }}</div>
<div class="data_content">{{ item.title }}</div>
</div>
</div>
<SvgIcon size="14px" style="cursor: pointer" name="setting"></SvgIcon>
</div>
</template>
defineProps({
hasColor: {
type: Boolean,
default: () => false,
},
})
function initRem() {
const designWidth = 1440
const rempPx = 16
const scale = window.innerWidth / designWidth
document.documentElement.style.fontSize = `${scale * rempPx}px`
}
onMounted(() => {
initRem()
})
<script lang="ts" setup>
const data = [
{
link: 'count',
title: '任务总数',
link: "/src/assets/images/taskCount.png",
title: "任务包总数",
count: 6399,
},
{
link: 'wait',
title: '待审批',
link: "/src/assets/images/nocheck.png",
title: "未标记",
count: 6290,
},
{
link: 'done',
title: '已审批',
link: "/src/assets/images/check.png",
title: "已标记",
count: 109,
},
{
link: 'resolve',
title: '通过',
link: "/src/assets/images/status.png",
title: "真",
count: 3290,
color: '#03c984',
},
{
link: 'reject',
title: '不通过',
link: "/src/assets/images/status.png",
title: "假",
count: 3000,
color: '#ff8b8b',
},
{
link: 'reimg',
title: '图片重复数',
link: "/src/assets/images/pic.png",
title: "相似度100%图",
count: 230,
},
{
link: 'breakcount',
title: '小结重复数',
link: "/src/assets/images/xiaojie.png",
title: "小结重复数",
count: 365,
},
]
];
</script>
<template>
<div class="header_wrap">
<div v-for="(item, index) in data" :key="index" class="header_item">
<SvgIcon :name="item.link" />
<div class="data_wrap">
<div class="data_title" :style="hasColor ? `color:${item.color || ''}` : ''">
{{ item.count }}
</div>
<div class="data_content">
{{ item.title }}
</div>
</div>
</div>
<SvgIcon size="14px" style="cursor: pointer" name="setting" class="settingSvg" />
</div>
</template>
<style scoped lang="less">
.header_wrap {
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: space-between;
padding: 1rem 1rem 1rem 3.125rem;
padding: 20px 30px;
background: #fff;
margin-bottom: 1rem;
.header_item {
min-width: 10%;
width: 10%;
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: center;
svg {
width: 2.75rem !important;
height: 2.75rem !important;
img{
width: 50px;
height: 50px
}
.data_wrap {
margin-left: .8125rem;
.data_title {
font-size: 1.125rem;
font-size: 20px;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC-Bold;
font-weight: 900;
font-weight: Bold;
text-align: left;
color: #202020;
line-height: 1.4375rem;
line-height: 23px;
text-align: center;
white-space: nowrap;
}
.data_content {
opacity: 0.6;
font-size: .75rem;
font-size: 14px;
font-family: PingFang SC, PingFang SC-Regular;
font-weight: 500;
font-weight: Regular;
text-align: center;
color: #202020;
line-height: 1rem;
line-height: 16px;
text-align: center;
white-space: nowrap;
}
}
}
}
.settingSvg{
width: 1rem !important;
height: 1rem !important;
}
</style>

@ -1,30 +0,0 @@
<template>
<div class="ip_box" :style="canClick?'cursor: pointer;':''">
<img :src="IPImg" />
</div>
</template>
<script setup>
import IPImg from "@/assets/images/IP.png";
import { defineProps } from "vue";
defineProps({
canClick: {
type: Boolean,
default: () => false,
},
});
</script>
<style scoped lang="less">
.ip_box {
position: fixed;
bottom: 80px;
right: 20px;
z-index: 1000;
img {
width: 80px;
height: auto;
}
}
</style>

@ -1,5 +1,5 @@
import type { AsideEntity } from './aside'
import { IzApprovalStatus, IzCustomlevel, IzCustomname, IzCustomtype, IzProductVue, IzProjectVue, IzProjecttype, IzShowAll, IzStatus, IzVisitcity, IzfirmVue, IztaskrromVue, IzvisitproVue, PictureDownloadVue, PlanVue, ReportUserVue, TimeVue } from '@/views/home/aside/comp/items'
import { IzApprovalStatus, IzProjectVue, IzStatus, IztaskrromVue, PictureDownloadVue, PlanVue, ReportUserVue, TimeVue, IzCustomname, IzCustomtype, IzVisitcity, IzCustomlevel, IzProjecttype, IzProductVue, IzvisitproVue, IzfirmVue } from '@/views/home/aside/comp/items'
export interface RowData {
id: string
@ -122,17 +122,18 @@ export const asideMap: Recordable<AsideEntity> = {
},
izshowall: {
label: '显示全部任务数据',
defaultValue: false,
defaultValue: true,
isDefaultFilter: false,
key: 'izshowall',
component: IzShowAll,
component: PictureDownloadVue,
inFilterList: false,
},
}
// 审批添加筛选配置 (左侧)
export const asideTaskMap: Recordable<AsideEntity> = {
izApprovalStatus: {
izstatus: {
label: '审批状态',
defaultValue: null,
isDefaultFilter: true,
@ -193,7 +194,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
defaultValue: null,
isDefaultFilter: true,
key: 'izcustomlevel',
component: IzCustomlevel,
component: IzCustomlevel
},
izprojecttype: {
label: '项目类别',
@ -222,5 +223,5 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izfirm',
component: IzfirmVue,
},
}
}
}

@ -1,13 +1,13 @@
<script lang="ts" setup>
import Masonry from 'masonry-layout'
import { useDialog, useMessage } from 'naive-ui'
import { computed, nextTick, onBeforeMount, onMounted, onUpdated, reactive, ref, unref, watch } from 'vue'
import { computed, onBeforeMount, onMounted, onUpdated, reactive, ref, unref, watch } from 'vue'
import { dubiousfilelist, removeFiles } from '@/api/task/task'
import { viewOptions } from '@/config/home'
import { useInfiniteScroll } from '@vueuse/core'
import imagesloaded from 'imagesloaded'
import { debounce, cloneDeep } from 'lodash-es'
import { debounce } from 'lodash-es'
import { audit } from '@/api/task/task'
import NotPassed from '@/components/Approval/NotPassed.vue'
@ -20,19 +20,9 @@ const cardStyle = {
'--n-padding-left': '120px',
}
let startTime = 0;
let endTime = 0;
let startCalTime = false;
const message = useMessage()
const timeRange = ref('desc')
const similarRange = ref('desc')
const timeRange = ref('')
const batch = ref(false)
const imageRef = ref<ComponentElRef | null>();
let filterId = null;
let sortObj: any = {
orderByUptime: 'desc'
};
const timeOptions = [{
label: '升序',
value: 'asc',
@ -40,14 +30,6 @@ const timeOptions = [{
label: '降序',
value: 'desc',
}]
// const similarOptions = [{
// label: '',
// value: 'asc',
// }, {
// label: '',
// value: 'desc',
// }]
const timeLabel = computed(() => {
const item = timeOptions.find((option) => {
return option.value === timeRange.value
@ -68,7 +50,6 @@ const viewLabel = computed(() => {
const masonryRef = ref<ComponentRef>(null)
const el = ref<HTMLDivElement | null>(null)
const elwc = ref<HTMLDivElement | null>(null)
const listData = ref<any[]>([])
const pagination = reactive({
pageNo: 1,
@ -103,7 +84,6 @@ const layout = debounce(() => {
const top = scrollHeight - clientHeight - 20
el.value!.scrollTo({ top, behavior: 'instant' })
loading = false
console.log("loading---------------", loading);
})
}, 300)
@ -111,17 +91,11 @@ watch(viewMode, () => {
layout()
})
onBeforeMount(async () => {
})
let canloadMore = true
useInfiniteScroll(
el as any,
() => {
loading = false
console.log("加载了000000000000000---------------------------");
loadMore()
},
{ distance: 10, canLoadMore: () => canloadMore },
@ -130,66 +104,52 @@ useInfiniteScroll(
async function featchList() {
loading = true
try {
// const result = await dubiousfilelist({ ...pagination, orderbyname: timeRange.value })
console.log("pagination.pageNo------------", pagination.pageNo);
const result = await dubiousfilelist({ ...pagination, ...sortObj })
const result = await dubiousfilelist({ ...pagination, orderbyname: timeRange.value })
// TODO
// result.data = Array.from({ length: 30 })
result.pageCount = 1
const { data, pageCount } = result
// canloadMore = pageCount >= pagination.pageNo && pageCount > 0;
canloadMore = data.pages >= pagination.pageNo && data.pages > 0;
console.log("canloadMore------------", canloadMore);
pagination.pageNo += 1
canloadMore = pageCount >= pagination.pageNo
return result.data.records
// const list = data.map((item) => {
// return {
// imgUrl: randomUrl(),
// }
// })
// console.log(list)
// return list
}
catch (error) {
canloadMore = false;
return []
}
}
async function loadMore() {
console.log("执行l------------------------", loading, el.value, pagination.pageNo);
if (loading || el.value == null)
return
// loading = true
pagination.pageNo = pagination.pageNo + 1;
loading = true
const more = await featchList()
console.log("more------------------------", more);
listData.value.push(...more)
layout()
}
onUpdated(() => {
if(startCalTime) {
endTime = new Date().getTime();
if(endTime - startTime > 500) {
createDom()
}
}else {
removeDom()
}
// if(elwc.value) {
// on(elwc.value!, 'click', showjjj)
// }
console.log('onUpdated', onUpdated)
layout()
})
onBeforeMount(async () => {
console.log(888)
// const list = await featchList()
// listData.value = list
})
let start: { x: number, y: number } | null = null
let selectionBox: HTMLDivElement | null
const selectIds = ref<string[]>([])
function downHandler(event: MouseEvent) {
startTime = new Date().getTime();
startCalTime = true;
if (!selectionBox)
return
@ -216,33 +176,7 @@ function imUpdateSelectIds(x: number, y: number, w: number, h: number) {
if (rect.right > x && rect.bottom > y && rect.left < x + w && rect.top < y + h)
index === -1 && selectIds.value.push(item.dataset.id!)
else index !== -1 && selectIds.value.splice(index, 1)
// let tempApproveIndex = -1;
// selectedApproveItems.value.map((approveItem, approveIndex) => {
// console.log("approveItem and item", approveItem, item );
// if(approveItem.selfId == item.dataset.id) {
// tempApproveIndex = approveIndex;
// }
// })
// if (tempApproveIndex === -1 && item.className.indexOf('grid-item-selected') != -1) {
// let tempItem: any = cloneDeep(item);
// tempItem.selfId = item.dataset.id;
// selectedApproveItems.value.push(tempItem)
// } else {
// selectedApproveItems.value.splice(tempApproveIndex, 1);
// }
})
selectedApproveItems.value = [];
//
listData.value.map(item => {
if(selectIds.value.includes(String(item.pictureId))) {
item.checked = true;
selectedApproveItems.value.push(item);
}
});
}
function isSelected(pictureId: number) {
@ -250,14 +184,6 @@ function isSelected(pictureId: number) {
}
function moveHandler(e: MouseEvent) {
if(startCalTime) {
endTime = new Date().getTime();
if(endTime - startTime > 500) {
createDom()
}
}else {
removeDom()
}
if (!selectionBox || !start)
return
@ -274,81 +200,30 @@ function moveHandler(e: MouseEvent) {
imUpdateSelectIds(x, y, w, h)
}
function createDom() {
let dom = document.createElement('div');
dom.className = "selection-box";
dom.style.width = "1px";
dom.style.border = "1px dotted black";
dom.style.position = "absolute";
dom.style.display = "block";
dom.style.zIndex = '9999';
document.body.appendChild(dom);
selectionBox = document.querySelector('.selection-box') as HTMLDivElement
}
function removeDom() {
let dom = document.getElementsByClassName("selection-box")[0];
if(dom) {
document.body.removeChild(dom);
}
}
function upHandler(event: MouseEvent) {
endTime = new Date().getTime();
startCalTime = false;
if(endTime - startTime > 500) {
createDom()
}else {
removeDom()
}
if (!selectionBox)
return
return
selectionBox.style.display = 'none'
start = null
if(selectionBox.style.width == "0px") {
removeDom()
if(event.target?.className.indexOf("n-checkbox-box__border") != -1 ) {
return
}
selectIds.value = []
selectedApproveItems.value.forEach((item) => (item.checked = false));
selectedApproveItems.value.length = 0;
listData.value.map(item => {
item.checked = false;
});
// batch.value = false;
}
}
const gridHeight = computed(() => {
// return viewMode.value !== 'masonry' ? '157px' : ''
let height = "";
if (viewMode.value === "masonry") {
height = "";
} else if (viewMode.value === "horizontalVersion") {
height = "145px";
} else if (viewMode.value === "verticalVersion") {
height = "300px";
} else if (viewMode.value === "3:4") {
height = "240px";
}
return height;
return viewMode.value !== 'masonry' ? '157px' : ''
})
function addListeners() {
// selectionBox.style['z-index'] = '-1'
selectionBox = document.querySelector('.selection-box') as HTMLDivElement
on(el.value!, 'mousedown', downHandler)
on(el.value!, 'mousemove', moveHandler)
on(document, 'mouseup', upHandler)
// on(elwc.value!, 'mouseup', upHandler)
}
function removeListeners() {
off(el.value!, 'mousedown', downHandler)
on(el.value!, 'mousemove', moveHandler)
on(document, 'mouseup', upHandler)
// on(elwc.value!, 'mouseup', upHandler)
}
function afterEnter() {
@ -359,9 +234,8 @@ function afterLeave() {
removeListeners()
}
onMounted(async() => {
onMounted(() => {
show.value && addListeners()
removeDom()
})
async function showModal() {
@ -374,35 +248,9 @@ async function showModal() {
}
async function onChange() {
if(timeRange.value == "desc") {
timeRange.value = "asc";
}else {
timeRange.value = "desc";
}
sortObj = {
// orderbyname: val,
orderByUptime: timeRange.value
}
pagination.pageNo = 1
const list = await featchList()
listData.value = list
layout()
}
async function onChangeView() {
if(similarRange.value == "desc") {
similarRange.value = "asc";
}else {
similarRange.value = "desc";
}
sortObj = {
// orderbyname: val,
orderBySimilarity: similarRange.value
}
pagination.pageNo = 1
const list = await featchList()
listData.value = list
layout()
}
function closeModal(event: MouseEvent) {
@ -421,7 +269,6 @@ async function commit() {
}
}
function remove() {
// console.log("finally-selectedApproveItems------------", selectedApproveItems.value);
if (!selectIds.value || selectIds.value.length === 0) {
message.error('至少选中一个')
return
@ -454,26 +301,11 @@ const showActions = computed(() => {
function onCheckChange(checked: any, item: any) {
item.checked = checked
const index = selectedApproveItems.value.indexOf(item);
const picIndex = selectIds.value.indexOf(item.pictureId);
if (index === -1 && checked) {
selectedApproveItems.value.push(item)
} else {
selectedApproveItems.value.splice(index, 1);
}
if (picIndex === -1 && checked) {
selectIds.value.push(item.pictureId);
} else {
selectIds.value.splice(picIndex, 1);
}
setTimeout(() => {
nextTick(() => {
batch.value = true
})
}, 100)
if (index === -1 && checked) selectedApproveItems.value.push(item);
else selectedApproveItems.value.splice(index, 1);
}
function rejectHandler() {
@ -483,27 +315,25 @@ function rejectHandler() {
function reset() {
batch.value = false;
// pagination.pageNo = 1;
pagination.pageNo = 1;
pagination.pageSize = 20;
selectIds.value = [];
selectedApproveItems.value.length = 0;
loading = false;
canloadMore = true;
layout();
}
function validate(items: any[]) {
if (items.length === 0) return "至少选中一个任务";
return null;
}
function approvalHandler(items?: any) {
// if (batch.value) {
if (batch.value) {
processItems = selectedApproveItems.value
// }
}
// => => /
if (items !== undefined && !(items instanceof PointerEvent))
processItems = [items]
console.log("batch-------------",batch.value,selectedApproveItems.value,processItems);
const msg = validate(processItems)
if (msg !== null) {
@ -558,63 +388,12 @@ function doAudit(param: any) {
function reloadList() {
refreshHandler()
}
async function refreshHandler(filtersearchId?: any) {
// rao start
async function refreshHandler() {
reset()
pagination.pageNo = 1;
const list = await featchList()
listData.value = list
layout()
// rao end
// reset();
// if (filtersearchId) {
// filterId = filtersearchId;
// }
nextTick(() => {
setTimeout(() => {
useInfiniteScroll(
el as any,
() => {
console.log("加载了333333333333333333333333---------------------------");
loadMore();
},
{ distance: 10, canLoadMore: () => canloadMore }
);
}, 300);
});
}
watch(() => show.value,
async(newVal) => {
if(show.value) {
pagination.pageNo = 1;
const list = await featchList()
listData.value = list
console.log("加载了1111111111111---------------------------", listData.value);
layout()
}
},
)
watch(() => pagination.pageNo,
(newVal, oldVal) => {
if(newVal == oldVal) {
return
}
if((newVal == 1 || newVal == 2) && canloadMore) {
setTimeout(() => {
nextTick(() => {
console.log("加载了22222222222222222---------------------------", newVal);
loading = false
loadMore();
})
}, 500)
}
},
);
}
</script>
@ -622,7 +401,7 @@ watch(() => pagination.pageNo,
<div>
<n-modal v-model:show="show" :mask-closable="false" style="position: relative;" transform-origin="center"
@after-enter="afterEnter" @after-leave="afterLeave">
<n-card ref="elwc" :style="cardStyle" class="card card-1" style="position: fixed;top:64px" :bordered="false" size="huge"
<n-card :style="cardStyle" class="card card-1" style="position: fixed;top:64px" :bordered="false" size="huge"
role="dialog" aria-modal="true">
<div class="wrapper">
<div class="wrapper-m32">
@ -636,38 +415,18 @@ watch(() => pagination.pageNo,
<div class="wrapper-content">
<div class="wrapper-content-form wrapper-m32">
<div>
<n-popselect v-model:value="viewMode" :options="viewOptions" trigger="click">
<div class="wrapper-form-dropdown">
<span>视图模式</span>
<SvgIcon class="wrapper-content-form-gap" name="arrow-botton" size="14" />
</div>
</n-popselect>
<div
style="margin-left: 15px; cursor: pointer; color: #323233"
@click="onChange()"
>
<span>时间排序</span>
<SvgIcon style="margin-left: 8px" name="sort" size="12" />
</div>
<div
style="margin-left: 15px; cursor: pointer; color: #323233"
@click="onChangeView()"
>
<span>相似度排序</span>
<SvgIcon style="margin-left: 8px" name="sort" size="12" />
</div>
<!-- <n-popselect v-model:value="timeRange" :options="timeOptions" trigger="click" @change="onChange">
<n-popselect v-model:value="timeRange" :options="timeOptions" trigger="click" @change="onChange">
<div class="wrapper-content-form-dropdown">
<span>时间排序</span>
<SvgIcon class="wrapper-content-form-dropdown-gap" name="arrow-botton" size="14" />
</div>
</n-popselect>
<n-popselect v-model:value="similarRange" :options="timeOptions" trigger="click" @change="onChangeView">
<div class="wrapper-content-form-dropdown">
<span>相似度排序</span>
<SvgIcon class="wrapper-content-form-dropdown-gap" name="arrow-botton" size="14" />
<n-popselect v-model:value="viewMode" :options="viewOptions" trigger="click">
<div class="wrapper-form-dropdown">
<span>视图模式</span>
<SvgIcon class="wrapper-content-form-gap" name="arrow-botton" size="14" />
</div>
</n-popselect> -->
</n-popselect>
</div>
<div>
<div class="remove" @click="remove">
@ -701,17 +460,10 @@ watch(() => pagination.pageNo,
<div v-for="(item, index) in listData" :key="item.pictureId" :data-id="item.pictureId"
:class="{ 'grid-item-selected': isSelected(item.pictureId) }" :style="{ height: gridHeight }"
class="grid-item">
<n-image
ref="imageRef"
:src="item.imgUrl"
:preview-src="item.imgUrl"
class="img "
:class="{
'img-fit': viewMode === 'horizontalVersion',
'img-full': viewMode === '3:4' || viewMode === 'verticalVersion' }"
/>
<n-image :src="item.imgUrl" class="img "
:class="{ 'img-fit': viewMode === 'horizontalVersion', 'img-full': viewMode === '3:4' || viewMode === 'verticalVersion' }" />
<n-checkbox v-if="batch && item.historyStates === 1" v-model:checked="item.checked"
style="position:absolute;left:20px;top:20px" @click.prevent.stop
style="position:absolute;left:20px;top:20px" @click.prevent
@update:checked="onCheckChange($event, item)" />
<img v-if="item.historyStates === 2" class="tag-status" src="@/assets/images/task/tag-pass.png" alt="">
<img v-if="item.historyStates === 3" class="tag-status" src="@/assets/images/task/tag-not-pass.png"
@ -720,7 +472,7 @@ watch(() => pagination.pageNo,
<div :class="{ 'percent-red': item.similarityScore === 100 }" class="percent">
{{ item.similarityScore }}<span class="percent-unit">%</span>
</div>
<div class="time" >
<div class="time" style="left: 25px;bottom: 15px;">
<!-- <div class="time-item">
<SvgIcon class="svg-time" color="#FFF" size="16" name="camera-time" />
<span>{{ item?.photoDateTimestamp ?
@ -731,11 +483,6 @@ watch(() => pagination.pageNo,
<span>{{ item.submitDateTimestamp ?
formatToDateHMS(Number(item.submitDateTimestamp)) : '-' }}</span>
</div> -->
<div class="time-item" style="margin-bottom: 4px;">
<SvgIcon color="#FFF" size="16" name="camera" style="margin-right: 4px;" />
<span class="time-value">{{ item?.photoDateTimestamp ?
formatToDateHMS(Number(item.photoDateTimestamp)) : '-' }} </span>
</div>
<div class="time-item">
<SvgIcon class="svg-time" color="#FFF" size="16" name="time" />
<span>{{ item.submitDateTimestamp ?
@ -802,9 +549,7 @@ watch(() => pagination.pageNo,
}
.img {
border-radius: 7px;
display: block;
height: 100%;
border-radius: 8px;
}
.wrapper {
@ -915,12 +660,9 @@ watch(() => pagination.pageNo,
}
.time {
position: absolute;
width: 182px;
padding-left: 10px;
z-index: 3;
left: 16px;
bottom: 16px;
background: linear-gradient(180deg,rgba(6,0,0,0.01),rgba(0, 0, 0, 0.44) 100%);
left: 32px;
bottom: 32px;
.time-item {
display: flex;
@ -944,8 +686,7 @@ watch(() => pagination.pageNo,
.scroll {
overflow-y: auto;
// height: calc(100vh - 282px);
height: 800px;
height: calc(100vh - 282px);
margin-left: 20px;
}
}

@ -102,7 +102,10 @@ defineExpose({
</div>
<div class="wrapper-request">
<table style="margin-left: 100px;">
<tr>
<td><div class="key" data-key="c" /></td>
<td>关闭关闭当前场景弹窗</td>
</tr>
<tr>
<td><div class="key" data-key="p p" /></td>
<td>通过</td>
@ -114,8 +117,12 @@ defineExpose({
</table>
<table style="margin-left: 155px;">
<tr>
<td><div class="key" data-key="c" /></td>
<td>关闭关闭当前场景弹窗</td>
<td><div class="key" data-key="t t" /></td>
<td></td>
</tr>
<tr>
<td><div class="key" data-key="f f" /></td>
<td></td>
</tr>
<tr>
<td><div class="key" data-key="&larr;" /><span>/</span><div class="key" data-key="&rarr;" /></td>

@ -101,8 +101,8 @@ const options = computed(() => {
>
<template #trigger>
<div class="setting">
<span style="color:#333333">{{ useInfo.username }}</span>
<SvgIcon style="margin-left: 6px" :name="iconName" size="16" />
<span>{{ useInfo.username }}</span>
<SvgIcon style="margin-left: 6px" :name="iconName" size="14" />
</div>
</template>
<div class="container">

@ -11,11 +11,11 @@ import { msgPolling } from '@/api/message/message'
import { getImgUrl } from '@/utils/urlUtils'
import { useUser } from '@/store/modules/user'
import { useTaskStore } from '@/store/modules/task'
import defaultAvatar from '@/assets/icons/avatar.svg'
import defaultAvatar from '@/assets/icons/avatar.svg';
const taskStore = useTaskStore()
const taskStore = useTaskStore();
export default defineComponent({
name: 'PageHeader',
name: "PageHeader",
components: {
UserSettings,
QuillModal,
@ -31,140 +31,139 @@ export default defineComponent({
type: Boolean,
},
},
emits: ['update:collapsed'],
emits: ["update:collapsed"],
setup() {
const message = useMessage()
const dialog = useDialog()
const message = useMessage();
const dialog = useDialog();
const userStore = useUser()
const useInfo = userStore.getUserInfo
const userStore = useUser();
const useInfo = userStore.getUserInfo;
const name = ''
const name = "";
const state = reactive({
username: name ?? '',
fullscreenIcon: 'FullscreenOutlined',
})
username: name ?? "",
fullscreenIcon: "FullscreenOutlined",
});
const router = useRouter()
const route = useRoute()
const routename = ref(route.meta.title)
const router = useRouter();
const route = useRoute();
const routename = ref(route.meta.title);
// mm
const iconList = ref([
{
icon: 'magnifying-1',
icon: "magnifying-1",
handle: searchHandler,
},
{
icon: 'shortcut-keys',
icon: "shortcut-keys",
handle: shortcutHandler,
},
{
icon: 'suspicious-folder',
icon: "suspicious-folder",
handle: recycleHandler,
},
{
icon: 'memo',
icon: "memo",
handle: quillHandler,
},
{
icon: 'nomessage',
icon: "nomessage",
handle: goMessage,
},
])
]);
watch(
() => route.fullPath,
() => {
routename.value = route.meta.title
},
)
routename.value = route.meta.title;
}
);
const handleDragOver = (event, item) => {
taskStore.setInFile(true)
}
taskStore.setInFile(true);
};
const handleDragLeave = (event, item) => {
taskStore.setInFile(false)
}
taskStore.setInFile(false);
};
const dropdownSelect = (key) => {
router.push({ name: key })
}
router.push({ name: key });
};
// 退
const doLogout = () => {
dialog.info({
title: '提示',
content: '您确定要退出登录吗',
positiveText: '确定',
negativeText: '取消',
title: "提示",
content: "您确定要退出登录吗",
positiveText: "确定",
negativeText: "取消",
onPositiveClick: () => {
userStore.logout().then(() => {
message.success('成功退出登录')
message.success("成功退出登录");
router
.replace({
name: 'Login',
name: "Login",
query: {
// redirect: route.fullPath,
},
})
.finally(() => location.reload())
})
.finally(() => location.reload());
});
},
onNegativeClick: () => {},
})
}
});
};
const quillModalRef = ref(null)
const shortcutModal = ref(null)
const recycleModalRef = ref(null)
const SearchModalRef = ref(null)
const quillModalRef = ref(null);
const shortcutModal = ref(null);
const recycleModalRef = ref(null);
const SearchModalRef = ref(null);
function quillHandler() {
const modal = unref(quillModalRef)! as any
modal.showModal()
const modal = unref(quillModalRef)! as any;
modal.showModal();
}
function shortcutHandler() {
const modal = unref(shortcutModal)! as any
modal.showModal()
const modal = unref(shortcutModal)! as any;
modal.showModal();
}
function recycleHandler() {
const modal = unref(recycleModalRef)! as any
modal.showModal()
const modal = unref(recycleModalRef)! as any;
modal.showModal();
}
function searchHandler() {
const modal = unref(SearchModalRef)! as any
modal.showModal()
const modal = unref(SearchModalRef)! as any;
modal.showModal();
}
function goMessage() {
router.push({ name: 'message-main' })
router.push({ name: "message-main" });
}
async function getMessage() {
const res = await msgPolling()
if (res.data)
iconList.value[4].icon = 'hasmessage'
else iconList.value[4].icon = 'nomessage'
const res = await msgPolling();
if (res.data) iconList.value[4].icon = "hasmessage";
else iconList.value[4].icon = "nomessage";
}
setInterval(() => {
getMessage()
}, 5000)
getMessage();
}, 5000);
const mousetrap = inject('mousetrap') as any
const mousetrap = inject("mousetrap") as any;
onMounted(() => {
getMessage()
mousetrap.bind('n r', quillHandler)
mousetrap.bind('n t', quillHandler)
mousetrap.bind('n n', recycleHandler)
mousetrap.bind('m m', searchHandler)
})
getMessage();
mousetrap.bind("n r", quillHandler);
mousetrap.bind("n t", quillHandler);
mousetrap.bind("n n", recycleHandler);
mousetrap.bind("m m", searchHandler);
});
const defaultAvatarSrc = ref(defaultAvatar)
const defaultAvatarSrc = ref(defaultAvatar);
return {
...toRefs(state),
@ -188,7 +187,7 @@ export default defineComponent({
defaultAvatarSrc,
}
},
})
});
</script>
<template>
@ -202,6 +201,7 @@ export default defineComponent({
>
<SvgIcon name="homepage" size="16" />
</div>
<div>当前位置{{ routename }}</div>
</div>
<div class="layout-header-right">
@ -227,7 +227,7 @@ export default defineComponent({
<!-- 个人中心 -->
<div class="layout-header-trigger layout-header-trigger-min">
<!-- <n-avatar :src="getImgUrl(useInfo.usericon)" round /> -->
<n-avatar style="width:36px;height:36px;" :src="(useInfo.usericon && getImgUrl(useInfo.usericon)) || defaultAvatarSrc" round />
<n-avatar :src="(useInfo.usericon && getImgUrl(useInfo.usericon)) || defaultAvatarSrc" round/>
</div>
<!-- 设置 -->
<UserSettings @logout="doLogout" />
@ -245,7 +245,7 @@ export default defineComponent({
justify-content: space-between;
align-items: center;
padding: 0;
height: 62px;
height: 64px;
transition: all 0.2s ease-in-out;
width: 100%;
z-index: 11;
@ -253,7 +253,6 @@ export default defineComponent({
&-left {
display: flex;
align-items: center;
justify-content: flex-start;
color: #666666;
.logo {
@ -268,7 +267,7 @@ export default defineComponent({
img {
width: auto;
height: 34px;
height: 32px;
margin-right: 10px;
}
@ -281,7 +280,7 @@ export default defineComponent({
&-right {
display: flex;
align-items: center;
margin-right: 24px;
margin-right: 20px;
.back {
width: 28px;

@ -68,14 +68,11 @@ export default defineComponent({
return v;
});
}
console.log(userInfo.frontmenuTList,'frontmenuTList');
console.log(menus.value,'menus')
updateSelectedKeys();
}
//
function clickMenuItem(key: string) {
console.log('clickMenuItem',key)
if (/http(s)?:/.test(key)) window.open(key);
else router.push({ name: key });

@ -1,17 +1,21 @@
<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>
@ -41,13 +45,10 @@ 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;
overflow: hidden;
.layout-sider {
min-height: 100vh;
border-right: 1px solid #dae4f3;
@ -72,7 +73,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;
}

@ -31,7 +31,6 @@ const routes: Array<RouteRecordRaw> = [
name: 'final-main',
meta: {
title: '任务终审',
keepAlive: true,
},
component: () => import('@/views/final/index.vue'),
},

@ -1,44 +0,0 @@
import { Layout } from '@/router/constant'
import type { RouteRecordRaw } from 'vue-router'
/**
* @param name , ,
* @param meta
* @param redirect , 访,
* @param meta.disabled
* @param meta.title
* @param meta.icon
* @param meta.keepAlive
* @param meta.sort
*
*/
const routes: Array<RouteRecordRaw> = [
{
path: '/',
name: 'map',
redirect: '/map',
component: Layout,
meta: {
title: '地理位置',
permissions: ['task-main'],
svgname: 'task-approval',
svgsize: 22,
sort: 5,
disabled: true,
hidden: true,
},
children: [
{
path: 'map',
name: 'map-main',
meta: {
title: '地理位置',
},
component: () => import('@/views/map/index.vue'),
},
],
},
]
export default routes

@ -1,5 +1,5 @@
import type { RouteRecordRaw } from 'vue-router'
import { Layout } from '@/router/constant'
import type { RouteRecordRaw } from 'vue-router'
/**
* @param name , ,
@ -19,7 +19,7 @@ const routes: Array<RouteRecordRaw> = [
redirect: '/worksheet',
component: Layout,
meta: {
title: '图审审批',
title: '图审审批管理',
permissions: ['worksheet-main'],
svgname: 'worksheet',
svgsize: 22,
@ -30,7 +30,7 @@ const routes: Array<RouteRecordRaw> = [
path: 'worksheet',
name: 'worksheet-main',
meta: {
title: '图审审批',
title: '图审审批管理',
},
component: () => import('@/views/worksheet/index.vue'),
},

@ -5,7 +5,6 @@ import { getFilter } from '@/api/home/filter'
export interface ConfigState {
customConfig: string[] | null
asideValue: any
listKey: number
}
export const useFinalStore = defineStore({
@ -13,7 +12,6 @@ export const useFinalStore = defineStore({
state: (): ConfigState => ({
customConfig: null,
asideValue: null,
listKey: 0,
}),
getters: {
getCustomConfig(): string[] | null {
@ -27,9 +25,6 @@ export const useFinalStore = defineStore({
setAsideValue(value) {
this.asideValue = value
},
setListKey() {
this.listKey = new Date().getTime()
},
// 获取终审个性化配置
async fetchCustomConfig() {
const res = await getFilter(1)

@ -1,7 +1,7 @@
import { getApprovalList } from '@/api/task/task'
import { store } from '@/store'
import { defineStore } from 'pinia'
import type { TaskState } from '/#/task'
import { getApprovalList } from '@/api/task/task'
import { store } from '@/store'
export const useTaskStore = defineStore({
id: 'task-store',
@ -12,7 +12,6 @@ export const useTaskStore = defineStore({
packageid: '',
immersion: false,
inFile: false, // 是否进入文件夹
inFileId:"",
}),
getters: {
getActiveId: (state: TaskState) => state.activeId,
@ -20,7 +19,6 @@ 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[]) {
@ -29,9 +27,6 @@ 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]

@ -124,9 +124,10 @@ export const useUserStore = defineStore({
// 默认设置为第一个租户
const firstTenant = data.tenantList.length > 0 ? data.tenantList[0] : null
const tenantId = firstTenant ? firstTenant.id : ''
data.frontmenuTList.forEach((ele) => {
if (ele.description === 'AI工单')
ele.description = '图审审批'
data.frontmenuTList.forEach(ele=>{
if(ele.description === 'AI工单'){
ele.description = '图审审批管理'
}
})
storage.set(CURRENT_USER, data, ex)
storage.set(TENANT_ID, tenantId)

@ -37,24 +37,14 @@ Object.keys(asideMap).forEach((key) => {
if (inFilterList !== false) asideValue[key] = defaultValue;
});
const filterModalRef:any = ref(null);
const filterModalRef = ref(null);
const newFilterModalRef = ref(null);
const customModalRef = ref(null);
const AdvanceFilterRef: any = ref(null);
function showModal(modalRef: any) {
const modal = unref(modalRef)! as any;
modal.showModal();
}
const newFilterOk = () => {
filterModalRef.value.query(
filterModalRef.value.pagination.page,
filterModalRef.value.pagination.pageSize
);
filterModalRef.value.showModal();
};
const mousetrap = inject("mousetrap") as any;
mousetrap.bind("[", collapseHandler);
@ -176,16 +166,6 @@ watch(asideValue, (newVal) => {
const inputChange = (keyword) => {
emit("inputChange", keyword);
};
const handleOk = (item: any) => {
console.log("handleOk", item);
if (item) {
AdvanceFilterRef.value.setCurrentlySelectedAdvanced(item.searchname);
filterHandler(item.id);
} else {
AdvanceFilterRef.value.setCurrentlySelectedAdvanced("高级筛选");
filterHandler("");
}
};
</script>
<template>
@ -217,7 +197,6 @@ const handleOk = (item: any) => {
@update:search="setShowSearch(true)"
@show-custom="showModal(customModalRef)"
@show-filter="showModal(filterModalRef)"
ref="AdvanceFilterRef"
/>
</div>
@ -237,10 +216,9 @@ const handleOk = (item: any) => {
ref="filterModalRef"
@edit-filter="editFilter"
@show-new-filter="showModal(newFilterModalRef)"
@handleOk="handleOk"
/>
<!-- 新增过滤 -->
<NewFilterModal ref="newFilterModalRef" @onOk="newFilterOk" />
<NewFilterModal ref="newFilterModalRef" />
</n-scrollbar>
</div>
</template>
@ -260,7 +238,6 @@ const handleOk = (item: any) => {
width: 100%;
border-bottom: 1px solid #e8e8e8;
margin-bottom: 15px;
height: 58px
}
&-divider {

@ -260,7 +260,7 @@ const rightInputHandler = debounce((keyword) => {
<span class="wrapper-title" style="color: #333333;">自定义筛选</span>
<div class="wrapper-bar">
<div class="wrapper-info" style="background-color: #F8F8F8;">
<span :style="{ 'margin-left': '18px', 'color': '#333333' }">筛选项信息</span>
<span :style="{ 'margin-left': '18px' ,'color':'#333333'}">筛选项信息</span>
</div>
</div>
@ -442,6 +442,7 @@ const rightInputHandler = debounce((keyword) => {
.draggable-ul {
width: 100%;
overflow: hidden;
background: #f8f8f8;
.draggable-li {
width: 100%;

@ -1,98 +1,97 @@
<script lang="ts" setup>
import { difference } from 'lodash-es'
import { computed, onMounted, ref, watch } from 'vue'
import { VueDraggable } from 'vue-draggable-plus'
import { getAllfieldList, getfieldList, savefield } from '@/api/home/filter'
import { ColumnsMap } from '@/config/final'
import { useUser } from '@/store/modules/user'
import { getAllfieldList, getfieldList, savefield } from "@/api/home/filter";
import { ColumnsMap } from "@/config/final";
import { useUser } from "@/store/modules/user";
import { difference } from "lodash-es";
import { computed, onMounted, ref, watch } from "vue";
import { VueDraggable } from "vue-draggable-plus";
const emit = defineEmits<{
(e: "commit", columns: any[]);
}>();
//
const offList = ref<any[]>([]);
//
const fixLeftList = ref<any[]>([]);
const onList = ref<any[]>([]);
const props = defineProps({
reviewType: {
type: Number,
default: () => 0,
require: true,
},
})
});
const emit = defineEmits<{
(e: 'commit', columns: any[])
}>()
//
const offList = ref<any[]>([])
//
const fixLeftList = ref<any[]>([])
const onList = ref<any[]>([])
onMounted(async () => {
const userStore = useUser()
const userInfo = userStore.getUserInfo
let res
res = await getAllfieldList(props.reviewType) //
const allList = res.data
res = await getfieldList(props.reviewType, userInfo.id) //
const useList = res.data
const userStore = useUser();
const userInfo = userStore.getUserInfo;
let res;
res = await getAllfieldList(props.reviewType); //
const allList = res.data;
res = await getfieldList(props.reviewType, userInfo.id); //
const useList = res.data;
/**
* name 标题
* id 键值
* fix 是否默认
* checked 是否选中
*/
const userFieldFixed = useList.userFieldFixed?.split(',')
const userFieldUnFixed = useList.userFieldUnFixed?.split(',')
const mustList = []
const userFieldFixed = useList.userFieldFixed?.split(",");
const userFieldUnFixed = useList.userFieldUnFixed?.split(",");
let mustList = [];
allList?.map((v) => {
const item = {
let item = {
name: v.fieldDesc,
id: v.name,
fix: v.isrequired == 2,
checked:
v.isrequired == 2
|| Boolean(userFieldFixed?.find(v2 => v2 == v.name))
|| Boolean(userFieldUnFixed?.find(v2 => v2 == v.name)),
}
v.isrequired == 2 ||
Boolean(userFieldFixed?.find((v2) => v2 == v.name)) ||
Boolean(userFieldUnFixed?.find((v2) => v2 == v.name)),
};
if (item.fix) {
mustList.push(item)
if (!userFieldFixed?.length && !userFieldUnFixed?.length)
fixLeftList.value.push(item)
mustList.push(item);
if (!userFieldFixed?.length && !userFieldUnFixed?.length) {
fixLeftList.value.push(item);
}
}
if (userFieldFixed?.find(v2 => v2 == v.name))
fixLeftList.value.push(item)
if (userFieldUnFixed?.find(v2 => v2 == v.name))
onList.value.push(item)
offList.value.push(item)
})
})
if (userFieldFixed?.find((v2) => v2 == v.name)) {
fixLeftList.value.push(item);
}
if (userFieldUnFixed?.find((v2) => v2 == v.name)) {
onList.value.push(item);
}
offList.value.push(item);
});
});
const allCount = computed(() => {
return `全部字段(共${offList.value.length - 1}个)`
})
return `全部字段(共${offList.value.length - 1}个)`;
});
const selectCount = computed(() => {
return `显示字段(共${onList.value.length}个)`
})
return `显示字段(共${onList.value.length}个)`;
});
function generatList() {
const keys = Object.keys(ColumnsMap)
const keys = Object.keys(ColumnsMap);
// const showStr = 'name'
// const showKeys = showStr.split(',').map((key: string) => key.toLowerCase())
for (const key of keys) {
const { title, fixed, fixLeft, width } = ColumnsMap[key]
const { title, fixed, fixLeft, width } = ColumnsMap[key];
const item = {
id: key,
title,
fix: fixed,
checked: ColumnsMap[key].fixed,
width,
}
};
if (!fixed)
offList.value.push(item)
if (!fixed) offList.value.push(item);
if (fixLeft)
fixLeftList.value.push(item)
if (fixLeft) fixLeftList.value.push(item);
}
// showList = showKeys.reduce((acc, key) => {
@ -104,18 +103,18 @@ function generatList() {
// return [...acc, config]
// }, [])
const fixedList = generateDefaultList()
const fixedList = generateDefaultList();
const filterList = fixedList.filter((item) => {
return !item.fixLeft
})
return !item.fixLeft;
});
onList.value.unshift(...filterList)
offList.value.unshift(...fixedList)
onList.value.unshift(...filterList);
offList.value.unshift(...fixedList);
}
function generateDefaultList() {
return Object.keys(ColumnsMap).reduce((acc, key) => {
const { title, fixed, fixLeft, width } = ColumnsMap[key]
const { title, fixed, fixLeft, width } = ColumnsMap[key];
if (fixed) {
const config = {
@ -125,117 +124,115 @@ function generateDefaultList() {
checked: true,
fixLeft,
width,
}
return [...acc, config]
}
else {
return acc
};
return [...acc, config];
} else {
return acc;
}
}, [])
}, []);
}
const show = ref(false)
const checkAll = ref(false)
const show = ref(false);
const checkAll = ref(false);
function showModal() {
show.value = true
show.value = true;
}
function closeModal() {
show.value = false
show.value = false;
}
async function handleSumbit(e: MouseEvent) {
e.preventDefault()
closeModal()
const userStore = useUser()
const userInfo = userStore.getUserInfo
let userFieldFixed = ''
let userFieldUnFixed = ''
e.preventDefault();
closeModal();
const userStore = useUser();
const userInfo = userStore.getUserInfo;
let userFieldFixed = "";
let userFieldUnFixed = "";
fixLeftList.value.map((v) => {
userFieldFixed += `${v.id},`
})
userFieldFixed += `${v.id},`;
});
onList.value.map((v) => {
userFieldUnFixed += `${v.id},`
})
userFieldFixed = userFieldFixed.slice(0, userFieldFixed.length - 1)
userFieldUnFixed = userFieldUnFixed.slice(0, userFieldUnFixed.length - 1)
savefield(props.reviewType, userInfo.id, userFieldFixed, userFieldUnFixed)
userFieldUnFixed += `${v.id},`;
});
userFieldFixed = userFieldFixed.slice(0, userFieldFixed.length - 1);
userFieldUnFixed = userFieldUnFixed.slice(0, userFieldUnFixed.length - 1);
savefield(props.reviewType, userInfo.id, userFieldFixed, userFieldUnFixed);
const columns: any[] = [
{
type: 'selection',
fixed: 'left',
type: "selection",
fixed: "left",
width: 50,
},
]
];
const leftList = fixLeftList.value.map((item) => {
return {
title: item.name,
key: item.id,
fixed: 'left',
fixed: "left",
width: 120,
}
})
};
});
const unfixList = onList.value.map((item) => {
return {
title: item.name,
key: item.id,
width: 120,
}
})
};
});
columns.push(...leftList, ...unfixList)
emit('commit', columns)
columns.push(...leftList, ...unfixList);
emit("commit", columns);
}
defineExpose({
showModal,
})
});
// generatList()
const selectIds = ref<string[]>([])
const selectIds = ref<string[]>([]);
function onCheckAllChange(value) {
const ids: string[] = []
const ids: string[] = [];
for (const item of offList.value) {
if (!item.fix) {
item.checked = value
ids.push(item.id)
item.checked = value;
ids.push(item.id);
}
}
if (value) {
offList.value.map((v) => {
if (!v.checked)
onList.value.push(v)
})
}
else {
onList.value = []
fixLeftList.value = []
if (!v.checked) {
onList.value.push(v);
}
});
} else {
onList.value = [];
fixLeftList.value = [];
offList.value.map((v) => {
if (v.fix)
fixLeftList.value.push(v)
})
if (v.fix) {
fixLeftList.value.push(v);
}
});
}
selectIds.value = value ? ids : []
selectIds.value = value ? ids : [];
}
function onCheckChange(checked: any, item: any) {
item.checked = checked
item.checked = checked;
if (checked) {
onList.value.push(item)
}
else {
let index = onList.value.findIndex(v => v.id == item.id)
onList.value.push(item);
} else {
let index = onList.value.findIndex((v) => v.id == item.id);
if (index > -1) {
onList.value.splice(index, 1)
}
else {
index = fixLeftList.value.findIndex(v => v.id == item.id)
fixLeftList.value.splice(index, 1)
onList.value.splice(index, 1);
} else {
index = fixLeftList.value.findIndex((v) => v.id == item.id);
fixLeftList.value.splice(index, 1);
}
}
// TODO
@ -245,26 +242,24 @@ function onCheckChange(checked: any, item: any) {
const showIds = computed(() => {
return onList.value.map((item) => {
return item.id
})
})
return item.id;
});
});
watch(
() => selectIds.value.length,
(newVal, oldVal) => {
if (newVal === oldVal)
return
if (newVal === oldVal) return;
const action = newVal > oldVal ? 'add' : 'remove'
const diff: string[]
= action === 'add'
const action = newVal > oldVal ? "add" : "remove";
const diff: string[] =
action === "add"
? difference(selectIds.value, showIds.value)
: difference(showIds.value, selectIds.value)
: difference(showIds.value, selectIds.value);
if (diff.length === 0)
return
if (diff.length === 0) return;
if (action === 'add') {
if (action === "add") {
for (const item of offList.value) {
if (!item.fix && diff.includes(item.id)) {
onList.value.push({
@ -272,81 +267,77 @@ watch(
name: item.name,
fix: item.fix || false,
width: 120,
})
});
}
}
}
else {
const list = onList.value
} else {
const list = onList.value;
for (let index = 0; index < list.length; index++) {
const item = list[index]
const item = list[index];
if (!item.fix && diff.includes(item.id)) {
list.splice(index, 1)
return
list.splice(index, 1);
return;
}
}
}
},
)
}
);
watch(
() => showIds.value.length,
(newVal, oldVal) => {
if (newVal === oldVal)
return
if (newVal === oldVal) return;
const diff = difference(selectIds.value, showIds.value)
const diff = difference(selectIds.value, showIds.value);
if (diff.length === 0)
return
if (diff.length === 0) return;
for (const item of offList.value) {
if (!item.fix && diff.includes(item.id)) {
const index = selectIds.value.indexOf(item.id)
item.checked = false
selectIds.value.splice(index, 1)
const index = selectIds.value.indexOf(item.id);
item.checked = false;
selectIds.value.splice(index, 1);
}
}
},
)
}
);
function clearDragSource() {
onList.value = onList.value.filter((item) => {
return item.fix === true
})
return item.fix === true;
});
}
function removeHandler(id: string, type: 'fix' | 'unfix') {
const list = type === 'fix' ? fixLeftList.value : onList.value
function removeHandler(id: string, type: "fix" | "unfix") {
const list = type === "fix" ? fixLeftList.value : onList.value;
let index = list.findIndex((item) => {
return item.id === id
})
return item.id === id;
});
if (index !== -1)
list.splice(index, 1)
index = offList.value.findIndex(v => v.id == id)
if (index !== -1) list.splice(index, 1);
index = offList.value.findIndex((v) => v.id == id);
if (index !== -1) {
offList.value[index].checked = false
}
else {
index == fixLeftList.value.findIndex(v => v.id == id)
fixLeftList.value[index].checked = false
offList.value[index].checked = false;
} else {
index == fixLeftList.value.findIndex((v) => v.id == id);
fixLeftList.value[index].checked = false;
}
}
const indeterminate = computed(() => {
let baseNum = 0
let baseNum = 0;
offList.value.map((v) => {
if (v.fix)
baseNum += 1
})
if (v.fix) {
baseNum += 1;
}
});
return (
onList.value.length + fixLeftList.value.length - baseNum > 0
&& offList.value.length - baseNum
> onList.value.length + fixLeftList.value.length - baseNum
)
})
onList.value.length + fixLeftList.value.length - baseNum > 0 &&
offList.value.length - baseNum >
onList.value.length + fixLeftList.value.length - baseNum
);
});
</script>
<template>
@ -385,8 +376,8 @@ const indeterminate = computed(() => {
<n-checkbox
v-model:checked="checkAll"
label="全部"
:indeterminate="indeterminate"
@update:checked="onCheckAllChange"
:indeterminate="indeterminate"
/>
</div>
<div class="content">
@ -484,9 +475,7 @@ const indeterminate = computed(() => {
<template #footer>
<div class="wrapper-footer">
<n-button type="info" @click="handleSumbit">
确定
</n-button>
<n-button type="info" @click="handleSumbit"> </n-button>
<n-button secondary style="margin-left: 15px" @click="closeModal">
取消
</n-button>
@ -554,7 +543,7 @@ const indeterminate = computed(() => {
.textbtnStyle {
cursor: pointer;
color: #507AFD;
}
.drag-wrapper {

@ -19,11 +19,6 @@ import Action from "@/views/home/aside/comp/Action.vue";
import { deleteCondition, getConditionList, sort } from "@/api/home/filter";
import type { FilterSearchParam } from "/#/api";
import SvgIcon from "@/components/Icon/SvgIcon.vue";
import { useModal, NButton } from "naive-ui";
const modal = useModal();
defineOptions({ name: "FilterModal" });
const emit = defineEmits<{
@ -79,13 +74,7 @@ const columns: DataTableColumns<RowData> = [
{
title: "创建时间",
key: "createtime",
renderSorterIcon: ({ order }) => {
if (order === false) return h(SvgIcon, { name: "sort-2" });
if (order === "ascend") return h(SvgIcon, { name: "sort-1" });
if (order === "descend") return h(SvgIcon, { name: "sort-3" });
},
sorter: (row1, row2) =>
new Date(row1?.createtime).getTime() - new Date(row2?.createtime).getTime(),
sorter: (row1, row2) => new Date(row1?.createtime).getTime() - new Date(row2?.createtime).getTime()
},
{
title: "更新者",
@ -167,16 +156,7 @@ function select(key: number, id: string) {
editSelection(id);
break;
case 2:
const modalInst = modal.create({
title: "确认提示",
content: "确认删除该条过滤条件吗?",
positiveText: "确定",
negativeText: "取消",
preset: "dialog",
onPositiveClick: () => deleteSelection(id),
onNegativeClick: () => modalInst.destroy(),
});
deleteSelection(id);
break;
default:
break;
@ -208,18 +188,10 @@ function deleteSelection(id = "") {
});
return;
}
const modalInst = modal.create({
title: "确认提示",
content: "确认删除所选过滤条件吗?",
positiveText: "确定",
negativeText: "取消",
preset: "dialog",
onPositiveClick: () =>
deleteCondition({ ids: selectionIds.value.join(",") }).then(() => {
selectionIds.value = [];
query(pagination.page, pagination.pageSize);
}),
onNegativeClick: () => modalInst.destroy(),
deleteCondition({ ids: selectionIds.value.join(",") }).then(() => {
selectionIds.value = [];
query(pagination.page, pagination.pageSize);
});
}
@ -241,7 +213,6 @@ async function handlePageSizeChange(currentPageSize) {
function handleClick() {
emit("showNewFilter");
// show.value = false;
closeModal();
}
let sortTable: Sortable | null = null;
@ -309,9 +280,8 @@ function closeModal() {
defineExpose({
showModal,
query,
pagination,
});
const inputHandler = debounce((word) => {
keyword.value = word;
query(1, 5);
@ -324,16 +294,12 @@ const showSearch = computed(() => {
<template>
<div>
<!-- <n-modal v-model:show="delShow" >
</n-modal> -->
<n-modal
v-model:show="show"
transform-origin="center"
display-directive="if"
@after-leave="afterLeave"
:mask-closable="false"
class="modal_wrapper"
>
<n-card
:style="cardStyle"
@ -346,14 +312,7 @@ const showSearch = computed(() => {
<span class="wrapper-title">全部筛选值</span>
<div class="wrapper-bar">
<div class="wrapper-info">
<span
:style="{
'margin-left': '18px',
'font-size': '16px',
'font-weight': '600',
}"
>基本信息</span
>
<span :style="{ 'margin-left': '18px' }">基本信息</span>
</div>
</div>
<div class="wrapper-form" v-if="!showSearch">
@ -369,14 +328,14 @@ const showSearch = computed(() => {
<n-button type="info" @click="handleClick">
创建
<template #icon>
<SvgIcon size="14px" name="creatFilter" />
<SvgIcon size="14px" name="magnifying-1" />
</template>
</n-button>
</div>
<div class="wrapper-form" v-else>
<div class="del_btn">
<n-button icon-placement="left" size="medium" @click="deleteSelection">
<n-button icon-placement="left" size="medium">
<template #icon>
<SvgIcon name="delete-history" size="16" />
</template>
@ -450,15 +409,13 @@ const showSearch = computed(() => {
width: 300px;
border: 1px solid gray;
}
.del_btn {
}
.msg {
span {
padding-right: 16px;
}
a {
padding-left: 17px;
margin-left: 30px;
cursor: pointer;
color: #507afd;
border-left: 1px solid #d8d8d8;
}
}
}
@ -487,29 +444,4 @@ const showSearch = computed(() => {
}
}
}
.del_btn {
margin-left: 12px;
color: #333333;
font-weight: 500;
}
::v-deep(.n-button--info-type) {
background: #507afd !important;
}
::v-deep(.n-data-table
.n-data-table-th
.n-data-table-th__title-wrapper
.n-data-table-th__title) {
font-size: 14px !important;
color: #000000 !important;
}
::v-deep(.n-data-table
.n-data-table-tr:not(.n-data-table-tr--summary):hover
> .n-data-table-td) {
color: #666666 !important;
font-size: 14px !important;
}
::v-deep(.n-data-table .n-data-table-th .n-data-table-sorter) {
position: relative;
left: -80px;
}
</style>

@ -1,108 +1,105 @@
<script lang="ts" setup>
import type { FormInst, FormItemRule, FormRules } from "naive-ui";
import { computed, onBeforeMount, reactive, ref, unref, watch, defineEmits } from "vue";
import { asideMap } from "@/config/final";
import { useDictionary } from "@/store/modules/dictonary";
import { useConfig } from "@/store/modules/asideConfig";
import type { FilterCondition } from "/#/api";
import { addCondition, updateCondition } from "@/api/home/filter";
import { formatToDate2, formatToDate3 } from "@/utils/dateUtil";
type Status = "edit" | "new";
const emit = defineEmits(["onOk"]);
const show = ref(false);
const configStore = useConfig();
const dicStore = useDictionary();
const currentStatus = ref<Status>("new");
let currentEditId: string | null = null;
import type { FormInst, FormItemRule, FormRules } from 'naive-ui'
import { computed, onBeforeMount, reactive, ref, unref, watch } from 'vue'
import { asideMap } from '@/config/final'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
import type { FilterCondition } from '/#/api'
import { addCondition, updateCondition } from '@/api/home/filter'
import { formatToDate2, formatToDate3 } from '@/utils/dateUtil'
type Status = 'edit' | 'new'
const show = ref(false)
const configStore = useConfig()
const dicStore = useDictionary()
const currentStatus = ref<Status>('new')
let currentEditId: string | null = null
const modalTitle = computed(() => {
return currentStatus.value === "new" ? "新建过滤条件" : "编辑过滤条件";
});
return currentStatus.value === 'new' ? '新建过滤条件' : '编辑过滤条件'
})
const cardStyle = {
width: "800px",
"--n-padding-bottom": "10px",
"--n-padding-left": "10px",
};
'width': '800px',
'--n-padding-bottom': '10px',
'--n-padding-left': '10px',
}
const noBorderInput = {
"--n-border": "0px",
"--n-border-hover": "0px",
"--n-border-pressed": "0px",
};
'--n-border': '0px',
'--n-border-hover': '0px',
'--n-border-pressed': '0px',
}
const formItemStyle = {
"--n-label-height": "0px",
"--n-feedback-height": "8px",
};
'--n-label-height': '0px',
'--n-feedback-height': '8px',
}
interface FormType {
name: string | null;
logic: string | null;
conditions: Condition[];
name: string | null
logic: string | null
conditions: Condition[]
}
interface Condition {
type: string | null;
operator: string | null;
result: any;
type: string | null
operator: string | null
result: any
}
interface Option {
label: string;
value: string;
label: string
value: string
}
const rules: FormRules = {
name: {
required: true,
message: "请输入过滤条件名称",
trigger: "blur",
message: '请输入过滤条件名称',
trigger: 'blur',
},
logic: {
required: true,
message: "请选择逻辑关系",
trigger: "blur",
message: '请选择逻辑关系',
trigger: 'blur',
},
conditions: {
required: true,
validator(rule: FormItemRule, value: Condition[]) {
for (const item of value) {
const { type, operator, result } = item;
const { type, operator, result } = item
if (type === null || operator === null || result === null)
return new Error("请选择过滤条件");
return new Error('请选择过滤条件')
}
return true;
return true
},
trigger: ["input", "blur"],
trigger: ['input', 'blur'],
},
};
}
const formRef = ref<FormInst | null>(null);
const formRef = ref<FormInst | null>(null)
const formValue = reactive<FormType>({
name: null,
logic: "and",
conditions: [
{
type: null,
operator: "eq",
result: null,
},
],
});
logic: 'and',
conditions: [{
type: null,
operator: 'eq',
result: null,
}],
})
function handleSumbit(e: MouseEvent) {
e.preventDefault();
e.preventDefault()
formRef.value?.validate((errors) => {
if (errors) return;
if (errors)
return
const list = formValue.conditions.map((item, index) => {
const { type, operator, result } = item;
const { type, operator, result } = item
return {
searchfield: type!,
@ -110,246 +107,193 @@ function handleSumbit(e: MouseEvent) {
searchvalue: formatValue(type!, result),
searchRelationType: formValue.logic!,
orderNum: index + 1,
};
});
}
})
const param: FilterCondition = {
searchname: formValue.name!,
type: 1,
ocrUsersearchchildList: list,
};
}
if (currentStatus.value === "new") addCondition(param);
else updateCondition({ id: currentEditId!, ...param });
closeModal();
});
if (currentStatus.value === 'new')
addCondition(param)
else
updateCondition({ id: currentEditId!, ...param })
closeModal()
})
}
function formatValue(searchfield: string, searchvalue: any) {
if (searchfield === "izuptime") {
const start = formatToDate2(searchvalue[0]);
const end = formatToDate2(searchvalue[1]);
return `${start}-${end}`;
if (searchfield === 'izuptime') {
const start = formatToDate2(searchvalue[0])
const end = formatToDate2(searchvalue[1])
return `${start}-${end}`
}
return searchvalue;
return searchvalue
}
//
function unformatValue(searchfield: string, searchvalue: any) {
// 2022/01/03-2023/02/04
if (searchfield === "izuptime") {
const dataStrs = searchvalue.split("-");
const start = formatToDate3(dataStrs[0]);
const end = formatToDate3(dataStrs[1]);
return [start, end];
if (searchfield === 'izuptime') {
const dataStrs = searchvalue.split('-')
const start = formatToDate3(dataStrs[0])
const end = formatToDate3(dataStrs[1])
return [start, end]
}
return searchvalue;
return searchvalue
}
function createCondition() {
formValue.conditions.push({
type: null,
operator: "eq",
operator: 'eq',
result: null,
});
})
}
function removeCondition(index: number) {
formValue.conditions.splice(index, 1);
formValue.conditions.splice(index, 1)
}
function formLabel(index: number) {
return index === 0 ? "筛选条件" : "";
return index === 0 ? '筛选条件' : ''
}
const typeOptions = ref<Option[]>([]);
const typeOptions = ref<Option[]>([])
const operatorOptions = [
{
label: "等于",
value: "eq",
label: '等于',
value: 'eq',
},
{
label: "不等于",
value: "notEq",
label: '不等于',
value: 'notEq',
},
];
]
const logicOptions = ref([]);
const logicOptions = ref([])
onBeforeMount(() => {
dicStore.fetchRelationTypeList();
});
dicStore.fetchRelationTypeList()
})
watch(
() => dicStore.relationTypeList,
(newval) => {
logicOptions.value = newval;
}
);
watch(() => dicStore.relationTypeList, (newval) => {
logicOptions.value = newval
})
function showModal() {
show.value = true;
show.value = true
}
function closeModal() {
emit("onOk");
setTimeout(() => {
show.value = false;
}, 300);
show.value = false
}
function generateAllData(): Option[] {
const initVal: Option[] = [];
const initVal: Option[] = []
const list = Object.keys(asideMap).reduce((acc, value) => {
if (value.startsWith("iz") && asideMap[value]?.inFilterList !== false) {
const name = asideMap[value]?.label;
name &&
acc.push({
value,
label: name || "未配置",
});
if (value.startsWith('iz') && asideMap[value]?.inFilterList !== false) {
const name = asideMap[value]?.label
name && acc.push({
value,
label: name || '未配置',
})
}
return acc;
}, initVal);
return acc
}, initVal)
return list;
return list
}
typeOptions.value = generateAllData();
typeOptions.value = generateAllData()
function getOptions(key: string) {
const getterName = `get${key}`;
const options = unref(dicStore[getterName]);
return options || [];
const getterName = `get${key}`
const options = unref(dicStore[getterName])
return options || []
}
function leaveHandler() {
currentStatus.value = "new";
currentEditId = null;
currentStatus.value = 'new'
currentEditId = null
formValue.name = null;
formValue.name = null
formValue.conditions = [
{
type: null,
operator: "eq",
operator: 'eq',
result: null,
},
];
]
}
function edit(editFilter: any) {
currentStatus.value = "edit";
currentStatus.value = 'edit'
const { searchname, ocrUsersearchchildList, id } = editFilter;
currentEditId = id;
formValue.name = searchname;
const { searchname, ocrUsersearchchildList, id } = editFilter
currentEditId = id
formValue.name = searchname
formValue.conditions = ocrUsersearchchildList.map((item) => {
return {
type: item.searchfield,
operator: item.searchtype,
result: unformatValue(item.searchfield, item.searchvalue),
};
});
}
})
}
defineExpose({
showModal,
edit,
});
})
</script>
<template>
<n-modal
v-model:show="show"
transform-origin="center"
@after-leave="leaveHandler"
:mask-closable="false"
>
<n-card
:style="cardStyle"
:bordered="false"
size="huge"
role="dialog"
aria-modal="true"
>
<n-modal v-model:show="show" transform-origin="center" @after-leave="leaveHandler" :mask-closable="false">
<n-card :style="cardStyle" :bordered="false" size="huge" role="dialog" aria-modal="true">
<div class="wrapper">
<span class="wrapper-title">{{ modalTitle }}</span>
<div class="wrapper-bar">
<div class="wrapper-info">
<span
:style="{
'margin-left': '18px',
'font-size': '16px',
'font-weight': '600',
}"
>基本信息</span
>
<span :style="{ 'margin-left': '18px' }">基本信息</span>
</div>
</div>
<div class="wrapper-form">
<n-form ref="formRef" :model="formValue" :rules="rules">
<n-form-item path="name" label="标题">
<n-input
v-model:value="formValue.name"
:style="{ width: '780px' }"
@keydown.enter.prevent
placeholder="请输入过滤名称"
/>
<n-input v-model:value="formValue.name" :style="{ width: '780px' }" @keydown.enter.prevent />
</n-form-item>
<n-form-item path="logic" label="逻辑关系" v-show="false">
<n-select
filterable
v-model:value="formValue.logic"
placeholder="请选择逻辑关系"
:options="logicOptions"
/>
<n-select filterable v-model:value="formValue.logic" placeholder="请选择逻辑关系" :options="logicOptions" />
</n-form-item>
<n-form-item
v-for="(item, index) in formValue.conditions"
:key="index"
:style="formItemStyle"
path="conditions"
:label="formLabel(index)"
v-for="(item, index) in formValue.conditions" :key="index" :style="formItemStyle"
path="conditions" :label="formLabel(index)"
>
<n-select
filterable
v-model:value="item.type"
placeholder="请选择筛选项名称"
:options="typeOptions"
<n-select filterable
v-model:value="item.type" placeholder="请选择筛选项名称" :options="typeOptions"
@change="item.result = ''"
/>
<n-select
filterable
v-model:value="item.operator"
style="margin-left: 8px"
placeholder="请选择"
<n-select filterable
v-model:value="item.operator" style="margin-left: 8px;" placeholder="请选择"
:options="operatorOptions"
/>
<n-space v-if="item.type === 'izuptime'">
<n-date-picker
v-model:value="item.result"
style="margin-left: 8px; width: 240px"
type="daterange"
v-model:value="item.result" style="margin-left: 8px;width: 240px;" type="daterange"
clearable
/>
</n-space>
<n-select
filterable
v-else
v-model:value="item.result"
style="margin-left: 8px"
placeholder="请选择"
:options="getOptions(item.type!)"
<n-select filterable
v-else v-model:value="item.result" style="margin-left: 8px;" placeholder="请选择" :options="getOptions(item.type!)"
/>
<n-button
:style="noBorderInput"
icon-placement="right"
@click="removeCondition(index)"
>
<n-button :style="noBorderInput" icon-placement="right" @click="removeCondition(index)">
<template #icon>
<SvgIcon size="24" name="close" />
</template>
@ -358,14 +302,16 @@ defineExpose({
</n-form>
</div>
<div class="wrapper-new" @click="createCondition">
<span style="font-size:16px;">+</span>
<span style="margin-left: 8px">添加筛选条件</span>
<span>+</span>
<span style="margin-left:8px">添加筛选条件</span>
</div>
</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 type="info" @click="handleSumbit">
确定
</n-button>
<n-button secondary style="margin-left:15px" @click="closeModal">
取消
</n-button>
</div>
@ -381,22 +327,19 @@ defineExpose({
&-title {
font-weight: bold;
font-size: 18px;
color: #333333;
font-size: 16px;
}
&-bar {
background-color: #e8e8e8;
width: 100%;
margin-top: 27px;
font-size: 16px;
color: #333333;
margin-top: 20px;
}
&-form {
display: flex;
justify-content: space-between;
margin-top: 24px;
margin-top: 20px;
}
&-new {
@ -405,9 +348,6 @@ defineExpose({
color: #507afd;
line-height: 22px;
cursor: pointer;
span{
font-size: 11px;
}
&:hover {
color: #507aac;
@ -421,7 +361,6 @@ defineExpose({
&-footer {
display: flex;
justify-content: flex-end;
margin-bottom:6px;
}
&-info {
@ -429,7 +368,7 @@ defineExpose({
position: relative;
&:before {
background-color: #1980ff;
background-color: #1980FF;
content: "";
width: 5px;
border-radius: 2px;
@ -439,9 +378,4 @@ defineExpose({
}
}
}
::v-deep(.n-form-item .n-form-item-label){
font-size:14px;
color: #666666;
font-weight: 500;
}
</style>

@ -40,7 +40,6 @@ import type { ApprovalParam } from '/#/api'
import emitter from '@/utils/mitt'
import { formatToDateHMS } from '@/utils/dateUtil'
import { getAllfieldList, getfieldList, savefield } from '@/api/home/filter'
import DataHeader from '@/components/DataHeader/index.vue'
const emit = defineEmits(['changeShow'])
function changeContent() {
@ -58,7 +57,6 @@ const actionsColumns = {
title: '操作',
key: 'actions',
minWidth: 200,
width: 200,
fixed: 'right',
render(row) {
return h(ListAction, {
@ -395,6 +393,15 @@ async function formatColumns() {
key: columnsRef.value[index].key,
fixed: columnsRef.value[index].fixed || undefined,
width: 200,
sorter: 'default',
renderSorterIcon: ({ order }) => {
if (order === false)
return h(SvgIcon, { name: 'sort-2' })
if (order === 'ascend')
return h(SvgIcon, { name: 'sort-1' })
if (order === 'descend')
return h(SvgIcon, { name: 'sort-3' })
},
render(row: any) {
return row.fromusername
},
@ -480,8 +487,7 @@ const finalStore = useFinal()
async function query(page: number, pageSize: number, filterId?: any, taskName?: string) {
const asideParmas = unref(finalStore.getAsideValue)
// 使使
let params = filterId ? { userSearchId: filterId } : asideParmas
params = params?.izshowall ? {} : params
const params = filterId ? { userSearchId: filterId } : asideParmas
const result = await getFinalList({
sortorder: sortorder.value,
pageSize,
@ -503,8 +509,10 @@ async function handleSorterChange(value) {
let name = value.columnKey
if (name === 'fromuptime')
name = 'field11'
else if (name === 'similarityscore')
name = 'similarity_score'
else if (name === 'fromusername')
name = 'fromuserid'
@ -568,21 +576,6 @@ const maxHeight = computed(() => {
return tableData.value.length ? `${unref(deviceHeight)}px` : 'auto'
})
const scrollX = computed(() => {
const table = unref(tableRef)
if (!table)
return
const tableEl: any = table?.$el
const wrapper = tableEl.querySelector('.n-data-table-wrapper')
// const arr = columnsRef.value.filter(item => !item.fixed)
let width = 0
columnsRef.value.forEach((item) => {
width += Number(item.width) || 200
})
return width
})
query(pagination.page, pagination.pageSize)
const customTabelRef = ref(null)
@ -836,13 +829,6 @@ watch(
{ deep: true },
)
watch(
() => finalStore.listKey,
(newVal, oldVal) => {
refreshHandler()
},
)
function reset() {
pagination.page = 1
pagination.pageCount = 1
@ -859,7 +845,8 @@ function filterTableData(keyword) {
if (keyword)
// tableData.value = tableData.value.filter(item => item.id.includes(keyword))
query(pagination.page, pagination.pageSize, '', keyword)
else query(pagination.page, pagination.pageSize)
else
query(pagination.page, pagination.pageSize)
}
defineExpose({
filterTableData,
@ -871,12 +858,7 @@ defineExpose({
<div class="wrapper-header">
<div class="wrapper-header-left">
<span class="wrapper-header-font">任务管理列表</span>
<SvgIcon
style="cursor: pointer"
size="16"
name="list-mode"
@click="changeContent"
/>
<SvgIcon size="16" name="list-mode" @click="changeContent" />
</div>
<div>
<SvgIcon
@ -948,9 +930,6 @@ defineExpose({
</n-popover>
</div>
</div>
<div class="header_data">
<DataHeader :has-color="true" />
</div>
<!-- <div class="wrapper-statistic">
<div v-for="i in 7" :key="i" class="item">
<div class="icon" />
@ -974,12 +953,11 @@ defineExpose({
</div>
<div class="wrapper-content">
<NDataTable
id="table"
ref="tableRef"
v-model:checked-row-keys="checkedRowKeys"
remote
:columns="columnsRef"
:scroll-x="scrollX"
:scroll-x="1250"
:max-height="maxHeight"
:data="tableData"
:loading="loading"
@ -1194,8 +1172,4 @@ defineExpose({
:deep(.n-data-table .n-data-table-td) {
color: #666;
}
:deep(.n-data-table .n-data-table-base-table-header) {
overflow: hidden;
}
</style>

@ -1,24 +1,9 @@
<script lang="ts" setup>
import { onMounted, ref } from "vue";
import testImg from "@/assets/images/test.png";
import {chunk} from 'lodash-es'
const emit = defineEmits(["changeShow"]);
function changeContent() {
emit("changeShow");
}
const initRem = () => {
const designWidth = 1440;
const rempPx = 16;
const scale = window.innerWidth / designWidth;
document.documentElement.style.fontSize = scale * rempPx + "px";
};
onMounted(() => {
initRem();
});
const item = {
img: testImg,
// img: "/src/assets/images/test.png",
img:'http://47.93.59.251/api/image/thumbnail_1752999610491604992.jpeg',
checked: false,
title: "YP4567890545",
date: "2023-12-19 12:09:18",
@ -26,59 +11,40 @@ const item = {
const data = ref<any[]>([]);
onMounted(() => {
for (let i = 0; i < 8; i++) {
for (let i = 0; i < 20; i++) {
data.value.push(item as any);
}
data.value = chunk(data.value,4)
});
</script>
<template>
<div class="wrapper">
<div class="wrapper-header">
<div class="wrapper-header-left">
<span class="wrapper-header-font">任务管理列表</span>
<SvgIcon
style="cursor: pointer"
size="16"
name="card-mode"
@click="changeContent"
/>
</div>
</div>
<div class="header_data">
<DataHeader :hasColor="true" />
</div>
<div class="data_wrapper" v-for="(sitem,sindex) in data" :key="sindex">
<div class="item" v-for="(item, index) in sitem" :key="index">
<div class="top">
<div
class="img"
:style="`background:url(${item.img});background-size:100%;background-repeat: no-repeat;`"
>
<!-- <div class="check_box"><n-checkbox size="medium" label=" " /></div> -->
</div>
<div class="content">
<div class="title">任务ID{{ item.title }}</div>
<div class="date">{{ item.date }}</div>
<div class="tag_box">
<div
class="tag_item"
v-for="index in 2"
:key="index"
:style="index == 2 ? 'color:#02C984' : 'color:#507AFD'"
>
{{ index == 1 ? "待确认" : "张思" }}
</div>
<div class="item" v-for="(item, index) in data" :key="index">
<div class="top">
<div
class="img"
:style="`background:url(${item.img});background-size:100%;background-repeat: no-repeat;`"
>
<div class="check_box"><n-checkbox size="medium" label=" " /></div>
</div>
<div class="content">
<div class="title">任务ID{{ item.title }}</div>
<div class="date">{{ item.date }}</div>
<div class="tag_box">
<div
class="tag_item"
v-for="index in 2"
:key="index"
:style="index == 2 ? 'color:#02C984' : 'color:#507AFD'"
>
{{ index==1?'待确认':'张思' }}
</div>
</div>
</div>
<div class="bottom">
<div class="resovle_action">通过</div>
<div class="reject_action">通过</div>
</div>
</div>
<div class="bottom">
<div class="resovle_action">通过</div>
<div class="reject_action">不通过</div>
</div>
</div>
</div>
@ -86,180 +52,85 @@ onMounted(() => {
<style scoped lang="less">
.wrapper {
// display: flex;
// flex-flow: row wrap;
// align-items: center;
// justify-content: flex-start;
// flex: 1;
display: flex;
flex-flow: row wrap;
align-items: center;
justify-content: flex-start;
flex: 1;
box-sizing: border-box;
margin-left: 16px;
width: 100%;
background: #fff;
padding: 0px 24px 24px 24px;
&-header {
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
height: 64px;
width: 100%;
div {
display: flex;
align-items: center;
}
.xjcc {
font-weight: bold;
color: #507afd;
margin-right: 20px;
}
.title {
color: #507afd;
font-weight: bold;
font-size: 14px;
margin-left: 8px;
}
.btn {
width: 118px;
height: 36px;
background: linear-gradient(135deg, #5b85f8, #3c6cf0);
border-radius: 17px;
box-shadow: 0px 2px 6px 0px rgba(116, 153, 253, 0.3);
.item {
width: 23%;
border: 1px solid #ededed;
border-radius: 3px;
padding: 8px 10px;
margin-right: 10px;
.top {
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: center;
color: #fff;
margin-right: 6px;
cursor: pointer;
}
.more {
width: 30px;
height: 30px;
line-height: 30px;
opacity: 0.1;
background: linear-gradient(144deg, #73a7f9 0%, #3e6ef1 96%);
border-radius: 8px;
}
&-font {
font-size: 20px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 600;
color: #0d0b22;
margin-right: 8px;
}
&-action {
padding: 8px;
li {
height: 32px;
line-height: 32px;
cursor: pointer;
&:hover {
background-color: #f3f8ff;
}
}
}
}
.header_data {
width: 100%;
}
.data_wrapper {
display: flex;
flex-flow: row wrap;
align-items: center;
// justify-content: flex-start;
justify-content: space-between;
flex: 1;
.item {
min-width: 14.125rem;
border: 1px solid #ededed;
border-radius: 3px;
padding: 8px 10px;
margin-right: 20px;
margin-bottom: 16px;
.top {
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: flex-start;
.img {
width: 84px;
height: 55px;
// height: auto;
object-fit: cover;
border-radius: 3px;
.check_box {
margin-left: 8px;
}
}
.content {
justify-content: flex-start;
.img {
width: 50%;
height: 70px;
border-radius: 3px;
.check_box {
margin-left: 8px;
.title,
.date {
font-size: 11px;
font-weight: bolder;
text-align: left;
color: #323233;
line-height: 16px;
}
}
.tag_box {
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: flex-start;
.tag_item {
min-width: 31px;
min-height: 14px;
font-size: 10px;
padding: 1px 3px;
font-weight: bolder;
text-align: left;
// color: #507afd;
line-height: 14px;
letter-spacing: 0.1px;
margin-right: 8px;
// opacity: 0.1;
background: #c0f7e4;
border-radius: 2px;
text-align: center;
white-space: nowrap
}
}
.content {
margin-left: 8px;
.title,
.date {
font-size: 11px;
font-weight: bolder;
text-align: left;
color: #323233;
line-height: 16px;
}
}
.bottom {
.tag_box {
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: flex-end;
div {
cursor: pointer;
}
.resovle_action {
font-size: 12px;
font-weight: bolder;
text-align: left;
color: #507afd;
line-height: 17px;
}
.reject_action {
font-size: 12px;
justify-content: flex-start;
.tag_item {
width: 31px;
height: 14px;
font-size: 10px;
font-weight: bolder;
text-align: left;
color: #FF4E4F;
line-height: 17px;
margin-left: 15px;
// color: #507afd;
line-height: 14px;
letter-spacing: 0.1px;
margin-right: 8px;
}
}
}
.bottom {
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: flex-end;
.resovle_action {
font-size: 12px;
font-weight: bolder;
text-align: left;
color: #507afd;
line-height: 17px;
}
.reject_action {
font-size: 12px;
font-weight: bolder;
text-align: left;
color: #ff4e4f;
line-height: 17px;
margin-left: 15px;
}
}
}
}
</style>

@ -3,31 +3,26 @@ import { ref } from 'vue'
import Aside from './aside/Aside.vue'
import Content from './content/Content.vue'
import ListContent from './content/ListContent.vue'
import Robot from '@/components/Robot/index.vue'
defineOptions({
name: 'FinalMain',
})
const showList = ref(false)
const contentRef: any = ref(null)
function inputChange(keyword) {
const showList = ref(false);
const contentRef:any = ref(null);
const inputChange = (keyword)=>{
contentRef.value.filterTableData(keyword)
}
</script>
<template>
<div class="main">
<!-- 侧边 -->
<Aside @input-change="inputChange" />
<Aside @inputChange="inputChange" />
<!-- 内容 -->
<Content v-show="!showList" ref="contentRef" @change-show="showList = true" />
<Content @changeShow="showList=true" ref="contentRef" />
<!-- 任务管理 -->
<!-- TODO:本地演示即可 上传注释注释 -->
<ListContent v-show="showList" @change-show="showList = false" />
<!-- 机器人 -->
<Robot />
<!-- <ListContent /> -->
</div>
</template>

@ -101,8 +101,7 @@ onBeforeMount(async () => {
configStore.fetchCustomConfig();
});
nextTick(()=>{
configStore.$subscribe(() => {
configStore.$subscribe(() => {
const config = configStore.getConfig;
const customConfig = configStore.getCustomConfig;
if (
@ -123,7 +122,7 @@ nextTick(()=>{
let sortKeyList: any = [];
configStore.getFilterConfig.map((item: any) => {
sortKeyList.push(item?.id);
sortKeyList.push(item.id);
});
const showKeys = [...sortKeyList];
@ -173,10 +172,10 @@ nextTick(()=>{
}
// console.log("showKeys", showKeys);
const items = showKeys.reduce((acc, key) => {
const currentData = asideMap[key];
const render = currentData?.render;
const { render } = asideMap[key];
if (render !== false) {
const str = key?.toLowerCase();
const str = key.toLowerCase();
const o = {
key: str,
@ -192,7 +191,6 @@ nextTick(()=>{
configFilterRef.value = configStore.getFilterConfig;
});
})
const asideEnter = ref(false);
const showCollapse = computed(() => {
@ -209,7 +207,6 @@ const newFilterOk = () => {
filterModalRef.value.pagination.page,
filterModalRef.value.pagination.pageSize
);
filterModalRef.value.showModal();
};
// key
@ -346,7 +343,6 @@ const handleOk = (item: any) => {
width: 100%;
border-bottom: 1px solid #e8e8e8;
margin-bottom: 15px;
height: 58px;
}
&-divider {

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

@ -106,7 +106,7 @@ const handleDrop = async (e) => {
<div v-show="figureHovered" class="wrapper-figure-tools">
<SvgIcon size="28" name="view" @click="previewHandler" />
<div class="wrapper-figure-line" />
<SvgIcon size="28" name="white_delete" @click="clearHandler" />
<SvgIcon size="28" name="delete" @click="clearHandler" />
</div>
</div>
</n-upload-dragger>

@ -1,46 +0,0 @@
<script lang="ts" setup>
import { ref } from 'vue'
import { useConfig } from '@/store/modules/asideConfig'
const props = defineProps({
value: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '',
},
})
const emit = defineEmits<{
(e: 'update:value', value: boolean): void
}>()
const configStore = useConfig()
const download = ref(props.value)
function onChange(value: boolean) {
emit('update:value', value)
}
</script>
<template>
<div class="download">
<span class="download-title">{{ label }}</span>
<n-switch v-model:value="download" @update:value="onChange" />
</div>
</template>
<style lang="less" scoped>
.download {
display: flex;
padding: 10px;
justify-content: space-between;
&-title {
font-weight: bold;
}
}
</style>

@ -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,53 +1,54 @@
<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>
@ -55,14 +56,10 @@ 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"
placeholder="请选择"
>
<template #separator> </template>
<n-date-picker v-model:value="time" type="daterange" clearable @update:value="onChange">
<template #separator>
</template>
</n-date-picker>
</n-space>
</n-collapse-item>
@ -81,21 +78,5 @@ 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) {
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: "*";
position: absolute;
left: 0;
top: 2px;
color: red;
}
</style>
;
}</style>

@ -20,6 +20,6 @@ import ReportUserVue from './ReportUser.vue'
import SimilarityVue from './Similarity.vue'
import TimeVue from './Time.vue'
import IzApprovalStatus from './IzApprovalStatus.vue'
import IzShowAll from './IzShowAll.vue'
export { IzProjecttype, IzStatus, IzVisitcity, IzCustomlevel, IzCustomtype, IzCustomname, IzfirmVue, IzProductVue, IzvisitproVue, IztaskstatusVue, IztaskrromVue, IzProjectVue, PictureDownloadVue, PictureUploadVue, PlaceHolderVue, RegionVue, SimilarityVue, ReportUserVue, PlanVue, PictureTypeVue, TimeVue, IzApprovalStatus, IzShowAll }
export { IzProjecttype, IzStatus, IzVisitcity, IzCustomlevel, IzCustomtype, IzCustomname, IzfirmVue, IzProductVue, IzvisitproVue, IztaskstatusVue, IztaskrromVue, IzProjectVue, PictureDownloadVue, PictureUploadVue, PlaceHolderVue, RegionVue, SimilarityVue, ReportUserVue, PlanVue, PictureTypeVue, TimeVue, IzApprovalStatus }

@ -236,7 +236,7 @@ function onCheckChange(checked: any, item: any) {
const showIds = computed(() => {
return onList.value.map((item) => {
return item?.id
return item.id
})
})

@ -18,10 +18,6 @@ import Action from "../Action.vue";
import { deleteCondition, getConditionList, sort } from "@/api/home/filter";
import type { FilterSearchParam } from "/#/api";
import selection from "naive-ui/es/_internal/selection";
import SvgIcon from "@/components/Icon/SvgIcon.vue";
import { useModal } from "naive-ui";
const modal = useModal();
defineOptions({ name: "FilterModal" });
const $message = window["$message"];
@ -110,11 +106,6 @@ const columns: DataTableColumns<RowData> = [
title: "创建时间",
key: "createtime",
width: 180,
renderSorterIcon: ({ order }) => {
if (order === false) return h(SvgIcon, { name: "sort-2" });
if (order === "ascend") return h(SvgIcon, { name: "sort-1" });
if (order === "descend") return h(SvgIcon, { name: "sort-3" });
},
sorter: (row1, row2) => {
// tableData.value.sort(
// (a, b) => new Date(a?.createtime).getTime() - new Date(b?.createtime).getTime()
@ -206,15 +197,7 @@ function select(key: number, id: string) {
editSelection(id);
break;
case 2:
const modalInst = modal.create({
title: "确认提示",
content: "确认删除该条过滤条件吗?",
positiveText: "确定",
negativeText: "取消",
preset: "dialog",
onPositiveClick: () => deleteSelection(id),
onNegativeClick: () => modalInst.destroy(),
});
deleteSelection(id);
break;
default:
break;
@ -233,7 +216,7 @@ function editSelection(id) {
});
emit("editFilter", selectedFilter);
closeModal();
// closeModal();
}
function deleteSelection(id = "") {
@ -243,18 +226,10 @@ function deleteSelection(id = "") {
});
return;
}
const modalInst = modal.create({
title: "确认提示",
content: "确认删除所选过滤条件吗?",
positiveText: "确定",
negativeText: "取消",
preset: "dialog",
onPositiveClick: () =>
deleteCondition({ ids: selectionIds.value.join(",") }).then(() => {
selectionIds.value = [];
query(pagination.page, pagination.pageSize);
}),
onNegativeClick: () => modalInst.destroy(),
deleteCondition({ ids: selectionIds.value.join(",") }).then(() => {
selectionIds.value = [];
query(pagination.page, pagination.pageSize);
});
}
@ -275,7 +250,7 @@ async function handlePageSizeChange(currentPageSize) {
function handleClick() {
emit("showNewFilter");
closeModal();
// show.value = false;
}
let sortTable: Sortable | null = null;
@ -358,7 +333,7 @@ const handleOk = () => {
}
if (selectionIds.value.length == 1) {
const selectedId = selectionIds.value[0];
let item = tableData.value.find((v) => v.id == selectedId);
let item = tableData.value.find(v=>v.id == selectedId);
emit("handleOk", item);
}
if (selectionIds.value.length == 0) {
@ -376,7 +351,6 @@ const handleOk = () => {
display-directive="if"
@after-leave="afterLeave"
:mask-closable="false"
class="modal_wrapper"
>
<n-card
:style="cardStyle"
@ -390,11 +364,7 @@ const handleOk = () => {
<div class="wrapper-bar">
<div class="wrapper-info">
<span
:style="{
'margin-left': '18px',
'font-size': '16px',
'font-weight': '600',
}"
:style="{ 'margin-left': '18px', 'font-size': '16px' }"
class="wrapper-info-title"
>基本信息</span
>
@ -414,7 +384,7 @@ const handleOk = () => {
<n-button type="info" @click="handleClick">
创建
<template #icon>
<SvgIcon size="14px" name="creatFilter" />
<SvgIcon size="14px" name="magnifying-1" />
</template>
</n-button>
</div>
@ -501,17 +471,6 @@ const handleOk = () => {
width: 300px;
border: 1px solid gray;
}
.msg {
span {
padding-right: 16px;
}
a {
padding-left: 17px;
cursor: pointer;
color: #507afd;
border-left: 1px solid #d8d8d8;
}
}
}
&-table {
@ -547,12 +506,6 @@ const handleOk = () => {
}
}
}
.del_btn {
margin-left: 12px;
color: #333333;
font-weight: 500;
}
::v-deep(.n-data-table .n-data-table-th) {
font-weight: bold !important;
}
@ -563,24 +516,4 @@ const handleOk = () => {
background-color: #fff;
border: 1px solid #cad2dd !important;
}
::v-deep(.n-button--info-type) {
background: #507afd !important;
}
::v-deep(.n-data-table
.n-data-table-th
.n-data-table-th__title-wrapper
.n-data-table-th__title) {
font-size: 14px !important;
color: #000000 !important;
}
::v-deep(.n-data-table
.n-data-table-tr:not(.n-data-table-tr--summary):hover
> .n-data-table-td) {
color: #666666 !important;
font-size: 14px !important;
}
::v-deep(.n-data-table .n-data-table-th .n-data-table-sorter) {
position: relative;
left: -80px;
}
</style>

@ -1,106 +1,107 @@
<script lang="ts" setup>
import type { FormInst, FormItemRule, FormRules } from "naive-ui";
import { computed, defineOptions, onBeforeMount, reactive, ref, unref, watch } from "vue";
import { asideMap } from "@/config/aside";
import { useDictionary } from "@/store/modules/dictonary";
import { useConfig } from "@/store/modules/asideConfig";
import type { FilterCondition } from "/#/api";
import { addCondition, updateCondition } from "@/api/home/filter";
import { formatToDate2, formatToDate3 } from "@/utils/dateUtil";
type Status = "edit" | "new";
const emit = defineEmits(["onOk"]);
const show = ref(false);
const configStore = useConfig();
const dicStore = useDictionary();
const currentStatus = ref<Status>("new");
let currentEditId: string | null = null;
import type { FormInst, FormItemRule, FormRules } from 'naive-ui'
import { computed, defineOptions, onBeforeMount, reactive, ref, unref, watch } from 'vue'
import { asideMap } from '@/config/aside'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
import type { FilterCondition } from '/#/api'
import { addCondition, updateCondition } from '@/api/home/filter'
import { formatToDate2, formatToDate3 } from '@/utils/dateUtil'
type Status = 'edit' | 'new'
const emit = defineEmits(['onOk'])
const show = ref(false)
const configStore = useConfig()
const dicStore = useDictionary()
const currentStatus = ref<Status>('new')
let currentEditId: string | null = null
const modalTitle = computed(() => {
return currentStatus.value === "new" ? "新建过滤条件" : "编辑过滤条件";
});
return currentStatus.value === 'new' ? '新建过滤条件' : '编辑过滤条件'
})
const cardStyle = {
width: "800px",
"--n-padding-bottom": "10px",
"--n-padding-left": "10px",
};
'width': '800px',
'--n-padding-bottom': '10px',
'--n-padding-left': '10px',
}
const noBorderInput = {
"--n-border": "0px",
"--n-border-hover": "0px",
"--n-border-pressed": "0px",
};
'--n-border': '0px',
'--n-border-hover': '0px',
'--n-border-pressed': '0px',
}
const formItemStyle = {
"--n-label-height": "0px",
"--n-feedback-height": "8px",
};
'--n-label-height': '0px',
'--n-feedback-height': '8px',
}
interface FormType {
name: string | null;
logic: string | null;
conditions: Condition[];
name: string | null
logic: string | null
conditions: Condition[]
}
interface Condition {
type: string | null;
operator: string | null;
result: any;
type: string | null
operator: string | null
result: any
}
interface Option {
label: string;
value: string;
label: string
value: string
}
const rules: FormRules = {
name: {
required: true,
message: "请输入过滤条件名称",
trigger: "blur",
message: '请输入过滤条件名称',
trigger: 'blur',
},
logic: {
required: true,
message: "请选择逻辑关系",
trigger: "blur",
message: '请选择逻辑关系',
trigger: 'blur',
},
conditions: {
required: true,
validator(rule: FormItemRule, value: Condition[]) {
for (const item of value) {
const { type, operator, result } = item;
const { type, operator, result } = item
if (type === null || operator === null || result === null)
return new Error("请选择过滤条件");
return new Error('请选择过滤条件')
}
return true;
return true
},
trigger: ["input", "blur"],
trigger: ['input', 'blur'],
},
};
}
const formRef = ref<FormInst | null>(null);
const formRef = ref<FormInst | null>(null)
const formValue = reactive<FormType>({
name: null,
logic: "and",
logic: 'and',
conditions: [
{
type: null,
operator: "eq",
operator: 'eq',
result: null,
},
],
});
})
function handleSumbit(e: MouseEvent) {
e.preventDefault();
e.preventDefault()
formRef.value?.validate((errors) => {
if (errors) return;
if (errors)
return
const list = formValue.conditions.map((item, index) => {
const { type, operator, result } = item;
const { type, operator, result } = item
return {
searchfield: type!,
@ -108,149 +109,151 @@ function handleSumbit(e: MouseEvent) {
searchvalue: formatValue(type!, result),
searchRelationType: formValue.logic!,
orderNum: index + 1,
};
});
}
})
const param: FilterCondition = {
searchname: formValue.name!,
type: 0,
ocrUsersearchchildList: list,
};
}
if (currentStatus.value === "new") addCondition(param);
else updateCondition({ id: currentEditId!, ...param });
closeModal();
});
if (currentStatus.value === 'new')
addCondition(param)
else updateCondition({ id: currentEditId!, ...param })
emit('onOk')
setTimeout(() => {
closeModal()
}, 300)
})
}
//
function formatValue(searchfield: string, searchvalue: any) {
if (searchfield === "izyear") {
const start = formatToDate2(searchvalue[0]);
const end = formatToDate2(searchvalue[1]);
return `${start}-${end}`;
if (searchfield === 'izyear') {
const start = formatToDate2(searchvalue[0])
const end = formatToDate2(searchvalue[1])
return `${start}-${end}`
}
if (searchfield === "izsimilarity" && Array.isArray(searchvalue))
return searchvalue.join(",");
if (searchfield === 'izsimilarity' && Array.isArray(searchvalue))
return searchvalue.join(',')
return searchvalue;
return searchvalue
}
//
function unformatValue(searchfield: string, searchvalue: any) {
// 2022/01/03-2023/02/04
if (searchfield === "izyear") {
const dataStrs = searchvalue.split("-");
const start = formatToDate3(dataStrs[0]);
const end = formatToDate3(dataStrs[1]);
return [start, end];
if (searchfield === 'izyear') {
const dataStrs = searchvalue.split('-')
const start = formatToDate3(dataStrs[0])
const end = formatToDate3(dataStrs[1])
return [start, end]
}
// 80,90
// if (searchfield === "izsimilarity") return searchvalue.split(",");
return searchvalue;
return searchvalue
}
function createCondition() {
formValue.conditions.push({
type: null,
operator: "eq",
operator: 'eq',
result: null,
});
})
}
function removeCondition(index: number) {
formValue.conditions.splice(index, 1);
formValue.conditions.splice(index, 1)
}
function formLabel(index: number) {
return index === 0 ? "筛选条件" : "";
return index === 0 ? '筛选条件' : ''
}
const typeOptions = ref<Option[]>([]);
const typeOptions = ref<Option[]>([])
const operatorOptions = [
{
label: "等于",
value: "eq",
label: '等于',
value: 'eq',
},
{
label: "不等于",
value: "notEq",
label: '不等于',
value: 'notEq',
},
];
]
const logicOptions = ref([]);
const logicOptions = ref([])
const similarityOptions = [
{
label: "80%-90%",
value: "80,90",
value: '80,90',
},
{
label: "95%-100%",
value: "95,100",
value: '95,100',
},
{
label: "100%-100%",
value: "100,100",
value: '100,100',
},
];
]
onBeforeMount(() => {
dicStore.fetchRelationTypeList();
});
dicStore.fetchRelationTypeList()
})
watch(
() => dicStore.relationTypeList,
(newval) => {
logicOptions.value = newval;
}
);
logicOptions.value = newval
},
)
function showModal() {
const list = generateAllData(configStore.systemConfig);
typeOptions.value = list;
show.value = true;
const list = generateAllData(configStore.systemConfig)
typeOptions.value = list
show.value = true
}
function closeModal() {
emit("onOk");
setTimeout(() => {
show.value = false;
}, 300);
show.value = false
}
function generateAllData(config): Option[] {
const initVal: Option[] = [];
const initVal: Option[] = []
const list = Object.keys(config).reduce((acc, value) => {
if (value.startsWith("iz") && asideMap[value]?.inFilterList !== false) {
const name = asideMap[value]?.label;
name &&
acc.push({
value,
label: name || "未配置",
});
if (value.startsWith('iz') && asideMap[value]?.inFilterList !== false) {
const name = asideMap[value]?.label
name
&& acc.push({
value,
label: name || '未配置',
})
}
return acc;
}, initVal);
return acc
}, initVal)
return list;
return list
}
watch(
() => configStore.systemConfig,
(newVal) => {
if (!newVal) return;
if (!newVal)
return
const list = generateAllData(newVal);
typeOptions.value = list;
}
);
const list = generateAllData(newVal)
typeOptions.value = list
},
)
function getOptions(key: string) {
if (key === "izsimilarity") return similarityOptions;
@ -260,22 +263,22 @@ function getOptions(key: string) {
}
function leaveHandler() {
currentStatus.value = "new";
currentEditId = null;
currentStatus.value = 'new'
currentEditId = null
formValue.name = null;
formValue.name = null
formValue.conditions = [
{
type: null,
operator: "eq",
operator: 'eq',
result: null,
},
];
]
}
function edit(editFilter: any) {
currentStatus.value = "edit";
console.log(editFilter, "editFilter");
console.log(editFilter,'editFilter')
const { searchname, ocrUsersearchchildList, id } = editFilter;
currentEditId = id;
formValue.name = searchname;
@ -284,24 +287,18 @@ function edit(editFilter: any) {
type: item.searchfield,
operator: item.searchtype,
result: unformatValue(item.searchfield, item.searchvalue),
};
});
}
})
}
defineExpose({
showModal,
edit,
});
})
</script>
<template>
<n-modal
v-model:show="show"
transform-origin="center"
@after-leave="leaveHandler"
:mask-closable="false"
class="modal_wrapper"
>
<n-modal v-model:show="show" transform-origin="center" @after-leave="leaveHandler" :mask-closable="false">
<n-card
:style="cardStyle"
:bordered="false"
@ -313,26 +310,18 @@ defineExpose({
<span class="wrapper-title">{{ modalTitle }}</span>
<div class="wrapper-bar">
<div class="wrapper-info">
<span
:style="{
'margin-left': '18px',
'font-size': '16px',
'font-weight': '600',
}"
>基本信息</span
>
<span :style="{ 'margin-left': '18px' }">基本信息</span>
</div>
</div>
<div class="wrapper-form">
<n-form ref="formRef" :model="formValue" :rules="rules" >
<n-form-item path="name" label="标题" mergedRequireMarkPlacement="left">
<n-form ref="formRef" :model="formValue" :rules="rules">
<n-form-item path="name" label="标题">
<!-- j -->
<n-input
v-model:value="formValue.name"
:style="{ width: '780px' }"
maxlength="15"
@keydown.enter.prevent
placeholder="请输入过滤名称"
/>
</n-form-item>
<n-form-item v-show="false" path="logic" label="逻辑关系">
@ -388,71 +377,33 @@ defineExpose({
<template #icon>
<!-- <SvgIcon size="24" name="close" color="#F00"/>
-->
<svg
width="24px"
height="24px"
viewBox="0 0 64 64"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>清除</title>
<g
id="页面-1"
stroke="none"
stroke-width="1"
fill="none"
fill-rule="evenodd"
>
<g
id="PrevailCloud-Design-图标集"
transform="translate(-3040.000000, -3118.000000)"
fill-rule="nonzero"
>
<g id="清除" transform="translate(3040.000000, 3118.000000)">
<rect
id="矩形"
fill="#000000"
opacity="0"
x="0"
y="0"
width="64"
height="64"
></rect>
<path
d="M32,4 C16.5619675,4 4,16.5600322 4,32 C4,47.4399678 16.5600322,60 32,60 C47.4380325,60 60,47.4399678 60,32 C60,16.5600322 47.4399678,4 32,4 Z M43.4220132,40.6240021 C44.2020159,41.4079827 44.1999731,42.6720064 43.4180353,43.4520091 C43.0280877,43.8400215 42.5180487,44.0360166 42.0060745,44.0360166 C41.4920576,44.0360166 40.9800834,43.8400214 40.5900283,43.4480311 L31.9900014,34.8219862 L23.3620213,43.3580432 C22.9720737,43.7420776 22.4639699,43.9360301 21.9559737,43.9360301 C21.4400215,43.9360301 20.9260046,43.7379922 20.5340143,43.3420239 C19.7579895,42.5560005 19.7640102,41.2919768 20.5500336,40.5140169 L29.1680151,31.9900013 L20.5819648,23.3759978 C19.8019621,22.5939524 19.8040049,21.3279935 20.5859428,20.5479908 C21.3679882,19.7659454 22.6319043,19.7700309 23.4139498,20.5519687 L32.0119339,29.1759709 L40.639914,20.6400214 C41.4238946,19.8620614 42.6918962,19.8700173 43.467921,20.6560407 C44.2458809,21.4420641 44.2379251,22.708023 43.4519016,23.4840477 L34.8340277,32.0079559 L43.4220132,40.6240021 Z"
id="形状"
fill="#DDDDDD"
></path>
</g>
</g>
</g>
</svg>
<svg width="24px" height="24px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>清除</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="PrevailCloud-Design-图标集" transform="translate(-3040.000000, -3118.000000)" fill-rule="nonzero">
<g id="清除" transform="translate(3040.000000, 3118.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="64" height="64"></rect>
<path d="M32,4 C16.5619675,4 4,16.5600322 4,32 C4,47.4399678 16.5600322,60 32,60 C47.4380325,60 60,47.4399678 60,32 C60,16.5600322 47.4399678,4 32,4 Z M43.4220132,40.6240021 C44.2020159,41.4079827 44.1999731,42.6720064 43.4180353,43.4520091 C43.0280877,43.8400215 42.5180487,44.0360166 42.0060745,44.0360166 C41.4920576,44.0360166 40.9800834,43.8400214 40.5900283,43.4480311 L31.9900014,34.8219862 L23.3620213,43.3580432 C22.9720737,43.7420776 22.4639699,43.9360301 21.9559737,43.9360301 C21.4400215,43.9360301 20.9260046,43.7379922 20.5340143,43.3420239 C19.7579895,42.5560005 19.7640102,41.2919768 20.5500336,40.5140169 L29.1680151,31.9900013 L20.5819648,23.3759978 C19.8019621,22.5939524 19.8040049,21.3279935 20.5859428,20.5479908 C21.3679882,19.7659454 22.6319043,19.7700309 23.4139498,20.5519687 L32.0119339,29.1759709 L40.639914,20.6400214 C41.4238946,19.8620614 42.6918962,19.8700173 43.467921,20.6560407 C44.2458809,21.4420641 44.2379251,22.708023 43.4519016,23.4840477 L34.8340277,32.0079559 L43.4220132,40.6240021 Z" id="形状" fill="#DDDDDD"></path>
</g>
</g>
</g>
</svg>
</template>
</n-button>
</n-form-item>
</n-form>
</div>
<div class="wrapper-new" @click="createCondition">
<span style="font-size:16px;">+</span>
<span>+</span>
<span style="margin-left: 8px">添加筛选条件</span>
</div>
</div>
<template #footer>
<div class="wrapper-footer">
<n-button style="background-color: #507afd" type="info" @click="handleSumbit">
<n-button style="background-color: #507AFD;" type="info" @click="handleSumbit">
确定
</n-button>
<n-button
secondary
style="
margin-left: 15px;
background-color: #ffffff;
border: 1px solid #cad2dd;
color: #333333;
"
@click="closeModal"
>
<n-button secondary style="margin-left: 15px;background-color: #ffffff;border: 1px solid #cad2dd;color: #333333;" @click="closeModal">
取消
</n-button>
</div>
@ -468,22 +419,19 @@ defineExpose({
&-title {
font-weight: bold;
font-size: 18px;
color: #333333;
font-size: 16px;
}
&-bar {
background-color: #e8e8e8;
width: 100%;
margin-top: 27px;
font-size: 16px;
color: #333333;
margin-top: 20px;
}
&-form {
display: flex;
justify-content: space-between;
margin-top: 24px;
margin-top: 20px;
}
&-new {
@ -492,9 +440,7 @@ defineExpose({
color: #507afd;
line-height: 22px;
cursor: pointer;
span{
font-size: 11px;
}
&:hover {
color: #507aac;
}
@ -507,13 +453,11 @@ defineExpose({
&-footer {
display: flex;
justify-content: flex-end;
margin-bottom:6px;
}
&-info {
font-weight: bold;
position: relative;
background: #f8f8f8;
&:before {
background-color: #1980ff;
@ -530,21 +474,7 @@ defineExpose({
// ::v-deep(.n-input .n-input-wrapper) {
// padding-left: 0;
// }
::v-deep(.n-input__suffix) {
::v-deep(.n-input__suffix){
margin-right: -8px;
}
.modal_wrapper {
width: 808px !important;
height: 432px !important;
}
::v-deep(.n-card__content) {
}
.modal_wrapper {
padding: 14px 14px 0 14px !important;
}
::v-deep(.n-form-item .n-form-item-label){
font-size:14px;
color: #666666;
font-weight: 500;
}
</style>

@ -46,8 +46,6 @@ import PackageSettingsModal from "./modal/PackageSettingsModal.vue";
import QueryRepeatedTasksModal from "./modal/QueryRepeatedTasksModal.vue";
import type { PictureSortParam } from "/#/api";
import defaultAvatar from "@/assets/icons/avatar.svg";
import baseImg from "@/assets/images/baseImg.png";
import axios from "axios";
const deviceHeight = ref(600);
let _masonry: null | Masonry = null;
@ -188,13 +186,12 @@ watch(
const listData = ref<any[]>([]);
async function featchList(userSearchId?: string) {
async function featchList() {
loading.value = true;
try {
const contentParams = {
search_month: timeRange.value,
search_history: 0,
userSearchId,
};
pagination.pageNo += 1;
@ -248,7 +245,6 @@ async function featchList(userSearchId?: string) {
uphead: item.uphead,
similar: item.similarityscore || -1,
imgName: item.imgname,
loadOver: false,
};
});
@ -287,8 +283,8 @@ const gridHeight = computed(() => {
async function oneCheck() {
const asideVal = cloneDeep(configStore.getAsideValue);
asideVal.upUserName = searchValue.value;
console.log("searchValue", asideVal, searchValue.value);
console.log('searchValue', asideVal, searchValue.value)
if (asideVal.izyear && asideVal.izyear.length == 2) {
asideVal.izyear =
dayjs(asideVal.izyear[0]).format("YYYY/MM/DD") +
@ -378,7 +374,7 @@ async function tasksLoadingCloseCallback() {
async function showLoginSuccessModal() {
const modal = LoginSuccessModalRef.value as any;
modal.showModal();
// modal.showModal()
}
// id
@ -411,11 +407,6 @@ async function commitHandler(settingParam) {
onMounted(() => {
emitter.on("filter", refreshHandler);
// emitter.on("filter", (searchId)=>{
// console.log("emitter on filter" + searchId)
// reset();
// featchList(searchId);
// });
//
getLastCheckNo().then((res) => {
if (res.code === "OK") {
@ -528,8 +519,7 @@ function previewHandler(index: number, event: MouseEvent) {
event.stopImmediatePropagation();
event.stopPropagation();
if (imageRef.value?.[index] && (imageRef.value[index] as any).src)
// (imageRef.value?.[index] as any).mergedOnClick();
(imageRef.value?.[index] as any).click();
(imageRef.value?.[index] as any).mergedOnClick();
}
const timer = ref();
@ -616,15 +606,6 @@ const dropdownOptions = ref([
icon: renderIcon(EyeOutlineIcon),
},
]);
const loadImgOver = (item) => {
console.log("loadImgOver", item);
setTimeout(() => (item.loadOver = true), 2000);
};
defineExpose({
showLoginSuccessModal,
});
</script>
<template>
@ -632,7 +613,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">AI一键查重</span>
</div>
<div class="flex-btn-icon">
<SvgIcon
@ -720,19 +701,8 @@ defineExpose({
:src="item.thumburl"
ref="imageRef"
/>
<!-- @load="loadImgOver(item)" -->
<!-- <n-image
class="img"
:class="{
'img-fit': viewMode === 'horizontalVersion',
'img-full': viewMode === '3:4' || viewMode === 'verticalVersion',
}"
:src="baseImg"
v-show="!item.loadOver"
/> -->
<div class="percent" v-if="item.similar != -1">
<SvgIcon size="42" :name="item.similar == 100 ? 'error_tag' : 'tag'" />
<SvgIcon size="42" name="tag" />
<div class="val">
{{ `${item.similar}%` }}
</div>
@ -809,7 +779,7 @@ defineExpose({
justify-content: space-between;
align-items: center;
background: #fff;
padding: 0px 16px 0px 15px;
padding: 0px 15px 0px 15px;
box-sizing: border-box;
height: 64px;
border: 1px solid rgb(239, 239, 245);
@ -826,10 +796,7 @@ defineExpose({
font-weight: bold;
color: #333333;
line-height: 25px;
width: 89px;
height: 25px;
white-space: nowrap;
// margin-left: 12px;
margin-left: 12px;
}
}

@ -1,120 +1,73 @@
<script lang="ts" setup>
import { defineOptions, onMounted, ref, onBeforeUnmount } from "vue";
import { useRouter } from "vue-router";
import { defineOptions, onMounted, ref, onBeforeUnmount } from 'vue';
import { useRouter } from 'vue-router';
defineOptions({ name: 'ShortcutModal' })
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;
width: 360px;
height: 157px;
"
>
<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;" >
<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="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"
/>
<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;"/>
</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>
@ -127,22 +80,19 @@ 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-weight: 500;
font-size: 16px
}
.msg {

@ -1,6 +1,6 @@
<script lang="ts" setup>
import { onMounted, ref } from "vue";
import { getToolsCount } from "@/api/home/main";
import {getToolsCount } from '@/api/home/main'
const emit = defineEmits<{
(e: "reject", params: any);
@ -10,16 +10,16 @@ const emit = defineEmits<{
const show = ref(false);
const toolsData = ref({} as any);
async function getData() {
const res = await getToolsCount();
toolsData.value = res.data || {};
if (res.code == "OK") {
async function getData(){
const res=await getToolsCount();
toolsData.value=res.data || {};
if(res.code == 'OK'){
showModal();
}
}
onMounted(() => {
getData();
});
onMounted(()=>{
getData()
})
function showModal() {
show.value = true;
@ -40,6 +40,8 @@ async function viewRepeat(e: MouseEvent) {
closeModal();
}
defineExpose({
showModal,
});
@ -53,38 +55,32 @@ defineExpose({
<div class="wrapper-mark">某某有限公司-某某事业部-张小凡</div>
</div>
<div class="wrapper-content">
<div class="flex_box">
<div class="flex_box" style="height: 100px">
<div class="item">
<SvgIcon name="task_count" width="49" height="58" />
<SvgIcon name="task_count" width="80" height="96" />
<div class="num_box">{{ toolsData?.total || 0 }}</div>
<div class="title_box">任务总数</div>
</div>
<div class="item">
<SvgIcon name="task_wait" width="49" height="58" />
<SvgIcon name="task_wait" width="80" height="96" />
<div class="num_box">{{ toolsData?.treat || 0 }}</div>
<div class="title_box">待审批</div>
</div>
<div class="item">
<SvgIcon name="task_over" width="49" height="58" />
<SvgIcon name="task_over" width="80" height="96" />
<div class="num_box">{{ toolsData?.approvedCount || 0 }}</div>
<div class="title_box">已审批</div>
</div>
<div class="item">
<SvgIcon name="modal_reImg" width="49" height="58" />
<div class="num_box">{{ 83 }}</div>
<div class="title_box">重复图片</div>
</div>
</div>
<div class="footer" @click="viewRepeat"></div>
<!-- <div class="footer">
<div class="footer">
<SvgIcon
@click="viewRepeat"
style="cursor: pointer"
name="login_r"
width="167"
height="60"
width="200"
height="70"
/>
</div> -->
</div>
</div>
</div>
</n-modal>
@ -95,63 +91,60 @@ defineExpose({
background-image: url(../../../../assets/images/approval_modal_bg.png);
background-repeat: no-repeat;
background-size: 100%;
width: 510px;
height: 361px;
width: 700px;
height: 500px;
box-shadow: none !important;
margin-left: 30px !important;
}
.wrapper {
position: absolute;
left: calc(50% - 286px);
left: calc(50% - 350px);
.wrapper-hearder {
margin-top: 80px;
margin-left: 18px;
margin-top: 110px;
.wrapper-title {
text-align: center;
font-size: 16px;
font-family: PingFang SC, PingFang SC-Semibold;
font-weight: 600;
font-weight: Semibold;
text-align: center;
color: #333333;
line-height: 22px;
line-height: 32px;
}
.wrapper-mark {
text-align: center;
font-size: 13px;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC-Regular;
font-weight: 400;
font-weight: Regular;
text-align: center;
color: #666666;
line-height: 18px;
margin-top: 8px;
}
}
.wrapper-content {
flex: 1;
border-radius: 8px;
margin: 24px 50px 16px 48px;
margin: 100px 60px 35px 120px;
.flex_box {
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: space-between;
margin: 58.5px 0 0 20px;
.item {
.num_box {
font-size: 20px;
font-size: 32px;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC-Bold;
font-weight: bold;
text-align: center;
font-weight: Bold;
text-align: left;
color: #202020;
line-height: 23px;
text-align: center;
}
.title_box {
opacity: 0.6;
font-size: 12px;
font-size: 16px;
font-family: PingFang SC, PingFang SC-Regular;
font-weight: Regular;
text-align: center;
color: #202020;
line-height: 16px;
text-align: center;
}
}
}
@ -200,40 +193,14 @@ defineExpose({
}
}
.footer {
width: 153px;
height: 46px;
background: linear-gradient(135deg, #3258e8, #786efc);
border: 1px solid;
border-image: linear-gradient(123deg, #d7dffe 2%, #d7d5ff 88%) 1 1;
border-radius: 24px;
box-shadow: 0px 2px 6px 0px rgba(116, 153, 253, 0.3);
cursor: pointer;
margin: 20px auto 0;
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: center;
margin: 20px 30px 0 0;
position: relative;
bottom: -30px;
left: 20px;
font-size: 20px;
font-weight: 400;
font-family: YouSheBiaoTiHei, YouSheBiaoTiHei-Regular;
text-align: center;
color: #ffffff;
line-height: 46px;
border: none;
font-style: italic;
bottom: -80px;
}
// .footer {
// display: flex;
// flex-flow: row nowrap;
// align-items: center;
// justify-content: center;
// margin: 20px 30px 0 0;
// position: relative;
// bottom: -30px;
// left: 20px;
// }
}
}
</style>

@ -77,11 +77,10 @@ function afterLeave() {
<span class="wrapper-title">生成任务包设置</span>
<div class="wrapper-bar">
<div class="wrapper-info">
<span :style="{ 'margin-left': '18px', 'font-size': '16px','font-weight':'600' }">基本信息</span>
<span :style="{ 'margin-left': '18px' }">基本信息</span>
</div>
</div>
<!-- require-mark-placement="left" -->
<n-form ref="formRef" :model="model" style="margin-top: 8px;" :rules="rules">
<n-form ref="formRef" :model="model" require-mark-placement="left" style="margin-top: 8px;" :rules="rules">
<n-form-item class="wrapper-task-package-name" path="packagename" label="任务包名称">
<n-input v-model:value="model.packagename" maxlength="12" @keydown.enter.prevent />
</n-form-item>
@ -110,20 +109,17 @@ function afterLeave() {
.wrapper {
display: flex;
flex-direction: column;
padding: 14px 14px 0 14px ;
&-title {
font-weight: 600;
// font-weight: bold;
font-size: 18px;
font-weight: bold;
font-size: 16px;
color: #333;
}
&-bar {
background-color: #f8f8f8;
width: 100%;
margin-top: 24px;
font-size: 16px;
margin-bottom: 16px;
margin-top: 20px;
span {
color: #333;
}
@ -138,8 +134,6 @@ function afterLeave() {
&-task-package-name {
::v-deep(.n-form-item-label) {
color: #666;
font-weight: 500;
margin-bottom: 8px;
}
}
@ -162,11 +156,6 @@ function afterLeave() {
&-footer {
display: flex;
justify-content: flex-end;
padding-bottom:6px ;
button{
font-size: 14px !important;
font-weight: 500 !important;
}
}
&-info {
@ -184,8 +173,4 @@ function afterLeave() {
}
}
}
::v-deep(.n-button--info-type){
}
</style>

@ -1,72 +1,63 @@
<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: 15.7px; top: 6px; cursor: pointer"
/>
<svg-icon size="15" name="close" @click="closeModal" style="position:absolute; right:6px;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>
@ -80,4 +71,5 @@ configStore.$subscribe(() => {
justify-content: center;
align-items: center;
}
</style>

@ -1,14 +1,6 @@
<script lang="ts" setup>
import Aside from './aside/Aside.vue'
import Content from './content/Content.vue'
import Robot from '@/components/Robot/index.vue'
import {ref} from 'vue';
const contentRef:any = ref(null)
const showLoginModal = ()=>{
contentRef.value.showLoginSuccessModal();
}
</script>
<template>
@ -17,10 +9,7 @@ const showLoginModal = ()=>{
<Aside />
<!-- 内容 -->
<Content ref="contentRef"/>
<!-- 机器人 -->
<!-- <Robot :canClick="true" @click="showLoginModal"/> -->
<Content />
</div>
</template>

@ -1,92 +0,0 @@
<script>
import { reactive, toRefs, onMounted } from "vue";
export default {
setup() {
let state = reactive({});
let methods = {
init() {
function getQueryParamsNew() {
const params = new URLSearchParams(window.location.search);
let paramsObj = {};
for (const [key, value] of params.entries()) {
if (paramsObj.hasOwnProperty(key)) {
if (Array.isArray(paramsObj[key])) {
paramsObj[key].push(value);
} else {
paramsObj[key] = [paramsObj[key], value];
}
} else {
paramsObj[key] = value;
}
}
return paramsObj;
}
var queryParamsNew = getQueryParamsNew();
state.queryParamsNew = queryParamsNew;
const lng = queryParamsNew.lng; //
const lat = queryParamsNew.lat; //
//
const center = new qq.maps.LatLng(lat, lng);
const map = new qq.maps.Map(document.getElementById("map-container"), {
center,
zoom: 15,
});
//
const marker = new qq.maps.Marker({
position: center,
map: map,
});
//
const infoWin = new qq.maps.InfoWindow({
map: map,
position: center,
});
infoWin.setContent(
`<div class="detailshow" >${queryParamsNew.name}</div>`
);
infoWin.open();
qq.maps.event.addListener(marker, "click", function () {
infoWin.open();
infoWin.setContent(
`<div class="detailshow" >${queryParamsNew.name}</div>`
);
infoWin.setPosition(centerLatLng);
});
},
};
onMounted(() => {
methods.init();
});
return {
...toRefs(state),
...methods,
};
},
components: {},
};
</script>
<template>
<div class="mapmain">
<div id="map-container" style="width: 100%; height: 100%"></div>
</div>
</template>
<style >
.layout-sider {
display: none;
}
.layout-main-header {
display: none;
}
.mapmain {
height: 100%;
width: 100%;
}
.detailshow {
width: 100%;
}
</style>

@ -1,32 +1,32 @@
<script lang="ts" setup>
import { computed, reactive, ref, toRefs } from "vue";
import { format } from "date-fns";
import { useRoute, useRouter } from "vue-router";
import { getMessageList, readAllMsg, readMsg } from "@/api/message/message";
import iconApproveActive from "@/assets/images/message/approve-active.png";
import iconApprove from "@/assets/images/message/approve.png";
import iconSystemActive from "@/assets/images/message/system-active.png";
import iconSystem from "@/assets/images/message/system.png";
import iconArrowActive from "@/assets/images/message/arrow-active.png";
import iconArrow from "@/assets/images/message/arrow.png";
import iconClear from "@/assets/images/message/clear.png";
import iconArrowDown from "@/assets/images/message/arrow-down.png";
const emit = defineEmits(["goDetail"]);
const router = useRouter();
const route = useRoute();
const hasNextPage = ref(false);
import { reactive, ref, toRefs } from 'vue'
import { format } from 'date-fns'
import { useRoute, useRouter } from 'vue-router'
import { getMessageList, readAllMsg, readMsg } from '@/api/message/message'
import iconApproveActive from '@/assets/images/message/approve-active.png'
import iconApprove from '@/assets/images/message/approve.png'
import iconSystemActive from '@/assets/images/message/system-active.png'
import iconSystem from '@/assets/images/message/system.png'
import iconArrowActive from '@/assets/images/message/arrow-active.png'
import iconArrow from '@/assets/images/message/arrow.png'
import iconClear from '@/assets/images/message/clear.png'
import iconArrowDown from '@/assets/images/message/arrow-down.png'
const emit = defineEmits(['goDetail'])
const router = useRouter()
const route = useRoute()
const hasNextPage = ref(false)
const state = reactive({
tabList: [
{
name: "审批通知",
name: '审批通知',
icon: iconApprove,
activeIcon: iconApproveActive,
value: 1,
},
{
name: "系统消息",
name: '系统消息',
icon: iconSystem,
activeIcon: iconSystemActive,
value: 2,
@ -34,107 +34,105 @@ const state = reactive({
],
list: [] as any,
pageNo: 1,
});
})
const { list, tabList } = toRefs(state);
const { list, tabList } = toRefs(state)
const tab = ref(1);
const tab = ref(1)
const getStateText = computed(() => {
return (value) => (value == 1 ? "待审批" : value == 2 ? "通过" : "不通过");
});
async function getList(type = "") {
async function getList(type = '') {
let res = await getMessageList({
pageNo: state.pageNo,
pageSize: "7",
pageSize: '7',
msgCategory: tab.value,
});
console.log("getMessageList", res.data);
if (type == "more") {
})
if (type == 'more') {
while (res.data.endRow > 0) {
if (res.code == "OK") {
if (res.code == 'OK') {
if (tab.value === 1) {
res.data.list.forEach((item) => {
item.tag = JSON.parse(item.busJson);
});
item.tag = JSON.parse(item.busJson)
})
}
state.list = state.list.concat(res.data.list);
state.pageNo++;
state.list = state.list.concat(res.data.list)
state.pageNo++
res = await getMessageList({
pageNo: state.pageNo,
pageSize: "7",
pageSize: '7',
msgCategory: tab.value,
});
})
}
}
hasNextPage.value = res.data.hasNextPage;
} else {
if (res.code === "OK") {
hasNextPage.value = res.data.hasNextPage;
hasNextPage.value = res.data.hasNextPage
}
else {
if (res.code === 'OK') {
hasNextPage.value = res.data.hasNextPage
if (tab.value === 1) {
res.data.list.forEach((item) => {
item.tag = JSON.parse(item.busJson);
});
item.tag = JSON.parse(item.busJson)
})
}
state.list = state.list.concat(res.data.list);
state.list = state.list.concat(res.data.list)
}
}
}
getList();
getList()
async function clearMsg() {
const res = await readAllMsg({ msgCategory: tab.value });
if (res.code === "OK") {
state.list = [];
state.pageNo = 1;
getList();
const res = await readAllMsg({ msgCategory: tab.value })
if (res.code === 'OK') {
state.list = []
state.pageNo = 1
getList()
}
}
function switchTab(type: number) {
tab.value = type;
state.list = [];
state.pageNo = 1;
getList();
tab.value = type
state.list = []
state.pageNo = 1
getList()
}
function goFinalDetail(row) {
console.log(row);
console.log(row)
router.push({
name: "final-detail",
name: 'final-detail',
query: { id: row.tag.fromId, packageid: row.packageid },
});
})
}
function goDetail(item) {
if (tab.value === 1) {
clearMsgOne(item.id);
goFinalDetail(item);
clearMsgOne(item.id)
goFinalDetail(item)
}
// emit('goDetail', item.id)
else {
router.push({ name: "message-detail", query: { id: item.id } });
router.push({ name: 'message-detail', query: { id: item.id } })
}
}
async function clearMsgOne(id) {
const res = await readMsg({ msgid: id });
const res = await readMsg({ msgid: id })
}
function getMore() {
state.pageNo += 1;
getList("more");
state.pageNo += 1
getList('more')
}
</script>
<template>
<div class="wrapper-message">
<div class="flex justify-between header">
<div class="header-title">消息通知</div>
<div class="header-title">
消息通知
</div>
<div class="clear" @click="clearMsg">
<img class="icon-clear" :src="iconClear" alt="" />
<img class="icon-clear" :src="iconClear" alt="">
清除未读
</div>
</div>
@ -152,7 +150,7 @@ function getMore() {
class="icon"
:src="tab === item.value ? item.activeIcon : item.icon"
alt=""
/>
>
<div :class="{ 'text-active': tab === item.value }" class="text">
{{ item.name }}
</div>
@ -161,7 +159,7 @@ function getMore() {
class="icon-arrow"
:src="tab === item.value ? iconArrowActive : iconArrow"
alt=""
/>
>
<div v-if="tab === item.value" class="line" />
</div>
</div>
@ -169,7 +167,7 @@ function getMore() {
<div
v-for="(item, index) in list"
:key="item.id"
:class="{ pt0: index === 0, 'item-disabled': item.readFlag }"
:class="{ 'pt0': index === 0, 'item-disabled': item.readFlag }"
class="item"
@click="goDetail(item)"
>
@ -190,9 +188,11 @@ function getMore() {
{{ item.titile }}
</div>
<div v-if="tab === 1" class="status">
<div class="tag tag-blue">审批节点{{ item.tag.nodeName }}</div>
<div class="tag tag-blue">
审批节点{{ item.tag.nodeName }}
</div>
<div :class="item.tag.states === 5 ? 'tag-red' : 'tag-green'" class="tag">
审批状态{{ getStateText(item.tag.states) }}
审批状态{{ item.tag.states }}
</div>
</div>
<div v-if="tab === 1" class="subtitle">
@ -204,11 +204,13 @@ function getMore() {
<span class="time">{{ format(item.sendTime, "yyyy-MM-dd HH:mm:ss") }}</span>
</div>
</div>
<div class="look">查看</div>
<div class="look">
查看
</div>
</div>
<div v-if="hasNextPage" class="more" @click="getMore">
查看更多<img class="icon-more" :src="iconArrowDown" alt="" />
查看更多<img class="icon-more" :src="iconArrowDown" alt="">
</div>
</div>
</div>

@ -21,13 +21,11 @@ import { getAllfieldList, getfieldList } from '@/api/home/filter'
import { useTaskStore } from '@/store/modules/task'
import emitter from '@/utils/mitt'
import { useConfig } from '@/store/modules/asideConfig'
import { getConditionList } from "@/api/home/filter";
import type { FilterSearchParam } from "/#/api";
const CustomFieldModalRef = ref(null)
const collapse = ref(false)
const taskStore = useTaskStore()
const taskListRef: any = ref(null)
const AdvanceFilterRef: any = ref(null);
//
const showFieldList = ref<any[]>([])
const search = ref('')
@ -130,33 +128,8 @@ async function getshowFieldList() {
onMounted(() => {
getshowFieldList()
window.addEventListener("keydown", handleKeydown);
init()
})
async function init(){
try {
const searchParam: FilterSearchParam = {
search_searchname: { value: "", op: "like", type: "string" },
};
const result = await getConditionList(1, searchParam,2);
const { data } = result;
if(data[0]){
AdvanceFilterRef.value.setCurrentlySelectedAdvanced(data[0].searchname);
setTimeout(() => {
filterHandler(data[0].id)
}, 1000);
//filterHandler(data[0].id);
}
// pagination.pageNo += 1
} catch (error) {
return [];
} finally {
}
//currentlySelectedAdvanced.value=""
}
function handleKeydown(event) {
if (event.key === "s") setShowSearch(true)}
// key
function scrollHandler(key: string) {
const element = document.querySelector(`#${key}`)
@ -185,8 +158,7 @@ function newFilterOk() {
filterModalRef.value.query(
filterModalRef.value.pagination.page,
filterModalRef.value.pagination.pageSize,
);
filterModalRef.value.showModal();
)
}
onBeforeMount(async () => {
configStore.fetchConfig()
@ -199,16 +171,6 @@ function setAsideItemName(text) {
defineExpose({
setAsideItemName,
})
const handleOk = (item: any) => {
if (item) {
AdvanceFilterRef.value.setCurrentlySelectedAdvanced(item.searchname);
filterHandler(item.id);
} else {
AdvanceFilterRef.value.setCurrentlySelectedAdvanced("高级筛选");
filterHandler("");
}
};
</script>
<template>
@ -253,7 +215,6 @@ const handleOk = (item: any) => {
@update:search="setShowSearch(true)"
@show-custom="showModal(CustomFieldModalRef)"
@show-filter="showModal(filterModalRef)"
ref="AdvanceFilterRef"
/>
<div v-show="showSearch" class="warpper">
@ -278,10 +239,9 @@ const handleOk = (item: any) => {
<TaskList
ref="taskListRef"
:show-field-list="showFieldList"
style="height: 811px"
style="height: calc(100vh - 146px)"
class="work-sheet-list"
/>
<!-- calc(100vh - 146px) -->
<CustomFieldModal
ref="CustomFieldModalRef"
:review-type="reviewType"
@ -293,7 +253,6 @@ const handleOk = (item: any) => {
:type="2"
@edit-filter="editFilter"
@show-new-filter="showModal(newFilterModalRef)"
@handleOk="handleOk"
/>
<!-- 新增过滤 -->
<NewFilterModalVue ref="newFilterModalRef" @on-ok="newFilterOk" />
@ -315,7 +274,6 @@ const handleOk = (item: any) => {
width: 100%;
overflow: hidden;
border-bottom: 1px solid #e8e8e8;
height: 58px;
.warpper {
display: flex;

@ -1,6 +1,6 @@
<script lang="ts" setup>
import { format } from 'date-fns'
import { computed,watch ,ref} from 'vue'
import { computed } from 'vue'
defineOptions({ name: 'ListItem' })
@ -18,19 +18,9 @@ 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>

@ -4,7 +4,6 @@ import { defineProps, onMounted, onUnmounted, reactive, ref, watch } from 'vue'
import ListItem from './ListItem.vue'
import emitter from '@/utils/mitt'
import { useTaskStore } from '@/store/modules/task'
import { filter } from 'lodash'
defineProps({
showFieldList: {
@ -19,18 +18,14 @@ const el = ref<HTMLDivElement | null>(null)
const keyword = ref('')
const canloadMore = ref(true)
const isLoading = ref(false)
const searchId = ref('')
const pagination = reactive({
pageNo: 0,
pageSize: 30,
})
function selectHandler(item, index: number) {
activeId.value = item.id
console.log(activeId.value,item.id)
console.log(index)
taskStore.setActive(index,item.id)
function selectHandler(id: string, index: number) {
taskStore.setActive(index)
}
useInfiniteScroll(
@ -42,6 +37,7 @@ useInfiniteScroll(
)
async function loadMore() {
console.log(77888)
if (isLoading.value || el.value == null)
return
isLoading.value = true
@ -61,7 +57,6 @@ async function fetchList() {
const result = await taskStore.fetchApprovalList({
...pagination,
keyword: keyword.value,
userSearchId:searchId.value
})
const { data, pageCount } = result
canloadMore.value = pageCount >= pagination.pageNo
@ -76,44 +71,16 @@ 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
canloadMore.value = true
data.value.length = 0
taskStore.reset()
}
@ -131,13 +98,6 @@ async function search(word: string) {
onMounted(() => {
emitter.on('refresh', refreshHandler)
emitter.on('filter',async(id)=>{
await reset();
searchId.value = id;
data.value = await fetchList();
activeId.value = data.value[0].id
console.log(data.value)
})
})
onUnmounted(() => {
@ -162,17 +122,14 @@ 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, index)"
>
</ListItem>
@click="selectHandler(item.id, index)"
/>
</div>
</n-spin>
</template>

File diff suppressed because it is too large Load Diff

@ -74,7 +74,7 @@ defineProps({
align-items: center;
font-size: 16px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 600;
font-weight: 500;
color: #333333;
&:before {

@ -1,6 +1,5 @@
<script lang="ts" setup>
import { ref, watch } from "vue";
import * as XLSX from 'xlsx';
defineProps({
data: {
@ -12,14 +11,10 @@ defineProps({
default: () => [[]],
},
});
const emit = defineEmits(["showModal","getrowValue"]);
const emit = defineEmits(["showModal"]);
function showActionsModal() {
emit("showModal");
}
function getrowvalue(row){
emit("getrowValue",row);
}
</script>
<template>
@ -37,13 +32,13 @@ function getrowvalue(row){
<th v-if="item && item[0]">
{{ item[0].label }}
</th>
<td v-if="item && item[0]" :class="item[0].blue ? 'blue' : ''" @click="getrowvalue(item[0])">
<td v-if="item && item[0]" :class="item[0].blue ? 'blue' : ''">
{{ item[0].value }}
</td>
<th v-if="item && item.length > 1">
{{ item[1].label }}
</th>
<td v-if="item && item.length > 1" :class="item[1].blue ? 'blue' : ''" @click="getrowvalue(item[1])">
<td v-if="item && item.length > 1" :class="item[1].blue ? 'blue' : ''">
{{ item[1].value }}
</td>
</tr>

@ -1,37 +1,26 @@
<script lang="ts" setup>
import { ref } from "vue";
import Aside from "./aside/Aside.vue";
import Content from "./content/Content.vue";
import DataHeader from "@/components/DataHeader/index.vue";
import Robot from '@/components/Robot/index.vue'
import { ref } from 'vue'
import Aside from './aside/Aside.vue'
import Content from './content/Content.vue'
const asideRef: any = ref(null);
const asideRef: any = ref(null)
function setAsideItemName(text) {
asideRef.value.setAsideItemName(text);
asideRef.value.setAsideItemName(text)
}
</script>
<template>
<div style="width: 100%; ">
<div class="header">
<DataHeader />
</div>
<div class="main">
<!-- 侧边 -->
<Aside ref="asideRef" />
<div class="main">
<!-- 侧边 -->
<Aside ref="asideRef" />
<!-- 内容 -->
<Content @set-aside-item-name="setAsideItemName" />
</div>
<Robot />
<!-- 内容 -->
<Content @set-aside-item-name="setAsideItemName" />
</div>
</template>
<style lang="less" scoped>
:deep(.wrapper){
top:0
}
.main {
display: flex;
flex-direction: row;

@ -254,19 +254,8 @@ function afterLeave() {
onMounted(() => {
show.value && addListeners()
window.addEventListener("keydown", handleKeydown);
})
//
function handleKeydown(event) {
//
if (event.keyCode === 67) {
show.value=false
// batchModalRef.value.closeModal()
}
}
function showModal(value) {
taskId.value = value
refreshHandler()
@ -408,7 +397,7 @@ const gridHeight = computed(() => {
defineExpose({
showModal,
reload,closeModal
reload,
})
</script>
@ -544,6 +533,7 @@ defineExpose({
:style="{ height: gridHeight }"
class="grid-item"
>
<div>
<n-image
ref="imageRef"
class="img"
@ -577,7 +567,8 @@ defineExpose({
</div>
<div :class="{ 'percent-red': item.similarityScore === 100 }" class="percent">
{{ item.similarityScore }}<span class="percent-unit">%</span>
</div>
</div>
</div>
</div>
</div>
<!-- </n-scrollbar> -->
@ -621,9 +612,9 @@ defineExpose({
.small-mark{
width: 100%;
height: 56px;
height: 36px;
background: linear-gradient(180deg,rgba(0,0,0,0.01), rgba(0,0,0,0.44) 88%);
//border-radius: 0px 8px 8px 8px;
border-radius: 0px 8px 8px 8px;
position: absolute;
left: 0;
bottom: 0;

@ -1,369 +1,365 @@
<script lang="ts" setup>
import { cloneDeep, difference } from 'lodash-es'
import { computed, defineEmits, defineProps, onMounted, ref, watch } from 'vue'
import { VueDraggable } from 'vue-draggable-plus'
import { getAllfieldList, getfieldList, savefield } from '@/api/home/filter'
import { workPackageMap } from '@/config/workorder'
import { useUser } from '@/store/modules/user'
import { getAllfieldList, getfieldList, savefield } from "@/api/home/filter";
import { workPackageMap } from "@/config/workorder";
import { useUser } from "@/store/modules/user";
import { difference, cloneDeep } from "lodash-es";
import { computed, defineEmits, defineProps, onMounted, ref, watch } from "vue";
import { VueDraggable } from "vue-draggable-plus";
const props = defineProps({
reviewType: {
type: Number,
default: () => 1,
require: true,
},
})
});
const emit = defineEmits(['onOk'])
const emit = defineEmits(["onOk"]);
//
const offList = ref<any[]>([])
const offList = ref<any[]>([]);
//
const onList = ref<any[]>([])
const onList = ref<any[]>([]);
//
const fixList = ref<any[]>([])
const fixList = ref<any[]>([]);
const offShowList = ref<any[]>([])
const onShowList = ref<any[]>([])
const fixShowList = ref<any[]>([])
const offShowList = ref<any[]>([]);
const onShowList = ref<any[]>([]);
const fixShowList = ref<any[]>([]);
const allCount = computed(() => {
return `全部字段(共${offList.value.length - 1}个)`
})
return `全部字段(共${offList.value.length - 1}个)`;
});
const selectCount = computed(() => {
return `显示字段(共${onList.value.length}个)`
})
return `显示字段(共${onList.value.length}个)`;
});
function generatList() {
const keys = Object.keys(workPackageMap)
let showList: object[] = []
const hideList: object[] = []
const showStr = 'status'
const showKeys = showStr.split(',').map((key: string) => key.toLowerCase())
const keys = Object.keys(workPackageMap);
let showList: object[] = [];
const hideList: object[] = [];
const showStr = "status";
const showKeys = showStr.split(",").map((key: string) => key.toLowerCase());
for (const key of keys) {
const name = workPackageMap[key]?.label
const isDefault = workPackageMap[key]?.isDefault
const name = workPackageMap[key]?.label;
const isDefault = workPackageMap[key]?.isDefault;
// Y
if (!isDefault) {
hideList.push({
id: key,
name: name || '未配置',
name: name || "未配置",
fix: isDefault,
checked: workPackageMap[key].isDefault,
})
});
}
}
showList = showKeys.reduce((acc, key) => {
const config = {
id: key,
name: workPackageMap[key].label || '未配置',
name: workPackageMap[key].label || "未配置",
fix: workPackageMap[key].isDefault,
}
return [...acc, config]
}, [])
};
return [...acc, config];
}, []);
const fixedList = generateDefaultList()
const fixedList = generateDefaultList();
hideList.unshift(...fixedList)
showList.unshift(...fixedList)
hideList.unshift(...fixedList);
showList.unshift(...fixedList);
onList.value = showList
offList.value = hideList
return { showList, hideList }
onList.value = showList;
offList.value = hideList;
return { showList, hideList };
}
function generateDefaultList() {
return Object.keys(workPackageMap).reduce((acc, key) => {
const { label, isDefault } = workPackageMap[key]
const { label, isDefault } = workPackageMap[key];
if (isDefault) {
const config = {
id: key,
name: label || '未配置',
name: label || "未配置",
fix: true,
checked: true,
}
return [...acc, config]
}
else {
return acc
};
return [...acc, config];
} else {
return acc;
}
}, [])
}, []);
}
const show = ref(false)
const show = ref(false);
const checkAll = computed(() => {
let baseNum = 0
let baseNum = 0;
offList.value.map((v) => {
if (v.fix)
baseNum += 1
})
return onList.value.length == offList.value.length - baseNum
})
if (v.fix) {
baseNum += 1;
}
});
return onList.value.length == offList.value.length - baseNum;
});
function showModal() {
show.value = true
show.value = true;
}
function closeModal() {
show.value = false
show.value = false;
}
async function handleSumbit(e: MouseEvent) {
const userStore = useUser()
const userInfo = userStore.getUserInfo
let userFieldFixed = ''
const userStore = useUser();
const userInfo = userStore.getUserInfo;
let userFieldFixed = "";
fixList.value.map((v) => {
userFieldFixed += `${v.id},`
})
userFieldFixed += `${v.id},`;
});
onList.value.map((v) => {
userFieldFixed += `${v.id},`
})
userFieldFixed = userFieldFixed.slice(0, userFieldFixed.length - 1)
savefield(props.reviewType, userInfo.id, userFieldFixed)
e.preventDefault()
closeModal()
emit('onOk')
userFieldFixed += `${v.id},`;
});
userFieldFixed = userFieldFixed.slice(0, userFieldFixed.length - 1);
savefield(props.reviewType, userInfo.id, userFieldFixed);
e.preventDefault();
closeModal();
emit("onOk");
}
defineExpose({
showModal,
})
});
// generatList();
const selectIds = ref<string[]>([])
const selectIds = ref<string[]>([]);
function onCheckAllChange(value) {
const ids: string[] = []
const ids: string[] = [];
for (const item of offList.value) {
if (!item.fix) {
item.checked = value
ids.push(item.id)
item.checked = value;
ids.push(item.id);
}
}
for (const item of offShowList.value) {
if (!item.fix)
item.checked = value
if (!item.fix) {
item.checked = value;
}
}
selectIds.value = value ? ids : []
selectIds.value = value ? ids : [];
if (value) {
offList.value.map((v) => {
if (!v.checked)
onList.value.push(v)
})
onShowList.value = cloneDeep(onList.value)
}
else {
onList.value = []
onShowList.value = []
if (!v.checked) {
onList.value.push(v);
}
});
onShowList.value = cloneDeep(onList.value);
} else {
onList.value = [];
onShowList.value = [];
}
}
function onCheckChange(checked: any, item: any) {
const index = selectIds.value.indexOf(item.id)
item.checked = checked
const currentIndex = offList.value.findIndex(v => v.id == item.id)
offList.value[currentIndex].checked = checked
if (index === -1 && checked)
selectIds.value.push(item.id)
else
selectIds.value.splice(index, 1)
const index = selectIds.value.indexOf(item.id);
item.checked = checked;
let currentIndex = offList.value.findIndex((v) => v.id == item.id);
offList.value[currentIndex].checked = checked;
if (index === -1 && checked) {
selectIds.value.push(item.id);
} else {
selectIds.value.splice(index, 1);
}
}
const showIds = computed(() => {
return onList.value.map((item) => {
return item.id
})
})
return item.id;
});
});
watch(
() => selectIds.value.length,
(newVal, oldVal) => {
if (newVal === oldVal)
return
if (newVal === oldVal) return;
const action = newVal > oldVal ? 'add' : 'remove'
const diff
= action === 'add'
const action = newVal > oldVal ? "add" : "remove";
const diff =
action === "add"
? difference(selectIds.value, showIds.value)
: difference(showIds.value, selectIds.value)
: difference(showIds.value, selectIds.value);
if (diff.length === 0)
return
if (diff.length === 0) return;
if (action === 'add') {
if (action === "add") {
for (const item of offList.value) {
if (!item.fix && diff.includes(item.id)) {
onList.value.push({
id: item.id,
name: item.name || '未配置',
name: item.name || "未配置",
fix: item.fix || false,
})
});
}
}
onShowList.value = cloneDeep(onList.value)
}
else {
const list = onList.value
onShowList.value = cloneDeep(onList.value);
} else {
const list = onList.value;
for (let index = 0; index < list.length; index++) {
const item = list[index]
const item = list[index];
if (!item.fix && diff.includes(item.id)) {
list.splice(index, 1)
onShowList.value.splice(index, 1)
index--
list.splice(index, 1);
onShowList.value.splice(index, 1);
index--;
}
}
console.log(onShowList.value, list, 'onShowList')
console.log(onShowList.value, list, "onShowList");
}
},
)
}
);
watch(
() => showIds.value.length,
(newVal, oldVal) => {
if (newVal === oldVal)
return
if (newVal === oldVal) return;
const diff = difference(selectIds.value, showIds.value)
const diff = difference(selectIds.value, showIds.value);
if (diff.length === 0)
return
if (diff.length === 0) return;
for (const item of offList.value) {
if (!item.fix && diff.includes(item.id)) {
const index = selectIds.value.indexOf(item.id)
item.checked = false
selectIds.value.splice(index, 1)
const index = selectIds.value.indexOf(item.id);
item.checked = false;
selectIds.value.splice(index, 1);
}
}
},
)
}
);
function clearDragSource() {
onList.value = onList.value.filter((item) => {
return item.fix === true
})
onShowList.value = cloneDeep(onList.value)
return item.fix === true;
});
onShowList.value = cloneDeep(onList.value);
}
function removeHandler(id: string) {
let index = onList.value.findIndex((item) => {
return item.id === id
})
return item.id === id;
});
if (index !== -1) {
onList.value.splice(index, 1)
onShowList.value.splice(index, 1)
onList.value.splice(index, 1);
onShowList.value.splice(index, 1);
}
index = offList.value.findIndex(v => v.id == id)
offList.value[index].checked = false
offShowList.value = cloneDeep(offList.value)
index = offList.value.findIndex((v) => v.id == id);
offList.value[index].checked = false;
offShowList.value = cloneDeep(offList.value);
}
function initData() {
offList.value = []
onList.value = []
fixList.value = []
offShowList.value = []
onShowList.value = []
fixShowList.value = []
selectIds.value = []
const initData = ()=>{
offList.value = [];
onList.value = [];
fixList.value = [];
offShowList.value = [];
onShowList.value = [];
fixShowList.value = [];
selectIds.value = [];
}
async function getData(type = '') {
initData()
const userStore = useUser()
const userInfo = userStore.getUserInfo
let res
res = await getAllfieldList(props.reviewType) //
const allList = res.data
res = await getfieldList(props.reviewType, userInfo.id) //
const useList = res.data
const getData = async (type = "") => {
initData();
const userStore = useUser();
const userInfo = userStore.getUserInfo;
let res;
res = await getAllfieldList(props.reviewType); //
const allList = res.data;
res = await getfieldList(props.reviewType, userInfo.id); //
const useList = res.data;
/**
* name 标题
* id 键值
* fix 是否默认
* checked 是否选中
*/
const userFieldFixed = useList?.userFieldFixed?.split(',')
const userFieldUnFixed = useList?.userFieldUnFixed?.split(',')
if (!type || type == 'off') {
offList.value = []
const userFieldFixed = useList?.userFieldFixed?.split(",");
const userFieldUnFixed = useList?.userFieldUnFixed?.split(",");
if (!type || type == "off") {
offList.value = [];
allList?.map((v) => {
const item = {
let item = {
name: v.fieldDesc,
id: v.name,
fix: v.isrequired == 2,
checked:
v.isrequired == 2
|| Boolean(userFieldFixed?.find(v2 => v2 == v.name))
|| Boolean(userFieldUnFixed?.find(v2 => v2 == v.name)),
v.isrequired == 2 ||
Boolean(userFieldFixed?.find((v2) => v2 == v.name)) ||
Boolean(userFieldUnFixed?.find((v2) => v2 == v.name)),
};
if (item.fix) {
fixList.value.push(item);
} else {
offList.value.push(item);
}
if (item.fix)
fixList.value.push(item)
else
offList.value.push(item)
})
offList.value.unshift(...fixList.value)
});
offList.value.unshift(...fixList.value);
}
if (!type || type == 'on') {
useList?.userFieldFixed?.split(',').map((v) => {
let item = allList.find(v2 => v2.name == v)
if (!type || type == "on") {
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,
};
selectIds.value.push(item.id);
if (!item.fix) {
onList.value.push(item);
}
selectIds.value.push(item.id)
if (!item.fix)
onList.value.push(item)
}
})
});
}
offShowList.value = cloneDeep(offList.value)
fixShowList.value = cloneDeep(fixList.value)
onShowList.value = cloneDeep(onList.value)
}
offShowList.value = cloneDeep(offList.value);
fixShowList.value = cloneDeep(fixList.value);
onShowList.value = cloneDeep(onList.value);
};
onMounted(() => getData())
onMounted(() => getData());
const indeterminate = computed(() => {
let baseNum = 0
let baseNum = 0;
offList.value.map((v) => {
if (v.fix)
baseNum += 1
})
if (v.fix) {
baseNum += 1;
}
});
return (
onShowList.value.length > 0
&& offShowList.value.length - baseNum > onShowList.value.length
)
})
function queryData(value, type) {
onShowList.value.length > 0 &&
offShowList.value.length - baseNum > onShowList.value.length
);
});
const queryData = (value, type) => {
if (value) {
if (type == 'off') {
offShowList.value = offList.value.filter(item => item.name.includes(value))
if (type == "off") {
offShowList.value = offList.value.filter((item) => item.name.indexOf(value) > -1);
} else {
onShowList.value = onList.value.filter((item) => item.name.indexOf(value) > -1);
fixShowList.value = fixList.value.filter((item) => item.name.indexOf(value) > -1);
}
else {
onShowList.value = onList.value.filter(item => item.name.includes(value))
fixShowList.value = fixList.value.filter(item => item.name.includes(value))
}
}
else {
} else {
// getData(type);
if (type == 'off') {
offShowList.value = cloneDeep(offList.value)
}
else {
onShowList.value = cloneDeep(onList.value)
fixShowList.value = cloneDeep(fixList.value)
if (type == "off") {
offShowList.value = cloneDeep(offList.value);
} else {
onShowList.value = cloneDeep(onList.value);
fixShowList.value = cloneDeep(fixList.value);
}
}
}
};
</script>
<template>
@ -405,8 +401,8 @@ function queryData(value, type) {
<n-checkbox
v-model:checked="checkAll"
label="全选"
:indeterminate="indeterminate"
@update:checked="onCheckAllChange"
:indeterminate="indeterminate"
/>
</div>
<div class="content">
@ -449,9 +445,7 @@ function queryData(value, type) {
<SvgIcon size="14px" name="magnifying-1" />
</template>
</n-input>
<div class="draggable-title">
系统默认
</div>
<div class="draggable-title">系统默认</div>
<div class="draggable-ul" style="border-bottom: none">
<div
v-for="item in fixShowList"
@ -462,9 +456,7 @@ function queryData(value, type) {
<span class="ml-2">{{ item.name }}</span>
</div>
</div>
<div class="draggable-title" style="border-top: none">
自定义配置
</div>
<div class="draggable-title" style="border-top: none">自定义配置</div>
<VueDraggable
v-model="onList"
class="draggable-ul"
@ -495,9 +487,7 @@ function queryData(value, type) {
</div>
<template #footer>
<div class="wrapper-footer">
<n-button type="info" @click="handleSumbit">
确定
</n-button>
<n-button type="info" @click="handleSumbit"> </n-button>
<n-button secondary style="margin-left: 15px" @click="getData();closeModal()">
取消
</n-button>

@ -1,7 +1,7 @@
<script lang="ts" setup>
import type { FormInst, FormItemRule, FormRules } from "naive-ui";
import { computed, onBeforeMount, reactive, ref, unref, watch } from "vue";
import { asideTaskMap } from "@/config/final";
import { asideTaskMap as asideMap } from "@/config/final";
import { useDictionary } from "@/store/modules/dictonary";
import { useConfig } from "@/store/modules/asideConfig";
import type { FilterCondition } from "/#/api";
@ -120,7 +120,10 @@ function handleSumbit(e: MouseEvent) {
if (currentStatus.value === "new") addCondition(param);
else updateCondition({ id: currentEditId!, ...param });
closeModal();
emit("onOk");
setTimeout(() => {
closeModal();
}, 300);
});
}
@ -195,18 +198,14 @@ function showModal() {
}
function closeModal() {
emit("onOk");
setTimeout(() => {
show.value = false;
}, 300);
show.value = false;
}
function generateAllData(): Option[] {
const initVal: Option[] = [];
console.log(asideTaskMap,'asideTaskMap')
const list = Object.keys(asideTaskMap).reduce((acc, value) => {
if (value.startsWith("iz") && asideTaskMap[value]?.inFilterList !== false) {
const name = asideTaskMap[value]?.label;
const list = Object.keys(asideMap).reduce((acc, value) => {
if (value.startsWith("iz") && asideMap[value]?.inFilterList !== false) {
const name = asideMap[value]?.label;
name &&
acc.push({
@ -223,8 +222,6 @@ function generateAllData(): Option[] {
typeOptions.value = generateAllData();
function getOptions(key: string) {
console.log('key',key,'getOptions');
console.log(formValue.conditions,'formValue.conditions')
const getterName = `get${key}`;
const options = unref(dicStore[getterName]);
return options || [];
@ -266,12 +263,7 @@ defineExpose({
</script>
<template>
<n-modal
v-model:show="show"
transform-origin="center"
@after-leave="leaveHandler"
class="modal_wrapper"
>
<n-modal v-model:show="show" transform-origin="center" @after-leave="leaveHandler">
<n-card
:style="cardStyle"
:bordered="false"
@ -283,14 +275,7 @@ defineExpose({
<span class="wrapper-title">{{ modalTitle }}</span>
<div class="wrapper-bar">
<div class="wrapper-info">
<span
:style="{
'margin-left': '18px',
'font-size': '16px',
'font-weight': '600',
}"
>基本信息</span
>
<span :style="{ 'margin-left': '18px' }">基本信息</span>
</div>
</div>
<div class="wrapper-form">
@ -300,7 +285,6 @@ defineExpose({
v-model:value="formValue.name"
:style="{ width: '780px' }"
@keydown.enter.prevent
placeholder="请输入过滤名称"
/>
</n-form-item>
<n-form-item path="logic" label="逻辑关系" v-show="false">
@ -323,7 +307,7 @@ defineExpose({
v-model:value="item.type"
placeholder="请选择筛选项名称"
:options="typeOptions"
@update="item.result = ''"
@change="item.result = ''"
/>
<n-select
filterable
@ -361,13 +345,13 @@ defineExpose({
</n-form>
</div>
<div class="wrapper-new" @click="createCondition">
<span style="font-size:16px;">+</span>
<span>+</span>
<span style="margin-left: 8px">添加筛选条件</span>
</div>
</div>
<template #footer>
<div class="wrapper-footer">
<n-button type="info" @click="handleSumbit"> </n-button>
<n-button type="info" @click="handleSumbit"> </n-button>
<n-button secondary style="margin-left: 15px" @click="closeModal">
取消
</n-button>
@ -384,22 +368,19 @@ defineExpose({
&-title {
font-weight: bold;
font-size: 18px;
color: #333333;
font-size: 16px;
}
&-bar {
background-color: #e8e8e8;
width: 100%;
margin-top: 27px;
font-size: 16px;
color: #333333;
margin-top: 20px;
}
&-form {
display: flex;
justify-content: space-between;
margin-top: 24px;
margin-top: 20px;
}
&-new {
@ -408,9 +389,7 @@ defineExpose({
color: #507afd;
line-height: 22px;
cursor: pointer;
span{
font-size: 11px;
}
&:hover {
color: #507aac;
}
@ -423,7 +402,6 @@ defineExpose({
&-footer {
display: flex;
justify-content: flex-end;
margin-bottom:6px;
}
&-info {
@ -441,17 +419,4 @@ defineExpose({
}
}
}
.modal_wrapper {
width: 808px !important;
height: 432px !important;
}
.modal_wrapper {
padding: 14px 14px 0 14px !important;
}
::v-deep(.n-form-item .n-form-item-label){
font-size:14px;
color: #666666;
font-weight: 500;
}
</style>

@ -1,26 +1,24 @@
<script lang="ts" setup>
import { debounce } from 'lodash-es'
import { getAllfieldList, getfieldList } from "@/api/home/filter";
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 {
computed,
defineEmits,
defineOptions,
inject,
nextTick,
onMounted,
ref,
unref,
watch,
} from 'vue'
import CustomFieldModalVue from '../modal/CustomFieldModal.vue'
import WorkSheetList from './WorkSheetList.vue'
import { getAllfieldList, getfieldList } from '@/api/home/filter'
import { useWindowSizeFn } from '@/hooks/event/useWindowSizeFn'
import { useUser } from '@/store/modules/user'
import { useWorkOrder } from '@/store/modules/workOrder'
import { getViewportOffset } from '@/utils/domUtils'
computed, defineEmits, defineOptions,
inject,
nextTick,
onMounted,
ref,
unref,
watch
} from "vue";
import CustomFieldModalVue from "../modal/CustomFieldModal.vue";
import WorkSheetList from "./WorkSheetList.vue";
defineOptions({ name: 'AsideContent' })
const emit = defineEmits(['ApprovalOver'])
defineOptions({ name: "AsideContent" });
const emit = defineEmits(["ApprovalOver"]);
const collapse = ref(false)
const workStore = useWorkOrder()
@ -146,16 +144,16 @@ function setShowSearch(value: boolean) {
if (value === false) {
(packageListRef.value as any).search('')
searchKeyword.value = ''
}
};
}
const inputHandler = debounce((word) => {
searchKeyword.value = word;
(packageListRef.value as any).search(word)
}, 500)
(packageListRef.value as any).search(word);
}, 500);
function ApprovalOver(packageId) {
emit('ApprovalOver', packageId)
const ApprovalOver = (packageId)=>{
emit('ApprovalOver',packageId)
}
</script>
@ -176,7 +174,7 @@ function 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
@ -217,9 +215,9 @@ function ApprovalOver(packageId) {
class="work-sheet-list"
:show-field-list="showFieldList"
:dicts="dicts"
@approval-over="ApprovalOver"
@ApprovalOver="ApprovalOver"
/>
<CustomFieldModalVue ref="filterModalRef" :review-type="1" @on-ok="getshowFieldList" />
<CustomFieldModalVue ref="filterModalRef" :review-type="1" @onOk="getshowFieldList" />
</div>
</template>
@ -237,6 +235,7 @@ function ApprovalOver(packageId) {
padding: 12px 16px;
width: 100%;
overflow: hidden;
.warpper {
display: flex;
justify-content: space-between;

@ -1,8 +1,7 @@
<script lang="ts" setup>
import { format } from 'date-fns'
import { computed, onMounted, ref, watch } from 'vue'
import { computed, onMounted, ref } from 'vue'
import type { PackageListItem } from '/#/workorder'
import { useDialog } from 'naive-ui'
defineOptions({ name: 'ListItem' })
const props = defineProps({
@ -23,50 +22,31 @@ const props = defineProps({
default: () => [],
},
mouseOverTask: {
type: Object,
type: Array,
default: () => [],
},
})
const emit = defineEmits(['dismisClick'])
const dialog = useDialog()
const svgName = computed(() => {
return props.selected ? 'taskpack-select' : 'taskpack'
})
const showFull = ref(false)
const popconfirmTarget: any = ref(null)
const popconfirmRef: any = ref(null)
function handleDismissTask() {
dialog.warning({
title: '确认提示',
content: '确认解散该任务包吗?',
positiveText: '取消',
negativeText: '确定',
negativeButtonProps: {
type: 'info',
ghost: false,
},
positiveButtonProps: {
type: 'default',
},
onPositiveClick: () => {
},
onNegativeClick: () => {
emit('dismisClick', props.mouseOverTask.id)
},
})
emit('dismisClick', props.mouseOverTask.id)
popconfirmRef.value[0]?.setShow(false) // popconfirm
}
watch(() => props.mouseOverTask, (value) => {
console.log(props)
})
onMounted(async () => {
})
</script>
<template>
<div ref="popconfirmTarget" class="list-item relative" :class="{ 'list-item-selected': selected, 'h200': showFieldList?.length > 5 && !showFull }">
<div ref="popconfirmTarget" class="list-item" :class="{ 'list-item-selected': selected }">
<div v-for="(item, index) in showFieldList" :key="index">
<div v-if="item.id === 'name'" class="list-item-header">
<div class="id-wrap">
@ -81,8 +61,7 @@ onMounted(async () => {
placement="bottom" trigger="click"
>
<template #trigger>
<span v-show="mouseOverTask?.id === listItem.id" class="dismiss-task-pack" style="cursor: pointer;">...</span>
<span v-show="mouseOverTask?.id" class="dismiss-task-pack" style="cursor: pointer;">...</span>
</template>
<template #action>
<span style="cursor: pointer;" @click="handleDismissTask"></span>
@ -106,40 +85,21 @@ onMounted(async () => {
</li>
<li v-else-if="item.id === 'createdate'">
提交时间<n-ellipsis style="max-width: 170px">
{{ listItem.createdate && format(listItem.createdate, "yyyy-MM-dd HH:mm:ss") || '全部' }}
{{ listItem.createdate && format(listItem.createdate, "yyyy-MM-dd HH:mm:ss") }}
</n-ellipsis>
</li>
<li v-else-if="item.id === 'createTime'">
生成时间<n-ellipsis style="max-width: 170px">
{{ listItem.createTime && format(listItem.createTime, "yyyy-MM-dd HH:mm:ss") || '全部' }}
</n-ellipsis>
</li>
<li v-else-if="item.id === 'submit_date_timestamp'">
筛选日期<n-ellipsis style="max-width: 170px">
<!-- {{ listItem.submit_date_timestamp && format(listItem.submit_date_timestamp.split('-')[0], "yyyy年MM月dd日") || '全部' }} -->
{{ listItem.submit_date_timestamp && format(new Date(listItem.submit_date_timestamp?.split('-')[0]), "yyyy年MM月dd日") }}
{{ listItem.submit_date_timestamp && format(new Date(listItem.submit_date_timestamp?.split('-')[1]), "yyyy年MM月dd日") }}
{{ listItem.createTime && format(listItem.createTime, "yyyy-MM-dd HH:mm:ss") }}
</n-ellipsis>
</li>
<li v-else class="ellipsis">
<span class="label">{{ item.name }}</span><n-ellipsis style="max-width: 170px">
{{ listItem[item.id] || '全部' }}
{{ listItem[item.id] }}
</n-ellipsis>
</li>
</ul>
</div>
<template
v-if="showFieldList?.length > 5"
>
<div class="absolute bottom-0 py-[8px] pl-[36px] item-action">
<span class="cursor-pointer" @click.stop="showFull = !showFull">
<SvgIcon style="margin-left: 6px" name="expand" size="16" />
<SvgIcon style="margin-left: 6px" name="collapse" size="16" />
{{ showFull ? '收起' : '展开' }}
</span>
</div>
</template>
<!-- <div class="list-item-header">
<div style="display: flex;">
<SvgIcon :name="svgName" size="28" />
@ -162,12 +122,7 @@ onMounted(async () => {
padding: 10px 0px 10px 8px;
position: relative;
border-bottom: 1px solid #e8e8e8;
// · transition: height: 0.2s ease-out;
// transform: ;
&.h200 {
height: 206px;
overflow: hidden;
}
&-header {
display: flex;
align-items: center;
@ -215,16 +170,9 @@ onMounted(async () => {
color: #507afd !important;
}
}
.item-action {
background-color: #fff;
width: calc(100% - 8px);
}
&-selected {
background-color: #f2f5fe;
.item-action {
background-color: #f2f5fe;
}
}
&-detail {

@ -1,15 +1,16 @@
<script lang="ts" setup>
import { onMounted, onUnmounted, reactive, ref, watch } from 'vue'
import { throttle } from 'lodash'
import { useInfiniteScroll } from '@vueuse/core'
import { useMessage } from 'naive-ui'
import ApprovalModal from '../modal/ApprovalModal.vue'
import ListItem from './ListItem.vue'
import { deletePackage } from '@/api/home/main'
import { useWorkOrder } from '@/store/modules/workOrder'
import { isEmpty } from '@/utils'
import type { PackageListItem } from '/#/workorder'
import NotPassed from '@/components/NotPassed.vue'
import { deletePackage } from "@/api/home/main";
import NotPassed from "@/components/NotPassed.vue";
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 ApprovalModal from "../modal/ApprovalModal.vue";
import ListItem from "./ListItem.vue";
import type { PackageListItem } from "/#/workorder";
const emit = defineEmits(["ApprovalOver"]);
defineProps({
showFieldList: {
@ -20,189 +21,130 @@ defineProps({
type: Array,
default: () => [],
},
})
const emit = defineEmits(["ApprovalOver"]);
const emit = defineEmits(['ApprovalOver'])
const workStore = useWorkOrder()
const data = ref<PackageListItem[]>([])
const activeId = ref('')
const el = ref<HTMLDivElement | null>(null)
const keyword = ref('')
const canloadMore = ref(true)
const isLoading = ref(false)
});
const workStore = useWorkOrder();
const data = ref<PackageListItem[]>([]);
const activeId = ref("");
const el = ref<HTMLDivElement | null>(null);
const keyword = ref("");
const canloadMore = ref(true);
const isLoading = ref(false);
const pagination = reactive({
pageNo: 0,
pageSize: 10,
})
});
const approvalModalRef: any = ref(null)
const notPassedRef: any = ref(null)
const overTask = ref<any>(null)
const approvalModalRef: any = ref(null);
const notPassedRef: any = ref(null);
const overTask = ref<any>(null);
function selectHandler(id: string, index: number) {
// console.log('selectHandler',id)
workStore.setActive(index)
workStore.setActive(index);
// showModal(approvalModalRef, id)
}
useInfiniteScroll(
el as any,
() => {
loadMore()
loadMore();
},
{
distance: 10,
interval: 1500,
canLoadMore: () => canloadMore.value,
},
)
}
);
async function loadMore() {
if (isLoading.value || el.value == null)
return
isLoading.value = true
if (isLoading.value || el.value == null) return;
isLoading.value = true;
try {
const more = await fetchList()
const more = await fetchList();
more.forEach((ele) => {
ele.search = JSON.parse(ele.search)
ele.search = JSON.parse(ele.search);
// ele.search.createTime = ele.search.submit_date_timestamp
})
data.value.push(...more)
}
finally {
isLoading.value = false
});
data.value.push(...more);
} finally {
isLoading.value = false;
}
}
// onMounted(() => {
// console.log("onMounted");
// reset();
// fetchList();
// });
async function fetchList() {
try {
pagination.pageNo += 1
const result = await workStore.fetchOrderList(pagination, keyword.value)
const { data, pageCount } = result
if (pageCount !== 0)
canloadMore.value = pageCount >= pagination.pageNo
else canloadMore.value = false
return data || []
}
catch (error) {
canloadMore.value = false
return []
pagination.pageNo += 1;
const result = await workStore.fetchOrderList(pagination, keyword.value);
const { data, pageCount } = result;
if (pageCount !== 0) canloadMore.value = pageCount >= pagination.pageNo;
else canloadMore.value = false;
return data || [];
} catch (error) {
canloadMore.value = false;
return [];
}
}
watch(
() => workStore.activeId,
(newVal) => {
if (isEmpty(newVal))
return
activeId.value = newVal
approvalModalRef.value.showModal(workStore.dataId)
},
)
if (isEmpty(newVal)) return;
activeId.value = newVal;
approvalModalRef.value.showModal(workStore.dataId);
}
);
function reset() {
pagination.pageNo = 0
pagination.pageSize = 10
canloadMore.value = true
data.value.length = 0
pagination.pageNo = 0;
pagination.pageSize = 10;
canloadMore.value = true;
data.value.length = 0;
workStore.reset()
workStore.reset();
}
function notPass(value) {
notPassedRef.value.showModal(value)
notPassedRef.value.showModal(value);
}
async function search(word: string) {
keyword.value = word
reset()
keyword.value = word;
reset();
useInfiniteScroll(
el as any,
() => {
loadMore()
loadMore();
},
{ distance: 10, canLoadMore: () => canloadMore.value },
)
{ distance: 10, canLoadMore: () => canloadMore.value }
);
}
function overTaskHandelr(item: any) {
overTask.value = item
overTask.value = item;
}
function leaveTaskHandler(event) {
if (event?.relatedTarget?.id !== 'taskPopconfirmRef')
overTask.value = null
if (event?.relatedTarget?.id !== "taskPopconfirmRef") {
overTask.value = null;
}
}
const message = useMessage()
const message = useMessage();
function dismisClick(packageId: string) {
deletePackage({ packageId }).then((res) => {
if (res.code === 'OK') {
message.success('解散任务包成功')
reset()
loadMore()
deletePackage({ packageId: packageId }).then((res) => {
if (res.code === "OK") {
message.success("解散任务包成功");
reset();
loadMore();
}
})
}
function ApprovalOver(packageId) {
emit('ApprovalOver', packageId)
});
}
const ApprovalOver = (packageId) => {
emit("ApprovalOver",packageId);
};
defineExpose({
search,
})
const onKeydown = throttle((event) => {
const eles = ['INPUT', 'TEXTAREA']
if (eles.includes(event.target.tagName))
return
if (event.defaultPrevented)
return //
const handled = false
if (event.key !== undefined) {
// 使 KeyboardEvent.key handled true
}
else if (event.keyCode !== undefined) {
// 使 KeyboardEvent.keyCode handled true
}
if (handled) {
//
event.preventDefault()
}
if (event.key === 'ArrowUp') {
const prev = data.value[workStore.currentIndex - 1]?.id
if (prev)
selectHandler(prev, workStore.currentIndex - 1)
}
if (event.key === 'ArrowDown') {
const next = data.value[workStore.currentIndex + 1]?.id
if (next)
selectHandler(next, workStore.currentIndex + 1)
}
if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {
if (activeId.value)
activeId.value = ''
else
activeId.value = data.value[workStore.currentIndex]?.checkDuplicateId
}
}, 500)
onMounted(() => {
document.addEventListener('keydown', onKeydown, true)
})
onUnmounted(() => {
document.removeEventListener('keydown', onKeydown)
})
});
</script>
<template>
@ -221,7 +163,7 @@ onUnmounted(() => {
@click="selectHandler(item.id, index)"
@mouseover="overTaskHandelr(item)"
@mouseleave="leaveTaskHandler"
@dismis-click="dismisClick"
@dismisClick="dismisClick"
/>
</div>
</n-spin>

@ -28,18 +28,10 @@ const propertys = computed(() => {
任务ID{{ taskDetailInfo.taskname }}
</n-ellipsis>
<div class="tags">
<div v-if="taskDetailInfo.historyStates == 1" class="tag tag-submiting">
待审批
</div>
<div v-else-if="taskDetailInfo.historyStates == 2 || taskDetailInfo.workStatus == 3 || taskDetailInfo.historyStates == 3" class="tag tag-submited">
已审批
</div>
<div v-if="taskDetailInfo.historyStates == 2" class="tag tag-passed">
{{ TASK_STATUS_OBJ[taskDetailInfo.historyStates] }}
</div>
<div v-else-if="taskDetailInfo.historyStates == 3" class="tag tag-not-passed">
{{ TASK_STATUS_OBJ[taskDetailInfo.historyStates] }}
</div>
<div class="tag tag-submiting" v-if="taskDetailInfo.historyStates == 1"></div>
<div class="tag tag-submited" v-else-if="taskDetailInfo.historyStates == 2 || taskDetailInfo.workStatus == 3">已审批</div>
<div class="tag tag-passed" v-if="taskDetailInfo.historyStates == 2">{{ TASK_STATUS_OBJ[taskDetailInfo.historyStates] }}</div>
<div class="tag tag-not-passed" v-else-if="taskDetailInfo.historyStates == 3">{{ TASK_STATUS_OBJ[taskDetailInfo.historyStates] }}</div>
</div>
<n-divider class="divider-line" />
<div class="property">

@ -1,83 +1,84 @@
<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 { 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 { useInfiniteScroll } from '@vueuse/core'
import { format } from 'date-fns'
import imagesloaded from 'imagesloaded'
import { clone, cloneDeep, debounce, pickBy } from 'lodash-es'
import { useDialog, useMessage } from 'naive-ui'
import { computed, onUnmounted, onUpdated, reactive, ref, unref, watch } from 'vue'
import PictureInfo from '../components/PictureInfo.vue'
import ConfrimModal from '../modal/ConfrimModal.vue'
import type { ApprovalParam, SimilarityPictureSortParam } from '/#/api'
const batch = ref(false) //
const selectItems = ref<any[]>([])
const message = useMessage()
const dialog = useDialog()
const totalCount = ref(0)
let _imagesload: any
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 { useInfiniteScroll } from "@vueuse/core";
import { format } from 'date-fns';
import imagesloaded from "imagesloaded";
import { clone, cloneDeep, debounce, pickBy } from "lodash-es";
import { useDialog, useMessage } from "naive-ui";
import { computed, onUnmounted, onUpdated, reactive, ref, unref, watch } from "vue";
import PictureInfo from "../components/PictureInfo.vue";
import ConfrimModal from "../modal/ConfrimModal.vue";
import type { ApprovalParam, SimilarityPictureSortParam } from "/#/api";
const batch = ref(false); //
const selectItems = ref<any[]>([]);
const message = useMessage();
const dialog = useDialog();
const totalCount = ref(0);
let _imagesload: any;
function setBatch(value: boolean) {
if (value && batch.value)
batch.value = !value
else
batch.value = value
if (value && batch.value) {
batch.value = !value;
} else {
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
const index = selectItems.value.indexOf(item);
item.checked = checked;
if (index === -1 && checked)
selectItems.value.push(item)
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 taskpagination = reactive({
pageNo: 1,
pageSize: 10,
})
});
const sortBy: SimilarityPictureSortParam = {
orderType: 'desc',
orderName: 'similarityScore',
}
const workStore = useWorkOrder()
const selectTask = ref<any>(null)
const overTask = ref<any>(null)
const taskDetailInfo = ref<any>({})
const confrimModalRef = ref(null)
const imageRef = ref<ComponentElRef | null>()
const listData = ref<any[]>([])
const loading = ref(false)
const el = ref<HTMLDivElement | null>(null)
const selectedSortName = ref('')
const isFullScreen = ref(false)
orderType: "desc",
orderName: "similarityScore",
};
const workStore = useWorkOrder();
const selectTask = ref<any>(null);
const overTask = ref<any>(null);
const taskDetailInfo = ref<any>({});
const confrimModalRef = ref(null);
const imageRef = ref<ComponentElRef | null>();
const listData = ref<any[]>([]);
const loading = ref(false);
const el = ref<HTMLDivElement | null>(null);
const selectedSortName = ref('');
const isFullScreen = ref(false);
const notPassModalRef = ref(null)
const mainImageModalRef = ref(null)
const wrapperListRef = ref<HTMLElement | undefined>(undefined)
let processItems: any[] = []
let canloadMore = true;
let processItems: any[] = [];
function validate(items: any[]) {
if (items.length === 0)
return '至少选中一个任务'
if (items.length === 0) return "至少选中一个任务";
// for (const item of items) {
// const { iztrueorfalse, history, states } = item
@ -91,213 +92,202 @@ function validate(items: any[]) {
// return ''
// }
return null
return null;
}
function forwardHandler() {
workStore.forward()
workStore.forward();
}
function backHandler() {
workStore.back()
workStore.back();
}
function reset() {
taskpagination.pageNo = 0
taskpagination.pageSize = 20
listData.value.length = 0
loading.value = false
canloadMore = true
taskpagination.pageNo = 0;
taskpagination.pageSize = 20;
listData.value.length = 0;
loading.value = false;
canloadMore = true;
}
async function refreshHandler() {
reset()
reset();
useInfiniteScroll(
el as any,
() => {
loadMore()
loadMore();
},
{ distance: 10, canLoadMore: () => canloadMore },
)
{ distance: 10, canLoadMore: () => canloadMore }
);
}
async function loadMore() {
if (loading.value || el.value == null)
return
if (loading.value || el.value == null) return;
const more = await featchList()
listData.value.push(...more)
const more = await featchList();
listData.value.push(...more);
}
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,
})
totalCount.value = total
canloadMore = pageCount >= taskpagination.pageNo && pageCount > 0
return data
}
catch (error) {
canloadMore = false
return []
loading.value = true;
try {
taskpagination.pageNo += 1;
const { data, total, pageCount } = await getPictureSimilarityList(
{ ...taskpagination, ...sortBy, checkDuplicateId: workStore.activeId, pictureId: taskDetailInfo.value.id }
);
totalCount.value = total;
canloadMore = pageCount >= taskpagination.pageNo && pageCount > 0;
return data;
} catch (error) {
canloadMore = false;
return [];
}
}
const layout = debounce(() => {
if (el.value == null)
return
if (el.value == null) return;
_imagesload = imagesloaded('.grid-item')
_imagesload = imagesloaded(".grid-item");
_imagesload.on('done', (instance) => {
if (!el.value)
return
loading.value = false
})
_imagesload.on("done", (instance) => {
if (!el.value) return;
loading.value = false;
});
_imagesload.on("fail", (instance) => {
message.error("图片错误");
loading.value = false;
});
}, 300);
_imagesload.on('fail', (instance) => {
message.error('图片错误')
loading.value = false
})
}, 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' : '',
}));
//
function toggleFullScreen() {
isFullScreen.value = !isFullScreen.value
}
const toggleFullScreen = () => {
isFullScreen.value = !isFullScreen.value;
};
onUpdated(() => {
layout()
})
layout();
});
watch(
() => workStore.activeId,
async (newValue, oldValue) => {
const packageid = workStore.getActiveId
const packageid = workStore.getActiveId;
if (isEmpty(packageid)) {
listData.value.length = 0
totalCount.value = 0
listData.value.length = 0;
totalCount.value = 0;
taskDetailInfo.value = {}
return
return;
}
queryDetail(packageid)
// const res = await getPackageTaskList(newValue, packagepagination);
// const { data } = res;
// taskList.value = data;
// if (taskList.value.length > 0) handleSelect(taskList.value[0]); //
},
)
}
);
const packageName = computed(() => {
const index = workStore.getCurrentIndex
return workStore.getOrderList[index]?.name || ''
})
const index = workStore.getCurrentIndex;
return workStore.getOrderList[index]?.name || "";
});
async function queryDetail(checkDuplicateId: any) {
taskDetailInfo.value = await getTaskDetailInfo(checkDuplicateId)
const packageid = workStore.getActiveId
taskDetailInfo.value = await getTaskDetailInfo(checkDuplicateId);
const packageid = workStore.getActiveId;
if (isEmpty(packageid)) {
listData.value.length = 0
totalCount.value = 0
return
listData.value.length = 0;
totalCount.value = 0;
return;
}
refreshHandler()
refreshHandler();
}
//
async function handleSelect(item: any) {
// taskDetailInfo.value = await getTaskDetailInfo(item.id)
const packageid = workStore.getActiveId
const packageid = workStore.getActiveId;
if (isEmpty(packageid)) {
listData.value.length = 0
totalCount.value = 0
listData.value.length = 0;
totalCount.value = 0;
return;
}
// refreshHandler();
}
async function sortHandler(orderby: 'similarityScore' | 'createdate') {
selectedSortName.value = orderby
sortBy.orderName = orderby
sortBy.orderType = sortBy.orderType === 'asc' ? 'desc' : 'asc'
refreshHandler()
async function sortHandler(orderby: "similarityScore" | "createdate") {
selectedSortName.value = orderby;
sortBy.orderName = orderby;
sortBy.orderType = sortBy.orderType === "asc" ? "desc" : "asc";
refreshHandler();
}
const propertys = computed(() => {
const { ocrPicture } = taskDetailInfo.value
const { ocrPicture } = taskDetailInfo.value;
const v = pickBy(ocrPicture, (value, key: string) => {
return key.startsWith('field') && value !== null
})
return v
})
return key.startsWith("field") && value !== null;
});
return v;
});
function overTaskHandelr(item: any) {
if (item?.historyStates === 2 || item?.historyStates == 3) {
overTask.value = null
return
overTask.value = null;
return;
}
if (validate([item]) == null && batch.value === false)
overTask.value = item
if (validate([item]) == null && batch.value === false) overTask.value = item;
}
function leaveTaskHandler() {
overTask.value = null
}
function onEsc() {
if (isFullScreen.value && !(document.querySelector('.n-modal-container')))
isFullScreen.value = false
overTask.value = null;
}
onUnmounted(() => {
workStore.reset()
document.removeEventListener('keydown', onEsc)
})
onMounted(() => {
document.addEventListener('keydown', onEsc)
})
workStore.reset();
});
function immersionHandler() {
// class="wrapper"
// workStore.updateImmersion();
toggleFullScreen()
toggleFullScreen();
}
function showAction() {
const item = taskDetailInfo.value
if (item.historyStates === 2 || item.historyStates === 3)
const item = taskDetailInfo.value;
if (item.historyStates === 2 || item.historyStates === 3) {
return
if (batch.value === false)
overTask.value = item
}
if (batch.value === false) overTask.value = item;
}
function hideAction() {
overTask.value = null
overTask.value = null;
}
function previewHandler(event: MouseEvent) {
event.stopImmediatePropagation()
event.stopPropagation()
event.stopImmediatePropagation();
event.stopPropagation();
if (imageRef.value && (imageRef.value as any).src)
(imageRef.value as any).mergedOnClick()
(imageRef.value as any).mergedOnClick();
}
function rejectHandler() {
const modal = unref(notPassModalRef)! as any
@ -329,9 +319,9 @@ function handleRejectMainImage() {
params.id = params.taskchildpictureid
modal.showModal([params])
}
async function reloadDetailInfo() {
const packageid = workStore.getActiveId
taskDetailInfo.value = await getTaskDetailInfo(packageid)
async function reloadDetailInfo(){
const packageid = workStore.getActiveId;
taskDetailInfo.value = await getTaskDetailInfo(packageid);
}
function handleApproveMainImage(items?: any) {
let cloneItem: any
@ -371,17 +361,17 @@ function handleApproveMainImage(items?: any) {
positiveText: '确定',
negativeText: '取消',
onPositiveClick: () => {
audit(param).then(async (res) => {
audit(param).then(async(res) => {
const { code } = res
if (code === 'OK') {
message.info(res.message)
const packageid = workStore.getActiveId
taskDetailInfo.value = await getTaskDetailInfo(packageid)
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) {
@ -431,7 +421,7 @@ function approvalHandler(items?: any) {
onPositiveClick: () => {
doAudit(param)
},
onNegativeClick: () => {},
onNegativeClick: () => { },
})
}
@ -444,7 +434,7 @@ function doAudit(param: any) {
emitter.emit('refresh')
refreshHandler()
}
else { message.error(res.message) }
else message.error(res.message)
})
}
@ -452,28 +442,8 @@ function reloadList() {
setBatch(false)
refreshHandler()
}
function handleRejectdubiousfileyd() {
dialog.info({
title: '确认提示',
content: '确认将图片移入可疑文件夹吗?',
positiveText: '确定',
negativeText: '取消',
onPositiveClick: () => {
audit(param).then(async (res) => {
const { code } = res
if (code === 'OK') {
dubiousfileyd(taskDetailInfo.value.pictureId).then(() => {
refreshHandler()
})
}
else { message.error(res.message) }
})
},
onNegativeClick: () => { },
})
}
defineExpose({
queryDetail,
queryDetail
})
</script>
@ -492,20 +462,8 @@ defineExpose({
批量审批
</div>
<div class="icon-wrap">
<SvgIcon
v-if="isFullScreen"
size="20"
name="power-off"
style="cursor: pointer"
@click="immersionHandler"
/>
<SvgIcon
v-else
size="20"
name="immersion-model"
style="cursor: pointer"
@click="immersionHandler"
/>
<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>
@ -531,67 +489,50 @@ 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 }} </span>
<span class="time-value">{{ taskDetailInfo?.photoDateTimestamp ? format(
taskDetailInfo.photoDateTimestamp, 'yyyy-MM-dd HH:mm:ss') : '-' }} </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>
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>
@ -602,151 +543,74 @@ 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 v-if="[1].includes(taskDetailInfo.historyStates)" style="cursor: pointer" name="t1" @click.stop="handleApproveMainImage" />
<SvgIcon v-if="[1].includes(taskDetailInfo.historyStates)" style="cursor: pointer; margin-left: 30px" name="t2" @click.stop="handleRejectMainImage" />
<SvgIcon v-if="[1, 2, 3].includes(taskDetailInfo.historyStates)" style="cursor: pointer; margin-left: 30px" name="t9" @click.stop="handleRejectdubiousfileyd" />
<SvgIcon style="cursor: pointer" name="t1" @click.stop="handleApproveMainImage" />
<SvgIcon style="cursor: pointer; margin-left: 30px" name="t2" @click.stop="handleRejectMainImage" />
</div>
<PictureInfo :task-detail-info="taskDetailInfo" />
</div>
<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>
<PictureInfo :taskDetailInfo="taskDetailInfo"></PictureInfo>
</div>
<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>
</div>
<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'" />
</div>
<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
v-show="selectedSortName !== 'createdate'"
style="margin-left: 5px"
name="sort"
size="12"
/>
<SvgIcon
v-show="selectedSortName === 'createdate'"
style="margin-left: 5px"
name="active-sort"
size="12"
/>
</div>
<div
style="margin-left: 15px; cursor: pointer"
@click="sortHandler('similarityScore')"
>
<span>相似度排序</span>
<SvgIcon
v-show="selectedSortName !== 'similarityScore'"
style="margin-left: 5px"
name="sort"
size="12"
/>
<SvgIcon
v-show="selectedSortName === 'similarityScore'"
style="margin-left: 5px"
name="active-sort"
size="12"
/>
</div>
<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'" />
</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 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>
</div>
<div class="time">
<SvgIcon color="#FFF" size="16" name="save" />
<span class="current-time">{{
item.submitDateTimestamp
? formatToDateHMS(Number(item.submitDateTimestamp) || 0)
: "-"
}}</span>
</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 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>
</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)"
/>
<div class="time">
<SvgIcon color="#FFF" size="16" name="save" />
<span class="current-time">{{ item.submitDateTimestamp ? formatToDateHMS(Number(item.submitDateTimestamp)
|| 0) : '-'
}}</span>
</div>
<div class="percent" :class="{ 'percent-red': item?.maxSimilarity >= 100 }">
<SvgIcon size="42" :name="item.maxSimilarity == 100 ? 'error_tag' : 'tag'" />
<div class="val">
{{ item?.maxSimilarity && Number(item?.maxSimilarity).toFixed(0)
}}<span class="percent-unit">%</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)" />
</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>
</div>
</div>
<div v-if="item.historyStates === 2" class="pass-status">
<SvgIcon name="pass-icon" style="width: 52; height: 24px" />
</div>
<div v-else-if="item.historyStates === 3" class="pass-status">
<SvgIcon name="no-pass-icon" style="width: 52; height: 24px" />
</div>
<SvgIcon v-if="[1, 2, 3].includes(taskDetailInfo.historyStates)" style="cursor: pointer; margin-left: 30px" name="t9" @click.stop="handleRejectdubiousfileyd" />
<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 v-if="[1, 2, 3].includes(taskDetailInfo.historyStates)" style="cursor: pointer; margin-left: 30px" name="t9" @click.stop="handleRejectdubiousfileyd" />
</div>
<div class="pass-status" v-if="item.historyStates === 2">
<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" />
</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)" />
</div>
<n-back-top :listen-to="wrapperListRef" :bottom="220" :visibility-height="10">
<div
style="
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 14px;
"
>
回到顶部
</div>
</n-back-top>
</div>
</div>
</div>
@ -868,7 +732,7 @@ defineExpose({
z-index: 3;
width: 30px;
height: 30px;
background: rgba(255, 255, 255, 0.2);
background: rgba(255, 255, 255, 0.20);
border-radius: 6px;
backdrop-filter: blur(10px);
display: flex;
@ -908,11 +772,7 @@ 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;
@ -964,7 +824,7 @@ defineExpose({
justify-content: center;
width: 30px;
height: 30px;
background: rgba(80, 122, 253, 0.1);
background: rgba(80, 122, 253, .1);
border-radius: 8px;
margin-left: 10px;
cursor: pointer;
@ -1003,6 +863,7 @@ defineExpose({
.unit {
font-size: 11px;
}
}
}
@ -1024,6 +885,7 @@ defineExpose({
padding: 24px;
// background: lime;
.task-name {
display: inline-block;
width: 100%;
@ -1064,18 +926,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 {
@ -1103,8 +965,7 @@ defineExpose({
margin-right: 32px;
}
.top {
}
.top {}
.property-content {
flex: 1;
@ -1146,11 +1007,7 @@ 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;
@ -1177,33 +1034,16 @@ defineExpose({
display: flex;
align-items: center;
justify-content: center;
// width: 35px;
// height: 18px;
width: 35px;
height: 18px;
opacity: 0.9;
// background: #6f92fd;
background: #6f92fd;
border-radius: 6px 0px 6px 0px;
z-index: 5;
right: 12px;
top: 0;
top: 15px;
color: #fff;
font-size: 14px;
.val {
position: absolute;
left: 0;
top: 0;
display: block;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-family: PingFang SC, PingFang SC-Semibold;
font-weight: Semibold;
text-align: left;
color: #ffffff;
line-height: 24px;
}
}
.percent-unit {
@ -1237,6 +1077,7 @@ defineExpose({
}
}
.action {
position: absolute;
z-index: 5;
@ -1250,10 +1091,8 @@ defineExpose({
justify-content: center;
background-color: rgba(0, 0, 0, 0.48);
}
<<<<<<< HEAD
=======
>>>>>>> test
}
}
}

@ -4,9 +4,6 @@ import { ref } from "vue";
import Aside from "./aside/Aside.vue";
import Content from "./content/Content.vue";
import { useWorkOrder } from "@/store/modules/workOrder";
import Robot from '@/components/Robot/index.vue'
const workStore = useWorkOrder();
const contentRef: any = ref(null);
const ApprovalOver = (packageId) => {
@ -18,7 +15,7 @@ const ApprovalOver = (packageId) => {
<template>
<div style="width: 100%">
<div class="header">
<DataHeader />
<DataHeader v-show="false" />
</div>
<div class="main">
<!-- 侧边 -->
@ -27,7 +24,6 @@ const ApprovalOver = (packageId) => {
<!-- 内容 -->
<Content ref="contentRef" />
</div>
<Robot />
</div>
</template>

@ -1,10 +1,10 @@
<script lang="ts" setup>
import { difference } from 'lodash-es'
import { computed, defineEmits, defineProps, onMounted, ref, watch } from 'vue'
import { VueDraggable } from 'vue-draggable-plus'
import { getAllfieldList, getfieldList, savefield } from '@/api/home/filter'
import { workPackageMap } from '@/config/workorder'
import { useUser } from '@/store/modules/user'
import { getAllfieldList, getfieldList, savefield } from "@/api/home/filter";
import { workPackageMap } from "@/config/workorder";
import { useUser } from "@/store/modules/user";
import { difference } from "lodash-es";
import { computed, defineEmits, defineProps, onMounted, ref, watch } from "vue";
import { VueDraggable } from "vue-draggable-plus";
const props = defineProps({
reviewType: {
@ -12,319 +12,304 @@ const props = defineProps({
default: () => 1,
require: true,
},
})
});
const emit = defineEmits(['onOk'])
const emit = defineEmits(["onOk"]);
//
const offList = ref<any[]>([])
const offList = ref<any[]>([]);
//
const onList = ref<any[]>([])
const onList = ref<any[]>([]);
//
const fixList = ref<any[]>([])
//
const searchKey = ref('')
const searchFixVal = ref('')
const fixList = ref<any[]>([]);
const allCount = computed(() => {
return `全部字段(共${offList.value.length - 1}个)`
})
const showOffList = computed(() => {
return offList.value.filter((i) => {
console.log(i.name, searchKey.value, 'i.name.includes(searchKey.value)')
return i.name.includes(searchKey.value)
})
})
const showFixList = computed(() => {
return fixList.value.filter(i => i.name.includes(searchFixVal.value))
})
return `全部字段(共${offList.value.length - 1}个)`;
});
const selectCount = computed(() => {
return `显示字段(共${onList.value.length}个)`
})
return `显示字段(共${onList.value.length}个)`;
});
function generatList() {
const keys = Object.keys(workPackageMap)
let showList: object[] = []
const hideList: object[] = []
const showStr = 'status'
const showKeys = showStr.split(',').map((key: string) => key.toLowerCase())
const keys = Object.keys(workPackageMap);
let showList: object[] = [];
const hideList: object[] = [];
const showStr = "status";
const showKeys = showStr.split(",").map((key: string) => key.toLowerCase());
for (const key of keys) {
const name = workPackageMap[key]?.label
const isDefault = workPackageMap[key]?.isDefault
const name = workPackageMap[key]?.label;
const isDefault = workPackageMap[key]?.isDefault;
// Y
if (!isDefault) {
hideList.push({
id: key,
name: name || '未配置',
name: name || "未配置",
fix: isDefault,
checked: workPackageMap[key].isDefault,
})
});
}
}
showList = showKeys.reduce((acc, key) => {
const config = {
id: key,
name: workPackageMap[key].label || '未配置',
name: workPackageMap[key].label || "未配置",
fix: workPackageMap[key].isDefault,
}
return [...acc, config]
}, [])
};
return [...acc, config];
}, []);
const fixedList = generateDefaultList()
const fixedList = generateDefaultList();
hideList.unshift(...fixedList)
showList.unshift(...fixedList)
hideList.unshift(...fixedList);
showList.unshift(...fixedList);
onList.value = showList
offList.value = hideList
console.log(offList.value, 'console.log(offList.value)')
return { showList, hideList }
onList.value = showList;
offList.value = hideList;
return { showList, hideList };
}
function generateDefaultList() {
return Object.keys(workPackageMap).reduce((acc, key) => {
const { label, isDefault } = workPackageMap[key]
const { label, isDefault } = workPackageMap[key];
if (isDefault) {
const config = {
id: key,
name: label || '未配置',
name: label || "未配置",
fix: true,
checked: true,
}
return [...acc, config]
}
else {
return acc
};
return [...acc, config];
} else {
return acc;
}
}, [])
}, []);
}
const show = ref(false)
const show = ref(false);
const checkAll = computed(() => {
let baseNum = 0
let baseNum = 0;
offList.value.map((v) => {
if (v.fix)
baseNum += 1
})
return onList.value.length == offList.value.length - baseNum
})
if (v.fix) {
baseNum += 1;
}
});
return onList.value.length == offList.value.length - baseNum;
});
function showModal() {
show.value = true
show.value = true;
}
function closeModal() {
show.value = false
show.value = false;
}
async function handleSumbit(e: MouseEvent) {
const userStore = useUser()
const userInfo = userStore.getUserInfo
let userField = ''
const userStore = useUser();
const userInfo = userStore.getUserInfo;
let userField = "";
fixList.value.map((v) => {
userField += `${v.id},`
})
userField += `${v.id},`;
});
onList.value.map((v) => {
userField += `${v.id},`
})
userField = userField.slice(0, userField.length - 1)
savefield(props.reviewType, userInfo.id, userField)
e.preventDefault()
closeModal()
emit('onOk')
userField += `${v.id},`;
});
userField = userField.slice(0, userField.length - 1);
savefield(props.reviewType, userInfo.id, userField);
e.preventDefault();
closeModal();
emit("onOk");
}
defineExpose({
showModal,
})
});
// generatList();
const selectIds = ref<string[]>([])
const selectIds = ref<string[]>([]);
function onCheckAllChange(value) {
const ids: string[] = []
const ids: string[] = [];
for (const item of offList.value) {
if (!item.fix) {
item.checked = value
ids.push(item.id)
item.checked = value;
ids.push(item.id);
}
}
selectIds.value = value ? ids : []
selectIds.value = value ? ids : [];
}
function onCheckChange(checked: any, item: any) {
const index = selectIds.value.indexOf(item.id)
const index = selectIds.value.indexOf(item.id);
item.checked = checked
item.checked = checked;
if (index === -1 && checked)
selectIds.value.push(item.id)
else selectIds.value.splice(index, 1)
if (index === -1 && checked) selectIds.value.push(item.id);
else selectIds.value.splice(index, 1);
}
const showIds = computed(() => {
return onList.value.map((item) => {
return item.id
})
})
return item.id;
});
});
watch(
() => selectIds.value.length,
(newVal, oldVal) => {
if (newVal === oldVal)
return
if (newVal === oldVal) return;
const action = newVal > oldVal ? 'add' : 'remove'
const diff
= action === 'add'
const action = newVal > oldVal ? "add" : "remove";
const diff =
action === "add"
? difference(selectIds.value, showIds.value)
: difference(showIds.value, selectIds.value)
: difference(showIds.value, selectIds.value);
if (diff.length === 0)
return
if (diff.length === 0) return;
if (action === 'add') {
if (action === "add") {
for (const item of offList.value) {
if (!item.fix && diff.includes(item.id)) {
onList.value.push({
id: item.id,
name: item.name || '未配置',
name: item.name || "未配置",
fix: item.fix || false,
})
});
}
}
}
else {
const list = onList.value
} else {
const list = onList.value;
for (let index = 0; index < list.length; index++) {
const item = list[index]
const item = list[index];
if (!item.fix && diff.includes(item.id)) {
list.splice(index, 1)
index--
list.splice(index, 1);
index--;
}
}
}
},
)
}
);
watch(
() => showIds.value.length,
(newVal, oldVal) => {
if (newVal === oldVal)
return
if (newVal === oldVal) return;
const diff = difference(selectIds.value, showIds.value)
const diff = difference(selectIds.value, showIds.value);
if (diff.length === 0)
return
if (diff.length === 0) return;
for (const item of offList.value) {
if (!item.fix && diff.includes(item.id)) {
const index = selectIds.value.indexOf(item.id)
item.checked = false
selectIds.value.splice(index, 1)
const index = selectIds.value.indexOf(item.id);
item.checked = false;
selectIds.value.splice(index, 1);
}
}
},
)
}
);
function clearDragSource() {
onList.value = onList.value.filter((item) => {
return item.fix === true
})
return item.fix === true;
});
}
function removeHandler(id: string) {
let index = onList.value.findIndex((item) => {
return item.id === id
})
if (index !== -1)
onList.value.splice(index, 1)
return item.id === id;
});
if (index !== -1) onList.value.splice(index, 1);
index = offList.value.findIndex(v => v.id == id)
offList.value[index].checked = false
index = offList.value.findIndex((v) => v.id == id);
offList.value[index].checked = false;
}
function initData() {
offList.value = []
onList.value = []
fixList.value = []
const initData = () => {
offList.value = [];
onList.value = [];
fixList.value = [];
// offShowList.value = [];
// onShowList.value = [];
// fixShowList.value = [];
selectIds.value = []
}
async function getData() {
initData()
const userStore = useUser()
const userInfo = userStore.getUserInfo
let res
res = await getAllfieldList(props.reviewType) //
const allList = res.data
res = await getfieldList(props.reviewType, userInfo.id) //
const useList = res.data
selectIds.value = [];
};
const getData = async () => {
initData();
const userStore = useUser();
const userInfo = userStore.getUserInfo;
let res;
res = await getAllfieldList(props.reviewType); //
const allList = res.data;
res = await getfieldList(props.reviewType, userInfo.id); //
const useList = res.data;
/**
* name 标题
* id 键值
* fix 是否默认
* checked 是否选中
*/
const userFieldFixed = useList.userFieldFixed?.split(',')
const userFieldUnFixed = useList.userFieldUnFixed?.split(',')
const userFieldFixed = useList.userFieldFixed?.split(",");
const userFieldUnFixed = useList.userFieldUnFixed?.split(",");
allList.map((v) => {
const item = {
let item = {
name: v.fieldDesc,
id: v.name,
fix: v.isrequired == 2,
checked:
v.isrequired == 2
|| Boolean(userFieldFixed?.find(v2 => v2 == v.name))
|| Boolean(userFieldUnFixed?.find(v2 => v2 == v.name)),
v.isrequired == 2 ||
Boolean(userFieldFixed?.find((v2) => v2 == v.name)) ||
Boolean(userFieldUnFixed?.find((v2) => v2 == v.name)),
};
if (item.fix) {
fixList.value.push(item);
} else {
offList.value.push(item);
}
if (item.fix)
fixList.value.push(item)
else
offList.value.push(item)
})
offList.value.unshift(...fixList.value)
useList.userFieldFixed?.split(',').map((v) => {
let item = allList.find(v2 => v2.name == v)
});
offList.value.unshift(...fixList.value);
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,
};
selectIds.value.push(item.id);
if (!item.fix) {
onList.value.push(item);
}
selectIds.value.push(item.id)
if (!item.fix)
onList.value.push(item)
}
})
}
});
};
onMounted(async () => {
getData()
})
getData();
});
const indeterminate = computed(() => {
let baseNum = 0
let baseNum = 0;
offList.value.map((v) => {
if (v.fix)
baseNum += 1
})
if (v.fix) {
baseNum += 1;
}
});
return (
onList.value.length > 0
&& offList.value.length - baseNum > onList.value.length
)
})
onList.value.length > 0 &&
offList.value.length - baseNum > onList.value.length
);
});
</script>
<template>
@ -353,7 +338,7 @@ const indeterminate = computed(() => {
:bordered="false"
>
<div>
<n-input v-model:value="searchKey" placeholder="搜索关键词">
<n-input placeholder="搜索关键词">
<template #suffix>
<SvgIcon size="14px" name="magnifying-1" />
</template>
@ -363,13 +348,13 @@ const indeterminate = computed(() => {
<n-checkbox
v-model:checked="checkAll"
label="全选"
:indeterminate="indeterminate"
@update:checked="onCheckAllChange"
:indeterminate="indeterminate"
/>
</div>
<div class="content">
<div
v-for="item in showOffList"
v-for="item in offList"
:key="item.id"
style="width: 170px"
:class="{ 'disable-check': item.fix }"
@ -399,14 +384,14 @@ const indeterminate = computed(() => {
<span class="textbtnStyle" @click="clearDragSource"></span>
</template>
<div>
<n-input v-model:value="searchFixVal" placeholder="搜索关键词">
<n-input placeholder="搜索关键词">
<template #suffix>
<SvgIcon size="14px" name="magnifying-1" />
</template>
</n-input>
<div class="draggable-ul">
<div
v-for="item in showFixList"
v-for="item in fixList"
:key="item.id"
:class="{ fix: item.fix }"
class="cursor-move draggable-item"
@ -444,9 +429,7 @@ const indeterminate = computed(() => {
</div>
<template #footer>
<div class="wrapper-footer">
<n-button type="info" style="background-color: #507AFD;" @click="handleSumbit">
确定
</n-button>
<n-button type="info" @click="handleSumbit" style="background-color: #507AFD;"> 确定 </n-button>
<n-button secondary style="margin-left: 15px" @click="getData();closeModal();">
取消
</n-button>

3
types/task.d.ts vendored

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

Loading…
Cancel
Save