elseif 1 year ago
parent 9faf0ab0bd
commit 718b8566b6

@ -17,7 +17,7 @@ VITE_GLOB_API_URL =
VITE_GLOB_UPLOAD_URL=
# 图片前缀地址
VITE_GLOB_IMG_URL="http://47.103.213.109:8311/jeecg-boot"
VITE_GLOB_IMG_URL="http://47.93.59.251:8311/jeecg-boot"
# 接口前缀
VITE_GLOB_API_URL_PREFIX = /api

@ -287,3 +287,31 @@ export async function getIzvisitcityList() {
const { data } = res
return data
}
/**
*
* @returns
*/
export async function getRejectList() {
const res = await http.request({
url: `/static/admin/web/distionary/bytypecode/TASKREJECT`,
method: 'get',
})
const list = res.data[0].distionaryList
return list
}
/**
* 退
* @returns
*/
export async function getBackList() {
const res = await http.request({
url: `/static/admin/web/distionary/bytypecode/ACTIONTYPE`,
method: 'get',
})
const list = res.data[0].distionaryList
return list
}

@ -106,7 +106,7 @@ export async function getPictureList(params: any): Promise<any> {
notEmptyParams[key] = `${start}-${end}`
}
if (Array.isArray(val))
if (Array.isArray(notEmptyParams[key]))
notEmptyParams[key] = val.join(',')
})

