WIP: 项目梳理 #186

Draft
lizhong wants to merge 6 commits from refactor/project into test

8
.idea/.gitignore vendored

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

@ -0,0 +1,48 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="15">
<item index="0" class="java.lang.String" itemvalue="PyMuPDF" />
<item index="1" class="java.lang.String" itemvalue="scikit-image" />
<item index="2" class="java.lang.String" itemvalue="shapely" />
<item index="3" class="java.lang.String" itemvalue="opencv-contrib-python" />
<item index="4" class="java.lang.String" itemvalue="opencv-python" />
<item index="5" class="java.lang.String" itemvalue="cython" />
<item index="6" class="java.lang.String" itemvalue="numpy" />
<item index="7" class="java.lang.String" itemvalue="attrdict" />
<item index="8" class="java.lang.String" itemvalue="imgaug" />
<item index="9" class="java.lang.String" itemvalue="premailer" />
<item index="10" class="java.lang.String" itemvalue="lxml" />
<item index="11" class="java.lang.String" itemvalue="visualdl" />
<item index="12" class="java.lang.String" itemvalue="openpyxl" />
<item index="13" class="java.lang.String" itemvalue="lanms-neo" />
<item index="14" class="java.lang.String" itemvalue="Polygon3" />
</list>
</value>
</option>
</inspection_tool>
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="ignoredErrors">
<list>
<option value="N802" />
<option value="N806" />
<option value="N812" />
<option value="N801" />
</list>
</option>
</inspection_tool>
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredIdentifiers">
<list>
<option value="image_tools.image_similarity.calculate" />
<option value="float.*" />
</list>
</option>
</inspection_tool>
<inspection_tool class="TsLint" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<includedPredefinedLibrary name="Node.js Core" />
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EslintConfiguration">
<option name="fix-on-save" value="true" />
</component>
</project>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="$PROJECT_DIR$/../../../webutils/ai/PaddleOCR/.conda" project-jdk-type="Python SDK" />
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

11
components.d.ts vendored

@ -11,19 +11,30 @@ declare module 'vue' {
BasicModal: typeof import('./src/components/Modal/BasicModal.vue')['default']
DataHeader: typeof import('./src/components/DataHeader/index.vue')['default']
NAvatar: typeof import('naive-ui')['NAvatar']
NBackTop: typeof import('naive-ui')['NBackTop']
NButton: typeof import('naive-ui')['NButton']
NCard: typeof import('naive-ui')['NCard']
NCheckbox: typeof import('naive-ui')['NCheckbox']
NCollapse: typeof import('naive-ui')['NCollapse']
NCollapseItem: typeof import('naive-ui')['NCollapseItem']
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
NDatePicker: typeof import('naive-ui')['NDatePicker']
NDialogProvider: typeof import('naive-ui')['NDialogProvider']
NDivider: typeof import('naive-ui')['NDivider']
NDropdown: typeof import('naive-ui')['NDropdown']
NEllipsis: typeof import('naive-ui')['NEllipsis']
NForm: typeof import('naive-ui')['NForm']
NFormItem: typeof import('naive-ui')['NFormItem']
NGi: typeof import('naive-ui')['NGi']
NGrid: typeof import('naive-ui')['NGrid']
NGridItem: typeof import('naive-ui')['NGridItem']
NImage: typeof import('naive-ui')['NImage']
NInput: typeof import('naive-ui')['NInput']
NMessageProvider: typeof import('naive-ui')['NMessageProvider']
NModal: typeof import('naive-ui')['NModal']
NNotificationProvider: typeof import('naive-ui')['NNotificationProvider']
NotPassed: typeof import('./src/components/NotPassed.vue')['default']
NPopconfirm: typeof import('naive-ui')['NPopconfirm']
NPopover: typeof import('naive-ui')['NPopover']
NPopselect: typeof import('naive-ui')['NPopselect']
NProgress: typeof import('naive-ui')['NProgress']

@ -1,4 +1,3 @@
// @ts-check
const antfu = require('@antfu/eslint-config').default
module.exports = antfu(
@ -10,24 +9,26 @@ module.exports = antfu(
'dist',
'/public',
'.husky',
'eslint.config.js',
],
},
{
rules: {
// 允许使用 debugger
'no-debugger': 'off',
'unused-imports/no-unused-vars': 'off',
'unused-imports/no-unused-imports': 'off',
'jsdoc/require-returns-description': 'off',
"jsdoc/check-param-names": "off",
'jsdoc/require-param-name': 'off',
'eqeqeq': 'off',
'no-console': 'off',
'vue/custom-event-name-casing': 'off',
'vue/eqeqeq': 'off',
'no-console': ['warn', { allow: ['warn', 'error'] }],
'no-restricted-syntax': [
// eslint-disable-next-line node/prefer-global/process
process.env.MODE === 'production' ? 2 : 0,
],
'array-callback-return': ['error', { allowImplicit: true }],
curly: ['off']
},
},
)

@ -48,6 +48,7 @@
"@commitlint/config-conventional": "^18.4.3",
"@types/imagesloaded": "^4.1.6",
"@types/lodash": "^4.14.197",
"@types/lodash-es": "^4.17.12",
"@types/masonry-layout": "^4.2.7",
"@types/node": "^18.17.1",
"@types/sortablejs": "^1.15.7",

@ -100,6 +100,9 @@ devDependencies:
'@types/lodash':
specifier: ^4.14.197
version: 4.14.202
'@types/lodash-es':
specifier: ^4.17.12
version: 4.17.12
'@types/masonry-layout':
specifier: ^4.2.7
version: 4.2.7
@ -1323,7 +1326,6 @@ packages:
resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
dependencies:
'@types/lodash': 4.14.202
dev: false
/@types/lodash@4.14.202:
resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==}

@ -0,0 +1,29 @@
#-------------------------------------------------------------------------------#
# Qodana analysis is configured by qodana.yaml file #
# https://www.jetbrains.com/help/qodana/qodana-yaml.html #
#-------------------------------------------------------------------------------#
version: "1.0"
#Specify inspection profile for code analysis
profile:
name: qodana.starter
#Enable inspections
#include:
# - name: <SomeEnabledInspectionId>
#Disable inspections
#exclude:
# - name: <SomeDisabledInspectionId>
# paths:
# - <path/where/not/run/inspection>
#Execute shell command before Qodana execution (Applied in CI/CD pipeline)
#bootstrap: sh ./prepare-qodana.sh
#Install IDE plugins before Qodana execution (Applied in CI/CD pipeline)
#plugins:
# - id: <plugin.id> #(plugin id can be found at https://plugins.jetbrains.com)
#Specify Qodana linter for analysis (Applied in CI/CD pipeline)
linter: jetbrains/qodana-js:latest

@ -1,17 +1,18 @@
<script lang="ts" setup>
import { dateZhCN, zhCN, NModalProvider } from "naive-ui";
import { computed, onMounted, nextTick, inject } from "vue";
import { AppProvider } from "@/components/Application";
import { lighten } from "@/utils/index";
import mouseTrapBind from "@/hooks/event/mouseTrapBind";
const mousetrap = inject("mousetrap") as any;
import { NModalProvider, dateZhCN, zhCN } from 'naive-ui'
import { computed, inject, nextTick, onMounted } 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(() => {
mouseTrapBind(mousetrap);
});
mouseTrapBind(mousetrap)
})
const getThemeOverrides = computed(() => {
const theme = "#1980FF";
const lightenStr = lighten(theme, 6);
const theme = '#1980FF'
const lightenStr = lighten(theme, 6)
return {
common: {
@ -21,34 +22,34 @@ const getThemeOverrides = computed(() => {
primaryColorSuppl: theme,
},
Switch: {
railColorActive: "#07C984",
railColorActive: '#07C984',
},
Input: {
borderHover: "0px",
borderFocus: "0px",
boxShadowFocus: "#ff0000",
borderHover: '0px',
borderFocus: '0px',
boxShadowFocus: '#ff0000',
},
Tag: {
colorCheckedHover: "#507afd",
colorCheckedPressed: "#507afd",
colorCheckedHover: '#507afd',
colorCheckedPressed: '#507afd',
},
Slider: {
fillColor: "#1980FF",
dotBorderActive: "#1980FF",
fillColorHover: "#1980FF",
fillColor: '#1980FF',
dotBorderActive: '#1980FF',
fillColorHover: '#1980FF',
},
Card: {
padding: "0px",
padding: '0px',
},
Dropdown: {
optionColorHover: "#e8f2ff",
optionColorHover: '#e8f2ff',
},
Upload: {
draggerBorder: "1px dashed #1980FF",
draggerBorderHover: "1px dashed #1980FF",
draggerBorder: '1px dashed #1980FF',
draggerBorderHover: '1px dashed #1980FF',
},
};
});
}
})
</script>
<template>

@ -1,5 +1,5 @@
import { http } from '@/utils/http/axios'
import type { BusinessParam, PageParam } from '/#/api'
import type { PageParam } from '/#/api'
/**
*
@ -26,7 +26,7 @@ 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 && res.data.length ? res.data[0].distionaryList : []
return list
}
@ -72,7 +72,7 @@ export async function getTFList() {
method: 'get',
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data && res.data.length ? res.data[0].distionaryList : []
return list
}
@ -144,7 +144,7 @@ export async function getIztaskrromList(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data && res.data.length ? res.data[0].distionaryList : []
return list
}
@ -160,7 +160,7 @@ export async function getIztaskstatusList(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data && res.data.length ? res.data[0].distionaryList : []
return list
}
@ -190,7 +190,7 @@ export async function getIzfirmList(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data && res.data.length ? res.data[0].distionaryList : []
return list
}
@ -206,7 +206,7 @@ export async function getIzproductnameList(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data && res.data.length ? res.data[0].distionaryList : []
return list
}
@ -222,7 +222,7 @@ export async function getizcustomnameList(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data && res.data.length ? res.data[0].distionaryList : []
return list
}
@ -236,7 +236,7 @@ export async function getIzCustomtypeList(): Promise<any> {
method: 'get',
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data && res.data.length ? res.data[0].distionaryList : []
return list
}
@ -252,7 +252,7 @@ export async function getIzcustomlevel(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data && res.data.length ? res.data[0].distionaryList : []
return list
}
@ -268,13 +268,12 @@ export async function getIzprojecttypeList(enabled: string) {
params: { enabled },
})
const list = res.data&&res.data.length?res.data[0].distionaryList:[]
const list = res.data && res.data.length ? res.data[0].distionaryList : []
return list
}
/**
*
* @param enabled
* @returns
*/
export async function getIzvisitcityList() {
@ -297,7 +296,7 @@ export async function getRejectList() {
method: 'get',
})
return res.data&&res.data.length?res.data[0].distionaryList:[]
return res.data && res.data.length ? res.data[0].distionaryList : []
}
/**
@ -310,7 +309,7 @@ export async function getBackList() {
method: 'get',
})
return res.data&&res.data.length?res.data[0].distionaryList:[]
return res.data && res.data.length ? res.data[0].distionaryList : []
}
/**
@ -363,7 +362,7 @@ export async function getRelationTypeList() {
method: 'get',
})
return res.data&&res.data.length?res.data[0].distionaryList:[]
return res.data && res.data.length ? res.data[0].distionaryList : []
}
/**
@ -375,7 +374,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 && res.data.length ? res.data[0].distionaryList : []
}
/**
@ -387,5 +386,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 && res.data.length ? res.data[0].distionaryList : []
}

@ -65,6 +65,7 @@ export async function repetitionTask() {
/**
*
* @param params
* @returns
*/
export async function getRepeatList(params: FinalParam) {

@ -3,8 +3,12 @@ import type { FilterCondition, FilterParam, FilterSearchParam, FilterUpdate, Pag
/**
*
* @param params
* @returns 1
*
* @param page
* @param searchParam
* @param type
* @returns
*
*/
export async function getConditionList(page: PageParam, searchParam: FilterSearchParam, type: number): Promise<any> {
const res = await http.request({
@ -17,11 +21,11 @@ export async function getConditionList(page: PageParam, searchParam: FilterSearc
},
})
const { data: { records, pages,total } } = res
const { data: { records, pages, total } } = res
return {
pageCount: pages,
data: records,
total
total,
}
}
@ -52,7 +56,7 @@ export async function updateCondition(params: FilterUpdate) {
/**
*
* @param params
* @param { ids: string } params
* @returns
*/
export async function deleteCondition(params: { ids: string }) {
@ -90,7 +94,7 @@ export async function setFilter(params: FilterParam): Promise<void> {
/**
*
* @param params
* @param searchid
* @returns
*/
export async function favorite(searchid: string): Promise<void> {
@ -103,7 +107,7 @@ export async function favorite(searchid: string): Promise<void> {
/**
*
* @param params
* @param searchid
* @returns
*/
export async function unfavorite(searchid: string): Promise<void> {
@ -135,7 +139,7 @@ export async function sort(searchid: string, reorder: number): Promise<void> {
* @param userId
* @returns
*/
export async function getfieldList(reviewType: number, userId: number): Promise<void> {
export async function getfieldList(reviewType: number, userId: number): Promise<void> {
return http.request({
url: `/ocr/user/field/queryFields`,
method: 'get',
@ -148,11 +152,11 @@ export async function sort(searchid: string, reorder: number): Promise<void> {
* @param reviewType
* @returns
*/
export async function getAllfieldList(reviewType: number): Promise<void> {
export async function getAllfieldList(reviewType: number): Promise<void> {
return http.request({
url: `/ocr/field/list`,
method: 'get',
params: { reviewType},
params: { reviewType },
})
}
@ -162,17 +166,13 @@ export async function sort(searchid: string, reorder: number): Promise<void> {
* @param reviewType
* @param userId
* @param userField
*
*
* @returns
*/
export async function savefield(reviewType: number,userId:string,userFieldFixed:string,userFieldUnFixed:string=''): Promise<void> {
export async function savefield(reviewType: number, userId: string, userFieldFixed: string, userFieldUnFixed: string = ''): Promise<void> {
return http.request({
url: `/ocr/user/field/saveOrUpdate`,
method: 'POST',
params: { reviewType,userId,userFieldFixed,userFieldUnFixed},
params: { reviewType, userId, userFieldFixed, userFieldUnFixed },
})
}

@ -79,7 +79,6 @@ export async function getToolsCount() {
})
}
/**
*
* @param note
@ -108,7 +107,7 @@ export async function oneClickCheck(params: Partial<CheckParam> = { search_histo
* @param note
* @returns
*/
export async function oneClickCheckTaskPackage(params: Partial<CheckParam> = { search_history: '0' }) {
export async function oneClickCheckTaskPackage(params: Partial<CheckParam> = { search_history: '0' }) {
const notEmptyParams = pickBy(params, notEmpty)
Object.keys(notEmptyParams).forEach((key) => {
@ -131,8 +130,7 @@ export async function oneClickCheck(params: Partial<CheckParam> = { search_histo
* @param note
* @returns
*/
export async function getLastCheckNo() {
export async function getLastCheckNo() {
return http.request({
url: `/ocr/checkDuplicate/getLastCheckNo`,
method: 'get',
@ -144,8 +142,7 @@ export async function oneClickCheck(params: Partial<CheckParam> = { search_histo
* @param note
* @returns
*/
export async function getCheckDuplicateStatus(checkDuplicateNo) {
export async function getCheckDuplicateStatus(checkDuplicateNo) {
return http.request({
url: `/ocr/checkDuplicate/getCheckDuplicateStatus`,
method: 'get',
@ -158,8 +155,7 @@ export async function oneClickCheck(params: Partial<CheckParam> = { search_histo
* @param note
* @returns
*/
export async function removeCheckDuplicate(checkDuplicateNo) {
export async function removeCheckDuplicate(checkDuplicateNo) {
return http.request({
url: `/ocr/checkDuplicate/removeCheckDuplicate`,
method: 'get',
@ -169,33 +165,31 @@ export async function oneClickCheck(params: Partial<CheckParam> = { search_histo
}
/**
*
* @param
* @param
* @returns
*/
export async function createPackage(params) {
export async function createPackage(params) {
return http.request({
url: `/ocr/ocrTaskPackage/createPackage`,
method: 'post',
params
params,
})
}
/**
*
* @param
* @param
* @returns
*/
export async function deletePackage(params) {
export async function deletePackage(params) {
return http.request({
url: `/ocr/ocrTaskPackage/deletePackage`,
method: 'get',
params
params,
})
}
/**
*
* @param
* @param
* @returns
*/
export async function queryPageListByCheckNo(params: any): Promise<any> {
@ -266,14 +260,13 @@ export async function getPictureList(params: any): Promise<any> {
/**
*
* @param
* @param
* @returns
*/
export async function getFilterList(params) {
return http.request({
url: `/ocr/ocrUsersearch/querySearchCondition`,
method: 'get',
params
params,
})
}
}

@ -6,7 +6,7 @@ import { ContentTypeEnum } from '@/enums/httpEnum'
*
* @returns
*/
export async function getCode(params: {phone: string,agentcode:string}) {
export async function getCode(params: { phone: string, agentcode: string }) {
const res = await http.request({
url: `/web/smslogin/sendcode`,
method: 'get',

@ -1,7 +1,4 @@
import qs from 'qs'
import { http } from '@/utils/http/axios'
import type { ApprovalParam, PageParam } from '/#/api'
import { ContentTypeEnum } from '@/enums/httpEnum'
/**
*
@ -15,7 +12,7 @@ export async function getApprovalList(page: any) {
pageSize: page.pageSize,
currPage: page.pageNo,
keyword: page.keyword,
userSearchId:page.userSearchId
userSearchId: page.userSearchId,
},
})

@ -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', 'close'])
const message = useMessage()
const loading = ref(false)
@ -42,11 +42,11 @@ function showModal(value) {
function closeModal() {
show.value = false
emit('close')
formData.disposeTypeId='262403670085013522'
formData.failCauseId= '260402999231251188'
formData.comment= ''
emit('close')
formData.disposeTypeId = '262403670085013522'
formData.failCauseId = '260402999231251188'
formData.comment = ''
}
defineExpose({
@ -118,9 +118,9 @@ async function handleSumbit(e: MouseEvent) {
}
}
})
formData.disposeTypeId='262403670085013522'
formData.failCauseId= '260402999231251188'
formData.comment= ''
formData.disposeTypeId = '262403670085013522'
formData.failCauseId = '260402999231251188'
formData.comment = ''
}
async function selectChange(id) {

@ -22,7 +22,6 @@ const cardStyle = {
}
function showModal(value) {
console.log(value)
state.detail = value
show.value = true
}
@ -54,8 +53,6 @@ async function handleSumbit(e: MouseEvent) {
// selectRejectId.value === 'other'
// emit('commit', unref(comomitValue), unref(selectBackId), showOther.value)
console.log(state.detail)
console.log(comomitValue)
const param = {
formid: [state.detail.id],
taskId: ['66b06dda-e673-11ee-a934-0242bc74e4f3'],
@ -87,7 +84,6 @@ onBeforeMount(async () => {
})
async function selectChange(id) {
console.log(id, 'selectChange')
selectItem.value = reasonOptions.value.find(v => v.id == id)
}
</script>

@ -30,9 +30,7 @@ function initHandler() {
queryNote().then((res) => {
if (res.data)
note.value = res.data.notecontent
console.log('note:', note.value)
}).catch(e => console.log(e))
}).catch(e => console.error('Quill file -> Error in initHandler function', e))
}
const saveHandler = debounce(() => {

@ -1,21 +1,21 @@
<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";
import { defineProps } from 'vue'
import IPImg from '@/assets/images/IP.png'
defineProps({
canClick: {
type: Boolean,
default: () => false,
},
});
})
</script>
<template>
<div class="ip_box" :style="canClick ? 'cursor: pointer;' : ''">
<img :src="IPImg">
</div>
</template>
<style scoped lang="less">
.ip_box {
position: fixed;

@ -72,9 +72,9 @@ async function getHistory() {
getHistory()
function goPath(item, id) {
const desiredObject = item.data.find(function (item) {
return item.id === id;
});
const desiredObject = item.data.find((item) => {
return item.id === id
})
router.push({ name: item.path, query: { id, searchContent: desiredObject.name } })
emit('close')
}
@ -97,8 +97,10 @@ function highlightText(text, query) {
<img src="../../assets/images/IP.png" alt="">
</div>
<div class="input_box">
<n-input v-model:value="value" placeholder="搜索任务ID、任务名称、提报人、拜访终端" type="text" @input="inputHandler"
@mousedown="handlerShowList">
<n-input
v-model:value="value" placeholder="搜索任务ID、任务名称、提报人、拜访终端" type="text" @input="inputHandler"
@mousedown="handlerShowList"
>
<template #prefix>
<SvgIcon name="magnifying-1" size="18" />
</template>
@ -111,16 +113,20 @@ function highlightText(text, query) {
</div>
<div class="flex history-list">
<div class="tag-wrap">
<div v-for="(item, index) of historyList" :key="index" class="tag"
@click="handlerHistory(item.historyname)">
<div
v-for="(item, index) of historyList" :key="index" class="tag"
@click="handlerHistory(item.historyname)"
>
{{ item.historyname }}
</div>
</div>
<SvgIcon class="icon-delete" name="delete-history" size="16" @click="deleteHistory" />
</div>
</div>
<div v-for="(item, index) in resultList" :key="index" class="list_classfiy_item"
:style="(index === resultList.length - 1) ? '' : 'border-bottom:1px solid #e4e4e4'">
<div
v-for="(item, index) in resultList" :key="index" class="list_classfiy_item"
:style="(index === resultList.length - 1) ? '' : 'border-bottom:1px solid #e4e4e4'"
>
<div class="list_title">
{{ item.title }}
</div>

@ -1,52 +0,0 @@
export const asideMap: Recordable<AsideEntity> = {
izupuser: {
label: '',
defaultValue: null,
isDefaultFilter: true,
key: 'izupuser',
component: ReportUserVue,
},
izproject: {
label: '',
defaultValue: null,
isDefaultFilter: true,
key: 'izproject',
component: IzProjectVue,
},
izplan: {
label: '',
defaultValue: null,
isDefaultFilter: true,
key: 'izplan',
component: PlanVue,
},
izstatus: {
label: '',
defaultValue: null,
isDefaultFilter: false,
key: 'izstatus',
component: PlanVue, // todo
},
izyear: {
label: '',
defaultValue: null,
isDefaultFilter: false,
key: 'izyear',
component: TimeVue,
},
iztaskrrom: {
label: '',
defaultValue: null,
isDefaultFilter: false,
key: 'iztaskrrom',
component: IztaskrromVue,
},
izshowall: {
label: '',
defaultValue: true,
isDefaultFilter: false,
key: 'izshowall',
component: PictureDownloadVue,
inFilterList: false,
},
}

@ -1,5 +1,5 @@
import { IzCustomlevel, IzCustomname, IzCustomtype, IzfirmVue, IzProductVue, IzProjecttype, IzProjectVue, IztaskrromVue, IztaskstatusVue, IzVisitcity, IzvisitproVue, PictureDownloadVue, PictureTypeVue, PictureUploadVue, PlanVue, ReportUserVue, SimilarityVue, TimeVue } from '@/views/home/aside/comp/items'
import type { Component } from 'vue'
import { IzCustomlevel, IzCustomname, IzCustomtype, IzProductVue, IzProjectVue, IzProjecttype, IzVisitcity, IzfirmVue, IztaskrromVue, IztaskstatusVue, IzvisitproVue, PictureDownloadVue, PictureTypeVue, PictureUploadVue, PlanVue, ReportUserVue, SimilarityVue, TimeVue } from '@/views/home/aside/comp/items'
export interface AsideEntity {
label: string

@ -1,6 +1,6 @@
import { defineAsyncComponent } from 'vue'
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 { defineAsyncComponent } from "vue"
export interface RowData {
id: string
@ -85,7 +85,7 @@ export const asideMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izupuser',
// component: ReportUserVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/ReportUser.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/ReportUser.vue')),
},
izproject: {
label: '所属项目',
@ -93,7 +93,7 @@ export const asideMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izproject',
// component: IzProjectVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzProject.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/IzProject.vue')),
},
izplan: {
label: '所属计划',
@ -101,7 +101,7 @@ export const asideMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izplan',
// component: PlanVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Plan.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/Plan.vue')),
},
izstatus: {
label: '审批状态',
@ -109,7 +109,7 @@ export const asideMap: Recordable<AsideEntity> = {
isDefaultFilter: false,
key: 'izstatus',
// component: IzStatus, // todo
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzStatus.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/IzStatus.vue')),
},
izyear: {
label: '提报时间',
@ -117,7 +117,7 @@ export const asideMap: Recordable<AsideEntity> = {
isDefaultFilter: false,
key: 'izyear',
// component: TimeVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Time.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/Time.vue')),
},
iztaskrrom: {
label: '任务来源',
@ -125,7 +125,7 @@ export const asideMap: Recordable<AsideEntity> = {
isDefaultFilter: false,
key: 'iztaskrrom',
// component: IztaskrromVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Iztaskrrom.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/Iztaskrrom.vue')),
},
izshowall: {
label: '显示全部任务数据',
@ -133,7 +133,7 @@ export const asideMap: Recordable<AsideEntity> = {
isDefaultFilter: false,
key: 'izshowall',
// component: IzShowAll,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzShowAll.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/IzShowAll.vue')),
inFilterList: false,
},
}
@ -146,7 +146,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izApprovalStatus',
// component: IzApprovalStatus, // todo
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzApprovalStatus.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/IzApprovalStatus.vue')),
},
izuptime: {
label: '提报时间',
@ -154,7 +154,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izuptime',
// component: TimeVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Time.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/Time.vue')),
},
izupuser: {
label: '提报人',
@ -162,7 +162,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izupuser',
// component: ReportUserVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/ReportUser.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/ReportUser.vue')),
},
iztaskrrom: {
label: '任务来源',
@ -170,7 +170,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'iztaskrrom',
// component: IztaskrromVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Iztaskrrom.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/Iztaskrrom.vue')),
},
izcustomname: {
label: '拜访客户',
@ -178,7 +178,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izcustomname',
// component: IzCustomname,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzCustomname.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/IzCustomname.vue')),
},
izcustomtype: {
label: '客户类型',
@ -186,7 +186,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izcustomtype',
// component: IzCustomtype,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzCustomtype.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/IzCustomtype.vue')),
},
izproject: {
label: '所属项目',
@ -194,7 +194,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izproject',
// component: IzProjectVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzProject.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/IzProject.vue')),
},
izvisitpro: {
label: '拜访省份/直辖市',
@ -202,7 +202,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izvisitpro',
// component: IzVisitcity,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzVisitcity.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/IzVisitcity.vue')),
},
izcustomlevel: {
label: '客户级别',
@ -210,7 +210,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izcustomlevel',
// component: IzCustomlevel,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzCustomlevel.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/IzCustomlevel.vue')),
},
izprojecttype: {
label: '项目类别',
@ -218,7 +218,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izprojecttype',
// component: IzProjecttype,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzProjecttype.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/IzProjecttype.vue')),
},
izproductname: {
label: '产品名称',
@ -226,7 +226,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izproductname',
// component: IzProductVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/IzProduct.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/IzProduct.vue')),
},
izvisitcity: {
label: '拜访城市',
@ -234,7 +234,7 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izvisitcity',
// component: IzvisitproVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Izvisitpro.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/Izvisitpro.vue')),
},
izfirm: {
label: '厂商',
@ -242,6 +242,6 @@ export const asideTaskMap: Recordable<AsideEntity> = {
isDefaultFilter: true,
key: 'izfirm',
// component: IzfirmVue,
component: defineAsyncComponent(() => import("@/views/home/aside/comp/items/Izfirm.vue")),
component: defineAsyncComponent(() => import('@/views/home/aside/comp/items/Izfirm.vue')),
},
}

@ -1,11 +1,11 @@
const commonKeyDown = (keyCode: number) => {
document.dispatchEvent(new KeyboardEvent('keydown', { keyCode }));
function commonKeyDown(keyCode: number) {
document.dispatchEvent(new KeyboardEvent('keydown', { keyCode }))
}
const c = () => {
commonKeyDown(27)
function c() {
commonKeyDown(27)
}
const initBind = (mousetrap) => {
mousetrap.bind('c', c)
function initBind(mousetrap) {
mousetrap.bind('c', c)
}
export default initBind;
export default initBind

@ -1,16 +1,15 @@
<script lang="ts" setup>
import { onBeforeMount, ref } from 'vue';
import { onBeforeMount, ref } from 'vue'
const emit = defineEmits<{
(e: 'commit')
}>()
const props = defineProps({
selectedTotal: {
type: Number,
default: () => 0,
}
},
})
const emit = defineEmits<{
(e: 'commit')
}>()
const show = ref(false)
const cardStyle = {
'width': '450px',

@ -122,8 +122,6 @@ const layout = debounce(() => {
// }
// el.value!.scrollTo({ top: height, behavior: 'instant' })
loading = false
console.log('loading---------------', loading)
console.log('pagination.pageNo---------------', pagination.pageNo)
if (pagination.pageNo == 3) {
let timer
if (timer)
@ -131,7 +129,6 @@ const layout = debounce(() => {
timer = setTimeout(() => {
isTop.value = false
console.log('isTop.value---------------', isTop.value)
}, 1000)
}
})
@ -152,7 +149,6 @@ useInfiniteScroll(
el as any,
() => {
loading = false
console.log('加载了000000000000000---------------------------')
loadMore()
},
{ distance: 10, canLoadMore: () => canloadMore },
@ -162,22 +158,14 @@ 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 })
// TODO
// result.data = Array.from({ length: 30 })
const { data, pageCount } = result
// canloadMore = pageCount >= pagination.pageNo && pageCount > 0;
canloadMore = data.pages >= pagination.pageNo && data.pages > 0
console.log('canloadMore------------', canloadMore)
return result.data.records
// const list = data.map((item) => {
// return {
// imgUrl: randomUrl(),
// }
// })
// return list
}
catch (error) {
canloadMore = false
@ -186,14 +174,12 @@ async function featchList() {
}
async function loadMore() {
console.log('执行l------------------------', loading, el.value, pagination.pageNo)
if (loading || el.value == null)
return
// loading = true
pagination.pageNo = pagination.pageNo + 1
const more = await featchList()
console.log('more------------------------', more)
listData.value.push(...more)
layout()
}
@ -246,21 +232,6 @@ 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 = []
//
@ -451,7 +422,6 @@ async function commit() {
}
}
function remove() {
// console.log("finally-selectedApproveItems------------", selectedApproveItems.value);
if (!selectIds.value || selectIds.value.length === 0) {
message.error('至少选中一个')
return
@ -531,7 +501,6 @@ function approvalHandler(items?: any) {
// => => /
if (items !== undefined && !(items instanceof PointerEvent))
processItems = [items]
console.log('batch-------------', batch.value, selectedApproveItems.value, processItems)
const msg = validate(processItems)
if (msg !== null) {
@ -604,7 +573,6 @@ async function refreshHandler(filtersearchId?: any) {
useInfiniteScroll(
el as any,
() => {
console.log('加载了333333333333333333333333---------------------------')
loadMore()
},
{ distance: 10, canLoadMore: () => canloadMore },
@ -618,13 +586,11 @@ watch(() => show.value, async (newVal) => {
pagination.pageNo = 1
const list = await featchList()
listData.value = list
console.log('加载了1111111111111---------------------------', listData.value)
layout()
}
})
watch(() => pagination.pageNo, (newVal, oldVal) => {
console.log('加载了22222222222222222---------------------------', newVal, oldVal, canloadMore)
if (newVal == oldVal)
return

@ -14,7 +14,7 @@ defineExpose({
<template>
<div>
<n-modal v-model:show="show" :mask="false" :showMask="false" transform-origin="center">
<n-modal v-model:show="show" :mask="false" :show-mask="false" transform-origin="center">
<Search @close="show = false" />
</n-modal>
</div>

@ -9,7 +9,7 @@ const cardStyle = {
'width': '800px',
'--n-padding-bottom': '10px',
'--n-padding-left': '10px',
'padding-bottom':'100px'
'padding-bottom': '100px',
}
function showModal() {
@ -102,7 +102,6 @@ defineExpose({
</div>
<div class="wrapper-request">
<table style="margin-left: 100px;">
<tr>
<td><div class="key" data-key="p p" /></td>
<td>通过</td>

@ -36,7 +36,7 @@ function getSvgName(item: MenuMixedOption) {
class="icon-button" :class="{ 'icon-button--selected': isSelect(item) }"
@click="handleClick(item)"
>
<SvgIcon color="#666666" :size="item.svgsize as number" :name="getSvgName(item)" />
<SvgIcon color="#666666" :size="item.svgsize as number" :name="getSvgName(item)" />
</button>
</template>
<span>{{ item.title }}</span>

@ -1,57 +1,57 @@
<script lang="ts">
import { computed, defineComponent, onMounted, ref, unref, watch } from "vue";
import { useRoute, useRouter } from "vue-router";
import { IconGroup } from "../IconGroup";
import { useAsyncRouteStore } from "@/store/modules/asyncRoute";
import { generatorMenu } from "@/utils";
import { storage } from "@/utils/Storage";
import { CURRENT_USER } from "@/store/mutation-types";
import { computed, defineComponent, onMounted, ref, unref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { IconGroup } from '../IconGroup'
import { useAsyncRouteStore } from '@/store/modules/asyncRoute'
import { generatorMenu } from '@/utils'
import { storage } from '@/utils/Storage'
import { CURRENT_USER } from '@/store/mutation-types'
export default defineComponent({
name: "AppMenu",
name: 'AppMenu',
components: { IconGroup },
emits: ["clickMenuItem"],
emits: ['clickMenuItem'],
setup(props, { emit }) {
//
const currentRoute = useRoute();
const router = useRouter();
const asyncRouteStore = useAsyncRouteStore();
const menus = ref<any[]>([]);
const selectedSvg = ref<string>(currentRoute.meta.svgname as string);
const currentRoute = useRoute()
const router = useRouter()
const asyncRouteStore = useAsyncRouteStore()
const menus = ref<any[]>([])
const selectedSvg = ref<string>(currentRoute.meta.svgname as string)
const getSelectedSvg = computed(() => {
return unref(selectedSvg);
});
return unref(selectedSvg)
})
//
watch(
() => currentRoute.fullPath,
() => {
updateMenu();
}
);
updateMenu()
},
)
function updateSelectedKeys() {
const svgname: string = (currentRoute.meta?.svgname as string) || "";
selectedSvg.value = svgname;
const svgname: string = (currentRoute.meta?.svgname as string) || ''
selectedSvg.value = svgname
}
function updateMenu() {
menus.value = generatorMenu(asyncRouteStore.getMenus);
const userInfo = storage.get(CURRENT_USER);
menus.value = generatorMenu(asyncRouteStore.getMenus)
const userInfo = storage.get(CURRENT_USER)
if (userInfo && userInfo.frontmenuTList) {
menus.value = userInfo.frontmenuTList.map((item) => {
let v = {
const v = {
component: () =>
item.resUrl == "/task"
? import("@/views/task/index.vue")
: item.resUrl == "/home"
? import("@/views/home/index.vue")
: item.resUrl == "/worksheet"
? import("@/views/worksheet/index.vue")
: item.resUrl == "/final"
? import("@/views/final/index.vue")
: "",
item.resUrl == '/task'
? import('@/views/task/index.vue')
: item.resUrl == '/home'
? import('@/views/home/index.vue')
: item.resUrl == '/worksheet'
? import('@/views/worksheet/index.vue')
: item.resUrl == '/final'
? import('@/views/final/index.vue')
: '',
icon: undefined,
key: item.resKey,
label: item.description,
@ -62,38 +62,36 @@ export default defineComponent({
path: item.resUrl,
name: item.resKey,
svgname: item.icon,
svgsize: item.resUrl == "/home" ? 60 : 22,
svgsize: item.resUrl == '/home' ? 60 : 22,
title: item.description,
};
return v;
});
}
return v
})
}
console.log(userInfo.frontmenuTList,'frontmenuTList');
console.log(menus.value,'menus')
updateSelectedKeys();
updateSelectedKeys()
}
//
function clickMenuItem(key: string) {
console.log('clickMenuItem',key)
if (/http(s)?:/.test(key)) window.open(key);
else router.push({ name: key });
if (/http(s)?:/.test(key))
window.open(key)
else router.push({ name: key })
emit("clickMenuItem" as any, key);
emit('clickMenuItem' as any, key)
}
onMounted(() => {
updateMenu();
});
updateMenu()
})
return {
menus,
selectedSvg,
getSelectedSvg,
clickMenuItem,
};
}
},
});
})
</script>
<template>

@ -1,17 +1,17 @@
<script lang="ts" setup>
import { computed, unref } from "vue";
import { Logo } from "./components/Logo";
import { MainView } from "./components/Main";
import { AsideMenu } from "./components/Menu";
import { PageHeader } from "./components/Header";
import { useProjectSetting } from "@/hooks/setting/useProjectSetting";
import { computed, unref } from 'vue'
import { Logo } from './components/Logo'
import { MainView } from './components/Main'
import { AsideMenu } from './components/Menu'
import { PageHeader } from './components/Header'
import { useProjectSetting } from '@/hooks/setting/useProjectSetting'
const { menuSetting } = useProjectSetting();
const { menuSetting } = useProjectSetting()
const leftMenuWidth = computed(() => {
const { minMenuWidth } = unref(menuSetting);
return minMenuWidth;
});
const { minMenuWidth } = unref(menuSetting)
return minMenuWidth
})
</script>
<template>

@ -16,7 +16,7 @@ async function bootstrap() {
setupGlobalProperties(app)
setupRouter(app)
await router.isReady()
const meta = document.createElement('meta')
const meta = document.createElement('meta')
meta.name = 'naive-ui-style'
document.head.appendChild(meta)
app.mount('#app', true)

@ -85,7 +85,6 @@ export function createRouterGuards(router: Router) {
router.afterEach((to, _, failure) => {
document.title = (to?.meta?.title as string) || document.title
if (isNavigationFailure(failure)) {
// console.log('failed navigation', failure)
}
const asyncRouteStore = useAsyncRoute()
// 在这里设置需要缓存的组件名称
@ -108,7 +107,6 @@ export function createRouterGuards(router: Router) {
})
router.onError((error) => {
// eslint-disable-next-line no-console
console.log(error, '路由错误')
console.error(error, '路由错误')
})
}

@ -1,5 +1,5 @@
import { Layout } from '@/router/constant'
import type { RouteRecordRaw } from 'vue-router'
import { Layout } from '@/router/constant'
/**
* @param name , ,
@ -36,7 +36,7 @@ const routes: Array<RouteRecordRaw> = [
},
component: () => import('@/views/map/index.vue'),
},
],
},
]

@ -21,7 +21,7 @@ export const useAsideConfigStore = defineStore({
systemConfig: null,
customConfig: null,
asideValue: null,
searchValue: "",
searchValue: '',
isAllowDownload: true,
timeNum: 0,
filterConfig: [],

@ -1,6 +1,6 @@
import { defineStore } from 'pinia'
import { store } from '@/store'
import { getBackList, getBusinessList, getIzShowList, getIztaskstatusList, getPictureTypeList, getRegionList, getRejectList, getRelationTypeList, getTFList, getizstatusList, getizApprovalStatusList } from '@/api/dictionary'
import { getBackList, getBusinessList, getIzShowList, getIztaskstatusList, getPictureTypeList, getRegionList, getRejectList, getRelationTypeList, getTFList, getizApprovalStatusList, getizstatusList } from '@/api/dictionary'
export interface DictionaryState {
regionList: any
@ -104,32 +104,32 @@ export const useDictionaryStore = defineStore({
},
getizApprovalStatus: (state) => {
return state.izApprovalStatusList
}
},
},
actions: {
initData(){
initData() {
// this.fetchRegionList(); //废弃
this.fetchPictureTypeList();
this.fetchPersionList();
this.fetchPlanList();
this.fetchTFList();
this.fetchPictureTypeList()
this.fetchPersionList()
this.fetchPlanList()
this.fetchTFList()
// this.fetchIzShowList(); //废弃
this.fetchIzProjectList();
this.fetchIztaskrromList();
this.fetchIztaskstatusList();
this.fetchIzvisitproList();
this.fetchIzfirmList();
this.fetchIzproductnameList();
this.fetchizcustomnameList();
this.fetchIzCustomtypeList();
this.fetchIzcustomlevelList();
this.fetchizizprojecttypeList();
this.fetchizvisitcityList();
this.fetchRejectList();
this.fetchBackList();
this.fetchRelationTypeList();
this.fetchizstatusListt();
this.fetchizApprovalStatusList();
this.fetchIzProjectList()
this.fetchIztaskrromList()
this.fetchIztaskstatusList()
this.fetchIzvisitproList()
this.fetchIzfirmList()
this.fetchIzproductnameList()
this.fetchizcustomnameList()
this.fetchIzCustomtypeList()
this.fetchIzcustomlevelList()
this.fetchizizprojecttypeList()
this.fetchizvisitcityList()
this.fetchRejectList()
this.fetchBackList()
this.fetchRelationTypeList()
this.fetchizstatusListt()
this.fetchizApprovalStatusList()
},
settfList(config) {
this.tfList = config

@ -2,8 +2,8 @@ import { defineStore } from 'pinia'
import { store } from '@/store'
import { getFilter } from '@/api/home/filter'
import { getConfig } from '@/api/system/user'
import { asideMap } from "@/config/final";
import { cloneDeep, isEqual } from "lodash-es";
import { asideMap } from '@/config/final'
import { cloneDeep, isEqual } from 'lodash-es'
import type { AsideConfig } from '/#/api'
@ -25,7 +25,7 @@ export const useFinalStore = defineStore({
customConfig: null,
asideValue: null,
listKey: 0,
searchValue: "",
searchValue: '',
isAllowDownload: true,
timeNum: 0,
filterConfig: [],
@ -56,7 +56,6 @@ export const useFinalStore = defineStore({
actions: {
setSystemConfig(config: AsideConfig) {
this.systemConfig = config
console.log("systemConfig----------", config);
},
setAsideValue(value) {
this.asideValue = value
@ -82,25 +81,19 @@ export const useFinalStore = defineStore({
},
// 获取系统配置信息
async fetchConfig() {
// const response = await getConfig()
// console.log("response.data----------", response.data);
// this.setSystemConfig(response.data)
// return response.data
let list: any = {};
let tempAsideMap = cloneDeep(asideMap);
Object.keys(tempAsideMap).map(key => {
list[key] = "Y";
});
console.log("setSystemConfig---------------", list);
this.setSystemConfig(list);
return list
const list: any = {}
const tempAsideMap = cloneDeep(asideMap)
Object.keys(tempAsideMap).forEach((key) => {
list[key] = 'Y'
})
this.setSystemConfig(list)
return list
},
// // 获取终审个性化配置
async fetchCustomConfig() {
const res = await getFilter(1)
const { data } = res
const list = data && data.searchcount ? data.searchcount.split(',') : [];
console.log("listkey---------------", list);
const list = data && data.searchcount ? data.searchcount.split(',') : []
this.customConfig = list
return list
},

@ -12,7 +12,7 @@ export const useTaskStore = defineStore({
packageid: '',
immersion: false,
inFile: false, // 是否进入文件夹
inFileId:"",
inFileId: '',
}),
getters: {
getActiveId: (state: TaskState) => state.activeId,
@ -49,7 +49,7 @@ export const useTaskStore = defineStore({
back() {
if (this.currentIndex === 0)
return
this.setActive(--this.currentIndex)
},
async fetchApprovalList(pagination) {

@ -150,7 +150,6 @@ export const useUserStore = defineStore({
},
// 刷新token
async refreshToken() {
// console.log('refresh token!')
const response = await refreshToken()
const { data: token, code } = response
if (code === ResultEnum.SUCCESS)

@ -28,7 +28,7 @@ export const useWorkOrderStore = defineStore({
this.currentIndex = index
const order = this.packageList[index]
this.activeId = orderId || order?.checkDuplicateId
this.dataId = dataId || order.id;
this.dataId = dataId || order.id
},
forward() {
const len = this.packageList.length

@ -201,9 +201,8 @@ const transform: AxiosTransform = {
// eslint-disable-next-line ts/no-use-before-define
const instance = http.getAxios()
const config = response.config
const whitelist = ['/api/captcha/captchatoken', '/api/captcha/captchaImage', '/api/backstage/adminlogin', '/api/oauthweb/token','/api/web/smslogin/login','/api/web/smslogin/sendcode','/api/ocr/sUser/selectSUser']
const whitelist = ['/api/captcha/captchatoken', '/api/captcha/captchaImage', '/api/backstage/adminlogin', '/api/oauthweb/token', '/api/web/smslogin/login', '/api/web/smslogin/sendcode', '/api/ocr/sUser/selectSUser']
const expirationTime = storage.get(TOKEN_EXPIRATION_TIME)
// console.log('剩余失效时间(分):', (expirationTime - Date.now()) / 1000 / 60, config.url)
if (expirationTime && (expirationTime - Date.now()) <= 0 && !whitelist.includes(config.url as string)) {
if (!isRefreshingToken) {
@ -231,7 +230,6 @@ const transform: AxiosTransform = {
}
else {
return new Promise((resolve) => {
// console.log('刷新token中暂存此请求', config.url)
requests.push((token) => {
(config as Recordable).headers.logintoken = token
resolve(instance(config)) // 执行请求,

@ -115,36 +115,6 @@ onBeforeMount(async () => {
nextTick(() => {
finalStore.$subscribe(() => {
// const customConfig = finalStore.getCustomConfig;
// console.log("customConfigaside---------------", customConfig);
// if (customConfig === null) return;
// const showKeys: string[] = [...customConfig];
// // const defaultKeys = Object.keys(asideMap).filter(
// // (key) => asideMap[key].isDefaultFilter
// // );
// // showKeys.unshift(...defaultKeys);
// Object.keys(asideMap).forEach((key) => {
// //
// if (key.startsWith("iz"))
// asideVisible[key] =
// asideMap[key] && (showKeys.includes(key) || asideMap[key].isDefaultFilter);
// });
// const items = showKeys.reduce((acc, key) => {
// if (asideMap[key]) {
// const config = {
// key,
// config: asideMap[key],
// };
// return [...acc, config];
// } else {
// return acc;
// }
// }, []);
// console.log("showItems111111111---------------", items);
// showItems.value = items;
const config = finalStore.getSystemConfig
const customConfig = finalStore.getCustomConfig
if (
@ -157,13 +127,6 @@ nextTick(() => {
if (config == null || customConfig == null)
return
// console.log("config", config, "customConfig", customConfig);
/* rao
const showKeys = [...customConfig].filter(key => !asideMap[key].isDefaultFilter)// customConfig isDefaultFilter
const defaultKeys = Object.keys(asideMap).filter(key => asideMap[key].isDefaultFilter)// asideMap isDefaultFilter
showKeys.unshift(...defaultKeys)
*/
const sortKeyList: any = []
finalStore.getFilterConfig.forEach((item: any) => {
sortKeyList.push(item?.id)
@ -188,7 +151,6 @@ nextTick(() => {
customObjRef.value[str] = customObjRef.value[str].split(',')
asideValue[key] = customObjRef.value[str] //
console.log('相似度2222222222', asideValue[key])
}
else if (str == 'izyear') {
if (typeof customObjRef.value[str] == 'string') {
@ -198,12 +160,8 @@ nextTick(() => {
customObjRef.value[str] = time
}
asideValue[key] = customObjRef.value[str] //
console.log('时间2222222222', asideValue[key])
}
else if (customObjRef.value[str]) {
console.log('customObjRef.value[str]222222', customObjRef.value[str])
// let list = customObjRef.value[str].split(',');
// console.log("list222222", list);
if (typeof customObjRef.value[str] == 'string') {
customObjRef.value[str] = customObjRef.value[str].split(',')
asideValue[key] = customObjRef.value[str] //
@ -215,17 +173,12 @@ nextTick(() => {
else {
asideValue[key] = null
}
// asideMap[str].defaultValue = customObjRef.value[str];//
}
})
customTempObjRef.value = customObjRef.value
console.log('asideValue直接处理后的结果', asideValue)
console.log('customTempObjRef.value', customTempObjRef.value)
const tempobj = cloneDeep(asideValue)
console.log('tempObj', tempobj)
finalStore.setAsideValue(tempobj)
}
// console.log("showKeys", showKeys);
const items = showKeys.reduce((acc, key) => {
const currentData = asideMap[key]
const render = currentData?.render
@ -242,7 +195,6 @@ nextTick(() => {
return acc
}
}, [])
console.log('showItems=================================', items)
showItems.value = items
configFilterRef.value = finalStore.getFilterConfig
})
@ -276,7 +228,6 @@ function scrollHandler(key: string) {
}
async function filterHandler(searchId: string) {
// emitter.emit("filter-final", searchId);
const res = await getFilterList({ userSearchId: searchId })
// console.log("", res);
if (res.code == 'OK') {
@ -288,7 +239,6 @@ async function filterHandler(searchId: string) {
if (Object.prototype.hasOwnProperty.call(asideMap, key))
showKeys.push(key)
})
console.log('showKeys1111111111111111', showKeys)
finalStore.setCustomConfig(showKeys)
}
}
@ -307,7 +257,6 @@ function inputChange(keyword) {
emit('inputChange', keyword)
}
function handleOk(item: any) {
console.log('handleOk', item)
if (item) {
AdvanceFilterRef.value.setCurrentlySelectedAdvanced(item.searchname)
filterHandler(item.id)
@ -319,27 +268,17 @@ function handleOk(item: any) {
}
function updateComponent(key, e) {
console.log('跟新值', key, e)
console.log('tempAsideValue跟新值', finalStore.getAsideValue, asideValue)
// let tempAsideValue = finalStore.getAsideValue || asideValue;
const tempobj = cloneDeep(asideValue)
console.log(tempobj, 'tempobj')
tempobj[key] = e
console.log(tempobj, 'tempobj After')
customObjRef.value = tempobj
// asideValue = Object.assign({}, asideValue, tempobj);
console.log('asideValue跟新值', tempobj)
finalStore.setAsideValue(tempobj)
}
</script>
<template>
<div
class="aside"
:style="asideStyle"
@mouseenter="asideEnter = true"
@mouseleave="asideEnter = false"
>
<div class="aside" :style="asideStyle" @mouseenter="asideEnter = true" @mouseleave="asideEnter = false">
<div v-show="showCollapse" class="aside-collapse">
<div class="aside-collapse-btn" @click="collapseHandler">
<SvgIcon :name="collapseIcon" size="40" />
@ -368,12 +307,8 @@ function updateComponent(key, e) {
</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"
@update:value="(e) => updateComponent(item.key, e)"
/>
@ -435,17 +370,11 @@ function updateComponent(key, e) {
right: -20px;
}
::v-deep(.n-collapse
.n-collapse-item.n-collapse-item--right-arrow-placement
.n-collapse-item__header
.n-collapse-item-arrow) {
::v-deep(.n-collapse .n-collapse-item.n-collapse-item--right-arrow-placement .n-collapse-item__header .n-collapse-item-arrow) {
margin-left: 8px;
}
::v-deep(.n-collapse
.n-collapse-item
.n-collapse-item__header
.n-collapse-item__header-main) {
::v-deep(.n-collapse .n-collapse-item .n-collapse-item__header .n-collapse-item__header-main) {
font-weight: bold;
justify-content: space-between;
}
@ -458,18 +387,11 @@ function updateComponent(key, e) {
border-top: 0px;
}
::v-deep(.n-collapse
.n-collapse-item
.n-collapse-item__content-wrapper
.n-collapse-item__content-inner) {
::v-deep(.n-collapse .n-collapse-item .n-collapse-item__content-wrapper .n-collapse-item__content-inner) {
padding-top: 10px;
}
::v-deep(.n-scrollbar
> .n-scrollbar-rail.n-scrollbar-rail--vertical
> .n-scrollbar-rail__scrollbar, .n-scrollbar
+ .n-scrollbar-rail.n-scrollbar-rail--vertical
> .n-scrollbar-rail__scrollbar) {
::v-deep(.n-scrollbar > .n-scrollbar-rail.n-scrollbar-rail--vertical > .n-scrollbar-rail__scrollbar, .n-scrollbar + .n-scrollbar-rail.n-scrollbar-rail--vertical > .n-scrollbar-rail__scrollbar) {
width: 0px;
}
}

@ -1,25 +1,30 @@
<script lang="ts" setup>
import { debounce, difference } from 'lodash-es'
import { computed, ref, watch, onMounted } from 'vue'
import { cloneDeep, debounce, difference, isEqual } from 'lodash-es'
import { computed, onMounted, ref, watch } from 'vue'
import { VueDraggable } from 'vue-draggable-plus'
import { setFilter } from '@/api/home/filter'
import { asideMap } from '@/config/final'
import { useFinal } from '@/store/modules/final'
import { cloneDeep, isEqual } from "lodash-es";
const show = ref(false)
const finalStore = useFinal()
const checkAll = ref(false)
const selectIds = ref<string[]>([])
const tempList = ref<string[]>([])
let extraCustomConfig :any = [];
const extraCustomConfig: any = []
//
const offList = ref<any[]>([])
//
const onList = ref<any[]>([])
const offKeyword = ref('')
const onKeyword = ref('')
Object.keys(asideMap).forEach((key) => {
const { isDefaultFilter } = asideMap[key];
if (isDefaultFilter) {
extraCustomConfig.push(key);
}
});
const { isDefaultFilter } = asideMap[key]
if (isDefaultFilter)
extraCustomConfig.push(key)
})
function showModal() {
show.value = true
@ -28,8 +33,6 @@ function showModal() {
const config = finalStore.getSystemConfig
const customConfig = finalStore.getCustomConfig
console.log('开启了啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦筛选条件----------------',config, customConfig)
console.log('开启了啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦筛选条件----------------',tempList.value, finalStore.getFilterConfig)
if (config == null || customConfig == null)
return
if (tempList.value.length > 0 && isEqual(tempList.value, finalStore.getFilterConfig))
@ -37,7 +40,6 @@ function showModal() {
const { showList, hideList } = generatList(config, customConfig)
tempList.value = cloneDeep(showList)
console.log("tempList.value开启了lllllllllllllllllll", showList, hideList);
if (tempList.value.length > 0)
finalStore.setFilterConfig(tempList.value)
@ -54,11 +56,6 @@ function closeModal() {
show.value = false
}
//
const offList = ref<any[]>([])
//
const onList = ref<any[]>([])
const allCount = computed(() => {
return `全部筛选(共${offList.value.length}个)`
})
@ -92,55 +89,31 @@ function generateDefaultList(config) {
}
function generatList(config, customConfig) {
const keys = Object.keys(config)
let onList: object[] = []
let offList: any = []
let showKeys = [];
const tempShowKeys = [...customConfig, ...extraCustomConfig];
tempShowKeys.map(item => {
if(!showKeys.includes(item)) {
showKeys.push(item);
}
});
console.log('原始筛选条件showKeys', showKeys)
console.log('原始筛选条件config customConfig', config, customConfig)
// for (const key of keys) {
// if (!key.startsWith('iz') || config[key] === 'N' || asideMap[key] === undefined)
// continue
// const name = asideMap[key]?.label
// const isDefaultFilter = asideMap[key]?.isDefaultFilter
// // Y
// if (!isDefaultFilter) {
// const isChecked = asideMap[key].isDefaultFilter || showKeys.includes(key)
// offList.push({
// id: key,
// name: name || '',
// fix: isDefaultFilter,
// checked: isChecked,
// })
// if (isChecked && !selectIds.value.includes(key))
// isChecked && selectIds.value.push(key)
// }
// }
Object.keys(asideMap).map(key => {
const offList: any = []
const showKeys: any[] = []
const tempShowKeys = [...customConfig, ...extraCustomConfig]
tempShowKeys.forEach((item) => {
if (!showKeys.includes(item))
showKeys.push(item)
})
Object.keys(asideMap).forEach((key) => {
const name = asideMap[key]?.label
const isDefaultFilter = asideMap[key]?.isDefaultFilter
// Y
// if (!isDefaultFilter) {
const isChecked = asideMap[key].isDefaultFilter || showKeys.includes(key)
const isChecked = asideMap[key].isDefaultFilter || showKeys.includes(key)
offList.push({
id: key,
name: name || '未配置',
fix: isDefaultFilter,
checked: isChecked,
})
if (isChecked && !selectIds.value.includes(key))
isChecked && selectIds.value.push(key)
offList.push({
id: key,
name: name || '未配置',
fix: isDefaultFilter,
checked: isChecked,
})
if (isChecked && !selectIds.value.includes(key))
isChecked && selectIds.value.push(key)
// }
})
@ -161,43 +134,30 @@ function generatList(config, customConfig) {
return acc
}
}, [])
console.log('原始筛选条件onList', onList)
const fixedList = generateDefaultList(config)
// offList.unshift(...fixedList)
console.log('原始筛选条件fixedList', fixedList)
onList.unshift(...fixedList)
console.log('原始筛选条件customConfig', customConfig)
// onListcustomConfig
const tempOnList = cloneDeep(onList)
console.log('原始筛选条件tempOnList', tempOnList)
const sortKeyList: any = []
finalStore.getFilterConfig.map((item: any) => {
console.log("tFilterConfig item000000000000000", item);
finalStore.getFilterConfig.forEach((item: any) => {
sortKeyList.push(item.id)
})
console.log('原始筛选条件sortKeyList', sortKeyList)
console.log('原始筛选条件showKeys', showKeys)
const sortList: any = []
if (sortKeyList.length > 0) {
sortKeyList.map((key) => {
sortKeyList.forEach((key) => {
const tempItem = tempOnList.find(item => item.id == key)
if(tempItem) {
if (tempItem)
sortList.push(tempItem)
}
})
}
else {
showKeys.map((key) => {
showKeys.forEach((key) => {
const tempItem = tempOnList.find(item => item.id == key)
if(tempItem) {
if (tempItem)
sortList.push(tempItem)
}
})
}
console.log('原始筛选条件showList', sortList)
console.log('原始筛选条件hideList', offList)
console.log('原始筛选条件configStore.getFilterConfig', finalStore.getFilterConfig)
// return { showList: onList, hideList: offList }
return { showList: sortList, hideList: offList }
}
@ -208,20 +168,16 @@ finalStore.$subscribe(() => {
if (config == null || customConfig == null)
return
console.log('订阅tempList.value-----------', tempList.value)
console.log('订阅finalStore.getFilterConfig-----------', finalStore.getFilterConfig)
if (tempList.value.length > 0 && isEqual(tempList.value, finalStore.getFilterConfig))
return
const { showList, hideList } = generatList(config, customConfig)
tempList.value = cloneDeep(showList)
console.log('订阅克隆条件', tempList.value)
if (tempList.value.length > 0)
finalStore.setFilterConfig(tempList.value)
// setTimeout(() => {
// }, 500);
console.log('订阅showList, hideList-----------', showList, hideList)
onList.value = showList
offList.value = hideList
})
@ -234,17 +190,13 @@ async function handleSumbit(e: MouseEvent) {
await setFilter({ searchcount: param, type: 1 })
const obj = await finalStore.fetchCustomConfig()
console.log('obj-------------------------------', obj)
const tempOnList = cloneDeep(onList.value)
console.log('提交筛选条件tempOnList', tempOnList)
const sortList: any = []
obj.map((key) => {
obj.forEach((key) => {
const tempItem = tempOnList.find(item => item.id == key)
if(tempItem) {
if (tempItem)
sortList.push(tempItem)
}
})
console.log('finalStore.sortList提交---------------', sortList)
// setTimeout(() => {
if (sortList.length > 0)
finalStore.setFilterConfig(sortList)
@ -359,9 +311,6 @@ function removeHandler(id: string) {
onList.value.splice(index, 1)
}
const offKeyword = ref('')
const onKeyword = ref('')
const leftInputHandler = debounce((keyword) => {
offKeyword.value = keyword
}, 300)
@ -370,19 +319,6 @@ const rightInputHandler = debounce((keyword) => {
onKeyword.value = keyword
}, 300)
// async function getfield() {
// let res
// res = await getAllfieldList(3)
// const userStore = useUser()
// const userInfo = userStore.getUserInfo
// res = await getfieldList(3, userInfo.id)
// }
function onMove(e) {
// e
if (e?.related?.className?.indexOf('fix') !== -1)
return false
}
onMounted(() => {
// getfield()
})

@ -1,5 +1,6 @@
<script lang="ts" setup>
import {
computed,
defineOptions,
h,
nextTick,
@ -8,97 +9,98 @@ import {
reactive,
ref,
unref,
computed,
} from "vue";
import { NDataTable } from "naive-ui";
import type { DataTableColumns, DataTableRowKey } from "naive-ui";
import type { SortableEvent } from "sortablejs";
import Sortable from "sortablejs";
import { debounce } from "lodash-es";
import Action from "@/views/home/aside/comp/Action.vue";
import { deleteCondition, getConditionList, sort } from "@/api/home/filter";
import type { FilterSearchParam } from "/#/api";
} from 'vue'
import { NButton, NDataTable, useModal } from 'naive-ui'
import type { DataTableColumns, DataTableRowKey } from 'naive-ui'
import type { SortableEvent } from 'sortablejs'
import Sortable from 'sortablejs'
import { debounce } from 'lodash-es'
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 SvgIcon from '@/components/Icon/SvgIcon.vue'
import { useModal, NButton } from "naive-ui";
const modal = useModal();
defineOptions({ name: "FilterModal" });
defineOptions({ name: 'FilterModal' })
const emit = defineEmits<{
(e: "showNewFilter"): void;
(e: "editFilter", filter: any): void;
}>();
(e: 'showNewFilter'): void
(e: 'editFilter', filter: any): void
}>()
const modal = useModal()
const show = ref(false);
const checkedRowKeys = ref([]);
const show = ref(false)
const checkedRowKeys = ref([])
const cardStyle = {
width: "800px",
height: "800px",
"--n-padding-bottom": "10px",
"--n-padding-left": "10px",
};
'width': '800px',
'height': '800px',
'--n-padding-bottom': '10px',
'--n-padding-left': '10px',
}
interface RowData {
id: string;
searchname: string;
createby: string;
createtime: string;
updateby: string;
updatetime: string;
id: string
searchname: string
createby: string
createtime: string
updateby: string
updatetime: string
}
const columns: DataTableColumns<RowData> = [
{
type: "selection",
type: 'selection',
},
{
title: "操作",
key: "action",
title: '操作',
key: 'action',
render(row) {
return h(Action, {
options: [
{ label: "编辑", key: 1 },
{ label: "删除", key: 2 },
{ label: '编辑', key: 1 },
{ label: '删除', key: 2 },
],
id: row.id,
select,
});
})
},
},
{
title: "名称",
key: "searchname",
title: '名称',
key: 'searchname',
},
{
title: "创建者",
key: "createby",
title: '创建者',
key: 'createby',
},
{
title: "创建时间",
key: "createtime",
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" });
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(),
},
{
title: "更新者",
key: "updateby",
title: '更新者',
key: 'updateby',
},
{
title: "更新时间",
key: "updatetime",
title: '更新时间',
key: 'updatetime',
},
];
]
const loading = ref(true);
const total = ref(0);
const loading = ref(true)
const total = ref(0)
const pagination = reactive({
page: 1,
pageCount: 1,
@ -106,220 +108,219 @@ const pagination = reactive({
showSizePicker: true,
pageSizes: [
{
label: "10 每页",
label: '10 每页',
value: 10,
},
{
label: "15 每页",
label: '15 每页',
value: 15,
},
{
label: "30 每页",
label: '30 每页',
value: 30,
},
{
label: "50 每页",
label: '50 每页',
value: 50,
},
],
showQuickJumper: true,
prefix: () => `${total.value} 条数据`,
});
const tableData = ref<Array<RowData>>([]);
const keyword = ref("");
})
const tableData = ref<Array<RowData>>([])
const keyword = ref('')
async function query(page: number, pageSize: number) {
const searchParam: FilterSearchParam = {
search_searchname: { value: keyword.value, op: "like", type: "string" },
};
const result = await getConditionList({ pageNo: page, pageSize }, searchParam, 1);
const { data, pageCount, total: totalCount } = result;
total.value = totalCount;
tableData.value = data;
pagination.page = page;
pagination.pageCount = pageCount;
loading.value = false;
search_searchname: { value: keyword.value, op: 'like', type: 'string' },
}
const result = await getConditionList({ pageNo: page, pageSize }, searchParam, 1)
const { data, pageCount, total: totalCount } = result
total.value = totalCount
tableData.value = data
pagination.page = page
pagination.pageCount = pageCount
loading.value = false
}
function afterLeave() {
pagination.page = 1;
pagination.pageCount = 1;
pagination.pageSize = 10;
pagination.page = 1
pagination.pageCount = 1
pagination.pageSize = 10
}
const selectionIds = ref<DataTableRowKey[]>([]);
const selectionIds = ref<DataTableRowKey[]>([])
const rowKey = (row: RowData) => row.id;
const rowKey = (row: RowData) => row.id
function rowProps(row: RowData) {
return {
"data-id": row.id,
};
'data-id': row.id,
}
}
function handleCheck(rowKeys: DataTableRowKey[]) {
selectionIds.value = rowKeys;
selectionIds.value = rowKeys
}
function select(key: number, id: string) {
switch (key) {
case 1:
editSelection(id);
break;
editSelection(id)
break
case 2:
const modalInst = modal.create({
title: "确认提示",
content: "确认删除该条过滤条件吗?",
positiveText: "确定",
negativeText: "取消",
preset: "dialog",
title: '确认提示',
content: '确认删除该条过滤条件吗?',
positiveText: '确定',
negativeText: '取消',
preset: 'dialog',
onPositiveClick: () => deleteSelection(id),
onNegativeClick: () => modalInst.destroy(),
});
})
break;
break
default:
break;
break
}
}
function editSelection(id = "") {
// eslint-disable-next-line dot-notation
function editSelection(id = '') {
// const $message = window["$message"];
// if (selectionIds.value.length === 0 || selectionIds.value.length > 1) {
// $message.error("");
// return;
// }
const selectedId = id;
const selectedId = id
const selectedFilter = tableData.value.find((item: any) => {
return item.id === selectedId;
});
return item.id === selectedId
})
emit("editFilter", selectedFilter);
closeModal();
emit('editFilter', selectedFilter)
closeModal()
}
function deleteSelection(id = "") {
// eslint-disable-next-line dot-notation
function deleteSelection(id = '') {
if (selectionIds.value.length === 0) {
deleteCondition({ ids: id }).then(() => {
query(pagination.page, pagination.pageSize);
});
return;
query(pagination.page, pagination.pageSize)
})
return
}
const modalInst = modal.create({
title: "确认提示",
content: "确认删除所选过滤条件吗?",
positiveText: "确定",
negativeText: "取消",
preset: "dialog",
title: '确认提示',
content: '确认删除所选过滤条件吗?',
positiveText: '确定',
negativeText: '取消',
preset: 'dialog',
onPositiveClick: () =>
deleteCondition({ ids: selectionIds.value.join(",") }).then(() => {
selectionIds.value = [];
query(pagination.page, pagination.pageSize);
deleteCondition({ ids: selectionIds.value.join(',') }).then(() => {
selectionIds.value = []
query(pagination.page, pagination.pageSize)
}),
onNegativeClick: () => modalInst.destroy(),
});
})
}
async function handlePageChange(currentPage) {
if (loading.value) return;
pagination.page = currentPage;
const { pageSize } = pagination;
await query(currentPage, pageSize);
if (loading.value)
return
pagination.page = currentPage
const { pageSize } = pagination
await query(currentPage, pageSize)
}
async function handlePageSizeChange(currentPageSize) {
if (loading.value) return;
if (loading.value)
return
const { page } = pagination;
pagination.pageSize = currentPageSize;
const { page } = pagination
pagination.pageSize = currentPageSize
await query(page, currentPageSize);
await query(page, currentPageSize)
}
function handleClick() {
emit("showNewFilter");
emit('showNewFilter')
// show.value = false;
closeModal();
closeModal()
}
let sortTable: Sortable | null = null;
const tableRef = ref<InstanceType<typeof NDataTable>>();
let sortTable: Sortable | null = null
const tableRef = ref<InstanceType<typeof NDataTable>>()
onMounted(() => {
nextTick(() => {
console.log(tableRef.value, "tableRef");
});
});
})
})
async function showModal() {
show.value = true;
show.value = true
const { page, pageSize } = pagination;
await query(page, pageSize);
const { page, pageSize } = pagination
await query(page, pageSize)
nextTick(() => {
if (sortTable !== null) destory();
const el: HTMLDivElement = tableRef.value?.$el;
const tbody: HTMLElement | null = el.querySelector("tbody.n-data-table-tbody")!;
if (tbody) sortTable = Sortable.create(tbody, { onEnd, onMove });
});
if (sortTable !== null)
destory()
const el: HTMLDivElement = tableRef.value?.$el
const tbody: HTMLElement | null = el.querySelector('tbody.n-data-table-tbody')!
if (tbody)
sortTable = Sortable.create(tbody, { onEnd, onMove })
})
}
let relatedId = "";
let insertafter = false;
let relatedId = ''
let insertafter = false
// TODO: bug
function onEnd(event: SortableEvent) {
const data = unref(tableData);
const oldElem = data[event.oldIndex!];
data.splice(event.oldIndex!, 1);
data.splice(event.newIndex!, 0, oldElem);
const data = unref(tableData)
const oldElem = data[event.oldIndex!]
data.splice(event.oldIndex!, 1)
data.splice(event.newIndex!, 0, oldElem)
const dragId = oldElem.id;
const dragId = oldElem.id
const index = data.findIndex((item) => {
return item.id === relatedId;
});
return item.id === relatedId
})
// -1+1
const order = insertafter ? index - 1 : index + 1;
// console.log('dragid:', dragId, 'order:', order)
sort(dragId, order);
const order = insertafter ? index - 1 : index + 1
sort(dragId, order)
}
function onMove(evt: any) {
relatedId = evt.related?.dataset?.id;
insertafter = evt.willInsertAfter;
// console.log(`${evt.dragged.dataset.id},${evt.related}`, 'insertafter', evt.willInsertAfter)
relatedId = evt.related?.dataset?.id
insertafter = evt.willInsertAfter
}
function destory() {
sortTable && sortTable.destroy();
sortTable = null;
sortTable && sortTable.destroy()
sortTable = null
}
onUnmounted(() => {
destory();
});
destory()
})
function closeModal() {
show.value = false;
show.value = false
}
defineExpose({
showModal,
query,
pagination,
});
})
const inputHandler = debounce((word) => {
keyword.value = word;
query(1, 5);
}, 300);
keyword.value = word
query(1, 5)
}, 300)
const showSearch = computed(() => {
return selectionIds.value.length > 0;
});
return selectionIds.value.length > 0
})
</script>
<template>
@ -331,9 +332,9 @@ const showSearch = computed(() => {
v-model:show="show"
transform-origin="center"
display-directive="if"
@after-leave="afterLeave"
:mask-closable="false"
class="modal_wrapper"
@after-leave="afterLeave"
>
<n-card
:style="cardStyle"
@ -352,11 +353,10 @@ const showSearch = computed(() => {
'font-size': '16px',
'font-weight': '600',
}"
>基本信息</span
>
>基本信息</span>
</div>
</div>
<div class="wrapper-form" v-if="!showSearch">
<div v-if="!showSearch" class="wrapper-form">
<n-input
:style="{ width: '360px', border: '1px solid #cad2dd' }"
placeholder="请输入过滤条件名称搜索"
@ -366,31 +366,29 @@ const showSearch = computed(() => {
<SvgIcon size="14px" name="magnifying-1" />
</template>
</n-input>
<n-button type="info" @click="handleClick">
<NButton type="info" @click="handleClick">
创建
<template #icon>
<SvgIcon size="14px" name="creatFilter" />
</template>
</n-button>
</NButton>
</div>
<div class="wrapper-form" v-else>
<div v-else class="wrapper-form">
<div class="del_btn">
<n-button icon-placement="left" size="medium" @click="deleteSelection">
<NButton icon-placement="left" size="medium" @click="deleteSelection">
<template #icon>
<SvgIcon name="delete-history" size="16" />
</template>
删除</n-button
>
删除
</NButton>
</div>
<div class="msg">
<span
>已选中
<span>已选中
<span style="color: #507afd; font-size: 16px">{{
selectionIds.length
}}</span>
</span
>
</span>
<a @click="selectionIds = []">清空</a>
</div>
</div>
@ -405,19 +403,21 @@ const showSearch = computed(() => {
:loading="loading"
:pagination="pagination"
:row-key="rowKey"
:checked-row-keys="selectionIds"
@update:page="handlePageChange"
@update-page-size="handlePageSizeChange"
@update:checked-row-keys="handleCheck"
:checked-row-keys="selectionIds"
/>
</div>
</div>
<template #footer>
<div class="wrapper-footer">
<n-button type="info" @click="closeModal"> </n-button>
<n-button secondary style="margin-left: 15px" @click="closeModal">
<NButton type="info" @click="closeModal">
确认
</NButton>
<NButton secondary style="margin-left: 15px" @click="closeModal">
取消
</n-button>
</NButton>
</div>
</template>
</n-card>

@ -1,188 +1,192 @@
<script lang="ts" setup>
import { reactive, ref, unref } from "vue";
import * as XLSX from "xlsx";
import { arrayEquals } from "@/utils/index";
import { generateUuid } from "@/utils/uuid";
import { reactive, ref, unref } from 'vue'
import * as XLSX from 'xlsx'
import { arrayEquals } from '@/utils/index'
import { generateUuid } from '@/utils/uuid'
const props = defineProps<{
onSuccess: Function;
headerConfig: string[];
}>();
onSuccess: Function
headerConfig: string[]
}>()
interface ExcelData {
header: string[] | null;
content: any[] | null;
header: string[] | null
content: any[] | null
}
interface ParseResults {
fileName: string;
results: any[];
uuid: string;
fileName: string
results: any[]
uuid: string
}
const cardStyle = {
width: "620px",
"--n-padding-bottom": "10px",
"--n-padding-left": "0px",
};
const inputRef = ref(null);
let loading = false;
const excelData: ExcelData = { header: null, content: null };
const excelDatas: ParseResults[] = reactive([]);
'width': '620px',
'--n-padding-bottom': '10px',
'--n-padding-left': '0px',
}
const inputRef = ref(null)
let loading = false
const excelData: ExcelData = { header: null, content: null }
const excelDatas: ParseResults[] = reactive([])
function generateData(content) {
excelData.header = props.headerConfig;
excelData.content = content;
props.onSuccess && props.onSuccess(excelData);
excelData.header = props.headerConfig
excelData.content = content
props.onSuccess && props.onSuccess(excelData)
}
function handleDrop(e) {
e.stopPropagation();
e.preventDefault();
if (loading) return;
const files = e.dataTransfer.files;
const rawFiles = Array.from(files);
e.stopPropagation()
e.preventDefault()
if (loading)
return
const files = e.dataTransfer.files
const rawFiles = Array.from(files)
// eslint-disable-next-line dot-notation
const $message = window["$message"];
const $message = window['$message']
if (!isExcel(rawFiles)) {
$message.error("Only supports upload .xlsx, .xls, .csv suffix files");
return false;
$message.error('Only supports upload .xlsx, .xls, .csv suffix files')
return false
}
uploadFiles(rawFiles);
e.stopPropagation();
e.preventDefault();
uploadFiles(rawFiles)
e.stopPropagation()
e.preventDefault()
}
async function uploadFiles(files) {
const inputEl: HTMLInputElement | null = unref(inputRef);
inputEl!.value = "";
const inputEl: HTMLInputElement | null = unref(inputRef)
inputEl!.value = ''
loading = true;
loading = true
for (const file of files) {
const fileData = await readFileData(file);
const message = validate(fileData);
const fileData = await readFileData(file)
const message = validate(fileData)
// TODO
if (message === undefined || true) {
const uuid = generateUuid();
const uuid = generateUuid()
excelDatas.push({
fileName: file.name,
results: (fileData as any).results,
uuid,
});
})
}
}
loading = false;
loading = false
}
function commitData() {
const mergeResults: any[] = [];
const mergeResults: any[] = []
if (excelDatas.length === 0) return;
if (excelDatas.length === 0)
return
excelDatas.forEach((item) => {
mergeResults.push(...item.results);
});
mergeResults.push(...item.results)
})
generateData(mergeResults);
generateData(mergeResults)
}
function validate(fileData) {
const { header } = fileData;
const { header } = fileData
//
const equal = arrayEquals(header, props.headerConfig);
const equal = arrayEquals(header, props.headerConfig)
if (!equal) return "表头不匹配";
if (!equal)
return '表头不匹配'
// TODO
}
function readFileData(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
const reader = new FileReader()
reader.onload = (e) => {
const data = e.target!.result;
const workbook = XLSX.read(data, { type: "array" });
const firstSheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[firstSheetName];
const header = getHeaderRow(worksheet);
const results = XLSX.utils.sheet_to_json(worksheet);
resolve({ header, results });
};
reader.readAsArrayBuffer(file);
});
const data = e.target!.result
const workbook = XLSX.read(data, { type: 'array' })
const firstSheetName = workbook.SheetNames[0]
const worksheet = workbook.Sheets[firstSheetName]
const header = getHeaderRow(worksheet)
const results = XLSX.utils.sheet_to_json(worksheet)
resolve({ header, results })
}
reader.readAsArrayBuffer(file)
})
}
function handleDragover(e) {
e.stopPropagation();
e.preventDefault();
e.dataTransfer.dropEffect = "copy";
e.stopPropagation()
e.preventDefault()
e.dataTransfer.dropEffect = 'copy'
}
function handleUpload() {
(inputRef.value as any).click();
(inputRef.value as any).click()
}
function handleClick(e) {
const files = e.target.files;
const rawFiles = Array.from(files);
uploadFiles(rawFiles);
const files = e.target.files
const rawFiles = Array.from(files)
uploadFiles(rawFiles)
}
function getHeaderRow(sheet) {
const headers: string[] = [];
const range = XLSX.utils.decode_range(sheet["!ref"]);
let C;
const R = range.s.r;
const headers: string[] = []
const range = XLSX.utils.decode_range(sheet['!ref'])
let C
const R = range.s.r
/* start in the first row */
for (C = range.s.c; C <= range.e.c; ++C) {
/* walk every column in the range */
const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })];
const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })]
/* find the cell in the first row */
let hdr = `UNKNOWN ${C}`; // <-- replace with your desired default
if (cell && cell.t) hdr = XLSX.utils.format_cell(cell);
headers.push(hdr);
let hdr = `UNKNOWN ${C}` // <-- replace with your desired default
if (cell && cell.t)
hdr = XLSX.utils.format_cell(cell)
headers.push(hdr)
}
return headers;
return headers
}
function isExcel(files) {
return files.every((file) => {
return /\.(xlsx|xls|csv)$/.test(file.name);
});
return /\.(xlsx|xls|csv)$/.test(file.name)
})
}
const show = ref(false);
const show = 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();
commitData();
closeModal();
e.preventDefault()
commitData()
closeModal()
}
defineExpose({
showModal,
});
})
function removeHandler(id: string) {
const index = excelDatas.findIndex((item) => item.uuid === id);
excelDatas.splice(index, 1);
const index = excelDatas.findIndex(item => item.uuid === id)
excelDatas.splice(index, 1)
}
function afterLeave() {
excelDatas.length = 0;
excelDatas.length = 0
}
</script>
@ -218,7 +222,7 @@ function afterLeave() {
type="file"
accept=".xlsx, .xls,.csv"
@change="handleClick"
/>
>
<SvgIcon
style="margin-top: 32px; margin-bottom: 13px"
size="45"
@ -226,9 +230,7 @@ function afterLeave() {
@click="handleUpload"
/>
<span class="wrapper-tip1">点击或拖拽审批文件到这里上传</span>
<span style="margin-top: 3px; margin-bottom: 19px" class="wrapper-tip2"
>支持上传格式.xls .xlsx .csv的文件</span
>
<span style="margin-top: 3px; margin-bottom: 19px" class="wrapper-tip2">支持上传格式.xls .xlsx .csv的文件</span>
</div>
<div
v-for="(item, index) in excelDatas"
@ -249,7 +251,9 @@ function afterLeave() {
</div>
<template #footer>
<div class="footer">
<n-button type="info" @click="handleSumbit"> </n-button>
<n-button type="info" @click="handleSumbit">
确认
</n-button>
</div>
</template>
</n-card>

@ -1,108 +1,108 @@
<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, defineEmits, 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 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!,
@ -110,164 +110,165 @@ 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 === "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}`
}
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]
}
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;
}
);
logicOptions.value = newval
},
)
function showModal() {
show.value = true;
show.value = true
}
function closeModal() {
emit("onOk");
emit('onOk')
setTimeout(() => {
show.value = false;
}, 300);
show.value = false
}, 300)
}
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"
@after-leave="leaveHandler"
>
<n-card
:style="cardStyle"
@ -286,8 +287,7 @@ defineExpose({
'font-size': '16px',
'font-weight': '600',
}"
>基本信息</span
>
>基本信息</span>
</div>
</div>
<div class="wrapper-form">
@ -296,14 +296,14 @@ defineExpose({
<n-input
v-model:value="formValue.name"
:style="{ width: '780px' }"
@keydown.enter.prevent
placeholder="请输入过滤名称"
@keydown.enter.prevent
/>
</n-form-item>
<n-form-item path="logic" label="逻辑关系" v-show="false">
<n-form-item v-show="false" path="logic" label="逻辑关系">
<n-select
filterable
v-model:value="formValue.logic"
filterable
placeholder="请选择逻辑关系"
:options="logicOptions"
/>
@ -316,15 +316,15 @@ defineExpose({
:label="formLabel(index)"
>
<n-select
filterable
v-model:value="item.type"
filterable
placeholder="请选择筛选项名称"
:options="typeOptions"
@change="item.result = ''"
/>
<n-select
filterable
v-model:value="item.operator"
filterable
style="margin-left: 8px"
placeholder="请选择"
:options="operatorOptions"
@ -338,9 +338,9 @@ defineExpose({
/>
</n-space>
<n-select
filterable
v-else
v-model:value="item.result"
filterable
style="margin-left: 8px"
placeholder="请选择"
:options="getOptions(item.type!)"
@ -364,7 +364,9 @@ defineExpose({
</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>

@ -78,11 +78,11 @@ onBeforeMount(async () => {
</div>
<div class="wrapper-content">
<span>处理方式</span>
<n-select filterable v-model:value="selectBackId" style="margin-top: 10px;" :options="backOptions" />
<n-select v-model:value="selectBackId" filterable style="margin-top: 10px;" :options="backOptions" />
</div>
<div class="wrapper-content">
<span>不通过原因</span>
<n-select filterable v-model:value="selectRejectId" style="margin-top: 10px;" :options="reasonOptions" />
<n-select v-model:value="selectRejectId" filterable style="margin-top: 10px;" :options="reasonOptions" />
<n-input v-show="showOther" v-model:value="otherValue" type="textarea" placeholder="备注内容" style="margin-top: 10px;" />
</div>
</div>

@ -54,14 +54,6 @@ async function query() {
sortname: '',
})
const { data } = result
// console.log(data)
// // const list = []
// // data.forEach((items) => {
// // items.repeatedTaskList.forEach((item) => {
// // list.push(item)
// // })
// // })
// console.log(data)
emit('reject', data)
closeModal()
}

@ -190,8 +190,6 @@ async function query(page: number, pageSize: number) {
pageNo: pagination.page,
sortname: '',
})
console.log(666666)
console.log(result)
const { data, pageCount, totalCount } = result
total.value = totalCount
@ -288,7 +286,6 @@ function batchApproval() {
message.error(msg)
return
}
console.log(items)
const list: any = []
items.forEach((item) => {
list.push({

@ -483,7 +483,6 @@ const message = useMessage()
const finalStore = useFinal()
async function query(page: number, pageSize: number, filterId?: any, taskName?: string) {
console.log('query', taskName)
const asideParmas = unref(finalStore.getAsideValue)
// 使使
// let params = filterId ? { userSearchId: filterId } : asideParmas
@ -498,7 +497,7 @@ async function query(page: number, pageSize: number, filterId?: any, taskName?:
taskName,
...params,
})
const { data, pageCount, totalCount } = result
const { data, totalCount } = result
tableData.value = data
total.value = totalCount
pagination.page = page
@ -708,7 +707,7 @@ function resetHandler() {
// TODO
// const result = await resetApproval()
},
onNegativeClick: () => {},
onNegativeClick: () => { },
})
}
@ -749,7 +748,6 @@ function batchApproval() {
message.error(msg)
return
}
console.log(items)
const list: any = []
items.forEach((item) => {
list.push({
@ -774,7 +772,6 @@ function batchApproval() {
//
function repeatBatchReject(items) {
console.log(items)
rejectHandler(items)
}
@ -815,7 +812,7 @@ function doAudit(param: any) {
}
})
},
onNegativeClick: () => {},
onNegativeClick: () => { },
})
}
@ -860,17 +857,18 @@ async function refreshHandler(searchId?: any) {
if (id_param)
searchKeyword = id_param[0].slice(1, -1)
}
console.log('refreshHandler', searchKeyword)
query(pagination.page, pagination.pageSize, searchId, searchKeyword)
}
function filterTableData(keyword) {
pagination.page = 1
pagination.pageSize = 10
if (keyword)
if (keyword) {
query(pagination.page, pagination.pageSize, '', keyword)
else
}
else {
query(pagination.page, pagination.pageSize)
}
}
defineExpose({
@ -883,20 +881,10 @@ 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 style="cursor: pointer" size="16" name="list-mode" @click="changeContent" />
</div>
<div>
<SvgIcon
style="margin-right: 6px"
size="13"
name="summary"
@click="showModal(repeatModalRef)"
/>
<SvgIcon style="margin-right: 6px" size="13" name="summary" @click="showModal(repeatModalRef)" />
<NButton class="xjcc" text @click="showModal(repeatModalRef)">
小结查重
</NButton>
@ -916,27 +904,16 @@ defineExpose({
</NButton>
<img
class="btn-approval btn-left"
src="@/assets/images/task/btn-not-pass.png"
alt=""
class="btn-approval btn-left" src="@/assets/images/task/btn-not-pass.png" alt=""
@click.stop="batchReject"
>
<SvgIcon size="24" name="vs" />
<img
class="btn-approval"
src="@/assets/images/task/btn-pass.png"
alt=""
@click.stop="batchApproval"
>
<img class="btn-approval" src="@/assets/images/task/btn-pass.png" alt="" @click.stop="batchApproval">
</div>
<n-popover
ref="popover"
:style="{ padding: '0px' }"
style="width: 148px"
:show-arrow="false"
placement="bottom-start"
trigger="click"
ref="popover" :style="{ padding: '0px' }" style="width: 148px" :show-arrow="false"
placement="bottom-start" trigger="click"
>
<template #trigger>
<div class="icon-wrap">
@ -977,46 +954,22 @@ defineExpose({
</div>
</div> -->
<div class="wrapper-settings">
<SvgIcon
style="cursor: pointer"
size="18"
name="column"
@click="showModal(customTabelRef)"
/>
<SvgIcon style="cursor: pointer" size="18" name="column" @click="showModal(customTabelRef)" />
</div>
<div class="wrapper-content">
<NDataTable
id="table"
ref="tableRef"
v-model:checked-row-keys="checkedRowKeys"
remote
:columns="columnsRef"
:scroll-x="scrollX"
:max-height="maxHeight"
:data="tableData"
:loading="loading"
:pagination="pagination"
:row-key="rowKey"
@update:page="handlePageChange"
@update-page-size="handlePageSizeChange"
@update:checked-row-keys="handleCheck"
@update:sorter="handleSorterChange"
id="table" ref="tableRef" v-model:checked-row-keys="checkedRowKeys" remote :columns="columnsRef"
:scroll-x="scrollX" :max-height="maxHeight" :data="tableData" :loading="loading" :pagination="pagination"
:row-key="rowKey" @update:page="handlePageChange" @update-page-size="handlePageSizeChange"
@update:checked-row-keys="handleCheck" @update:sorter="handleSorterChange"
/>
</div>
<CustomTabelModal ref="customTabelRef" @commit="commitHandler" />
<ImportExcelModal
ref="importExcelRef"
:on-success="sucessHandler"
:header-config="headRules"
/>
<ImportExcelModal ref="importExcelRef" :on-success="sucessHandler" :header-config="headRules" />
<NotPassed ref="notPassModalRef" @success="reload" />
<RepeatModal
ref="repeatModalRef"
@reject="repeatBatchReject"
@viewrepeat="showModal(repeatTaskTableModalRef)"
/>
<RepeatModal ref="repeatModalRef" @reject="repeatBatchReject" @viewrepeat="showModal(repeatTaskTableModalRef)" />
<RepeatTaskTableModal ref="repeatTaskTableModalRef" />
</div>
</template>

@ -1,36 +1,36 @@
<script lang="ts" setup>
import { onMounted, ref } from "vue";
import testImg from "@/assets/images/test.png";
import {chunk} from 'lodash-es'
import { onMounted, ref } from 'vue'
import { chunk } from 'lodash-es'
import testImg from '@/assets/images/test.png'
const emit = defineEmits(["changeShow"]);
const emit = defineEmits(['changeShow'])
function changeContent() {
emit("changeShow");
emit('changeShow')
}
function initRem() {
const designWidth = 1440
const rempPx = 16
const scale = window.innerWidth / designWidth
document.documentElement.style.fontSize = `${scale * rempPx}px`
}
const initRem = () => {
const designWidth = 1440;
const rempPx = 16;
const scale = window.innerWidth / designWidth;
document.documentElement.style.fontSize = scale * rempPx + "px";
};
onMounted(() => {
initRem();
});
initRem()
})
const item = {
img: testImg,
checked: false,
title: "YP4567890545",
date: "2023-12-19 12:09:18",
};
const data = ref<any[]>([]);
title: 'YP4567890545',
date: '2023-12-19 12:09:18',
}
const data = ref<any[]>([])
onMounted(() => {
for (let i = 0; i < 8; i++) {
data.value.push(item as any);
}
data.value = chunk(data.value,4)
});
for (let i = 0; i < 8; i++)
data.value.push(item as any)
data.value = chunk(data.value, 4)
})
</script>
<template>
@ -48,11 +48,11 @@ onMounted(() => {
</div>
<div class="header_data">
<DataHeader :hasColor="true" />
<DataHeader :has-color="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 v-for="(sitem, sindex) in data" :key="sindex" class="data_wrapper">
<div v-for="(item, index) in sitem" :key="index" class="item">
<div class="top">
<div
class="img"
@ -61,13 +61,17 @@ onMounted(() => {
<!-- <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="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"
class="tag_item"
:style="index == 2 ? 'color:#02C984' : 'color:#507AFD'"
>
{{ index == 1 ? "待确认" : "张思" }}
@ -76,8 +80,12 @@ onMounted(() => {
</div>
</div>
<div class="bottom">
<div class="resovle_action">通过</div>
<div class="reject_action">不通过</div>
<div class="resovle_action">
通过
</div>
<div class="reject_action">
不通过
</div>
</div>
</div>
</div>

@ -5,7 +5,6 @@ import Content from './content/Content.vue'
import ListContent from './content/ListContent.vue'
import Robot from '@/components/Robot/index.vue'
defineOptions({
name: 'FinalMain',
})

@ -9,9 +9,7 @@ import {
ref,
shallowRef,
unref,
watch,
} from 'vue'
import dayjs from 'dayjs'
import { cloneDeep, isEqual } from 'lodash-es'
import { CustomFilterModalVue, FilterModalVue, NewFilterModalVue } from './comp/modals'
import Search from './comp/Search.vue'
@ -19,11 +17,9 @@ import AdvanceFilter from './comp/AdvanceFilter.vue'
import { getViewportOffset } from '@/utils/domUtils'
import { useWindowSizeFn } from '@/hooks/event/useWindowSizeFn'
import { useConfig } from '@/store/modules/asideConfig'
import type { Filter } from '/#/home'
import type { AsideEntity } from '@/config/aside'
import { asideMap } from '@/config/aside'
import type { AsideConfig } from '/#/api'
import emitter from '@/utils/mitt'
import { getFilterList } from '@/api/home/main'
const configStore = useConfig()
@ -57,9 +53,7 @@ function showModal(modalRef: any) {
onMounted(() => {
nextTick(() => {
computeSlideHeight()
const tempAsideValue = cloneDeep(asideValue)
// configStore.setAsideValue(tempAsideValue);
console.log('asideMap和asideValue', tempAsideValue)
})
})
@ -115,7 +109,6 @@ nextTick(() => {
if (config == null || customConfig == null)
return
// console.log("config", config, "customConfig", customConfig);
/* rao
const showKeys = [...customConfig].filter(key => !asideMap[key].isDefaultFilter)// customConfig isDefaultFilter
const defaultKeys = Object.keys(asideMap).filter(key => asideMap[key].isDefaultFilter)// asideMap isDefaultFilter
@ -143,13 +136,11 @@ nextTick(() => {
// if (asideMap.hasOwnProperty(key)) {
if (Object.prototype.hasOwnProperty.call(customObjRef.value, key)) {
const str = key.toLowerCase()
// console.log("customObjRef.value[str]1111111111111", customObjRef.value[str]);
if (str == 'izsimilarity') {
if (typeof customObjRef.value[str] == 'string')
customObjRef.value[str] = customObjRef.value[str].split(',')
asideValue[key] = customObjRef.value[str] //
console.log('相似度2222222222', asideValue[key])
}
else if (str == 'izyear') {
if (typeof customObjRef.value[str] == 'string') {
@ -159,16 +150,13 @@ nextTick(() => {
customObjRef.value[str] = time
}
asideValue[key] = customObjRef.value[str] //
console.log('时间2222222222', asideValue[key])
}
else if (
str != 'izsimilarity'
&& str != 'izyear'
&& customObjRef.value[str]
) {
console.log('customObjRef.value[str]222222', customObjRef.value[str])
// let list = customObjRef.value[str].split(',');
// console.log("list222222", list);
asideValue[key] = customObjRef.value[str] //
}
else {
@ -179,13 +167,9 @@ nextTick(() => {
return key
})
customTempObjRef.value = customObjRef.value
console.log('asideValue直接处理后的结果', asideValue)
console.log('customTempObjRef.value', customTempObjRef.value)
const tempobj = cloneDeep(asideValue)
console.log('tempObj', tempobj)
configStore.setAsideValue(tempobj)
}
// console.log("showKeys", showKeys);
const items = showKeys.reduce((acc, key) => {
const currentData = asideMap[key]
const render = currentData?.render
@ -202,7 +186,6 @@ nextTick(() => {
return acc
}
}, [])
console.log('showItems=================================', items)
showItems.value = items
configFilterRef.value = configStore.getFilterConfig
})
@ -236,7 +219,6 @@ function scrollHandler(key: string) {
async function filterHandler(searchId: string) {
// emitter.emit('filter', searchId)
const res = await getFilterList({ userSearchId: searchId })
// console.log("", res);
if (res.code == 'OK') {
const obj = res.data
customObjRef.value = res.data
@ -249,7 +231,6 @@ async function filterHandler(searchId: string) {
return key
})
// console.log(showKeys);
configStore.setCustomConfig(showKeys)
}
}
@ -261,21 +242,14 @@ function editFilter(filter: any) {
}
function updateComponent(key, e) {
console.log('跟新值', key, e)
console.log('tempAsideValue跟新值', configStore.getAsideValue, asideValue)
// let tempAsideValue = configStore.getAsideValue || asideValue;
const tempobj = cloneDeep(asideValue)
console.log(tempobj, 'tempobj')
tempobj[key] = e
console.log(tempobj, 'tempobj After')
customObjRef.value = tempobj
// asideValue = Object.assign({}, asideValue, tempobj);
console.log('asideValue跟新值', tempobj)
configStore.setAsideValue(tempobj)
}
function handleOk(item: any) {
console.log('handleOk', item)
if (item) {
AdvanceFilterRef.value.setCurrentlySelectedAdvanced(item.searchname)
filterHandler(item.id)
@ -285,20 +259,10 @@ function handleOk(item: any) {
filterHandler('')
}
}
// watch(asideValue, (newVal) => {
// console.log("asideValue", newVal);
// configStore.setAsideValue(newVal)
// }, { deep: true })
</script>
<template>
<div
class="aside"
:style="asideStyle"
@mouseenter="asideEnter = true"
@mouseleave="asideEnter = false"
>
<div class="aside" :style="asideStyle" @mouseenter="asideEnter = true" @mouseleave="asideEnter = false">
<div v-show="showCollapse" class="aside-collapse">
<div class="aside-collapse-btn" @click="collapseHandler">
<SvgIcon :name="collapseIcon" size="40" />
@ -307,38 +271,24 @@ function handleOk(item: any) {
<n-scrollbar trigger="none">
<div class="aside-header">
<!-- 搜索跳转模块 -->
<Search
v-show="showSearch"
@select="scrollHandler"
@close="setShowSearch(false)"
/>
<Search v-show="showSearch" @select="scrollHandler" @close="setShowSearch(false)" />
<!-- 高级筛选 -->
<AdvanceFilter
v-show="!showSearch"
ref="AdvanceFilterRef"
:type="0"
@select="filterHandler"
@update:search="setShowSearch(true)"
@show-custom="showModal(customModalRef)"
v-show="!showSearch" ref="AdvanceFilterRef" :type="0" @select="filterHandler"
@update:search="setShowSearch(true)" @show-custom="showModal(customModalRef)"
@show-filter="showModal(filterModalRef)"
/>
</div>
<component
:is="item.config?.component"
v-for="item in showItems"
:id="item.key"
:key="item.key"
v-model:value="asideValue[item.key]"
:label="item.config?.label"
:is="item.config?.component" v-for="item in showItems" :id="item.key" :key="item.key"
v-model:value="asideValue[item.key]" :label="item.config?.label"
@update:value="(e) => updateComponent(item.key, e)"
/>
<!-- 过滤列表 -->
<FilterModalVue
ref="filterModalRef"
@edit-filter="editFilter"
@show-new-filter="showModal(newFilterModalRef)"
ref="filterModalRef" @edit-filter="editFilter" @show-new-filter="showModal(newFilterModalRef)"
@handle-ok="handleOk"
/>
<!-- 新增过滤 -->
@ -392,17 +342,11 @@ function handleOk(item: any) {
right: -20px;
}
::v-deep(.n-collapse
.n-collapse-item.n-collapse-item--right-arrow-placement
.n-collapse-item__header
.n-collapse-item-arrow) {
::v-deep(.n-collapse .n-collapse-item.n-collapse-item--right-arrow-placement .n-collapse-item__header .n-collapse-item-arrow) {
margin-left: 8px;
}
::v-deep(.n-collapse
.n-collapse-item
.n-collapse-item__header
.n-collapse-item__header-main) {
::v-deep(.n-collapse .n-collapse-item .n-collapse-item__header .n-collapse-item__header-main) {
font-weight: bold;
justify-content: space-between;
}
@ -415,18 +359,11 @@ function handleOk(item: any) {
border-top: 0px;
}
::v-deep(.n-collapse
.n-collapse-item
.n-collapse-item__content-wrapper
.n-collapse-item__content-inner) {
::v-deep(.n-collapse .n-collapse-item .n-collapse-item__content-wrapper .n-collapse-item__content-inner) {
padding-top: 10px;
}
::v-deep(.n-scrollbar
> .n-scrollbar-rail.n-scrollbar-rail--vertical
> .n-scrollbar-rail__scrollbar, .n-scrollbar
+ .n-scrollbar-rail.n-scrollbar-rail--vertical
> .n-scrollbar-rail__scrollbar) {
::v-deep(.n-scrollbar > .n-scrollbar-rail.n-scrollbar-rail--vertical > .n-scrollbar-rail__scrollbar, .n-scrollbar + .n-scrollbar-rail.n-scrollbar-rail--vertical > .n-scrollbar-rail__scrollbar) {
width: 0px;
}
}

@ -1,8 +1,8 @@
<script lang="ts" setup>
import type { DropdownMixedOption } from "naive-ui/es/dropdown/src/interface";
import type { PropType } from "vue";
import type { DropdownMixedOption } from 'naive-ui/es/dropdown/src/interface'
import type { PropType } from 'vue'
defineOptions({ name: "Action" });
defineOptions({ name: 'Action' })
const props = defineProps({
options: {
@ -16,12 +16,12 @@ const props = defineProps({
},
id: {
type: String,
default: "",
default: '',
},
});
const fun = (key) => {
props.select(key, props.id);
};
})
function fun(key) {
props.select(key, props.id)
}
</script>
<template>

@ -1,14 +1,14 @@
<script lang="ts" setup>
import { favorite, getConditionList, unfavorite, sort } from "@/api/home/filter";
import { asideMap } from "@/config/aside";
import { useInfiniteScroll } from "@vueuse/core";
import { debounce } from "lodash-es";
import { onMounted, reactive, ref, watch } from "vue";
import type { FilterSearchParam } from "/#/api";
import type { Filter, FilterEntity } from "/#/home";
import { VueDraggable } from "vue-draggable-plus";
import { useInfiniteScroll } from '@vueuse/core'
import { debounce } from 'lodash-es'
import { onMounted, reactive, ref, watch } from 'vue'
import type { FilterSearchParam } from '/#/api'
import type { Filter, FilterEntity } from '/#/home'
import { VueDraggable } from 'vue-draggable-plus'
import { asideMap } from '@/config/aside'
import { favorite, getConditionList, sort, unfavorite } from '@/api/home/filter'
defineOptions({ name: "AdvanceFilter" });
defineOptions({ name: 'AdvanceFilter' })
const props = defineProps({
type: {
@ -16,43 +16,42 @@ const props = defineProps({
default: 0,
required: true,
},
});
const ruleForm = reactive({
keyword: "",
});
const ruleformRef = ref();
})
const emit = defineEmits<{
(e: "show-filter"): void;
(e: "show-custom"): void;
(e: "update:search"): void;
(e: "select", id: string);
}>();
const data = ref<FilterEntity[]>([]);
const unData = ref<FilterEntity[]>([]);
const loading = ref(false);
const canloadMore = true;
const el = ref<HTMLDivElement | null>(null);
const popover = ref<ComponentRef | null>(null);
(e: 'show-filter'): void
(e: 'show-custom'): void
(e: 'update:search'): void
(e: 'select', id: string)
}>()
const ruleForm = reactive({
keyword: '',
})
const ruleformRef = ref()
const data = ref<FilterEntity[]>([])
const unData = ref<FilterEntity[]>([])
const loading = ref(false)
const canloadMore = true
const el = ref<HTMLDivElement | null>(null)
const popover = ref<ComponentRef | null>(null)
const pagination = reactive({
pageNo: 1,
pageSize: 300,
});
const keyword = ref("");
const currentlySelectedAdvanced = ref("高级筛选");
})
const keyword = ref('')
const currentlySelectedAdvanced = ref('高级筛选')
onMounted(() => {
// data.value = generateDefaultConfig()
});
})
//
function generateDefaultConfig(): FilterEntity[] {
return Object.keys(asideMap).reduce((acc, key) => {
const { label, defaultValue, isDefaultFilter } = asideMap[key];
const { label, defaultValue, isDefaultFilter } = asideMap[key]
if (isDefaultFilter === true) {
const config = {
id: "",
id: '',
name: label,
favorite: false,
isDefaultFilter,
@ -62,70 +61,75 @@ function generateDefaultConfig(): FilterEntity[] {
value: defaultValue,
},
],
};
return [...acc, config];
} else {
return acc;
}
return [...acc, config]
}
}, []);
else {
return acc
}
}, [])
}
useInfiniteScroll(
el as any,
() => {
loadMore();
loadMore()
},
{ distance: 10, interval: 300, canLoadMore: () => false }
);
const showClick = async () => {
getSearchedList("");
};
{ distance: 10, interval: 300, canLoadMore: () => false },
)
async function showClick() {
getSearchedList('')
}
async function loadMore() {
if (loading.value || el.value == null) return;
if (loading.value || el.value == null)
return
const more = await featchList();
const more = await featchList()
if (more.length === 0) return;
if (more.length === 0)
return
data.value.push(...more);
data.value.push(...more)
}
async function featchList() {
loading.value = true;
loading.value = true
try {
const searchParam: FilterSearchParam = {
search_searchname: { value: ruleForm.keyword, op: "like", type: "string" },
};
const result = await getConditionList(pagination, searchParam, props.type);
const { data } = result;
search_searchname: { value: ruleForm.keyword, op: 'like', type: 'string' },
}
const result = await getConditionList(pagination, searchParam, props.type)
const { data } = result
// pagination.pageNo += 1
// canloadMore = pageCount >= pagination.pageNo
const entityList = generateFilterEntityList(data);
return entityList;
} catch (error) {
return [];
} finally {
loading.value = false;
const entityList = generateFilterEntityList(data)
return entityList
}
catch (error) {
return []
}
finally {
loading.value = false
}
}
//
function generateFilterEntityList(data) {
const filterEntityList = data.map((item) => {
const { searchname, iztop, ocrUsersearchchildList, id, reorder } = item;
const { searchname, iztop, ocrUsersearchchildList, id, reorder } = item
const list = ocrUsersearchchildList.map((item) => {
const { searchfield, searchvalue } = item;
const { searchfield, searchvalue } = item
return {
key: searchfield,
value: searchvalue,
};
});
}
})
const reg = new RegExp(ruleForm.keyword, "gi");
const hilightText = searchname.replace(reg, `<span>${ruleForm.keyword}</span>`);
const reg = new RegExp(ruleForm.keyword, 'gi')
const hilightText = searchname.replace(reg, `<span>${ruleForm.keyword}</span>`)
return {
id,
@ -135,132 +139,130 @@ function generateFilterEntityList(data) {
filterList: list,
reorder,
searchname,
};
});
}
})
return filterEntityList;
return filterEntityList
}
function selectHandler(item: FilterEntity) {
(popover.value as any).setShow(false);
currentlySelectedAdvanced.value = item.searchname;
emit("select", item.id);
(popover.value as any).setShow(false)
currentlySelectedAdvanced.value = item.searchname
emit('select', item.id)
}
const inputHandler = debounce((word) => {
ruleForm.keyword = word;
ruleformRef.value.validate();
if (word.length < 2 && word) {
return;
}
getSearchedList(word);
}, 300);
ruleForm.keyword = word
ruleformRef.value.validate()
if (word.length < 2 && word)
return
getSearchedList(word)
}, 300)
function getSearchedList(word, isScroll = false) {
if (word) {
pagination.pageSize = 300;
}
if (!word) {
pagination.pageSize = 10;
}
if (isScroll) {
pagination.pageSize = 300;
}
ruleForm.keyword = word;
if (word)
pagination.pageSize = 300
if (!word)
pagination.pageSize = 10
if (isScroll)
pagination.pageSize = 300
ruleForm.keyword = word
featchList().then((list) => {
let dataArr: FilterEntity[] = [];
let unDataArr: FilterEntity[] = [];
const dataArr: FilterEntity[] = []
const unDataArr: FilterEntity[] = []
list.map((item) => {
if (item.favorite && !item.isDefaultFilter) {
dataArr.push(item);
}
if (!item.favorite && !item.isDefaultFilter) {
unDataArr.push(item);
}
});
if (item.favorite && !item.isDefaultFilter)
dataArr.push(item)
if (!item.favorite && !item.isDefaultFilter)
unDataArr.push(item)
})
data.value = dataArr.sort(
(a, b) => Number(new Date(a.createtime)) - Number(new Date(b.createtime))
);
(a, b) => Number(new Date(a.createtime)) - Number(new Date(b.createtime)),
)
unData.value = unDataArr.sort(
(a, b) => Number((a as any).reorder) - Number((b as any).reorder)
);
});
(a, b) => Number((a as any).reorder) - Number((b as any).reorder),
)
})
}
function favoriteHandler(event: MouseEvent, item: any) {
event.stopImmediatePropagation();
event.stopPropagation();
event.stopImmediatePropagation()
event.stopPropagation()
const { isDefaultFilter, id } = item;
const { isDefaultFilter, id } = item
if (!isDefaultFilter) {
item.favorite = true;
favorite(id);
item.favorite = true
favorite(id)
data.value.map((v, index) => {
if (v.id == id) {
sort(v.id, 0);
} else {
sort(v.id, index + 1);
}
});
if (v.id == id)
sort(v.id, 0)
else
sort(v.id, index + 1)
})
inputHandler(ruleForm.keyword);
inputHandler(ruleForm.keyword)
}
}
const rules = {
keyword: [
{
trigger: ["blur", "input", "change"],
level: "error",
trigger: ['blur', 'input', 'change'],
level: 'error',
validator(_rule, value) {
if (value.length >= 2) {
return true;
} else {
return new Error("搜索关键字最少为两个");
}
if (value.length >= 2)
return true
else
return new Error('搜索关键字最少为两个')
},
},
],
};
}
function unFavoriteHandler(event: MouseEvent, item) {
event.stopImmediatePropagation();
event.stopPropagation();
event.stopImmediatePropagation()
event.stopPropagation()
const { isDefaultFilter, id } = item;
const { isDefaultFilter, id } = item
if (!isDefaultFilter) {
item.favorite = false;
unfavorite(id);
inputHandler(ruleForm.keyword);
item.favorite = false
unfavorite(id)
inputHandler(ruleForm.keyword)
}
}
const handleScroll = (event) => {
let timer;
function handleScroll(event) {
let timer
if (timer) {
clearTimeout(timer);
} else {
clearTimeout(timer)
}
else {
timer = setTimeout(() => {
getSearchedList("", true);
}, 2000);
getSearchedList('', true)
}, 2000)
}
};
}
const moveEnd = () => {
function moveEnd() {
unData.value.map((v, index) => {
sort(v.id, index);
});
};
sort(v.id, index)
})
}
const setCurrentlySelectedAdvanced = (value: string) => {
currentlySelectedAdvanced.value = value;
};
function setCurrentlySelectedAdvanced(value: string) {
currentlySelectedAdvanced.value = value
}
defineExpose({
setCurrentlySelectedAdvanced,
});
})
</script>
<template>
@ -284,8 +286,7 @@ defineExpose({
font-size: 17px;
font-weight: 600;
"
>{{ currentlySelectedAdvanced }}</span
>
>{{ currentlySelectedAdvanced }}</span>
<SvgIcon
:style="{ marginLeft: '5px' }"
name="down"
@ -296,7 +297,7 @@ defineExpose({
</template>
<n-spin :show="loading">
<div class="wrapper-left-popover">
<n-form :rules="rules" ref="ruleformRef" :model="ruleForm">
<n-form ref="ruleformRef" :rules="rules" :model="ruleForm">
<n-form-item path="keyword">
<n-input
:style="{
@ -305,9 +306,9 @@ defineExpose({
'--n-height': '40px',
}"
placeholder="请输入关键词"
@input="inputHandler"
:value="ruleForm.keyword"
:minlength="2"
@input="inputHandler"
>
<template #prefix>
<SvgIcon size="14px" name="magnifying-1" />
@ -354,23 +355,23 @@ defineExpose({
style="margin-right: 3px"
@click="favoriteHandler($event, item)"
/>
<div v-html="item.name" style="color: #333333" />
<div style="color: #333333" v-html="item.name" />
</li>
<!-- filter=".draggable-li[draggable='false']" -->
<VueDraggable
@end="moveEnd"
v-model="unData"
class="draggable-ul"
:animation="150"
group="shared"
@end="moveEnd"
>
<li
v-for="(item, index) in unData"
:key="index"
style="display: flex; align-items: center"
@click="selectHandler(item)"
class="cursor-move draggable-li fix"
:draggable="true"
@click="selectHandler(item)"
>
<SvgIcon name="drag" size="10" style="margin-right: 3px" />
<SvgIcon
@ -392,7 +393,7 @@ defineExpose({
style="cursor: pointer !important; margin-right: 3px"
@click="favoriteHandler($event, item)"
/>
<div v-html="item.name" style="color: #333333" />
<div style="color: #333333" v-html="item.name" />
</li>
</VueDraggable>
</ul>

@ -1,11 +1,11 @@
<script lang="ts" setup>
import { upload } from '@/api/home/main'
import { hideDownload } from '@/utils/image'
import { getImgUrl } from '@/utils/urlUtils'
import { useElementHover } from '@vueuse/core'
import type { GlobalThemeOverrides, UploadCustomRequestOptions } from 'naive-ui'
import { useThemeVars } from 'naive-ui'
import { computed, ref } from 'vue'
import { getImgUrl } from '@/utils/urlUtils'
import { hideDownload } from '@/utils/image'
import { upload } from '@/api/home/main'
const props = defineProps<{
value: string
@ -15,13 +15,11 @@ const emit = defineEmits<{
(e: 'update:value', value: string): void
}>()
const figureUrl = ref(props.value)
if (figureUrl.value && !figureUrl.value.includes('http'))
figureUrl.value = getImgUrl(figureUrl.value)
let figureUrl = ref(props.value)
if(figureUrl.value && figureUrl.value.indexOf('http') == -1) {
figureUrl.value = getImgUrl(figureUrl.value);
}
const uploadRef = ref(null);
const uploadRef = ref(null)
async function customRequest(data: UploadCustomRequestOptions) {
const result = await upload({ file: data.file.file as any })
@ -66,34 +64,35 @@ const imageGroupThemeOverrides = computed(() => {
})
//
const handleDragOver = (e) => {
e.preventDefault(); //
e.dataTransfer.dropEffect = 'copy'; //
};
function handleDragOver(e) {
e.preventDefault() //
e.dataTransfer.dropEffect = 'copy' //
}
//
const handleDragLeave = (e) => {
e.preventDefault(); //
};
function handleDragLeave(e) {
e.preventDefault() //
}
//
const handleDrop = async (e) => {
e.preventDefault(); //
const files = e.dataTransfer.files;
if( files[0] ){
async function handleDrop(e) {
e.preventDefault() //
const files = e.dataTransfer.files
if (files[0]) {
const result = await upload({ file: files[0] as any })
const imgUrl = getImgUrl(result.data)
figureUrl.value = imgUrl
emit('update:value', result.data)
}
};
}
</script>
<template>
<n-space>
<n-upload ref="uploadRef" directory-dnd :show-file-list="false" accept=".png,.jpg,.bmp"
:custom-request="customRequest" @dragover="handleDragOver" @dragleave="handleDragLeave" @drop="handleDrop">
<n-upload
ref="uploadRef" directory-dnd :show-file-list="false" accept=".png,.jpg,.bmp"
:custom-request="customRequest" @dragover="handleDragOver" @dragleave="handleDragLeave" @drop="handleDrop"
>
<n-upload-dragger class="wrapper">
<div v-show="!showFigure" class="wrapper-dragger">
<SvgIcon size="30" name="upload" />
@ -101,12 +100,14 @@ const handleDrop = async (e) => {
<span class="wrapper-tip2">上传格式为.png .jpg .bmp 20M以内</span>
</div>
<div v-show="showFigure" ref="figureRef" class="wrapper-figure">
<n-image ref="imageRef" :img-props="{ onClick: hideDownload }" :theme-overrides="imageGroupThemeOverrides"
width="288" height="116" :src="figureUrl" />
<n-image
ref="imageRef" :img-props="{ onClick: hideDownload }" :theme-overrides="imageGroupThemeOverrides"
width="288" height="116" :src="figureUrl"
/>
<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="white_delete" @click="clearHandler" />
</div>
</div>
</n-upload-dragger>

@ -4,22 +4,6 @@ import type { FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izApprovalStatus'] && typeof asideValue['izApprovalStatus'] == "string") {
let list = asideValue['izApprovalStatus'].split(',');
formValue.value.plans = list;
console.log("formValue.value.izApprovalStatus", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -29,12 +13,29 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const isLoadValue = ref(false)
const configUseStore = useConfig()
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izApprovalStatus && typeof asideValue.izApprovalStatus == 'string') {
const list = asideValue.izApprovalStatus.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = []
}
})
if (typeof formValue.value.plans == 'string') {
const list = (formValue.value.plans as string).split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -56,9 +57,8 @@ onBeforeMount(async () => {
const list = await configStore.fetchizApprovalStatusList()
options.value = list
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -66,8 +66,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择审核状态" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择审核状态" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -1,30 +1,9 @@
<script lang="ts" setup>
import { onBeforeMount, onMounted, ref } from 'vue'
import type { FormItemRule, FormRules } from 'naive-ui'
import { onBeforeMount, ref } from 'vue'
import type { FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izcustomlevel']) {
if(typeof asideValue['izcustomlevel'] == "string") {
let list = asideValue['izcustomlevel'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izcustomlevel'];
}
console.log("formValue.value.izcustomlevel", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -37,12 +16,34 @@ const emit = defineEmits<{
const formValue = ref({
plans: props.value,
})
const isLoadValue = ref(false)
const configUseStore = useConfig()
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izcustomlevel) {
if (typeof asideValue.izcustomlevel == 'string') {
const list = asideValue.izcustomlevel.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izcustomlevel
}
}
else {
formValue.value.plans = []
}
})
if (typeof formValue.value.plans == 'string') {
const list = (formValue.value.plans as string).split(',')
formValue.value.plans = list
}
console.log("formValue.value.izcustomlevel22222", formValue.value.plans);
const rules: FormRules = {
plans: [
@ -64,9 +65,8 @@ onBeforeMount(async () => {
const list = await configStore.fetchIzcustomlevelList()
options.value = list
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -74,8 +74,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访客户级别" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择拜访客户级别" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izcustomname']) {
if(typeof asideValue['izcustomname'] == "string") {
let list = asideValue['izcustomname'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izcustomname'];
}
console.log("formValue.value.izcustomname", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izcustomname) {
if (typeof asideValue.izcustomname == 'string') {
const list = asideValue.izcustomname.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izcustomname
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -63,7 +64,7 @@ onBeforeMount(async () => {
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -71,8 +72,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访客户名称" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择拜访客户名称" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izcustomtype']) {
if(typeof asideValue['izcustomtype'] == "string") {
let list = asideValue['izcustomtype'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izcustomtype'];
}
console.log("formValue.value.izcustomtype", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izcustomtype) {
if (typeof asideValue.izcustomtype == 'string') {
const list = asideValue.izcustomtype.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izcustomtype
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -62,7 +63,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -70,8 +71,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访客户类型" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择拜访客户类型" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izcustomtypes']) {
if(typeof asideValue['izcustomtypes'] == "string") {
let list = asideValue['izcustomtypes'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izcustomtypes'];
}
console.log("formValue.value.izcustomtypes", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izcustomtypes) {
if (typeof asideValue.izcustomtypes == 'string') {
const list = asideValue.izcustomtypes.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izcustomtypes
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -68,7 +69,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -76,8 +77,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择izcustomtype" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择izcustomtype" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izproductname']) {
if(typeof asideValue['izproductname'] == "string") {
let list = asideValue['izproductname'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izproductname'];
}
console.log("formValue.value.izproductname", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izproductname) {
if (typeof asideValue.izproductname == 'string') {
const list = asideValue.izproductname.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izproductname
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -62,7 +63,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -70,8 +71,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择产品名称" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择产品名称" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -5,62 +5,64 @@ import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
import { useFinal } from '@/store/modules/final'
const props = defineProps<{
value: string[] | null
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
if (isLoadValue.value) {
isLoadValue.value = false
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izproject']) {
if(typeof asideValue['izproject'] == "string") {
let list = asideValue['izproject'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izproject'];
const asideValue = configUseStore.getAsideValue
if (asideValue.izproject) {
if (typeof asideValue.izproject == 'string') {
const list = asideValue.izproject.split(',')
formValue.value.plans = list
}
console.log("formValue.value.izproject", formValue.value.plans);
}else {
formValue.value.plans = [];
else {
formValue.value.plans = asideValue.izproject
}
}
else {
formValue.value.plans = []
}
});
})
const finalStore = useFinal()
finalStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
if (isLoadValue.value) {
isLoadValue.value = false
return
}
let asideValue = finalStore.getAsideValue;
if(asideValue && asideValue['izproject']) {
if(typeof asideValue['izproject'] == "string") {
let list = asideValue['izproject'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izproject'];
const asideValue = finalStore.getAsideValue
if (asideValue && asideValue.izproject) {
if (typeof asideValue.izproject == 'string') {
const list = asideValue.izproject.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izproject
}
console.log("formValue.value.izproject", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -76,7 +78,7 @@ const options = ref([])
const configStore = useDictionary()
const labStyle = {
fontWeight: 'bold',
color: '#333333'
color: '#333333',
}
onBeforeMount(async () => {
@ -85,7 +87,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -93,8 +95,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择所属项目" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择所属项目" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -1,30 +1,9 @@
<script lang="ts" setup>
import { onBeforeMount, onMounted, ref } from 'vue'
import { onBeforeMount, onMounted, onUpdated, ref } from 'vue'
import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { onUpdated } from 'vue';
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izprojecttype']) {
if(typeof asideValue['izprojecttype'] == "string") {
let list = asideValue['izprojecttype'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izprojecttype'];
}
console.log("formValue.value.izprojecttype", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -34,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izprojecttype) {
if (typeof asideValue.izprojecttype == 'string') {
const list = asideValue.izprojecttype.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izprojecttype
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -63,7 +63,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -71,8 +71,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访项目类别" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择拜访项目类别" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izsearch']) {
if(typeof asideValue['izsearch'] == "string") {
let list = asideValue['izsearch'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izsearch'];
}
console.log("formValue.value.izsearch", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izsearch) {
if (typeof asideValue.izsearch == 'string') {
const list = asideValue.izsearch.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izsearch
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -68,7 +69,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -76,8 +77,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择IzSearch" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择IzSearch" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izsearchmanager']) {
if(typeof asideValue['izsearchmanager'] == "string") {
let list = asideValue['izsearchmanager'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izsearchmanager'];
}
console.log("formValue.value.izsearchmanager", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izsearchmanager) {
if (typeof asideValue.izsearchmanager == 'string') {
const list = asideValue.izsearchmanager.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izsearchmanager
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -68,7 +69,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -76,8 +77,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择IzSearchManager" multiple :options="options"
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择IzSearchManager" multiple :options="options"
@update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izshow']) {
if(typeof asideValue['izshow'] == "string") {
let list = asideValue['izshow'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izshow'];
}
console.log("formValue.value.izshow", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izshow) {
if (typeof asideValue.izshow == 'string') {
const list = asideValue.izshow.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izshow
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -62,7 +63,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -70,8 +71,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择分类" multiple :options="options"
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择分类" multiple :options="options"
@update:value="onChange"
/>
</n-form-item>

@ -5,62 +5,64 @@ import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
import { useFinal } from '@/store/modules/final'
const props = defineProps<{
value: string[] | null
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
if (isLoadValue.value) {
isLoadValue.value = false
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izstatus']) {
if(typeof asideValue['izstatus'] == "string") {
let list = asideValue['izstatus'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izstatus'];
const asideValue = configUseStore.getAsideValue
if (asideValue.izstatus) {
if (typeof asideValue.izstatus == 'string') {
const list = asideValue.izstatus.split(',')
formValue.value.plans = list
}
console.log("formValue.value.izstatus", formValue.value.plans);
}else {
formValue.value.plans = [];
else {
formValue.value.plans = asideValue.izstatus
}
}
else {
formValue.value.plans = []
}
});
})
const finalStore = useFinal()
finalStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
if (isLoadValue.value) {
isLoadValue.value = false
return
}
let asideValue = finalStore.getAsideValue;
if(asideValue && asideValue['izstatus']) {
if(typeof asideValue['izstatus'] == "string") {
let list = asideValue['izstatus'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izstatus'];
const asideValue = finalStore.getAsideValue
if (asideValue && asideValue.izstatus) {
if (typeof asideValue.izstatus == 'string') {
const list = asideValue.izstatus.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izstatus
}
console.log("formValue.value.izstatus", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -84,7 +86,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -92,8 +94,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择审核状态" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择审核状态" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -1,29 +1,10 @@
<script lang="ts" setup>
import { onBeforeMount, onMounted, ref } from 'vue'
import type { FormItemRule, FormRules } from 'naive-ui'
import { onBeforeMount, ref } from 'vue'
import type { FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
import { isString } from '@/utils/is'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izvisitcity']) {
if(typeof asideValue['izvisitcity'] == "string") {
let list = asideValue['izvisitcity'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izvisitcity'];
}
console.log("formValue.value.izvisitcity", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +14,35 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
const isLoadValue = ref(false)
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izvisitcity) {
if (typeof asideValue.izvisitcity == 'string') {
const list = asideValue.izvisitcity.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izvisitcity
}
}
else {
formValue.value.plans = []
}
})
if (isString(formValue.value.plans)) {
const list = (formValue.value.plans as string).split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -60,9 +64,8 @@ onBeforeMount(async () => {
const list = await configStore.fetchizvisitcityList()
options.value = list
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -70,8 +73,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择发布地区" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择发布地区" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izfiled17']) {
if(typeof asideValue['izfiled17'] == "string") {
let list = asideValue['izfiled17'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izfiled17'];
}
console.log("formValue.value.izfiled17", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izfiled17) {
if (typeof asideValue.izfiled17 == 'string') {
const list = asideValue.izfiled17.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izfiled17
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -68,7 +69,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -76,8 +77,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访项目类别" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择拜访项目类别" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izfiled2']) {
if(typeof asideValue['izfiled2'] == "string") {
let list = asideValue['izfiled2'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izfiled2'];
}
console.log("formValue.value.izfiled2", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izfiled2) {
if (typeof asideValue.izfiled2 == 'string') {
const list = asideValue.izfiled2.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izfiled2
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -68,7 +69,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -76,8 +77,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访客户类型" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择拜访客户类型" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izfiled3']) {
if(typeof asideValue['izfiled3'] == "string") {
let list = asideValue['izfiled3'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izfiled3'];
}
console.log("formValue.value.izfiled3", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izfiled3) {
if (typeof asideValue.izfiled3 == 'string') {
const list = asideValue.izfiled3.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izfiled3
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -68,7 +69,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -76,8 +77,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访客户名称" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择拜访客户名称" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izfiled6']) {
if(typeof asideValue['izfiled6'] == "string") {
let list = asideValue['izfiled6'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izfiled6'];
}
console.log("formValue.value.izfiled6", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izfiled6) {
if (typeof asideValue.izfiled6 == 'string') {
const list = asideValue.izfiled6.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izfiled6
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -68,7 +69,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -76,8 +77,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择拜访客户级别" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择拜访客户级别" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izfirm']) {
if(typeof asideValue['izfirm'] == "string") {
let list = asideValue['izfirm'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izfirm'];
}
console.log("formValue.value.izfirm", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izfirm) {
if (typeof asideValue.izfirm == 'string') {
const list = asideValue.izfirm.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izfirm
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -62,7 +63,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -70,8 +71,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择厂商" multiple
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择厂商" multiple
:options="options" @update:value="onChange"
/>
</n-form-item>

@ -5,64 +5,64 @@ import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
import { useFinal } from '@/store/modules/final'
const props = defineProps<{
value: string[] | null
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
console.log("isLoadValue.value", isLoadValue.value,
"configUseStore.getAsideValue", configUseStore.getAsideValue);
if(isLoadValue.value) {
isLoadValue.value = false;
if (isLoadValue.value) {
isLoadValue.value = false
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['iztaskrrom']) {
if(typeof asideValue['iztaskrrom'] == "string") {
let list = asideValue['iztaskrrom'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['iztaskrrom'];
const asideValue = configUseStore.getAsideValue
if (asideValue.iztaskrrom) {
if (typeof asideValue.iztaskrrom == 'string') {
const list = asideValue.iztaskrrom.split(',')
formValue.value.plans = list
}
console.log("formValue.value.iztaskrrom", formValue.value.plans);
}else {
formValue.value.plans = [];
else {
formValue.value.plans = asideValue.iztaskrrom
}
}
else {
formValue.value.plans = []
}
});
})
const finalStore = useFinal()
finalStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
if (isLoadValue.value) {
isLoadValue.value = false
return
}
let asideValue = finalStore.getAsideValue;
if(asideValue && asideValue['iztaskrrom']) {
if(typeof asideValue['iztaskrrom'] == "string") {
let list = asideValue['iztaskrrom'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['iztaskrrom'];
const asideValue = finalStore.getAsideValue
if (asideValue && asideValue.iztaskrrom) {
if (typeof asideValue.iztaskrrom == 'string') {
const list = asideValue.iztaskrrom.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.iztaskrrom
}
console.log("formValue.value.iztaskrrom", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -86,7 +86,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -94,8 +94,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择任务来源" multiple :options="options"
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择任务来源" multiple :options="options"
@update:value="onChange"
/>
</n-form-item>

@ -4,26 +4,6 @@ import type { FormItemRule, FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['iztaskstatus']) {
if(typeof asideValue['iztaskstatus'] == "string") {
let list = asideValue['iztaskstatus'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['iztaskstatus'];
}
console.log("formValue.value.iztaskstatus", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -33,12 +13,33 @@ const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.iztaskstatus) {
if (typeof asideValue.iztaskstatus == 'string') {
const list = asideValue.iztaskstatus.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.iztaskstatus
}
}
else {
formValue.value.plans = []
}
})
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (typeof formValue.value.plans == 'string') {
const list = formValue.value.plans.split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -62,7 +63,7 @@ onBeforeMount(async () => {
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -70,8 +71,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择任务状态" multiple :options="options"
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择任务状态" multiple :options="options"
@update:value="onChange"
/>
</n-form-item>

@ -1,29 +1,10 @@
<script lang="ts" setup>
import { onBeforeMount, onMounted, ref } from 'vue'
import type { FormItemRule, FormRules } from 'naive-ui'
import { onBeforeMount, ref } from 'vue'
import type { FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
import { isString } from '@/utils/is'
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izvisitpro']) {
if(typeof asideValue['izvisitpro'] == "string") {
let list = asideValue['izvisitpro'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izvisitpro'];
}
console.log("formValue.value.izvisitpro", formValue.value.plans);
}else {
formValue.value.plans = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
@ -36,9 +17,31 @@ const emit = defineEmits<{
const formValue = ref({
plans: props.value,
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
const configUseStore = useConfig()
const isLoadValue = ref(false)
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false
return
}
const asideValue = configUseStore.getAsideValue
if (asideValue.izvisitpro) {
if (typeof asideValue.izvisitpro == 'string') {
const list = asideValue.izvisitpro.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izvisitpro
}
}
else {
formValue.value.plans = []
}
})
if (isString(formValue.value.plans)) {
const list = (formValue.value.plans as string).split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -60,9 +63,8 @@ onBeforeMount(async () => {
const list = await configStore.fetchIzvisitproList()
options.value = list
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -70,8 +72,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择省份" multiple :options="options"
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择省份" multiple :options="options"
@update:value="onChange"
/>
</n-form-item>

@ -2,8 +2,6 @@
import { ref } from 'vue'
import { useConfig } from '@/store/modules/asideConfig'
const configStore = useConfig()
const props = defineProps({
value: {
type: Boolean,
@ -19,11 +17,13 @@ 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)
configStore.setIsAllowDownload(value);
configStore.setIsAllowDownload(value)
}
</script>

@ -1,66 +1,71 @@
<script lang="ts" setup>
import { onBeforeMount, onMounted, ref } from 'vue'
import type { FormItemRule, FormRules } from 'naive-ui'
import { onBeforeMount, ref } from 'vue'
import type { FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
import { useFinal } from '@/store/modules/final'
import { isString } from '@/utils/is'
const props = defineProps<{
value: string[] | null
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const formValue = ref({
plans: props.value || [],
})
const isLoadValue = ref(false)
const configUseStore = useConfig()
configUseStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
if (isLoadValue.value) {
isLoadValue.value = false
return
}
let asideValue = configUseStore.getAsideValue;
if(asideValue['izplan']) {
if(typeof asideValue['izplan'] == "string") {
let list = asideValue['izplan'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izplan'];
}
console.log("formValue.value.izplan", formValue.value.plans);
}else {
formValue.value.plans = [];
const asideValue = configUseStore.getAsideValue
if (asideValue.izplan) {
if (typeof asideValue.izplan == 'string') {
const list = asideValue.izplan.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izplan
}
}
});
else {
formValue.value.plans = []
}
})
const finalStore = useFinal()
finalStore.$subscribe(() => {
if(isLoadValue.value) {
isLoadValue.value = false;
if (isLoadValue.value) {
isLoadValue.value = false
return
}
let asideValue = finalStore.getAsideValue;
if(asideValue && asideValue['izplan']) {
if(typeof asideValue['izplan'] == "string") {
let list = asideValue['izplan'].split(',');
formValue.value.plans = list;
}else {
formValue.value.plans = asideValue['izplan'];
}
console.log("formValue.value.izplan", formValue.value.plans);
}else {
formValue.value.plans = [];
const asideValue = finalStore.getAsideValue
if (asideValue && asideValue.izplan) {
if (typeof asideValue.izplan == 'string') {
const list = asideValue.izplan.split(',')
formValue.value.plans = list
}
else {
formValue.value.plans = asideValue.izplan
}
}
else {
formValue.value.plans = []
}
});
const props = defineProps<{
value: string[] | null
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const formValue = ref({
plans: props.value || [],
})
if(typeof formValue.value.plans == "string") {
let list = formValue.value.plans.split(',');
formValue.value.plans = list;
if (isString(formValue.value.plans)) {
const list = (formValue.value.plans as string).split(',')
formValue.value.plans = list
}
const rules: FormRules = {
plans: [
@ -82,9 +87,8 @@ onBeforeMount(async () => {
const planList = await configStore.fetchPlanList()
planOptons.value = planList
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -92,8 +96,9 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="plans" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.plans" :max-tag-count="2" placeholder="请选择计划" multiple :options="planOptons"
<n-select
v-model:value="formValue.plans"
filterable :max-tag-count="2" placeholder="请选择计划" multiple :options="planOptons"
@update:value="onChange"
/>
</n-form-item>

@ -1,70 +1,71 @@
<script lang="ts" setup>
import { onBeforeMount, onMounted, onUpdated, ref } from 'vue'
import type { FormItemRule, FormRules } from 'naive-ui'
import { onBeforeMount, ref } from 'vue'
import type { FormRules } from 'naive-ui'
import { useDictionary } from '@/store/modules/dictonary'
import { useConfig } from '@/store/modules/asideConfig'
import { useFinal } from '@/store/modules/final'
import { isString } from '@/utils/is'
const props = defineProps<{
value: string[] | null
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const configUseStore = useConfig()
const formValue = ref({
users: props.value || [],
})
const isLoadValue = ref(false)
configUseStore.$subscribe(() => {
let asideValue = configUseStore.getAsideValue;
console.log("asideValue接受到的", asideValue);
if(isLoadValue.value) {
isLoadValue.value = false;
const asideValue = configUseStore.getAsideValue
if (isLoadValue.value) {
isLoadValue.value = false
return
}
if(asideValue['izupuser']) {
if(typeof asideValue['izupuser'] == "string") {
let list = asideValue['izupuser'].split(',');
formValue.value.users = list;
}else {
formValue.value.users = asideValue['izupuser'];
if (asideValue.izupuser) {
if (typeof asideValue.izupuser == 'string') {
const list = asideValue.izupuser.split(',')
formValue.value.users = list
}
console.log("formValue.value.users1111111111", formValue.value.users);
}else {
formValue.value.users = [];
else {
formValue.value.users = asideValue.izupuser
}
}
else {
formValue.value.users = []
}
});
})
const finalStore = useFinal()
finalStore.$subscribe(() => {
let asideValue = finalStore.getAsideValue;
console.log("asideValue接受到的", asideValue);
if(isLoadValue.value) {
isLoadValue.value = false;
const asideValue = finalStore.getAsideValue
if (isLoadValue.value) {
isLoadValue.value = false
return
}
if(asideValue && asideValue['izupuser']) {
if(typeof asideValue['izupuser'] == "string") {
let list = asideValue['izupuser'].split(',');
formValue.value.users = list;
}else {
formValue.value.users = asideValue['izupuser'];
if (asideValue && asideValue.izupuser) {
if (typeof asideValue.izupuser == 'string') {
const list = asideValue.izupuser.split(',')
formValue.value.users = list
}
else {
formValue.value.users = asideValue.izupuser
}
console.log("formValue.value.users222222222222222", formValue.value.users);
}else {
formValue.value.users = [];
}
});
const props = defineProps<{
value: string[] | null
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: string[]): void
}>()
const formValue = ref({
users: props.value || [],
else {
formValue.value.users = []
}
})
if(typeof formValue.value.users == "string") {
let list = formValue.value.users.split(',');
formValue.value.users = list;
if (typeof formValue.value.users == 'string') {
const list = isString(formValue.value.users) ? (formValue.value.users as string).split(',') : []
formValue.value.users = list
}
console.log("formValue.value.users2222222222222", formValue.value.users);
const rules: FormRules = {
users: [
{
@ -86,10 +87,8 @@ onBeforeMount(async () => {
personOptions.value = personList
})
const isLoadValue = ref(false)
function onChange(value: Array<string>) {
console.log("user选中 ", value);
isLoadValue.value = true;
isLoadValue.value = true
emit('update:value', value)
}
</script>
@ -97,9 +96,10 @@ function onChange(value: Array<string>) {
<template>
<n-form :model="formValue" style="padding: 0px 10px;" :rules="rules">
<n-form-item :label="label" path="users" :label-style="labStyle">
<n-select filterable
v-model:value="formValue.users" :max-tag-count="2" multiple placeholder="请选择提报人(可多选)"
<n-select
v-model:value="formValue.users"
filterable :max-tag-count="2" multiple placeholder="请选择提报人(可多选)"
:options="personOptions" @update:value="onChange"
/>
</n-form-item>

@ -1,47 +1,46 @@
<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 configUseStore = useConfig();
const props = defineProps<{
value: [number, number]
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: string): void
}>()
const configUseStore = useConfig()
const isLoadValue = ref(false)
const range = ref<[number, number]>(props.value || [])
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false;
return;
}
let asideValue = configUseStore.getAsideValue;
if (asideValue["izsimilarity"]) {
range.value = asideValue["izsimilarity"];
} else {
range.value = [0, 100];
isLoadValue.value = false
return
}
console.log(range.value, "range.value");
const asideValue = configUseStore.getAsideValue
if (asideValue.izsimilarity)
range.value = asideValue.izsimilarity
else
range.value = [0, 100]
// else {
// range.value = [0, 100];
// }
});
const props = defineProps<{
value: [number, number];
label: string;
}>();
const emit = defineEmits<{
(e: "update:value", value: string): void;
}>();
const range = ref<[number, number]>(props.value || []);
})
const marks = {
0: "0",
50: "50",
100: "100",
};
const isLoadValue = ref(false);
0: '0',
50: '50',
100: '100',
}
function onChange(value: number & number[]) {
range.value = value as any;
isLoadValue.value = true;
let valueStr = value.join("-");
emit("update:value", valueStr);
range.value = value as any
isLoadValue.value = true
const valueStr = value.join('-')
emit('update:value', valueStr)
}
</script>

@ -1,71 +1,64 @@
<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 { onMounted, ref } from 'vue'
import { useConfig } from '@/store/modules/asideConfig'
import { useFinal } from '@/store/modules/final'
const configUseStore = useConfig();
const props = defineProps<{
value: [number, number] | null
label: string
}>()
const emit = defineEmits<{
(e: 'update:value', value: number[]): void
}>()
const configUseStore = useConfig()
const isLoadValue = ref(false)
const time = ref<[number, number] | null>(props.value)
configUseStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false;
return;
isLoadValue.value = false
return
}
let asideValue = configUseStore.getAsideValue;
if (asideValue["izyear"]) {
time.value = asideValue["izyear"];
} else {
time.value = null;
}
});
const asideValue = configUseStore.getAsideValue
if (asideValue.izyear)
time.value = asideValue.izyear
else
time.value = null
})
const finalStore = useFinal()
finalStore.$subscribe(() => {
if (isLoadValue.value) {
isLoadValue.value = false;
return;
}
let asideValue = finalStore.getAsideValue;
console.log("asideValue izyear", asideValue);
if (asideValue && asideValue["izyear"]) {
time.value = asideValue["izyear"];
} else {
time.value = null;
isLoadValue.value = false
return
}
});
const asideValue = finalStore.getAsideValue
if (asideValue && asideValue.izyear)
time.value = asideValue.izyear
else
time.value = null
})
const props = defineProps<{
value: [number, number] | null;
label: string;
}>();
const emit = defineEmits<{
(e: "update:value", value: number[]): void;
}>();
const time = ref<[number, number] | null>(props.value);
const isLoadValue = ref(false);
function onChange(value: [number, number]) {
isLoadValue.value = true;
emit("update:value", value);
isLoadValue.value = true
emit('update:value', value)
}
onMounted(() => {
if (!props.value) {
//
const currentDate = dayjs();
const currentDate = dayjs()
//
const endDate = currentDate.toDate();
const startDate = currentDate.subtract(3, "month").toDate();
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());
time.value = [startDate.getTime(), endDate.getTime()]
setTimeout(() => {
emit("update:value", [startDate.getTime(), endDate.getTime()]);
}, 300);
emit('update:value', [startDate.getTime(), endDate.getTime()])
}, 300)
}
});
})
</script>
<template>
@ -77,10 +70,12 @@ onMounted(() => {
v-model:value="time"
type="daterange"
:clearable="false"
@update:value="onChange"
placeholder="请选择"
@update:value="onChange"
>
<template #separator> </template>
<template #separator>
</template>
</n-date-picker>
</n-space>
</n-collapse-item>

@ -29,15 +29,9 @@ function showModal() {
const config = configStore.getConfig
const customConfig = configStore.getCustomConfig
if (config == null || customConfig == null)
return
if (tempList.value.length > 0 && isEqual(tempList.value, configStore.getFilterConfig))
return
console.log(
'开启了啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦筛选条件----------------',
customConfig,
)
if (config == null || customConfig == null) { return }
if (tempList.value.length > 0 && isEqual(tempList.value, configStore.getFilterConfig)) { return }
const { showList, hideList } = generatList(config, customConfig)
tempList.value = cloneDeep(showList)
if (tempList.value.length > 0)
@ -46,7 +40,7 @@ function showModal() {
onList.value = showList
offList.value = hideList
//
checkAll.value = hideList.every(item => item.checked)
checkAll.value = hideList.every((item: any) => item.checked)
//
offKeyword.value = ''
onKeyword.value = ''
@ -136,17 +130,14 @@ function generatList(config, customConfig) {
const fixedList = generateDefaultList(config)
offList.unshift(...fixedList)
onList.unshift(...fixedList)
console.log('原始筛选条件customConfig', customConfig)
// onListcustomConfig
const tempOnList = cloneDeep(onList)
console.log('原始筛选条件tempOnList', tempOnList)
const sortKeyList: any = []
configStore.getFilterConfig.map((item: any) => {
sortKeyList.push(item?.id)
return item
})
console.log('原始筛选条件sortKeyList', sortKeyList)
const sortList: any = []
if (sortKeyList.length > 0) {
sortKeyList.map((key) => {
@ -162,8 +153,6 @@ function generatList(config, customConfig) {
return key
})
}
console.log('原始筛选条件sortList', sortList)
console.log('原始筛选条件configStore.getFilterConfig', configStore.getFilterConfig)
// return { showList: onList, hideList: offList }
return { showList: sortList, hideList: offList }
}
@ -172,16 +161,11 @@ configStore.$subscribe(() => {
const config = configStore.getConfig
const customConfig = configStore.getCustomConfig
if (config == null || customConfig == null)
return
console.log('tempList.value-----------', tempList.value)
console.log('configStore.getFilterConfig-----------', configStore.getFilterConfig)
if (tempList.value.length > 0 && isEqual(tempList.value, configStore.getFilterConfig))
return
if (config == null || customConfig == null) { return }
if (tempList.value.length > 0 && isEqual(tempList.value, configStore.getFilterConfig)) { return }
const { showList, hideList } = generatList(config, customConfig)
tempList.value = cloneDeep(showList)
console.log('克隆条件', tempList.value)
if (tempList.value.length > 0)
configStore.setFilterConfig(tempList.value)
@ -201,16 +185,13 @@ async function handleSumbit(e: MouseEvent) {
await setFilter({ searchcount: param, type: 0 })
const obj = await configStore.fetchCustomConfig()
console.log('obj-------------------------------', obj)
const tempOnList = cloneDeep(onList.value)
console.log('原始筛选条件tempOnList', tempOnList)
const sortList: any = []
obj.map((key) => {
const tempItem = tempOnList.find(item => item.id == key)
sortList.push(tempItem)
return key
})
console.log('configStore.sortList---------------', sortList)
// setTimeout(() => {
if (sortList.length > 0)
configStore.setFilterConfig(sortList)
@ -336,16 +317,10 @@ const rightInputHandler = debounce((keyword) => {
}, 300)
async function getfield() {
let res
res = await getAllfieldList(3)
await getAllfieldList(3)
const userStore = useUser()
const userInfo = userStore.getUserInfo
res = await getfieldList(3, userInfo.id)
}
function onMove(e) {
// e
if (e?.related?.className?.indexOf('fix') !== -1)
return false
await getfieldList(3, userInfo.id)
}
onMounted(() => {
@ -355,13 +330,7 @@ onMounted(() => {
<template>
<n-modal v-model:show="show" transform-origin="center" :mask-closable="false">
<n-card
class="cardstyle"
:bordered="false"
size="huge"
role="dialog"
aria-modal="true"
>
<n-card class="cardstyle" :bordered="false" size="huge" role="dialog" aria-modal="true">
<div class="wrapper">
<span class="wrapper-title">自定义筛选</span>
<div class="wrapper-bar">
@ -373,10 +342,7 @@ onMounted(() => {
<n-grid cols="24" class="mt-4 proCard" responsive="screen" :x-gap="24">
<n-grid-item span="11">
<NCard
:title="allCount"
class="dragcardStyle"
:segmented="{ content: true, footer: true }"
size="small"
:title="allCount" class="dragcardStyle" :segmented="{ content: true, footer: true }" size="small"
:bordered="false"
>
<div class="input_wrap">
@ -385,29 +351,20 @@ onMounted(() => {
<SvgIcon size="14px" name="magnifying-1-color999" />
</template>
</n-input>
<n-scrollbar
style="max-height: 500px; border: 1px solid #cad2dd; border-radius: 2px"
>
<n-scrollbar style="max-height: 500px; border: 1px solid #cad2dd; border-radius: 2px">
<div class="draggable-ul">
<div class="draggable-li">
<n-checkbox
v-model:checked="checkAll"
label="全选"
:indeterminate="!checkAll"
v-model:checked="checkAll" label="全选" :indeterminate="!checkAll"
@update:checked="onCheckAllChange"
/>
</div>
<div
v-for="item in offList"
v-show="item.name.includes(offKeyword)"
:key="item.id"
:class="{ 'disable-check': item.fix }"
class="draggable-li"
v-for="item in offList" v-show="item.name.includes(offKeyword)" :key="item.id"
:class="{ 'disable-check': item.fix }" class="draggable-li"
>
<n-checkbox
v-model:checked="item.checked"
:label="item.name"
:disabled="item.fix"
v-model:checked="item.checked" :label="item.name" :disabled="item.fix"
@update:checked="onCheckChange($event, item)"
/>
</div>
@ -421,10 +378,7 @@ onMounted(() => {
</n-grid-item>
<n-grid-item span="11">
<NCard
:title="selectCount"
class="dragcardStyle"
:segmented="{ content: true, footer: true }"
size="small"
:title="selectCount" class="dragcardStyle" :segmented="{ content: true, footer: true }" size="small"
:bordered="false"
>
<template #header-extra>
@ -436,31 +390,17 @@ onMounted(() => {
<SvgIcon size="14px" name="magnifying-1-color999" />
</template>
</n-input>
<n-scrollbar
style="max-height: 500px; border: 1px solid #cad2dd; border-radius: 2px"
class="scroll"
>
<VueDraggable
v-model="onList"
class="draggable-ul"
:animation="150"
group="shared"
>
<n-scrollbar style="max-height: 500px; border: 1px solid #cad2dd; border-radius: 2px" class="scroll">
<VueDraggable v-model="onList" class="draggable-ul" :animation="150" group="shared">
<div
v-for="item in onList"
v-show="item.name.includes(onKeyword)"
:key="item.id"
:draggable="true"
v-for="item in onList" v-show="item.name.includes(onKeyword)" :key="item.id" :draggable="true"
class="cursor-move draggable-li"
>
<SvgIcon name="drag" size="24" />
<span class="ml-2">{{ item.name }}</span>
<SvgIcon
v-if="!item.fix"
size="16px"
style="display: block; margin-left: auto; cursor: pointer"
name="clear"
@click="removeHandler(item.id)"
v-if="!item.fix" size="16px" style="display: block; margin-left: auto; cursor: pointer"
name="clear" @click="removeHandler(item.id)"
/>
</div>
</VueDraggable>
@ -475,11 +415,7 @@ onMounted(() => {
<n-button type="info" @click="handleSumbit">
确定
</n-button>
<n-button
secondary
style="margin-left: 15px; border: 1px solid #cad2dd"
@click="closeModal"
>
<n-button secondary style="margin-left: 15px; border: 1px solid #cad2dd" @click="closeModal">
取消
</n-button>
</div>
@ -508,9 +444,11 @@ onMounted(() => {
&-footer {
display: flex;
justify-content: flex-end;
.n-button--info-type {
background: #507afd !important;
}
.n-button--default-type {
background: #fff !important;
color: #333333;
@ -537,6 +475,7 @@ onMounted(() => {
.dragcardStyle {
--n-padding-bottom: 0px !important;
--n-padding-left: 0px !important;
::v-deep(.n-card__content) {
padding-left: 0 !important;
padding-right: 0 !important;
@ -586,32 +525,39 @@ onMounted(() => {
--n-padding-top: 0px;
--n-padding-bottom: 12px;
}
::v-deep(.n-card > .n-card-header .n-card-header__main) {
font-weight: lighter !important;
font-size: 14px;
color: #666;
}
::v-deep(.n-scrollbar) {
border-left: 1px solid #cad2dd !important;
border-right: 1px solid #cad2dd !important;
border-bottom: 1px solid #e8e8e8 !important;
border-top: 1px solid #e8e8e8 !important;
}
::v-deep(.n-card__content) {
padding: 20px 24px 0 24px !important;
}
::v-deep(.n-card__footer) {
padding: 0 24px 16px 24px !important;
}
::v-deep(.n-input .n-input-wrapper) {
height: 44px !important;
border: 1px solid #cad2dd !important;
border-bottom: none !important;
// margin-bottom: -3px;
.n-input__input input {
height: 44px !important;
}
}
::v-deep(.n-button--info-type) {
background: #507afd !important;
}

@ -8,132 +8,138 @@ import {
reactive,
ref,
unref,
} from "vue";
import { NDataTable } from "naive-ui";
import type { DataTableColumns, DataTableRowKey } from "naive-ui";
import type { SortableEvent } from "sortablejs";
import Sortable from "sortablejs";
import { debounce } from "lodash-es";
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"];
} from 'vue'
import { NDataTable, useModal } from 'naive-ui'
import type { DataTableColumns, DataTableRowKey, ModalReactive } from 'naive-ui'
import type { SortableEvent } from 'sortablejs'
import Sortable from 'sortablejs'
import { debounce } from 'lodash-es'
import Action from '../Action.vue'
import { deleteCondition, getConditionList, sort } from '@/api/home/filter'
import type { FilterSearchParam } from '/#/api'
import SvgIcon from '@/components/Icon/SvgIcon.vue'
defineOptions({ name: 'FilterModal' })
const props = defineProps({
type: {
type: Number,
default: () => 0,
},
});
})
const emit = defineEmits<{
(e: "showNewFilter"): void;
(e: "editFilter", filter: any): void;
(e: "handleOk", item: any): void;
}>();
(e: 'showNewFilter'): void
(e: 'editFilter', filter: any): void
(e: 'handleOk', item: any): void
}>()
const show = ref(false);
const modal = useModal()
// eslint-disable-next-line ts/ban-ts-comment
// @ts-expect-error
const $message = window.$message
const show = ref(false)
const tableData = ref<Array<RowData>>([])
const cardStyle = {
width: "808px",
height: "840px",
"--n-padding-bottom": "10px",
"--n-padding-left": "10px",
};
'width': '808px',
'height': '840px',
'--n-padding-bottom': '10px',
'--n-padding-left': '10px',
}
interface RowData {
id: string;
searchname: string;
createby: string;
createtime: string;
updateby: string;
updatetime: string;
id: string
searchname: string
createby: string
createtime: string
updateby: string
updatetime: string
}
function sortData(row) {
console.log("sortData", row);
if (row.order == "descend") {
if (row.order == 'descend') {
tableData.value.sort(
(a, b) =>
new Date(a[row.columnKey]).getTime() - new Date(b[row.columnKey]).getTime()
);
} else if (row.order == "ascend") {
new Date(a[row.columnKey]).getTime() - new Date(b[row.columnKey]).getTime(),
)
}
else if (row.order == 'ascend') {
tableData.value.sort(
(a, b) =>
new Date(b[row.columnKey]).getTime() - new Date(a[row.columnKey]).getTime()
);
} else {
new Date(b[row.columnKey]).getTime() - new Date(a[row.columnKey]).getTime(),
)
}
else {
tableData.value.sort(
(a, b) => Number((a as any).reorder) - Number((b as any).reorder)
);
(a, b) => Number((a as any).reorder) - Number((b as any).reorder),
)
}
}
const columns: DataTableColumns<RowData> = [
{
type: "selection",
type: 'selection',
},
{
title: "操作",
key: "action",
title: '操作',
key: 'action',
render(row) {
return h(Action, {
options: [
{ label: "编辑", key: 1 },
{ label: "删除", key: 2 },
{ label: '编辑', key: 1 },
{ label: '删除', key: 2 },
],
id: row.id,
select,
});
})
},
},
// j
{
title: "名称",
key: "searchname",
title: '名称',
key: 'searchname',
ellipsis: {
tooltip: true,
},
},
{
title: "创建者",
key: "createby",
title: '创建者',
key: 'createby',
},
{
title: "创建时间",
key: "createtime",
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" });
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()
// );
return new Date(row1?.createtime).getTime() - new Date(row2?.createtime).getTime();
return new Date(row1?.createtime).getTime() - new Date(row2?.createtime).getTime()
},
},
{
title: "更新者",
key: "updateby",
title: '更新者',
key: 'updateby',
},
{
title: "更新时间",
key: "updatetime",
title: '更新时间',
key: 'updatetime',
width: 180,
},
];
const total = ref(0);
const loading = ref(true);
]
const total = ref(0)
const loading = ref(true)
const pagination = reactive({
page: 1,
pageCount: 1,
@ -141,231 +147,228 @@ const pagination = reactive({
showSizePicker: true,
pageSizes: [
{
label: "10 每页",
label: '10 每页',
value: 10,
},
{
label: "15 每页",
label: '15 每页',
value: 15,
},
{
label: "30 每页",
label: '30 每页',
value: 30,
},
{
label: "50 每页",
label: '50 每页',
value: 50,
},
],
showQuickJumper: true,
prefix: () => `${total.value} 条数据`,
});
const tableData = ref<Array<RowData>>([]);
const keyword = ref("");
})
const keyword = ref('')
async function query(page: number, pageSize: number) {
const searchParam: FilterSearchParam = {
search_searchname: { value: keyword.value, op: "like", type: "string" },
};
search_searchname: { value: keyword.value, op: 'like', type: 'string' },
}
const result = await getConditionList(
{ pageNo: page, pageSize },
searchParam,
props.type
);
const { data, pageCount, total: totalCount } = result;
tableData.value = data;
pagination.page = page;
total.value = totalCount;
pagination.pageCount = pageCount;
loading.value = false;
props.type,
)
const { data, pageCount, total: totalCount } = result
tableData.value = data
pagination.page = page
total.value = totalCount
pagination.pageCount = pageCount
loading.value = false
}
function afterLeave() {
pagination.page = 1;
pagination.pageCount = 1;
pagination.pageSize = 10;
pagination.page = 1
pagination.pageCount = 1
pagination.pageSize = 10
}
const selectionIds = ref<DataTableRowKey[]>([]);
const selectionIds = ref<DataTableRowKey[]>([])
const rowKey = (row: RowData) => row.id;
const rowKey = (row: RowData) => row.id
function rowProps(row: RowData) {
return {
"data-id": row.id,
};
'data-id': row.id,
}
}
function handleCheck(rowKeys: DataTableRowKey[]) {
selectionIds.value = rowKeys;
selectionIds.value = rowKeys
}
function select(key: number, id: string) {
let modalInst: ModalReactive | null = null
switch (key) {
case 1:
editSelection(id);
break;
editSelection(id)
break
case 2:
const modalInst = modal.create({
title: "确认提示",
content: "确认删除该条过滤条件吗?",
positiveText: "确定",
negativeText: "取消",
preset: "dialog",
modalInst = modal.create({
title: '确认提示',
content: '确认删除该条过滤条件吗?',
positiveText: '确定',
negativeText: '取消',
preset: 'dialog',
onPositiveClick: () => deleteSelection(id),
onNegativeClick: () => modalInst.destroy(),
});
break;
onNegativeClick: () => (modalInst as ModalReactive).destroy(),
})
break
default:
break;
break
}
}
function editSelection(id) {
// const $message = window["$message"];
// if (selectionIds.value.length === 0 || selectionIds.value.length > 1) {
// $message.error("");
// return;
// }
const selectedId = id;
const selectedId = id
const selectedFilter = tableData.value.find((item: any) => {
return item.id === selectedId;
});
return item.id === selectedId
})
emit("editFilter", selectedFilter);
closeModal();
emit('editFilter', selectedFilter)
closeModal()
}
function deleteSelection(id = "") {
function deleteSelection(id = '') {
if (selectionIds.value.length === 0) {
deleteCondition({ ids: id }).then(() => {
query(pagination.page, pagination.pageSize);
});
return;
query(pagination.page, pagination.pageSize)
})
return
}
const modalInst = modal.create({
title: "确认提示",
content: "确认删除所选过滤条件吗?",
positiveText: "确定",
negativeText: "取消",
preset: "dialog",
title: '确认提示',
content: '确认删除所选过滤条件吗?',
positiveText: '确定',
negativeText: '取消',
preset: 'dialog',
onPositiveClick: () =>
deleteCondition({ ids: selectionIds.value.join(",") }).then(() => {
selectionIds.value = [];
query(pagination.page, pagination.pageSize);
deleteCondition({ ids: selectionIds.value.join(',') }).then(() => {
selectionIds.value = []
query(pagination.page, pagination.pageSize)
}),
onNegativeClick: () => modalInst.destroy(),
});
})
}
async function handlePageChange(currentPage) {
if (loading.value) return;
pagination.page = currentPage;
const { pageSize } = pagination;
await query(currentPage, pageSize);
if (loading.value)
return
pagination.page = currentPage
const { pageSize } = pagination
await query(currentPage, pageSize)
}
async function handlePageSizeChange(currentPageSize) {
if (loading.value) return;
if (loading.value)
return
const { page } = pagination;
pagination.pageSize = currentPageSize;
await query(page, currentPageSize);
const { page } = pagination
pagination.pageSize = currentPageSize
await query(page, currentPageSize)
}
function handleClick() {
emit("showNewFilter");
closeModal();
emit('showNewFilter')
closeModal()
}
let sortTable: Sortable | null = null;
const tableRef = ref<InstanceType<typeof NDataTable>>();
let sortTable: Sortable | null = null
const tableRef = ref<InstanceType<typeof NDataTable>>()
async function showModal() {
show.value = true;
show.value = true
const { page, pageSize } = pagination;
await query(page, pageSize);
const { page, pageSize } = pagination
await query(page, pageSize)
nextTick(() => {
if (sortTable !== null) destory();
const el: HTMLDivElement = tableRef.value?.$el;
const tbody: HTMLElement | null = el.querySelector("tbody.n-data-table-tbody")!;
if (tbody) sortTable = Sortable.create(tbody, { onEnd, onMove });
});
if (sortTable !== null)
destory()
const el: HTMLDivElement = tableRef.value?.$el
const tbody: HTMLElement | null = el.querySelector('tbody.n-data-table-tbody')!
if (tbody)
sortTable = Sortable.create(tbody, { onEnd, onMove })
})
}
let relatedId = "";
let insertafter = false;
let relatedId = ''
let insertafter = false
// TODO: bug
function onEnd(event: SortableEvent) {
const data = unref(tableData);
const oldElem = data[event.oldIndex!];
data.splice(event.oldIndex!, 1);
data.splice(event.newIndex!, 0, oldElem);
const data = unref(tableData)
const oldElem = data[event.oldIndex!]
data.splice(event.oldIndex!, 1)
data.splice(event.newIndex!, 0, oldElem)
const dragId = oldElem.id;
const dragId = oldElem.id
const index = data.findIndex((item) => {
return item.id === relatedId;
});
return item.id === relatedId
})
// -1+1
const order = insertafter ? index - 1 : index + 1;
// console.log('dragid:', dragId, 'order:', order)
sort(dragId, order);
const order = insertafter ? index - 1 : index + 1
sort(dragId, order)
}
function onMove(evt: any) {
relatedId = evt.related?.dataset?.id;
insertafter = evt.willInsertAfter;
// console.log(`${evt.dragged.dataset.id},${evt.related}`, 'insertafter', evt.willInsertAfter)
relatedId = evt.related?.dataset?.id
insertafter = evt.willInsertAfter
}
function destory() {
sortTable && sortTable.destroy();
sortTable = null;
sortTable && sortTable.destroy()
sortTable = null
}
onUnmounted(() => {
destory();
});
destory()
})
function closeModal() {
selectionIds.value = [];
show.value = false;
selectionIds.value = []
show.value = false
}
defineExpose({
showModal,
query,
pagination,
});
})
const inputHandler = debounce((word) => {
keyword.value = word;
query(1, 5);
}, 300);
keyword.value = word
query(1, 5)
}, 300)
const showSearch = computed(() => {
return selectionIds.value.length > 0;
});
return selectionIds.value.length > 0
})
const handleOk = () => {
function handleOk() {
if (selectionIds.value.length > 1) {
$message.error("只能选择一条筛选条件");
return;
$message.error('只能选择一条筛选条件')
return
}
if (selectionIds.value.length == 1) {
const selectedId = selectionIds.value[0];
let item = tableData.value.find((v) => v.id == selectedId);
emit("handleOk", item);
const selectedId = selectionIds.value[0]
const item = tableData.value.find(v => v.id == selectedId)
emit('handleOk', item)
}
if (selectionIds.value.length == 0) {
emit("handleOk", "");
}
closeModal();
};
if (selectionIds.value.length == 0)
emit('handleOk', '')
closeModal()
}
</script>
<template>
@ -374,9 +377,9 @@ const handleOk = () => {
v-model:show="show"
transform-origin="center"
display-directive="if"
@after-leave="afterLeave"
:mask-closable="false"
class="modal_wrapper"
@after-leave="afterLeave"
>
<n-card
:style="cardStyle"
@ -396,8 +399,7 @@ const handleOk = () => {
'font-weight': '600',
}"
class="wrapper-info-title"
>基本信息</span
>
>基本信息</span>
</div>
</div>
@ -429,13 +431,10 @@ const handleOk = () => {
</n-button>
</div>
<div class="msg">
<span
>已选中
<span>已选中
<span style="color: #507afd; font-size: 16px">{{
selectionIds.length
}}</span>
</span
>
}}</span></span>
<a @click="selectionIds = []">清空</a>
</div>
</div>
@ -590,8 +589,6 @@ const handleOk = () => {
position: relative;
left: -80px;
}
.modal_wrapper {
}
::v-deep(.n-input .n-input__input-el) {
height: 24px;
}

@ -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,199 +109,201 @@ 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 })
closeModal()
})
}
//
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",
label: '80%-90%',
value: '80,90',
},
{
label: "95%-100%",
value: "95,100",
label: '95%-100%',
value: '95,100',
},
{
label: "100%-100%",
value: "100,100",
label: '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");
emit('onOk')
setTimeout(() => {
show.value = false;
}, 300);
show.value = false
}, 300)
}
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;
const getterName = `get${key}`;
const options = unref(dicStore[getterName]);
return options || [];
if (key === 'izsimilarity')
return similarityOptions
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";
console.log(editFilter, "editFilter");
const { searchname, ocrUsersearchchildList, id } = editFilter;
currentEditId = id;
formValue.name = searchname;
currentStatus.value = 'edit'
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"
class="modal_wrapper"
@after-leave="leaveHandler"
>
<n-card
:style="cardStyle"
@ -319,20 +322,19 @@ defineExpose({
'font-size': '16px',
'font-weight': '600',
}"
>基本信息</span
>
>基本信息</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="标题" merged-require-mark-placement="left">
<!-- j -->
<n-input
v-model:value="formValue.name"
:style="{ width: '780px' }"
maxlength="15"
@keydown.enter.prevent
placeholder="请输入过滤名称"
@keydown.enter.prevent
/>
</n-form-item>
<n-form-item v-show="false" path="logic" label="逻辑关系">
@ -418,12 +420,12 @@ defineExpose({
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="形状"
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"
fill="#DDDDDD"
></path>
/>
</g>
</g>
</g>

File diff suppressed because it is too large Load Diff

@ -1,54 +1,53 @@
<script lang="ts" setup>
import { defineOptions, onMounted, ref, onBeforeUnmount } from "vue";
import { useRouter } from "vue-router";
import { defineOptions, onBeforeUnmount, onMounted, ref } 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();
const time = ref()
onMounted(() => {
time.value = setInterval(() => {
// console.log("00000000-----------");
show.value && refresh();
}, 5000);
});
show.value && refresh()
}, 5000)
})
onBeforeUnmount(() => {
clearInterval(time.value);
time.value = null;
});
clearInterval(time.value)
time.value = null
})
defineExpose({
showModal,
closeModal,
});
})
</script>
<template>
@ -75,13 +74,15 @@ defineExpose({
style="padding: 8px 8px 0 8px"
>
<div class="wrapper">
<div class="title">查重进度</div>
<div class="title">
查重进度
</div>
<div class="icon-list">
<svg-icon
size="16"
name="refresh"
@click="refresh"
style="margin-right: 16px; cursor: pointer"
@click="refresh"
/>
<svg-icon
v-show="!isFold"
@ -100,8 +101,8 @@ defineExpose({
<svg-icon
size="16"
name="close-none-border"
@click="cancel"
style="margin-right: 25.7px; cursor: pointer"
@click="cancel"
/>
</div>
</div>

@ -1,6 +1,6 @@
<script lang="ts" setup>
import { defineOptions, ref } from 'vue';
import { useRouter } from 'vue-router';
import { defineOptions, ref } from 'vue'
import { useRouter } from 'vue-router'
defineOptions({ name: 'ShortcutModal' })
@ -9,7 +9,7 @@ const props = defineProps({
type: String,
default: '',
},
});
})
const show = ref(false)
const router = useRouter()
@ -26,11 +26,10 @@ function showModal() {
function closeModal(path) {
show.value = false
if(props.id) {
router.push(path + '?id=' + props.id)
}else {
if (props.id)
router.push(`${path}?id=${props.id}`)
else
router.push(path)
}
}
function closeIconModal() {
@ -43,7 +42,7 @@ defineExpose({
</script>
<template>
<div class="finish-package-modal" v-if="show">
<div v-if="show" class="finish-package-modal">
<!-- <n-modal v-model:show="show" :mask-closable="false" transform-origin="center" style="padding: 8px;">
<n-card :style="cardStyle" :bordered="false" size="huge" role="dialog" aria-modal="true">
<div style="display: flex;">
@ -67,10 +66,16 @@ defineExpose({
</n-card>
</n-modal> -->
<div class="header-box">
<div class="robot-box"><svg-icon size="80" name="robot-two" /></div>
<div class="robot-box">
<svg-icon size="80" name="robot-two" />
</div>
<div class="text-box">
<div class="msg-title">生成成功提示</div>
<div class="msg-text">AI助手已根据您的配置要求生成任务包</div>
<div class="msg-title">
生成成功提示
</div>
<div class="msg-text">
AI助手已根据您的配置要求生成任务包
</div>
</div>
<div class="close-box" @click="closeIconModal">
<svg-icon size="30" name="close-none-border" />

@ -1,6 +1,6 @@
<script lang="ts" setup>
import { defineOptions, ref } from 'vue';
import { useRouter } from 'vue-router';
import { defineOptions, ref } from 'vue'
import { useRouter } from 'vue-router'
defineOptions({ name: 'ShortcutModal' })
@ -34,8 +34,12 @@ defineExpose({
<div style="display: flex;">
<div><svg-icon size="80" name="robot2" /></div>
<div style="height: 130px;text-align: center;margin-left: 20px;">
<div class="msg-title">生成任务提示</div>
<div class="msg-text">AI已根据您的配置要求生成任务包</div>
<div class="msg-title">
生成任务提示
</div>
<div class="msg-text">
AI已根据您的配置要求生成任务包
</div>
</div>
</div>
@ -78,5 +82,4 @@ defineExpose({
color: #666666;
line-height: 22px;
}
</style>

@ -1,81 +1,102 @@
<script lang="ts" setup>
import { onMounted, ref } from "vue";
import { getToolsCount } from "@/api/home/main";
import { onMounted, ref } from 'vue'
import { getToolsCount } from '@/api/home/main'
const emit = defineEmits<{
(e: "reject", params: any);
(e: "viewrepeat");
}>();
(e: 'reject', params: any)
(e: 'viewrepeat')
}>()
const show = ref(false);
const toolsData = ref({} as any);
const show = ref(false)
const toolsData = ref({} as any)
async function getData() {
const res = await getToolsCount();
toolsData.value = res.data || {};
if (res.code == "OK") {
showModal();
}
const res = await getToolsCount()
toolsData.value = res.data || {}
if (res.code == 'OK')
showModal()
}
onMounted(() => {
getData();
});
getData()
})
function showModal() {
show.value = true;
show.value = true
}
function closeModal() {
show.value = false;
show.value = false
}
async function reject() {
emit("reject", { a: "todo" });
closeModal();
emit('reject', { a: 'todo' })
closeModal()
}
async function viewRepeat(e: MouseEvent) {
emit("viewrepeat");
e.preventDefault();
closeModal();
emit('viewrepeat')
e.preventDefault()
closeModal()
}
defineExpose({
showModal,
});
})
</script>
<template>
<n-modal v-model:show="show" transform-origin="center" class="modal_wrap">
<div class="wrapper">
<div class="wrapper-hearder">
<div class="wrapper-title">欢迎登录智能AI审批工具</div>
<div class="wrapper-mark">某某有限公司-某某事业部-张小凡</div>
<div class="wrapper-title">
欢迎登录智能AI审批工具
</div>
<div class="wrapper-mark">
某某有限公司-某某事业部-张小凡
</div>
</div>
<div class="wrapper-content">
<div class="flex_box">
<div class="item">
<SvgIcon name="task_count" width="49" height="58" />
<div class="num_box">{{ toolsData?.total || 0 }}</div>
<div class="title_box">任务总数</div>
<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" />
<div class="num_box">{{ toolsData?.treat || 0 }}</div>
<div class="title_box">待审批</div>
<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" />
<div class="num_box">{{ toolsData?.approvedCount || 0 }}</div>
<div class="title_box">已审批</div>
<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">{{ toolsData?.repeat }}</div>
<div class="title_box">重复图片</div>
<div class="num_box">
{{ toolsData?.repeat }}
</div>
<div class="title_box">
重复图片
</div>
</div>
</div>
<div class="footer" @click="viewRepeat"></div>
<div class="footer" @click="viewRepeat">
我知道了
</div>
<!-- <div class="footer">
<SvgIcon
@click="viewRepeat"

@ -1,7 +1,7 @@
<script lang="ts" setup>
import type { FormInst, FormRules } from 'naive-ui';
import { useMessage } from 'naive-ui';
import { ref } from 'vue';
import type { FormInst, FormRules } from 'naive-ui'
import { useMessage } from 'naive-ui'
import { ref } from 'vue'
const emit = defineEmits<{
(e: 'commit', value: any)
@ -77,11 +77,11 @@ 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', 'font-size': '16px', 'font-weight': '600' }">基本信息</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" 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>

@ -1,50 +1,50 @@
<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 percent = ref(0);
const configStore = useConfig()
const percent = ref(0)
configStore.$subscribe(() => {
percent.value = configStore.getTimeNum;
});
percent.value = configStore.getTimeNum
})
</script>
<template>
@ -58,8 +58,8 @@ configStore.$subscribe(() => {
<svg-icon
size="15"
name="close"
@click="closeModal"
style="position: absolute; right: 15.7px; top: 6px; cursor: pointer"
@click="closeModal"
/>
<div class="wrapper">
<svg-icon size="90" name="robot2" />

@ -1,14 +1,14 @@
<script lang="ts" setup>
import { ref } from 'vue'
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();
}
const contentRef: any = ref(null)
function showLoginModal() {
contentRef.value.showLoginSuccessModal()
}
</script>
<template>
@ -17,7 +17,7 @@ const showLoginModal = ()=>{
<Aside />
<!-- 内容 -->
<Content ref="contentRef"/>
<Content ref="contentRef" />
<!-- 机器人 -->
<!-- <Robot :canClick="true" @click="showLoginModal"/> -->

@ -1,281 +1,285 @@
<script lang="ts" setup>
import { reactive, ref } from "vue";
import { useMessage } from "naive-ui";
import { forgetPassword, getCode, updateSUser } from "@/api/login/login";
import { reactive, ref } from 'vue'
import { useMessage } from 'naive-ui'
import { forgetPassword, getCode, updateSUser } from '@/api/login/login'
const emit = defineEmits(["close", "forget"]);
const emit = defineEmits(['close', 'forget'])
interface FormState {
enterprisecode?: string;
username: string;
password: string;
captcha: string;
enterprisecode?: string
username: string
password: string
captcha: string
}
interface FormForget {
agentcode: string;
loginname: string;
phone: string;
phonecode: string;
agentcode: string
loginname: string
phone: string
phonecode: string
}
interface FormSure {
newPassword: string;
rePasswrod: string;
loginname: string;
newPassword: string
rePasswrod: string
loginname: string
}
const formRef = ref();
const formRefSure = ref();
const formRef = ref()
const formRefSure = ref()
const message = useMessage();
const loading = ref(false);
const flag = ref(true);
const message = useMessage()
const loading = ref(false)
const flag = ref(true)
const formForget: FormForget = reactive({
agentcode: "",
loginname: "",
phone: "",
phonecode: "",
});
agentcode: '',
loginname: '',
phone: '',
phonecode: '',
})
const formInline: FormState = reactive({
enterprisecode: "",
username: "",
password: "",
captcha: "",
});
enterprisecode: '',
username: '',
password: '',
captcha: '',
})
const formSure: FormSure = reactive({
newPassword: "",
rePasswrod: "",
loginname: "13311111111",
});
const tab = ref(0);
const loginSuccess = ref(true);
const loginRejectMessge = ref("");
const countTime = ref("获取验证码");
newPassword: '',
rePasswrod: '',
loginname: '13311111111',
})
const tab = ref(0)
const loginSuccess = ref(true)
const loginRejectMessge = ref('')
const countTime = ref('获取验证码')
const rules = {
enterprisecode: [
{ required: true, message: "请输入企业编码", trigger: "blur" },
{ required: true, message: '请输入企业编码', trigger: 'blur' },
{
trigger: ["blur", "input", "change"],
level: "error",
trigger: ['blur', 'input', 'change'],
level: 'error',
validator(_rule, value) {
if (loginSuccess.value || !value) {
return true;
}
if (loginRejectMessge.value.indexOf("企业") > -1) {
return new Error(loginRejectMessge.value);
}
if (loginSuccess.value || !value)
return true
if (loginRejectMessge.value.includes('企业'))
return new Error(loginRejectMessge.value)
},
},
],
agentcode: [
{ required: true, message: "请输入企业编码", trigger: "blur" },
{ required: true, message: '请输入企业编码', trigger: 'blur' },
{
trigger: ["blur", "input", "change"],
level: "error",
trigger: ['blur', 'input', 'change'],
level: 'error',
validator(_rule, value) {
if (loginSuccess.value || !value) {
return true;
}
if (loginRejectMessge.value.indexOf("企业") > -1) {
return new Error(loginRejectMessge.value);
}
if (loginSuccess.value || !value)
return true
if (loginRejectMessge.value.includes('企业'))
return new Error(loginRejectMessge.value)
},
},
],
loginname: [
{ required: true, message: "请输入用户名", trigger: "blur" },
{ required: true, message: '请输入用户名', trigger: 'blur' },
{
trigger: ["blur", "input", "change"],
level: "error",
trigger: ['blur', 'input', 'change'],
level: 'error',
validator(_rule, value) {
if (loginSuccess.value || !value) {
return true;
}
if (loginRejectMessge.value.indexOf("用户名") > -1||loginRejectMessge.value.indexOf("账号") > -1) {
return new Error(loginRejectMessge.value);
}
if (loginSuccess.value || !value)
return true
if (loginRejectMessge.value.includes('用户名') || loginRejectMessge.value.includes('账号'))
return new Error(loginRejectMessge.value)
},
},
],
phone: [
{ required: true, message: "请输入手机号", trigger: "blur" },
{ required: true, message: '请输入手机号', trigger: 'blur' },
{
trigger: ["blur", "input", "change"],
level: "error",
trigger: ['blur', 'input', 'change'],
level: 'error',
validator(_rule, value) {
if (loginSuccess.value || !value) {
return true;
}
if (loginRejectMessge.value.indexOf("手机号") > -1) {
return new Error(loginRejectMessge.value);
}
if (loginSuccess.value || !value)
return true
if (loginRejectMessge.value.includes('手机号'))
return new Error(loginRejectMessge.value)
},
},
],
password: { required: true, message: "请输入密码", trigger: "blur" },
password: { required: true, message: '请输入密码', trigger: 'blur' },
phonecode: [
{ required: true, message: "请输入验证码", trigger: "blur" },
{ required: true, message: '请输入验证码', trigger: 'blur' },
{
trigger: ["blur", "input", "change"],
level: "error",
trigger: ['blur', 'input', 'change'],
level: 'error',
validator(_rule, value) {
if (loginSuccess.value || !value) {
return true;
}
if (loginRejectMessge.value.indexOf("验证码") > -1) {
return new Error(loginRejectMessge.value);
}
if (loginSuccess.value || !value)
return true
if (loginRejectMessge.value.includes('验证码'))
return new Error(loginRejectMessge.value)
},
},
],
newPassword: { required: true, message: "请输入新密码", trigger: "blur" },
newPassword: { required: true, message: '请输入新密码', trigger: 'blur' },
rePasswrod: [
{
required: true,
message: "请再次输入密码",
trigger: ["input", "blur"],
message: '请再次输入密码',
trigger: ['input', 'blur'],
},
{
validator: validatePasswordSame,
message: "两次密码输入不一致",
trigger: ["blur", "password-input"],
message: '两次密码输入不一致',
trigger: ['blur', 'password-input'],
},
],
};
}
function validatePasswordSame(rule: any, value: string): boolean {
if (Boolean(formSure.rePasswrod)) {
if (value == formSure.newPassword) {
return true;
} else {
return false;
}
} else {
return true;
if (formSure.rePasswrod) {
if (value == formSure.newPassword)
return true
else
return false
}
else {
return true
}
}
function handleSubmit(e) {
e.preventDefault();
loginSuccess.value = true;
e.preventDefault()
loginSuccess.value = true
formRef.value.validate(async (errors) => {
if (!errors) {
const { loginname, phone, phonecode, agentcode } = formForget;
loading.value = true;
const { loginname, phone, phonecode, agentcode } = formForget
loading.value = true
const params = {
loginname,
phone,
phonecode,
agentcode,
};
}
try {
const res = await forgetPassword(params);
if (res.code === "OK") {
loginSuccess.value = true;
formSure.loginname = res.data?.loginname;
tab.value = 1;
} else {
loginSuccess.value = false;
message.error(res.message);
loginRejectMessge.value = res.message;
formRef.value.validate();
const res = await forgetPassword(params)
if (res.code === 'OK') {
loginSuccess.value = true
formSure.loginname = res.data?.loginname
tab.value = 1
}
} finally {
loading.value = false;
else {
loginSuccess.value = false
message.error(res.message)
loginRejectMessge.value = res.message
formRef.value.validate()
}
}
finally {
loading.value = false
}
}
});
})
}
function handleSure(e) {
e.preventDefault();
e.preventDefault()
formRefSure.value.validate(async (errors) => {
if (!errors) {
const { newPassword, rePasswrod, loginname } = formSure;
loading.value = true;
const { newPassword, rePasswrod, loginname } = formSure
loading.value = true
const params = {
newPassword,
rePasswrod,
loginname,
};
}
try {
const res = await updateSUser(params);
if (res.code === "OK") {
message.success("修改成功");
tab.value = 0;
forget();
} else {
message.error(res.message);
const res = await updateSUser(params)
if (res.code === 'OK') {
message.success('修改成功')
tab.value = 0
forget()
}
else {
message.error(res.message)
}
} finally {
loading.value = false;
}
finally {
loading.value = false
}
}
});
})
}
function close() {
loading.value = false;
emit("close");
loading.value = false
emit('close')
}
function switchTab(type: number) {
tab.value = type;
tab.value = type
}
function computedForm() {
return !formForget.phonecode || !formForget.phone || !formForget.loginname || !formForget.agentcode;
return !formForget.phonecode || !formForget.phone || !formForget.loginname || !formForget.agentcode
}
function computedFormSure() {
return !formSure.newPassword || !formSure.rePasswrod;
return !formSure.newPassword || !formSure.rePasswrod
}
async function sendCode(value) {
if (!flag.value) return;
flag.value = false;
if(!(formForget.phone.length == 11)){
if (!flag.value)
return
}
flag.value = false
if (!(formForget.phone.length == 11))
return
const res = await getCode({
phone: formForget.phone,
agentcode: formForget.agentcode,
});
})
if (!res.data) {
message.error(res.message);
return;
message.error(res.message)
return
}
startCount();
startCount()
}
function startCount() {
let time = 60;
countTime.value = "60s";
let time = 60
countTime.value = '60s'
const timer = setInterval(() => {
countTime.value = `${--time}s`;
countTime.value = `${--time}s`
if (time === 0) {
clearInterval(timer);
countTime.value = "获取验证码";
flag.value = true;
clearInterval(timer)
countTime.value = '获取验证码'
flag.value = true
}
}, 1000);
}, 1000)
}
function forget() {
loading.value = false;
emit("forget");
loading.value = false
emit('forget')
}
</script>
<template>
<div class="form-login">
<img class="img-close" src="@/assets/images/login/close.png" alt="" @click="close" />
<img class="img-close" src="@/assets/images/login/close.png" alt="" @click="close">
<div class="flex justify-between header">
<div class="tab">忘记密码</div>
<div class="back" @click="forget">&lt; </div>
<div class="tab">
忘记密码
</div>
<div class="back" @click="forget">
&lt; 返回登录
</div>
</div>
<div v-if="tab === 0" class="form-1">
<n-form
@ -322,7 +326,7 @@ function forget() {
src="@/assets/images/login/phone.png"
alt=""
@click="close"
/>
>
</template>
</n-input>
</n-form-item>
@ -340,7 +344,7 @@ function forget() {
src="@/assets/images/login/auth.png"
alt=""
@click="close"
/>
>
</template>
<template #suffix>
<div

@ -1,344 +1,349 @@
<script lang="ts" setup>
import { computed, onMounted, reactive, ref } from "vue";
import { useRoute, useRouter } from "vue-router";
import { useMessage } from "naive-ui";
import { computed, onMounted, reactive, ref } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useMessage } from 'naive-ui'
// import captcha from './captcha.vue'
import { PageEnum } from "@/enums/pageEnum";
import { useUserStore } from "@/store/modules/user";
import { ResultEnum } from "@/enums/httpEnum";
import { getCode, smsLogin } from "@/api/login/login";
import SvgIcon from "@/components/Icon/SvgIcon.vue";
import { PageEnum } from '@/enums/pageEnum'
import { useUserStore } from '@/store/modules/user'
import { ResultEnum } from '@/enums/httpEnum'
import { getCode, smsLogin } from '@/api/login/login'
import SvgIcon from '@/components/Icon/SvgIcon.vue'
const emit = defineEmits(["close", "forget"]);
const emit = defineEmits(['close', 'forget'])
interface FormState {
enterprisecode?: string;
username: string;
password: string;
enterprisecode?: string
username: string
password: string
}
interface FormSms {
agentcode: string;
phone: string;
phonecode: string;
agentcode: string
phone: string
phonecode: string
}
const formRef = ref();
const formRefSms = ref();
const message = useMessage();
const loading = ref(false);
const autoLogin = ref(false);
const LOGIN_NAME = PageEnum.BASE_LOGIN_NAME;
const userStore = useUserStore();
const router = useRouter();
const route = useRoute();
const show = ref(false);
const flag = ref(true);
const loginSuccess = ref(true);
const loginRejectMessge = ref("");
let formInline: FormState = reactive({
const formRef = ref()
const formRefSms = ref()
const message = useMessage()
const loading = ref(false)
const autoLogin = ref(false)
const LOGIN_NAME = PageEnum.BASE_LOGIN_NAME
const userStore = useUserStore()
const router = useRouter()
const route = useRoute()
const show = ref(false)
const flag = ref(true)
const loginSuccess = ref(true)
const loginRejectMessge = ref('')
const formInline: FormState = reactive({
// enterprisecode: "",
// username: "yanshi01",
// password: "123456",
enterprisecode: "",
username: "",
password: "",
});
let formSms: FormSms = reactive({
agentcode: "",
phone: "",
phonecode: "",
});
const tab = ref(0);
const countTime = ref("获取验证码");
enterprisecode: '',
username: '',
password: '',
})
const formSms: FormSms = reactive({
agentcode: '',
phone: '',
phonecode: '',
})
const tab = ref(0)
const countTime = ref('获取验证码')
const rules = {
enterprisecode: [
{ required: true, message: "请输入企业编码", trigger: "blur" },
{ required: true, message: '请输入企业编码', trigger: 'blur' },
{
trigger: ["blur", "input", "change"],
level: "error",
trigger: ['blur', 'input', 'change'],
level: 'error',
validator(_rule, value) {
if (loginSuccess.value || !value) {
return true;
}
if (loginRejectMessge.value.indexOf("企业") > -1) {
return new Error(loginRejectMessge.value);
}
if (loginSuccess.value || !value)
return true
if (loginRejectMessge.value.includes('企业'))
return new Error(loginRejectMessge.value)
},
},
],
agentcode: [
{ required: true, message: "请输入验证码", trigger: "blur" },
{ required: true, message: '请输入验证码', trigger: 'blur' },
{
trigger: ["blur", "input", "change"],
level: "error",
trigger: ['blur', 'input', 'change'],
level: 'error',
validator(_rule, value) {
if (loginSuccess.value || !value) {
return true;
}
if (loginRejectMessge.value.indexOf("验证码") > -1) {
return new Error(loginRejectMessge.value);
}
if (loginSuccess.value || !value)
return true
if (loginRejectMessge.value.includes('验证码'))
return new Error(loginRejectMessge.value)
},
},
],
phone: [
{ required: true, message: "请输入手机号", trigger: "blur" },
{ required: true, message: '请输入手机号', trigger: 'blur' },
{
trigger: ["blur", "input", "change"],
level: "error",
trigger: ['blur', 'input', 'change'],
level: 'error',
validator(_rule, value) {
if (loginSuccess.value || !value) {
return true;
}
if (loginRejectMessge.value.indexOf("手机号") > -1) {
return new Error(loginRejectMessge.value);
}
if (loginSuccess.value || !value)
return true
if (loginRejectMessge.value.includes('手机号'))
return new Error(loginRejectMessge.value)
},
},
],
phonecode: [
{ required: true, message: "请输入验证码", trigger: "blur" },
{ required: true, message: '请输入验证码', trigger: 'blur' },
{
trigger: ["blur", "input", "change"],
level: "error",
trigger: ['blur', 'input', 'change'],
level: 'error',
validator(_rule, value) {
if (value.length < 4 && value.length > 0) {
return new Error("请正确填写4位手机短信验证码");
}
if (loginSuccess.value || !value) {
return true;
}
if (loginRejectMessge.value.indexOf("验证码") > -1) {
return new Error(loginRejectMessge.value);
}
if (value.length < 4 && value.length > 0)
return new Error('请正确填写4位手机短信验证码')
if (loginSuccess.value || !value)
return true
if (loginRejectMessge.value.includes('验证码'))
return new Error(loginRejectMessge.value)
},
},
],
username: [
{ required: true, message: "请输入账号", trigger: "blur" },
{ required: true, message: '请输入账号', trigger: 'blur' },
{
trigger: ["blur", "input", "change"],
level: "error",
trigger: ['blur', 'input', 'change'],
level: 'error',
validator(_rule, value) {
if (loginSuccess.value || !value) {
return true;
}
if (loginRejectMessge.value.indexOf("账号") > -1) {
return new Error(loginRejectMessge.value);
}
if (loginSuccess.value || !value)
return true
if (loginRejectMessge.value.includes('账号'))
return new Error(loginRejectMessge.value)
},
},
],
password: [
{ required: true, message: "请输入密码", trigger: "blur" },
{ required: true, message: '请输入密码', trigger: 'blur' },
{
trigger: ["blur", "input", "change"],
level: "error",
trigger: ['blur', 'input', 'change'],
level: 'error',
validator(_rule, value) {
if (loginSuccess.value || !value) {
return true;
}
if (loginRejectMessge.value.indexOf("密码") > -1) {
return new Error(loginRejectMessge.value);
}
if (loginSuccess.value || !value)
return true
if (loginRejectMessge.value.includes('密码'))
return new Error(loginRejectMessge.value)
},
},
],
captcha: [{ required: true, message: "请输入验证码", trigger: "blur" }],
};
captcha: [{ required: true, message: '请输入验证码', trigger: 'blur' }],
}
function handleSubmit(e) {
e.preventDefault();
loginSuccess.value = true;
e.preventDefault()
loginSuccess.value = true
formRef.value.validate(async (errors) => {
if (!errors) {
const { username, password, enterprisecode } = formInline;
message.loading("登录中...");
loading.value = true;
const { username, password, enterprisecode } = formInline
message.loading('登录中...')
loading.value = true
const params = {
username,
password,
codetoken: userStore.getCapToken,
agentcode: enterprisecode,
};
}
try {
const { code, message: msg } = await userStore.login(params);
loginRejectMessge.value = msg;
const { code, message: msg } = await userStore.login(params)
loginRejectMessge.value = msg
if (code === ResultEnum.SUCCESS) {
//
if (autoLogin.value) {
localStorage.setItem("LOGIN_FORM_PASS", JSON.stringify(formInline));
} else {
localStorage.removeItem("LOGIN_FORM_PASS");
}
loginSuccess.value = true;
const { data: userInfo } = await userStore.getInformation();
message.destroyAll();
const toPath = decodeURIComponent((route.query?.redirect || "/") as string);
if (route.name === LOGIN_NAME)
if (autoLogin.value)
localStorage.setItem('LOGIN_FORM_PASS', JSON.stringify(formInline))
else
localStorage.removeItem('LOGIN_FORM_PASS')
loginSuccess.value = true
const { data: userInfo } = await userStore.getInformation()
message.destroyAll()
const toPath = decodeURIComponent((route.query?.redirect || '/') as string)
if (route.name === LOGIN_NAME) {
if (userInfo.frontmenuTList && userInfo.frontmenuTList.length) {
message.success("登录成功,即将进入系统");
message.success('登录成功,即将进入系统')
router.replace(
userInfo.frontmenuTList ? userInfo.frontmenuTList[0]["resUrl"] : "/"
);
} else {
message.error("用户无菜单权限,请联系管理员");
userInfo.frontmenuTList ? userInfo.frontmenuTList[0].resUrl : '/',
)
}
else router.replace(toPath);
} else {
loginSuccess.value = false;
message.destroyAll();
message.info(msg || "登录失败");
formRef.value.validate();
else {
message.error('用户无菜单权限,请联系管理员')
}
}
else { router.replace(toPath) }
}
else {
loginSuccess.value = false
message.destroyAll()
message.info(msg || '登录失败')
formRef.value.validate()
}
} finally {
loading.value = false;
}
} else {
message.error("请填写完整信息,并且进行验证码校验");
finally {
loading.value = false
}
}
else {
message.error('请填写完整信息,并且进行验证码校验')
}
});
})
}
onMounted(() => {
let data: any = localStorage.getItem("LOGIN_FORM_SMS");
let data: any = localStorage.getItem('LOGIN_FORM_SMS')
if (data) {
data = JSON.parse(data) as any;
formSms.agentcode = data.agentcode;
formSms.phone = data.phone;
formSms.phonecode = "";
autoLogin.value = true;
data = JSON.parse(data) as any
formSms.agentcode = data.agentcode
formSms.phone = data.phone
formSms.phonecode = ''
autoLogin.value = true
}
data = localStorage.getItem("LOGIN_FORM_PASS");
data = localStorage.getItem('LOGIN_FORM_PASS')
if (data) {
data = JSON.parse(data) as any;
formInline.username = data.username;
formInline.password = "";
data = JSON.parse(data) as any
formInline.username = data.username
formInline.password = ''
// formInline.password = data.password;
formInline.enterprisecode = data.enterprisecode;
autoLogin.value = true;
formInline.enterprisecode = data.enterprisecode
autoLogin.value = true
}
});
})
function handleSmsSubmit(e) {
e.preventDefault();
loginSuccess.value = true;
e.preventDefault()
loginSuccess.value = true
formRefSms.value.validate(async (errors) => {
if (!errors) {
const { phone, agentcode, phonecode } = formSms;
message.loading("登录中...");
loading.value = true;
const { phone, agentcode, phonecode } = formSms
message.loading('登录中...')
loading.value = true
try {
const res = await smsLogin({
phone,
agentcode,
phonecode,
});
const { code, message: msg } = res;
loginRejectMessge.value = msg;
})
const { code, message: msg } = res
loginRejectMessge.value = msg
if (code === ResultEnum.SUCCESS) {
//
if (autoLogin.value) {
localStorage.setItem("LOGIN_FORM_SMS", JSON.stringify(formSms));
} else {
localStorage.removeItem("LOGIN_FORM_SMS");
}
loginSuccess.value = true;
if (autoLogin.value)
localStorage.setItem('LOGIN_FORM_SMS', JSON.stringify(formSms))
else
localStorage.removeItem('LOGIN_FORM_SMS')
loginSuccess.value = true
// const { code, message: msg } = await userStore.login(params)
await userStore.setStorageToken(res.data);
const { data: userInfo } = await userStore.getInformation();
message.destroyAll();
const toPath = decodeURIComponent((route.query?.redirect || "/") as string);
await userStore.setStorageToken(res.data)
const { data: userInfo } = await userStore.getInformation()
message.destroyAll()
const toPath = decodeURIComponent((route.query?.redirect || '/') as string)
if (route.name === LOGIN_NAME) {
if (userInfo.frontmenuTList && userInfo.frontmenuTList.length) {
message.success("登录成功,即将进入系统");
message.success('登录成功,即将进入系统')
router.replace(
userInfo.frontmenuTList ? userInfo.frontmenuTList[0]["resUrl"] : "/"
);
} else {
message.error("用户无菜单权限,请联系管理员");
userInfo.frontmenuTList ? userInfo.frontmenuTList[0].resUrl : '/',
)
}
else {
message.error('用户无菜单权限,请联系管理员')
}
} else {
router.replace(toPath);
}
} else {
message.destroyAll();
message.info(msg || "登录失败");
loginSuccess.value = false;
formRefSms.value.validate();
else {
router.replace(toPath)
}
}
} catch (e) {
} finally {
loading.value = false;
else {
message.destroyAll()
message.info(msg || '登录失败')
loginSuccess.value = false
formRefSms.value.validate()
}
}
catch (e) {
}
finally {
loading.value = false
}
} else {
message.error("请填写完整信息,并且进行验证码校验");
}
});
else {
message.error('请填写完整信息,并且进行验证码校验')
}
})
}
function close() {
loading.value = false;
emit("close");
loading.value = false
emit('close')
}
function switchTab(type: number) {
loading.value = false;
tab.value = type;
loading.value = false
tab.value = type
}
function computedForm() {
if (tab.value == 0) {
return !formInline.enterprisecode || !formInline.username || !formInline.password;
}
if (tab.value == 1) {
return !formSms.agentcode || !formSms.phone || !formSms.phonecode;
}
if (tab.value == 0)
return !formInline.enterprisecode || !formInline.username || !formInline.password
if (tab.value == 1)
return !formSms.agentcode || !formSms.phone || !formSms.phonecode
}
async function sendCode(value) {
if (!formSms.phone) return;
if (!formSms.phone)
return
if (!flag.value) return;
flag.value = false;
if (!flag.value)
return
flag.value = false
const res = await getCode({
phone: formSms.phone,
agentcode: formSms.agentcode,
});
if (res.code == "OK") {
startCount();
} else {
message.error(res.message);
}
})
if (res.code == 'OK')
startCount()
else
message.error(res.message)
}
function startCount() {
let time = 60;
countTime.value = "60s";
let time = 60
countTime.value = '60s'
const timer = setInterval(() => {
countTime.value = `${--time}s`;
countTime.value = `${--time}s`
if (time === 0) {
clearInterval(timer);
countTime.value = "重新获取";
flag.value = true;
clearInterval(timer)
countTime.value = '重新获取'
flag.value = true
}
}, 1000);
}, 1000)
}
function forget() {
loading.value = false;
emit("forget");
loading.value = false
emit('forget')
}
</script>
<template>
<div class="form-login">
<img class="img-close" src="@/assets/images/login/close.png" alt="" @click="close" />
<img class="img-close" src="@/assets/images/login/close.png" alt="" @click="close">
<div class="tab">
<div
:class="{ 'tab-item-active': tab === 0 }"
@ -373,7 +378,7 @@ function forget() {
maxlength="20"
>
<template #prefix>
<svg-icon size="20" name="enterprise" />
<SvgIcon size="20" name="enterprise" />
</template>
</n-input>
</n-form-item>
@ -385,7 +390,7 @@ function forget() {
maxlength="16"
>
<template #prefix>
<svg-icon size="20" name="account" />
<SvgIcon size="20" name="account" />
</template>
</n-input>
</n-form-item>
@ -399,7 +404,7 @@ function forget() {
maxlength="16"
>
<template #prefix>
<svg-icon size="20" name="password" />
<SvgIcon size="20" name="password" />
</template>
</n-input>
</n-form-item>
@ -411,8 +416,8 @@ function forget() {
size="large"
:loading="loading"
block
@click="handleSubmit"
:disabled="computedForm()"
@click="handleSubmit"
>
登录
</n-button>
@ -446,7 +451,7 @@ function forget() {
placeholder="请输入企业编码"
>
<template #prefix>
<svg-icon size="20" name="enterprise" />
<SvgIcon size="20" name="enterprise" />
</template>
</n-input>
</n-form-item>
@ -463,7 +468,7 @@ function forget() {
src="@/assets/images/login/phone.png"
alt=""
@click="close"
/>
>
</template>
</n-input>
</n-form-item>
@ -481,7 +486,7 @@ function forget() {
src="@/assets/images/login/auth.png"
alt=""
@click="close"
/>
>
</template>
<template #suffix>
<div
@ -505,8 +510,8 @@ function forget() {
size="large"
:loading="loading"
block
@click="handleSmsSubmit"
:disabled="computedForm()"
@click="handleSmsSubmit"
>
登录
</n-button>

@ -1,36 +1,37 @@
<script lang="ts" setup>
import Login from "./components/Login.vue";
import Forget from "./components/Forget.vue";
import { onMounted, nextTick, ref, onDeactivated } from "vue";
import { nextTick, onDeactivated, onMounted, ref } from 'vue'
import Login from './components/Login.vue'
import Forget from './components/Forget.vue'
onMounted(() => {
nextTick(() => {
initRem();
});
window.addEventListener("resize", () => {
initRem();
});
});
onDeactivated(()=>{
window.removeEventListener('resize',()=>{
initRem()
})
window.addEventListener('resize', () => {
initRem()
})
})
onDeactivated(() => {
window.removeEventListener('resize', () => {
})
})
const show = ref(false);
const ifLogin = ref(true);
const initRem = () => {
const designWidth = 1440;
const rempPx = 16;
const scale = window.innerWidth / designWidth;
document.documentElement.style.fontSize = scale * rempPx + "px";
};
const show = ref(false)
const ifLogin = ref(true)
function initRem() {
const designWidth = 1440
const rempPx = 16
const scale = window.innerWidth / designWidth
document.documentElement.style.fontSize = `${scale * rempPx}px`
}
function showLogin() {
show.value = true;
show.value = true
}
function close() {
show.value = false;
ifLogin.value = true;
show.value = false
ifLogin.value = true
}
</script>
@ -38,56 +39,84 @@ function close() {
<div class="wrap-login">
<div class="content">
<div class="header f-c-b">
<img class="img-logo" src="@/assets/images/login/logo.png" alt="" />
<div class="btn-login f-c-c" @click="showLogin"></div>
<img class="img-logo" src="@/assets/images/login/logo.png" alt="">
<div class="btn-login f-c-c" @click="showLogin">
登录
</div>
</div>
<div class="img-wrap f-s">
<img class="img-ai" src="../../assets/images/login/ai.png" alt="" />
<img class="img-ai" src="../../assets/images/login/ai.png" alt="">
<div class="right">
<div class="f-c">
<img class="img-item" src="../../assets/images/login/img-item-1.png" alt="" />
<img class="img-item" src="../../assets/images/login/img-item-2.png" alt="" />
<img class="img-item" src="../../assets/images/login/img-item-3.png" alt="" />
<img class="img-item" src="../../assets/images/login/img-item-4.png" alt="" />
<img class="img-item" src="../../assets/images/login/img-item-5.png" alt="" />
<img class="img-item" src="../../assets/images/login/img-item-1.png" alt="">
<img class="img-item" src="../../assets/images/login/img-item-2.png" alt="">
<img class="img-item" src="../../assets/images/login/img-item-3.png" alt="">
<img class="img-item" src="../../assets/images/login/img-item-4.png" alt="">
<img class="img-item" src="../../assets/images/login/img-item-5.png" alt="">
</div>
<div class="img-task">
Task approval
</div>
<div class="img-task">Task approval</div>
</div>
</div>
<div class="center-text f-c-b">
<img class="img-ip" src="../../assets/images/login/img-ip.png" alt="" />
<img class="img-text" src="../../assets/images/login/img-text.png" alt="" />
<img class="img-icon-1" src="../../assets/images/login/img-icon-1.png" alt="" />
<img class="img-ip" src="../../assets/images/login/img-ip.png" alt="">
<img class="img-text" src="../../assets/images/login/img-text.png" alt="">
<img class="img-icon-1" src="../../assets/images/login/img-icon-1.png" alt="">
</div>
<div class="text">
企业级 SaaS 智能审批解决方案
</div>
<img class="img-icon-2" src="../../assets/images/login/img-icon-2.png" alt="">
<div class="flex btn-login-2 f-c-c" @click="showLogin">
立即登录 <SvgIcon name="right_arrow" class="right_arrow" />
</div>
<div class="text">企业级 SaaS 智能审批解决方案</div>
<img class="img-icon-2" src="../../assets/images/login/img-icon-2.png" alt="" />
<div class="flex btn-login-2 f-c-c" @click="showLogin"> <SvgIcon name="right_arrow" class="right_arrow"/></div>
<div class="item-wrap f-c">
<div class="item">
<img class="item-img" src="../../assets/images/login/item-1.png" alt="" />
<div class="title">AI一键查重</div>
<div class="subtitle">一键查重生成任务包</div>
<img class="item-img" src="../../assets/images/login/item-1.png" alt="">
<div class="title">
AI一键查重
</div>
<div class="subtitle">
一键查重生成任务包
</div>
</div>
<div class="item">
<img class="item-img" src="../../assets/images/login/item-2.png" alt="" />
<div class="title">AI工单管理</div>
<div class="subtitle">智能批量辨识真假假图快速审批</div>
<img class="item-img" src="../../assets/images/login/item-2.png" alt="">
<div class="title">
AI工单管理
</div>
<div class="subtitle">
智能批量辨识真假假图快速审批
</div>
</div>
<div class="item">
<img class="item-img" src="../../assets/images/login/item-3.png" alt="" />
<div class="title">AI快速审批</div>
<div class="subtitle">智能图片比对批量审批一键确认</div>
<img class="item-img" src="../../assets/images/login/item-3.png" alt="">
<div class="title">
AI快速审批
</div>
<div class="subtitle">
智能图片比对批量审批一键确认
</div>
</div>
<div class="item">
<img class="item-img" src="../../assets/images/login/item-4.png" alt="" />
<div class="title">OCR</div>
<div class="subtitle">图片自动识别文档图片版面解析</div>
<img class="item-img" src="../../assets/images/login/item-4.png" alt="">
<div class="title">
OCR
</div>
<div class="subtitle">
图片自动识别文档图片版面解析
</div>
</div>
<div class="item">
<img class="item-img" src="../../assets/images/login/item-5.png" alt="" />
<div class="title">更多功能</div>
<div class="subtitle">探索更多功能</div>
<img class="item-img" src="../../assets/images/login/item-5.png" alt="">
<div class="title">
更多功能
</div>
<div class="subtitle">
探索更多功能
</div>
</div>
</div>
</div>
@ -95,7 +124,7 @@ function close() {
<Login v-if="ifLogin" @close="close" @forget="ifLogin = !ifLogin" />
<Forget v-else @close="close" @forget="ifLogin = !ifLogin" />
</n-modal>
<img class="item-footer" src="../../assets/images/login/footer.png" alt="" />
<img class="item-footer" src="../../assets/images/login/footer.png" alt="">
</div>
</template>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save