@ -1,5 +1,6 @@
import { http } from '@/utils/http/axios'
import type { ApprovalParam, PageParam } from '/#/api'
import { ContentTypeEnum } from '@/enums/httpEnum'
/**
*
@ -23,10 +24,11 @@ export async function getApprovalList(params: PageParam, assigneeId: string) {
*
* @param param
*/
export async function approval(params: ApprovalParam) {
export async function audit(params: ApprovalParam) {
return http.request({
url: `/flow/task/completeFlow`,
url: `/flow/task/completeBatchFlow`,
method: 'post',
params,
headers: { 'Content-Type': ContentTypeEnum.FORM_DATA },
})
}

@ -71,10 +71,14 @@ export async function getTaskDetailPictureList(packageid: string, taskchildpictu
const { data: { records, pages, total } } = res
debugger
// 精简一下数据
const list = records.map((item) => {
return {
id: item.id,
taskid: item.taskId,
taskname: item.fromtaskname,
pictureid: item.pictureid,
imgurl: item.ocrPicture.imgurl,
iztrueorfalse: item.iztrueorfalse,

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="168px" height="48px" viewBox="0 0 168 48" 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="145.908028%" gradientTransform="translate(0.500000,0.500000),scale(0.285714,1.000000),rotate(46.988015),scale(1.000000,1.409640),translate(-0.500000,-0.500000)" id="radialGradient-1">
<stop stop-color="#FCFCFF" stop-opacity="0.1" offset="0%"></stop>
<stop stop-color="#FFFFFF" stop-opacity="0.41" offset="100%"></stop>
</radialGradient>
<linearGradient x1="-0.00164029895%" y1="47.5786919%" x2="49.9999972%" y2="54.0816319%" id="linearGradient-2">
<stop stop-color="#9BE9CE" stop-opacity="0.444383741" offset="0%"></stop>
<stop stop-color="#837DA3" stop-opacity="0" offset="100%"></stop>
</linearGradient>
<rect id="path-3" x="0" y="0" width="168" height="48" rx="9.345"></rect>
<rect id="path-4" x="0" y="0" width="168" height="48" rx="9.345"></rect>
<filter x="-0.3%" y="-1.0%" width="100.6%" height="102.1%" filterUnits="objectBoundingBox" id="filter-5">
<feOffset dx="1" 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.459565549 0 0 0 0 1 0 0 0 0 0.812502333 0 0 0 0.336265297 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
</filter>
<linearGradient x1="21.9689186%" y1="-52.1191406%" x2="63.939333%" y2="122.03776%" id="linearGradient-6">
<stop stop-color="#66FCC8" offset="0%"></stop>
<stop stop-color="#06C986" offset="100%"></stop>
</linearGradient>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="无法上传iconfont" transform="translate(-1016.000000, -95.000000)">
<g id="合格" transform="translate(1016.000000, 95.000000)">
<g id="Frame-18">
<g id="路径">
<use fill="url(#radialGradient-1)" xlink:href="#path-3"></use>
<use fill="url(#linearGradient-2)" xlink:href="#path-3"></use>
</g>
<path d="M82.0634717,30.597 L82.3476822,28.437 L84.2518927,28.437 L83.9676822,30.597 L87.7476822,30.597 L88.0318927,28.437 L89.9076822,28.437 L89.793998,29.2612105 L88.2592612,30.597 L91.4708401,30.597 C92.0203138,30.597 92.5034717,30.4075263 92.9203138,30.0285789 C93.3371559,29.6496316 93.5834717,29.1854211 93.6592612,28.6359474 L93.6592612,28.6359474 L94.9382085,19.5127895 L93.062419,19.5127895 L94.5971559,18.177 L95.0518927,14.937 L81.0118927,14.937 L80.642419,17.637 L89.822419,17.637 L87.6908401,19.5127895 L86.4403138,19.5127895 L85.9571559,18.177 L81.0971559,18.177 L81.5803138,19.5127895 L79.8182085,19.5127895 L78.2834717,30.597 L82.0634717,30.597 Z M78.3971559,18.177 L77.2318927,14.937 L72.9118927,14.937 L74.0771559,18.177 L78.3971559,18.177 Z M75.0434717,34.377 L75.4982085,33.5527895 L78.2834717,34.377 L93.4034717,34.377 L93.7729454,31.677 L80.5571559,31.677 L76.6634717,30.5117368 L78.2550506,19.257 L72.3150506,19.257 L71.9171559,21.957 L72.9971559,21.957 L71.6329454,31.677 L70.1834717,34.377 L75.0434717,34.377 Z M85.0192612,23.037 L83.0866296,23.037 L83.2571559,21.957 L85.1613664,21.957 L85.0192612,23.037 Z M90.6466296,23.037 L88.7992612,23.037 L88.9413664,21.957 L90.8171559,21.957 L90.6466296,23.037 Z M84.5645243,26.277 L82.6603138,26.277 L82.802419,25.197 L84.7066296,25.197 L84.5645243,26.277 Z M90.1918927,26.277 L88.3445243,26.277 L88.4866296,25.197 L90.362419,25.197 L90.1918927,26.277 Z M115.742419,30.5117368 C116.291893,30.5117368 116.775051,30.327 117.191893,29.9575263 C117.608735,29.5880526 117.855051,29.1285789 117.93084,28.5791053 L117.93084,28.5791053 L119.152945,19.797 L121.085577,19.797 L121.455051,17.097 L119.55084,17.097 L119.920314,14.4254211 L114.008735,14.4254211 L114.69084,15.2212105 L114.435051,17.097 L105.539261,17.097 L105.169787,19.797 L114.037156,19.797 L112.928735,27.8401579 L110.399261,30.5117368 L115.742419,30.5117368 Z M104.288735,18.3191053 L103.151893,14.937 L98.8318927,14.937 L99.9687348,18.3191053 L104.288735,18.3191053 Z M100.963472,34.377 L101.418209,33.5527895 L104.203472,34.377 L119.323472,34.377 L119.692945,31.6201579 L106.477156,31.6201579 L102.583472,30.5117368 L104.14663,19.3422632 L98.1782085,19.3422632 L97.8087348,22.0422632 L98.9171559,22.0422632 L97.5529454,31.677 L96.1034717,34.377 L100.963472,34.377 Z M111.337156,26.4475263 L110.456103,20.877 L105.652945,20.877 L106.533998,26.4475263 L111.337156,26.4475263 Z" id="通过" fill="#FFFFFF" fill-rule="nonzero" opacity="0.875879197"></path>
<g id="路径" fill="black" fill-opacity="1">
<use filter="url(#filter-5)" xlink:href="#path-4"></use>
</g>
</g>
<g id="编组" transform="translate(24.000000, 9.125000)" fill-rule="nonzero">
<path d="M12.7224,0.118610951 L1.91808,3.46385769 C0.779412566,3.81604859 0.000413716253,4.88859677 0,6.10472578 L0,12.8283405 C0,21.4619476 5.21639999,29.1372464 12.97296,31.8774782 L13.14792,31.9393046 C13.3767053,32.0202318 13.6254546,32.0202318 13.85424,31.9393046 L14.03136,31.8774782 C21.78576,29.1372464 27,21.4619476 27,12.8327567 L27,6.10472578 C27,4.89027975 26.2224,3.81715109 25.08408,3.46385769 L14.2884,0.118610951 C13.7778623,-0.0395369836 13.2329377,-0.0395369836 12.7224,0.118610951 Z" id="形状结合" fill="url(#linearGradient-6)"></path>
<path d="M18.59112,11.6403915 L19.35144,12.4264693 C19.770676,12.8600319 19.7668081,13.5588988 19.3428,13.9875844 L13.122,20.2806229 C12.7012684,20.7057675 12.0242516,20.7057675 11.60352,20.2806229 L7.65720002,16.2906157 C7.23319193,15.8619301 7.22932404,15.1630632 7.64856001,14.7295005 L8.40888002,13.9434227 C8.82882859,13.5105899 9.51247335,13.5076244 9.936,13.9367985 L12.36168,16.3921875 L17.064,11.6359753 C17.4881213,11.2074068 18.1717695,11.2113607 18.59112,11.6448076 L18.59112,11.6403915 Z" id="路径" fill="#FFFFFF"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="168px" height="48px" viewBox="0 0 168 48" 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="145.908028%" gradientTransform="translate(0.500000,0.500000),scale(0.285714,1.000000),rotate(46.988015),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="47.5786919%" x2="49.9999972%" y2="54.0816319%" id="linearGradient-2">
<stop stop-color="#D93333" 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="168" height="48" rx="9.345"></rect>
<rect id="path-4" x="0" y="0" width="168" height="48" rx="9.345"></rect>
<filter x="-0.3%" y="-1.0%" width="100.6%" height="102.1%" filterUnits="objectBoundingBox" id="filter-5">
<feOffset dx="1" 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.976470588 0 0 0 0 0.709803922 0 0 0 0 0.709803922 0 0 0 0.37 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
</filter>
<filter x="-64.8%" y="-54.7%" width="229.6%" height="209.4%" filterUnits="objectBoundingBox" id="filter-6">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="3.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.148940293 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<linearGradient x1="33.1888382%" y1="-10.641276%" x2="50%" y2="100%" id="linearGradient-7">
<stop stop-color="#FF9292" offset="0%"></stop>
<stop stop-color="#FF4E4F" offset="99.9781469%"></stop>
</linearGradient>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="无法上传iconfont" transform="translate(-1216.000000, -95.000000)">
<g id="不合格" transform="translate(1216.000000, 95.000000)">
<g id="路径">
<use fill="url(#radialGradient-1)" xlink:href="#path-3"></use>
<use fill="url(#linearGradient-2)" xlink:href="#path-3"></use>
</g>
<path d="M74.3277778,34.6797368 L75.7488304,24.4765789 L78.5625146,31.4965789 L83.9625146,31.4965789 L79.0172515,19.0765789 L73.9867252,19.0765789 L75.0951462,17.4565789 L85.3835673,17.4565789 L85.753041,14.7565789 L63.073041,14.7565789 L62.7035673,17.4565789 L69.6951462,17.4565789 L60.2025146,31.4965789 L65.6025146,31.4965789 L70.3488304,24.4765789 L68.9277778,34.6797368 L74.3277778,34.6797368 Z M98.5709357,30.4165789 L98.8551462,28.2565789 L100.759357,28.2565789 L100.475146,30.4165789 L104.255146,30.4165789 L104.539357,28.2565789 L106.415146,28.2565789 L106.301462,29.0807895 L104.766725,30.4165789 L107.978304,30.4165789 C108.527778,30.4165789 109.010936,30.2271053 109.427778,29.8481579 C109.84462,29.4692105 110.090936,29.005 110.166725,28.4555263 L110.166725,28.4555263 L111.445673,19.3323684 L109.569883,19.3323684 L111.10462,17.9965789 L111.559357,14.7565789 L97.5193568,14.7565789 L97.1498831,17.4565789 L106.329883,17.4565789 L104.198304,19.3323684 L102.947778,19.3323684 L102.46462,17.9965789 L97.6046199,17.9965789 L98.0877778,19.3323684 L96.3256725,19.3323684 L94.7909357,30.4165789 L98.5709357,30.4165789 Z M94.9046199,17.9965789 L93.7393568,14.7565789 L89.4193568,14.7565789 L90.5846199,17.9965789 L94.9046199,17.9965789 Z M91.5509357,34.1965789 L92.0056725,33.3723684 L94.7909357,34.1965789 L109.910936,34.1965789 L110.280409,31.4965789 L97.0646199,31.4965789 L93.1709357,30.3313158 L94.7625146,19.0765789 L88.8225146,19.0765789 L88.4246199,21.7765789 L89.5046199,21.7765789 L88.1404094,31.4965789 L86.6909357,34.1965789 L91.5509357,34.1965789 Z M101.526725,22.8565789 L99.5940936,22.8565789 L99.7646199,21.7765789 L101.66883,21.7765789 L101.526725,22.8565789 Z M107.154094,22.8565789 L105.306725,22.8565789 L105.44883,21.7765789 L107.32462,21.7765789 L107.154094,22.8565789 Z M101.071988,26.0965789 L99.1677778,26.0965789 L99.3098831,25.0165789 L101.214094,25.0165789 L101.071988,26.0965789 Z M106.699357,26.0965789 L104.851988,26.0965789 L104.994094,25.0165789 L106.869883,25.0165789 L106.699357,26.0965789 Z M132.249883,30.3313158 C132.799357,30.3313158 133.282515,30.1465789 133.699357,29.7771053 C134.116199,29.4076316 134.362515,28.9481579 134.438304,28.3986842 L134.438304,28.3986842 L135.660409,19.6165789 L137.593041,19.6165789 L137.962515,16.9165789 L136.058304,16.9165789 L136.427778,14.245 L130.516199,14.245 L131.198304,15.0407895 L130.942515,16.9165789 L122.046725,16.9165789 L121.677251,19.6165789 L130.54462,19.6165789 L129.436199,27.6597368 L126.906725,30.3313158 L132.249883,30.3313158 Z M120.796199,18.1386842 L119.659357,14.7565789 L115.339357,14.7565789 L116.476199,18.1386842 L120.796199,18.1386842 Z M117.470936,34.1965789 L117.925673,33.3723684 L120.710936,34.1965789 L135.830936,34.1965789 L136.200409,31.4397368 L122.98462,31.4397368 L119.090936,30.3313158 L120.654094,19.1618421 L114.685673,19.1618421 L114.316199,21.8618421 L115.42462,21.8618421 L114.060409,31.4965789 L112.610936,34.1965789 L117.470936,34.1965789 Z M127.84462,26.2671053 L126.963567,20.6965789 L122.160409,20.6965789 L123.041462,26.2671053 L127.84462,26.2671053 Z" id="不通过" fill="#FFFFFF" fill-rule="nonzero"></path>
<g id="路径" fill="black" fill-opacity="1">
<use filter="url(#filter-5)" xlink:href="#path-4"></use>
</g>
<g id="编组" filter="url(#filter-6)" transform="translate(17.000000, 8.125000)" fill-rule="nonzero">
<path d="M12.7224,0.1183699 C13.2329377,-0.0394566334 13.7778623,-0.0394566334 14.2884,0.1183699 L25.08408,3.45681817 C26.2224,3.80939358 27,4.88034134 27,6.09231928 L27,12.8066769 C27,21.4183309 21.7836,29.0780314 14.03136,31.8126943 L13.50216,32 L12.97296,31.8126943 C5.21856001,29.0780314 0,21.4161274 0,12.8022698 L0,6.09231928 C0,4.88034134 0.777599999,3.80939358 1.91808,3.45681817 L12.7224,0.1183699 Z" id="形状结合" fill="url(#linearGradient-7)"></path>
<path d="M17.59536,9.54535452 L18.67536,10.6471527 C19.0969725,11.0774047 19.0969725,11.7748432 18.67536,12.2050952 L16.1064306,14.824763 L18.67536,17.445247 C19.0969725,17.875499 19.0969725,18.5729375 18.67536,19.0031895 L17.59536,20.1049876 C17.1736202,20.5351097 16.4899798,20.5351097 16.06824,20.1049876 L13.4994306,17.484763 L10.93176,20.1049876 C10.5100202,20.5351097 9.82637984,20.5351097 9.40464001,20.1049876 L8.32464002,19.0031895 C7.9030275,18.5729375 7.9030275,17.875499 8.32464002,17.445247 L10.8924306,14.824763 L8.32464002,12.2050952 C7.90302753,11.7748432 7.90302753,11.0774047 8.32464002,10.6471527 L9.40464001,9.54535452 C9.82637984,9.11523244 10.5100202,9.11523244 10.93176,9.54535452 L13.4994306,12.164763 L16.06824,9.54535452 C16.4899798,9.11523244 17.1736202,9.11523244 17.59536,9.54535452 Z" id="形状结合" fill="#FFFFFF"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 492 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1710253216697" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4949" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 64c247.424 0 448 200.576 448 448S759.424 960 512 960 64 759.424 64 512 264.576 64 512 64z m0 80C308.752 144 144 308.752 144 512s164.752 368 368 368 368-164.752 368-368S715.248 144 512 144z m-32 176a16 16 0 0 1 16 16l-0.016 192H688a16 16 0 0 1 15.888 14.128L704 544v48a16 16 0 0 1-16 16H448a32 32 0 0 1-32-32l0.032 1.52A32.544 32.544 0 0 1 416 576V336a16 16 0 0 1 16-16h48z" p-id="4950"></path></svg>

After

Width:  |  Height:  |  Size: 737 B

@ -1,11 +1,12 @@
import type { Component } from 'vue'
import { IzCustomlevel, IzCustomname, IzCustomtype, IzProductVue, IzProjectVue, IzProjecttype, IzShowVue, IzfirmVue, IztaskrromVue, IztaskstatusVue, IzvisitproVue, PictureDownloadVue, PictureTypeVue, PictureUploadVue, PlaceHolderVue, PlanVue, ReportUserVue, SimilarityVue, TimeVue } from '@/views/home/aside/comp/items'
import { IzCustomlevel, IzCustomname, IzCustomtype, IzProductVue, IzProjectVue, IzProjecttype, IzShowVue, IzVisitcity, IzfirmVue, IztaskrromVue, IztaskstatusVue, IzvisitproVue, PictureDownloadVue, PictureTypeVue, PictureUploadVue, PlaceHolderVue, PlanVue, ReportUserVue, SimilarityVue, TimeVue } from '@/views/home/aside/comp/items'
export interface AsideEntity {
label: string
defaultValue?: any
isDefaultFilter?: boolean
inFilterList?: boolean
isDefaultFilter?: boolean// 是否为默认显示选项(不能隐藏)
inFilterList?: boolean// 是否出现在过滤配置选项中
render?: boolean// 是否作为单独组件渲染
key: string
component: Component
}
@ -41,16 +42,16 @@ export const asideMap: Recordable<AsideEntity> = {
key: 'izplan',
component: PlanVue,
},
izsimilarity: {
label: '相似度阈值',
defaultValue: [30, 95],
isDefaultFilter: true,
key: 'izsimilarity',
component: SimilarityVue,
},
// izsimilarity: {
// label: '相似度阈值',
// defaultValue: [0,100],
// isDefaultFilter: false,
// key: 'izsimilarity',
// component: SimilarityVue,
// },
izyear: {
label: '年份',
defaultValue: [1704038400000, Date.now()],
defaultValue: null,
isDefaultFilter: false,
key: 'izyear',
component: TimeVue,
@ -123,7 +124,7 @@ export const asideMap: Recordable<AsideEntity> = {
defaultValue: null,
isDefaultFilter: false,
key: 'izvisitcity',
component: PlaceHolderVue,
component: IzVisitcity,
},
izfirm: {
label: '厂商',
@ -140,20 +141,22 @@ export const asideMap: Recordable<AsideEntity> = {
component: IzProductVue,
},
izdesc: {
label: 'izdesc',
label: '添加备注',
defaultValue: null,
isDefaultFilter: false,
key: 'izdesc',
component: PlaceHolderVue,
inFilterList: false,
render: false,
},
izsearchmanager: {
label: 'izsearchmanager',
label: '自定义筛选',
defaultValue: null,
isDefaultFilter: false,
key: 'izsearchmanager',
component: PlaceHolderVue,
inFilterList: false,
render: false,
},
izshow: {
label: '分类',
@ -163,11 +166,12 @@ export const asideMap: Recordable<AsideEntity> = {
component: IzShowVue,
},
izsearch: {
label: 'izsearch',
label: '自定义过滤',
defaultValue: null,
isDefaultFilter: false,
key: 'izsearch',
component: PlaceHolderVue,
inFilterList: false,
render: false,
},
}

@ -1,6 +1,6 @@
import { defineStore } from 'pinia'
import { store } from '@/store'
import { getIzCustomtypeList, getIzProjectList, getIzShowList, getIzcustomlevel, getIzfirmList, getIzproductnameList, getIzprojecttypeList, getIztaskrromList, getIztaskstatusList, getIzvisitcityList, getIzvisitproList, getPersonList, getPictureTypeList, getPlanList, getRegionList, getTFList, getizcustomnameList } from '@/api/dictionary'
import { getBackList, getIzCustomtypeList, getIzProjectList, getIzShowList, getIzcustomlevel, getIzfirmList, getIzproductnameList, getIzprojecttypeList, getIztaskrromList, getIztaskstatusList, getIzvisitcityList, getIzvisitproList, getPersonList, getPictureTypeList, getPlanList, getRegionList, getRejectList, getTFList, getizcustomnameList } from '@/api/dictionary'
export interface DictionaryState {
regionList: any
@ -20,6 +20,8 @@ export interface DictionaryState {
izcustomlevelList: any
izizprojecttypeList: any
izvisitcityList: any
rejectList: any
backList: any
}
export const useDictionaryStore = defineStore({
@ -42,6 +44,8 @@ export const useDictionaryStore = defineStore({
izcustomlevelList: null,
izizprojecttypeList: null,
izvisitcityList: null,
rejectList: null,
backList: null,
}),
getters: {
getRegionList: (state) => {
@ -185,6 +189,16 @@ export const useDictionaryStore = defineStore({
this.izvisitcityList = generateOptions(list)
return this.izvisitcityList
},
async fetchRejectList() {
const list = await getRejectList()
this.rejectList = generateOptions(list)
return this.rejectList
},
async fetchBackList() {
const list = await getBackList()
this.backList = generateOptions(list)
return this.backList
},
},
})

@ -297,7 +297,7 @@ function createAxios(opt?: Partial<CreateAxiosOptions>) {
return new VAxios(
deepMerge(
{
timeout: 10 * 1000,
timeout: 30 * 1000,
authenticationScheme: '',
// 接口前缀
prefixUrl: urlPrefix,

@ -103,6 +103,13 @@ configStore.$subscribe(() => {
showItems.value = items
})
watch(asideVisible, (newVal) => {
Object.keys(asideValue).forEach((key) => {
if (newVal[key] === false)
asideValue[key] = asideMap[key].defaultValue
})
})
const asideEnter = ref(false)
const showCollapse = computed(() => {
@ -168,8 +175,8 @@ watch(asideValue, (newVal) => {
</div>
<component
:is="item.config.component" v-for="(item, index) in showItems" :id="item.key" :key="index" v-model:value="asideValue[item.key]"
:label="item.config.label"
:is="item.config.component" v-for="(item, index) in showItems" :id="item.key" :key="index"
v-model:value="asideValue[item.key]" :label="item.config.label"
/>
<!-- 过滤列表 -->

@ -93,9 +93,9 @@ configStore.$subscribe(() => {
})
const items = showKeys.reduce((acc, key) => {
const { inFilterList } = asideMap[key]
const { render } = asideMap[key]
if (inFilterList !== false) {
if (render !== false) {
const str = key.toLowerCase()
const o = {

@ -77,13 +77,13 @@ function isChecked(key: string) {
const optionData = ref<TagOption[]>([])
watch(optionData, () => {
const data = unref(optionData)
const firstOptionKey = data.length > 0 ? data[0].key : null
// watch(optionData, () => {
// const data = unref(optionData)
// const firstOptionKey = data.length > 0 ? data[0].key : null
if (firstOptionKey)
checkedKeys.push(firstOptionKey)
})
// if (firstOptionKey)
// checkedKeys.push(firstOptionKey)
// })
const getProps = computed(() => {
return { ...props }

@ -13,7 +13,6 @@ const emit = defineEmits<{
}>()
const checkedKeys = ref(props.value)
const configStore = useDictionary()
function onChange(value: string[]) {

@ -2,7 +2,7 @@
import { ref } from 'vue'
const props = defineProps<{
value: [number, number]
value: [number, number] | null
label: string
}>()
@ -10,7 +10,7 @@ const emit = defineEmits<{
(e: 'update:value', value: number[]): void
}>()
const time = ref<[number, number]>(props.value)
const time = ref<[number, number] | null>(props.value)
function onChange(value: [number, number]) {
emit('update:value', value)

@ -97,7 +97,6 @@ function generatList(config, customConfig) {
}, [])
const fixedList = generateDefaultList(config)
offList.unshift(...fixedList)
return { showList: onList, hideList: offList }
}

@ -6,6 +6,7 @@ import { debounce } from 'lodash-es'
import imagesloaded from 'imagesloaded'
import { useMessage } from 'naive-ui'
import PackageSettingsModal from './modal/PackageSettingsModal.vue'
import GeneratePackageModal from './modal/GeneratePackageModal.vue'
import { timeOptions, viewOptions } from '@/config/home'
import { useWindowSizeFn } from '@/hooks/event/useWindowSizeFn'
import { getViewportOffset } from '@/utils/domUtils'
@ -32,6 +33,7 @@ const pagination = reactive({
})
const configStore = useConfig()
const packageModalRef = ref(null)
const generateModalRef = ref(null)
const loading = ref(false)
const message = useMessage()
@ -67,9 +69,9 @@ const layout = debounce(() => {
_imagesload = imagesloaded('.grid-item')
_imagesload.on('always', (instance) => {
console.log('always')
})
// _imagesload.on('always', (instance) => {
// console.log('always')
// })
_imagesload.on('done', (instance) => {
(_masonry as any).layout()
@ -206,8 +208,17 @@ async function commitHandler(settingParam) {
const finalParam = { ...contentParams, ...asideVal }
finalParam.buessinessno = settingParam.packagename
finalParam.search_history = settingParam.comparehistory ? 1 : 0
// TODO
oneClickCheck(finalParam)
const modal = generateModalRef.value as any
modal.showModal()
oneClickCheck(finalParam).then(() => {
modal.closeModal()
}, () => {
modal.closeModal()
})
}
onMounted(() => {
@ -310,6 +321,7 @@ async function refreshHandler() {
</div>
</div>
<PackageSettingsModal ref="packageModalRef" @commit="commitHandler" />
<GeneratePackageModal ref="generateModalRef" />
</div>
</template>

@ -0,0 +1,50 @@
<script lang="ts" setup>
import { ref } from 'vue'
const show = ref(false)
const stys = {
'width': '424px',
'height': '192px',
'--n-padding-bottom': '0px',
'--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
}
function closeModal() {
show.value = false
}
defineExpose({
showModal,
closeModal,
})
</script>
<template>
<n-modal v-model:show="show" :mask-closable="false" transform-origin="center">
<n-card :style="stys" :bordered="false" role="dialog" aria-modal="true">
<div class="wrapper">
<svg-icon size="90" name="robot2" />
<span style="margin-top: 24px;">正在处理中请勿离开当前页面</span>
</div>
</n-card>
</n-modal>
</template>
<style lang="less" scoped>
.wrapper {
display: flex;
height: 100%;
flex-direction: column;
justify-content: center;
align-items: center;
}
</style>

@ -63,10 +63,16 @@ const formItemStyle = {
'--n-label-height': '0px',
'--n-feedback-height': '8px',
}
function afterLeave() {
model.value.packagename = ''
model.value.comparehistory = false
model.value.mark = false
}
</script>
<template>
<n-modal v-model:show="show" transform-origin="center">
<n-modal v-model:show="show" transform-origin="center" @after-leave="afterLeave">
<n-card :style="cardStyle" :bordered="false" size="huge" role="dialog" aria-modal="true">
<div class="wrapper">
<span class="wrapper-title">生成任务包设置</span>

@ -1,17 +1,24 @@
<script lang="ts" setup>
import { computed, onUnmounted, reactive, ref, unref, watch } from 'vue'
import { useDialog } from 'naive-ui'
import { useDialog, useMessage } from 'naive-ui'
import { clone } from 'lodash-es'
import ConfrimModal from '../modal/ConfrimModal.vue'
import BatchModal from '../modal/BatchModal.vue'
import TaskTable from './TaskTable.vue'
import PictureTable from './PictureTable.vue'
import { useTask } from '@/store/modules/task'
import { approval } from '@/api/task/task'
import { audit } from '@/api/task/task'
import type { ApprovalParam, PictureSortParam } from '/#/api'
import { getTaskDetailInfo, getTaskDetailPictureList } from '@/api/work/work'
const batch = ref(false)
const selectItems = ref<any[]>([])
const message = useMessage()
const dialog = useDialog()
const confrimModalRef = ref(null)
const batchModalRef = ref(null)
const totalCount = ref(0)
const sortBy: PictureSortParam = {
orderbyname: 'asc',
orderbyvalue: 'fromuptime',
@ -40,74 +47,112 @@ const showActions = computed(() => {
return selectItems.value.length > 0 && batch
})
const dialog = useDialog()
const taskpagination = reactive({
pageNo: 1,
pageSize: 10,
})
const taskStore = useTask()
const overTask = ref<any>(null)
const taskDetailInfo = ref<any>({})
const taskDetailPictureList = ref<any[]>([])
let processItems: any[] = []
function validate(items: any[]) {
if (items.length === 0)
return '至少选中一个任务'
for (const item of items) {
// const { iztrueorfalse, history, states } = item
// if (iztrueorfalse !== null)
// return ''
// else if (history)
// return ''
// else if (states !== 1 && states !== 2)
// return ''
}
return null
}
function approvalHandler() {
let cloneItem: any
if (batch.value) { processItems = selectItems.value }
else if (overTask.value) {
cloneItem = clone(overTask.value)
processItems = [cloneItem]
}
const msg = validate(processItems)
if (msg !== null) {
message.error(msg)
return
}
function handleConfirm() {
dialog.info({
title: '确认提示',
content: '确认给该任务审批为【通过】吗?',
positiveText: '确定',
negativeText: '取消',
onPositiveClick: () => {
approvalHandler()
approval()
},
onNegativeClick: () => { },
})
}
const taskpagination = reactive({
pageNo: 1,
pageSize: 10,
})
const taskStore = useTask()
const overTask = ref<any>(null)
const taskDetailInfo = ref<any>({})
const taskDetailPictureList = ref<any[]>([])
function rejectHandler() {
let cloneItem: any
if (batch.value) { processItems = selectItems.value }
else if (overTask.value) {
cloneItem = clone(overTask.value)
processItems = [cloneItem]
}
const msg = validate(processItems)
function approvalHandler() {
let ids: any[] = []
if (msg !== null) {
message.error(msg)
return
}
const modal = unref(confrimModalRef)! as any
modal.showModal()
}
if (batch.value === true)
ids = selectItems.value.map(item => item.id)
else if (overTask.value !== null)
ids = [overTask.value.id]
function approval() {
const formIds: string[] = processItems.map(item => item.id)
const taskIds: string[] = processItems.map(item => item.taskid)
const tasknames: string[] = processItems.map(item => item.taskname)
const param: ApprovalParam = {
formid: '',
taskId: '',
formid: formIds,
taskId: taskIds,
approvd: true,
taskComment: '',
taskname: tasknames,
}
approval(param)
audit(param)
}
function rejectHandler(idOrDesc: string, isOther: boolean) {
let ids: any[] = []
if (batch.value === true)
ids = selectItems.value.map(item => item.id)
else if (overTask.value !== null)
ids = [overTask.value.id]
function reject(idOrDesc: string, backId: string, isOther: boolean) {
const formIds: string[] = processItems.map(item => item.id)
const taskIds: string[] = processItems.map(item => item.taskid)
const tasknames: string[] = processItems.map(item => item.taskname)
const param: ApprovalParam = {
formid: '',
taskId: '',
formid: formIds,
taskId: taskIds,
approvd: false,
taskComment: '',
taskComment: idOrDesc,
taskname: isOther ? tasknames : ['其他'],
}
if (isOther)
param.taskComment = idOrDesc
else
param.taskComment = idOrDesc
approval(param)
audit(param)
}
const confrimModalRef = ref(null)
const batchModalRef = ref(null)
function showModal(modalRef: any) {
const modal = unref(modalRef)! as any
modal.showModal()
@ -126,8 +171,9 @@ watch(() => taskStore.activeId, async (newValue, oldValue) => {
const taskId = taskStore.getActiveId
taskDetailInfo.value = await getTaskDetailInfo(taskId, packageid)
const res = await getTaskDetailPictureList(packageid, taskId, { ...taskpagination, ...sortBy })
taskDetailPictureList.value = res.data
const { data, total } = await getTaskDetailPictureList(packageid, taskId, { ...taskpagination, ...sortBy })
taskDetailPictureList.value = data
totalCount.value = total
})
const currentTaskId = computed(() => {
@ -135,9 +181,11 @@ const currentTaskId = computed(() => {
return taskStore.getApprovalList[index]?.formid || ''
})
function overTaskHandelr(item: any) {
// TODOitem
overTask.value = item
function overTaskHandle() {
const item = taskDetailInfo.value
if (validate([item]) == null && batch.value === false)
overTask.value = item
}
function leaveTaskHandler() {
@ -147,6 +195,10 @@ function leaveTaskHandler() {
onUnmounted(() => {
taskStore.reset()
})
const mark = computed(() => {
return taskDetailInfo.value.iztrueorfalse === null ? '未标记' : '已标记'
})
</script>
<template>
@ -169,11 +221,11 @@ onUnmounted(() => {
</template>
返回
</n-button>
<div style="cursor: pointer;margin-left: 16px;" @click="showModal(confrimModalRef)">
<div style="cursor: pointer;margin-left: 16px;" @click="rejectHandler">
<SvgIcon width="64" height="28" name="a1" />
</div>
<SvgIcon size="24" name="vs" />
<div style="cursor: pointer;" @click="handleConfirm">
<div style="cursor: pointer;" @click="approvalHandler">
<SvgIcon width="64" height="28" name="a2" />
</div>
</div>
@ -181,20 +233,62 @@ onUnmounted(() => {
</div>
</div>
<div class="wrapper-detail">
<div class="left">
<img style="overflow: hidden;" src="../../../assets/images/test.png">
<div
class="left" :style="{ 'background-image': `url(${taskDetailInfo?.ocrPicture?.imgurl})` }"
@mouseover="overTaskHandle" @mouseleave="leaveTaskHandler"
>
<div v-show="overTask" class="action">
<SvgIcon style="cursor: pointer;" width="168" height="48" name="r6" @click.stop @click="approvalHandler" />
<SvgIcon
style="cursor: pointer;margin-left: 30px;" width="168" height="48" name="r7" @click.stop
@click="rejectHandler"
/>
</div>
<div class="mark">
<SvgIcon v-show="taskDetailInfo?.iztrueorfalse === 0" size="128" name="jia" />
</div>
<div class="mark">
<SvgIcon v-show="taskDetailInfo?.iztrueorfalse === 1" size="128" name="zhen" />
</div>
<div class="info">
<n-grid x-gap="12" y-gap="10" :cols="12">
<n-gi span="4" class="gi1">
<span>
<SvgIcon size="40" name="m1" />
</span>
</n-gi>
<n-gi span="8" class="gi2">
<span style="font-size: bold;font-size: 18px;">{{ mark }}</span>
<span>审批状态</span>
</n-gi>
<n-gi span="4" class="gi1">
<span>
<SvgIcon size="40" name="m2" />
</span>
</n-gi>
<n-gi span="8" class="gi2">
<span style="font-size: bold;font-size: 18px;">{{ totalCount }}</span>
<span>相似匹配</span>
</n-gi>
</n-grid>
</div>
<div class="time">
<SvgIcon color="#FFF" size="16" name="time" />
<span>2023-09-17 13:09:10</span>
</div>
</div>
<div class="right">
<n-scrollbar style="max-height: 100%;">
<div class="header">
<span>相似图片(9)</span>
<SvgIcon style="margin-right: 20px;cursor: pointer;" name="max" size="24" @click="showModal(batchModalRef)" />
<SvgIcon
style="margin-right: 20px;cursor: pointer;" name="max" size="24"
@click="showModal(batchModalRef)"
/>
</div>
<div class="list">
<div v-for="(item, index) in taskDetailPictureList" :key="index" class="item">
<div style="overflow: hidden;">
<img src="../../../assets/images/test.png">
</div>
<div class="img-wrapper" :style="{ 'background-image': `url(${item.imgurl})` }" />
<div class="check">
<n-checkbox
v-show="batch" v-model:checked="item.checked" @click.stop
@ -224,7 +318,7 @@ onUnmounted(() => {
</n-tab-pane>
<n-tab-pane name="history" tab="历史审查" />
</n-tabs>
<ConfrimModal ref="confrimModalRef" @commit="rejectHandler" />
<ConfrimModal ref="confrimModalRef" @commit="reject" />
<BatchModal ref="batchModalRef" />
</div>
</template>
@ -308,10 +402,73 @@ onUnmounted(() => {
.left {
flex: 0.6;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border-radius: 8px;
position: relative;
.mark {
position: absolute;
z-index: 1;
right: 15%;
top: 0px;
width: 128px;
height: 80px;
overflow: hidden;
overflow: hidden;
img {
max-height: 100%;
width: auto;
svg {
position: absolute;
top: -48px;
}
}
.action {
position: absolute;
z-index: 3;
width: 100%;
height: 100%;
display: flex;
border-radius: 8px;
align-items: center;
justify-content: center;
background-color: rgba(102, 102, 102, 0.5);
}
.info {
position: absolute;
z-index: 3;
right: 2%;
bottom: 2%;
width: 136px;
height: 119px;
background: rgba(216, 216, 216, 0.4);
border-radius: 7px;
padding: 10px;
color: #FFF;
}
.time {
position: absolute;
z-index: 3;
left: 2%;
bottom: 2%;
color: #FFF;
display: flex;
align-items: center;
}
.gi1 {
display: flex;
align-items: center;
}
.gi2 {
display: flex;
align-items: left;
flex-direction: column;
justify-content: center
}
}
@ -347,6 +504,16 @@ onUnmounted(() => {
overflow: hidden;
margin: 0px 16px 27px 0px;
.img-wrapper {
width: 230px;
height: 130px;
overflow: hidden;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border-radius: 8px;
}
.check {
position: absolute;
z-index: 5;

@ -1,16 +1,11 @@
<script lang="ts" setup>
import { computed, onBeforeMount, onMounted, onUpdated, reactive, ref, watch } from 'vue'
import { computed, onMounted, onUpdated, reactive, ref, watch } from 'vue'
import Masonry from 'masonry-layout'
import { useInfiniteScroll } from '@vueuse/core'
import { debounce } from 'lodash-es'
import imagesloaded from 'imagesloaded'
import { timeOptions, viewOptions } from '@/config/home'
import { off, on } from '@/utils/domUtils'
import img1 from '@/assets/images/1.jpg'
import img2 from '@/assets/images/2.jpg'
import img3 from '@/assets/images/3.jpg'
import img4 from '@/assets/images/4.jpg'
import img5 from '@/assets/images/5.jpg'
import { useTask } from '@/store/modules/task'
import { getTaskDetailPictureList } from '@/api/work/work'
import type { PictureSortParam } from '/#/api'
@ -252,6 +247,19 @@ function forwardHandler() {
function backHandler() {
taskStore.back()
}
const selectItems = ref<any[]>([])
function onCheckChange(checked: any, item: any) {
const index = selectItems.value.indexOf(item)
item.checked = checked
if (index === -1 && checked)
selectItems.value.push(item)
else
selectItems.value.splice(index, 1)
}
</script>
<template>
@ -270,7 +278,7 @@ function backHandler() {
<span style="margin-left: 8px;">任务审批</span>
</div>
<div class="wrapper-title wrapper-m32">
<span>可疑图片文件夹</span>
<span>任务ID:{{ taskStore.getActiveId }}</span>
<SvgIcon size="22" class="forward" name="arrow-left" @click="backHandler" />
<SvgIcon size="22" class="back" name="arrow-right" @click="forwardHandler" />
</div>
@ -346,10 +354,8 @@ function backHandler() {
class="wrapper-content-item-img"
:class="{ 'wrapper-content-item-img-fit': viewMode !== 'masonry' }" :src="item.imgUrl"
>
<div
style="position:absolute;left: 0px;top: 0px;display: flex;justify-content: space-between;width: 100%;padding: 16px;"
>
<n-checkbox v-model:checked="item.checked" @click.stop />
<div class="top">
<n-checkbox v-model:checked="item.checked" @click.stop @update:checked="onCheckChange($event, item)" />
<div class="percent">
30%
</div>
@ -414,6 +420,8 @@ function backHandler() {
font-weight: bold;
font-size: 21px;
padding: 24px 0px 12px 0px;
display: flex;
align-items: center;
.forward {
cursor: pointer;
@ -500,6 +508,16 @@ function backHandler() {
width: 214px;
padding: 16px;
position: relative;
.top {
position: absolute;
left: 0px;
top: 0px;
display: flex;
justify-content: space-between;
width: 100%;
padding: 22px;
}
}
.percent {

@ -3,7 +3,7 @@ import { computed, onBeforeMount, ref } from 'vue'
import { useDictionary } from '@/store/modules/dictonary'
const emit = defineEmits<{
(e: 'commit', value: any, isOther: boolean)
(e: 'commit', rejectId: any, backId: any, isOther: boolean)
}>()
const dictonaryStore = useDictionary()
@ -43,18 +43,15 @@ const comomitValue = computed(() => {
async function handleSumbit(e: MouseEvent) {
e.preventDefault()
closeModal()
emit('commit', comomitValue, selectRejectId.value === 'other')
emit('commit', comomitValue, selectBackId, selectRejectId.value === 'other')
}
onBeforeMount(async () => {
const tfList = await dictonaryStore.fetchTFList()
const rejectList = await dictonaryStore.fetchTFList()
const backList = await dictonaryStore.fetchBackList()
reasonOptions.value = tfList.map((item) => {
return {
label: item.name,
value: item.id,
}
})
reasonOptions.value = rejectList
backOptions.value = backList
//
reasonOptions.value.push({

@ -517,7 +517,7 @@ const mark = computed(() => {
width: 136px;
height: 119px;
opacity: 0.44;
background: #d8d8d8;
background: rgba(216, 216, 216, 0.4);
border-radius: 7px;
}
}

5
types/api.d.ts vendored

@ -108,10 +108,11 @@ export interface CheckParam {
// ----------任务审批----------
export interface ApprovalParam {
formid: string
taskId: string
formid: string[]
taskId: string[]
approvd: boolean
taskComment: string
taskname: string[]
}
// ----------任务终审----------

@ -44,3 +44,6 @@ izfiled2,izfield6,izfield3,izfield17
2. 可疑文件夹的增、删、改、查
3. 任务导出excel
4. 重复任务列表
## test
Loading…
Cancel
Save