From 2183aab470aa8020ef9cf37c42a188f19e2e37a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=B5=20=E5=B9=B4=E6=B3=BD?= <627844378@qq.com> Date: Tue, 11 Feb 2025 09:34:29 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8F=AF=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=BA=BA=E5=91=98=E7=BB=9F=E8=AE=A1=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 1 + .env.production | 3 +- .gitignore | 2 + api/renyuan.js | 16 + pages.json | 8 + .../views/renliziyuan/renyuanxinxi/index.vue | 13 +- .../renliziyuan/renyuanxinxi/qttongji.vue | 349 ++++++++++++++++++ uni_modules/lime-shared/addUnit/index.ts | 4 +- uni_modules/lime-shared/animation/ease.ts | 3 +- uni_modules/lime-shared/animation/index.ts | 4 +- .../lime-shared/animation/useTransition.ts | 21 +- uni_modules/lime-shared/animation/uvue.uts | 21 +- .../lime-shared/arrayBufferToFile/index.ts | 6 +- uni_modules/lime-shared/base64ToPath/index.ts | 4 +- .../lime-shared/canIUseCanvas2d/index.ts | 8 +- uni_modules/lime-shared/changelog.md | 23 ++ uni_modules/lime-shared/cloneDeep/index.ts | 4 +- .../components/lime-shared/lime-shared.vue | 149 ++++---- uni_modules/lime-shared/createImage/index.ts | 9 +- uni_modules/lime-shared/debounce/index.ts | 4 +- uni_modules/lime-shared/exif/index.ts | 4 +- uni_modules/lime-shared/floatAdd/index.ts | 50 +-- uni_modules/lime-shared/getClassStr/index.ts | 6 +- .../lime-shared/getCurrentPage/index.ts | 4 +- .../lime-shared/getLocalFilePath/index.ts | 2 +- uni_modules/lime-shared/getRect/index.ts | 4 +- uni_modules/lime-shared/getRect/uvue.uts | 4 +- uni_modules/lime-shared/getRect/vue.ts | 4 +- uni_modules/lime-shared/getStyleStr/index.ts | 8 +- uni_modules/lime-shared/hasOwn/index.ts | 4 +- uni_modules/lime-shared/isDef/index.ts | 4 +- uni_modules/lime-shared/isEmpty/index.ts | 4 +- uni_modules/lime-shared/isFunction/index.ts | 4 +- uni_modules/lime-shared/isNumber/index.ts | 2 +- uni_modules/lime-shared/isNumeric/index.ts | 4 +- uni_modules/lime-shared/isObject/index.ts | 4 +- uni_modules/lime-shared/isString/index.ts | 6 +- uni_modules/lime-shared/kebabCase/index.ts | 4 +- uni_modules/lime-shared/package.json | 9 +- uni_modules/lime-shared/pathToBase64/index.ts | 4 +- uni_modules/lime-shared/raf/index.ts | 8 +- uni_modules/lime-shared/raf/uvue.ts | 38 +- uni_modules/lime-shared/raf/vue.ts | 3 +- uni_modules/lime-shared/readme.md | 14 + uni_modules/lime-shared/sleep/index.ts | 4 +- uni_modules/lime-shared/throttle/index.ts | 4 +- uni_modules/lime-shared/toArray/index.ts | 4 +- uni_modules/lime-shared/toBoolean/index.ts | 4 +- uni_modules/lime-shared/toNumber/index.ts | 4 +- uni_modules/lime-shared/unitConvert/index.ts | 29 +- 50 files changed, 692 insertions(+), 207 deletions(-) create mode 100644 pages/views/renliziyuan/renyuanxinxi/qttongji.vue diff --git a/.env.development b/.env.development index b6fc12c..e059f52 100644 --- a/.env.development +++ b/.env.development @@ -1,3 +1,4 @@ # 开发环境 # 请求接口地址 VITE_REQUEST_BASE_URL = https://36.112.48.190 +#VITE_REQUEST_BASE_URL = http://10.75.15.247:8080 diff --git a/.env.production b/.env.production index 5ca2ca3..9338f38 100644 --- a/.env.production +++ b/.env.production @@ -1,3 +1,4 @@ # 生产环境 # 请求接口地址 -VITE_REQUEST_BASE_URL = https://36.112.48.190 +#VITE_REQUEST_BASE_URL = https://36.112.48.190 +VITE_REQUEST_BASE_URL = http://10.75.15.247:8080 \ No newline at end of file diff --git a/.gitignore b/.gitignore index ee4ee9f..c768048 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,5 @@ /node_modules/.vite/deps/dayjs.js /node_modules/.vite/deps/dayjs.js.map /node_modules/.vite/deps/package.json +/uni_modules +/node_modules diff --git a/api/renyuan.js b/api/renyuan.js index 6990e57..2eb4f44 100644 --- a/api/renyuan.js +++ b/api/renyuan.js @@ -80,4 +80,20 @@ export function cxcRyDataTongji(url, parm) { // 员工信息统计 method: 'get', data: parm }) +} + +export function cxcRyDatAstatistics(parm) { // 员工分组统计 + return https({ + url: '/cxc_rlzy.zb/cxcRlzyZb/statistics', + method: 'get', + data: parm + }) +} + +export function cxcRyDatAstatisticsDetails(parm) { // 员工信息统计 + return https({ + url: '/cxc_rlzy.zb/cxcRlzyZb/details', + method: 'get', + data: parm + }) } \ No newline at end of file diff --git a/pages.json b/pages.json index 52fd167..571274f 100644 --- a/pages.json +++ b/pages.json @@ -233,6 +233,14 @@ "navigationBarTitleText": "人员年龄分组统计信息", "navigationBarTextStyle": "white" + } + }, + { + "path": "pages/views/renliziyuan/renyuanxinxi/qttongji", + "style": { + "navigationBarTitleText": "其他统计信息", + "navigationBarTextStyle": "white" + } } ], diff --git a/pages/views/renliziyuan/renyuanxinxi/index.vue b/pages/views/renliziyuan/renyuanxinxi/index.vue index 7a820b5..782e15d 100644 --- a/pages/views/renliziyuan/renyuanxinxi/index.vue +++ b/pages/views/renliziyuan/renyuanxinxi/index.vue @@ -8,10 +8,13 @@ - + + + + + - @@ -29,6 +32,12 @@ url: "/pages/views/renliziyuan/renyuanxinxi/tongji" }) } + + function toQtTongji() { + uni.navigateTo({ + url: "/pages/views/renliziyuan/renyuanxinxi/qttongji" + }) + } \ No newline at end of file diff --git a/uni_modules/lime-shared/addUnit/index.ts b/uni_modules/lime-shared/addUnit/index.ts index 25bc2b1..78476c9 100644 --- a/uni_modules/lime-shared/addUnit/index.ts +++ b/uni_modules/lime-shared/addUnit/index.ts @@ -7,7 +7,7 @@ import {isDef} from '../isDef' * @returns 添加了单位的值,如果值为 null 则返回 null */ -// #ifndef APP-IOS || APP-ANDROID +// #ifndef UNI-APP-X && APP export function addUnit(value?: string | number): string | null { if (!isDef(value)) { return null; @@ -19,7 +19,7 @@ export function addUnit(value?: string | number): string | null { // #endif -// #ifdef APP-IOS || APP-ANDROID +// #ifdef UNI-APP-X && APP function addUnit(value: string): string function addUnit(value: number): string function addUnit(value: any|null): string|null { diff --git a/uni_modules/lime-shared/animation/ease.ts b/uni_modules/lime-shared/animation/ease.ts index 9358c6d..0af156e 100644 --- a/uni_modules/lime-shared/animation/ease.ts +++ b/uni_modules/lime-shared/animation/ease.ts @@ -1,2 +1,3 @@ import {cubicBezier} from './bezier'; -export let ease = cubicBezier(0.25, 0.1, 0.25, 1); \ No newline at end of file +export let ease = cubicBezier(0.25, 0.1, 0.25, 1); +export let linear = cubicBezier(0,0,1,1); \ No newline at end of file diff --git a/uni_modules/lime-shared/animation/index.ts b/uni_modules/lime-shared/animation/index.ts index 5665983..5979064 100644 --- a/uni_modules/lime-shared/animation/index.ts +++ b/uni_modules/lime-shared/animation/index.ts @@ -1,10 +1,10 @@ // @ts-nocheck -// #ifdef APP-IOS || APP-ANDROID +// #ifdef UNI-APP-X && APP export * from './uvue.uts' // #endif -// #ifndef APP-IOS || APP-ANDROID +// #ifndef UNI-APP-X && APP export * from './vue.ts' // #endif diff --git a/uni_modules/lime-shared/animation/useTransition.ts b/uni_modules/lime-shared/animation/useTransition.ts index 818e591..b9502c2 100644 --- a/uni_modules/lime-shared/animation/useTransition.ts +++ b/uni_modules/lime-shared/animation/useTransition.ts @@ -1,14 +1,14 @@ // @ts-nocheck -import { ComponentPublicInstance } from 'vue' -import { ease } from './ease'; +import type { ComponentPublicInstance } from 'vue' +import { ease, linear } from './ease'; import { Timeline, Animation } from './'; export type UseTransitionOptions = { duration ?: number immediate ?: boolean context ?: ComponentPublicInstance } -// #ifndef APP-IOS || APP-ANDROID -import { ref, watch, Ref } from '@/uni_modules/lime-shared/vue' +// #ifndef UNI-APP-X && APP +import { ref, watch, type Ref } from '@/uni_modules/lime-shared/vue' export function useTransition(percent : Ref|(() => number), options : UseTransitionOptions) : Ref { const current = ref(0) @@ -47,7 +47,7 @@ export function useTransition(percent : Ref|(() => number), options : Us // #endif -// #ifdef APP-IOS || APP-ANDROID +// #ifdef UNI-APP-X && APP type UseTransitionReturnType = Ref export function useTransition(source : any, options : UseTransitionOptions) : UseTransitionReturnType { const outputRef : Ref = ref(0) @@ -69,7 +69,7 @@ export function useTransition(source : any, options : UseTransitionOptions) : Us 0, ease, nowValue => { - outputRef.value = nowValue //nowValue < 0.0001 ? 0 : Math.abs(v - nowValue) < 0.00001 ? v : nowValue; + outputRef.value = nowValue clearTimeout(timer) if(outputRef.value == v){ timer = setTimeout(()=>{ @@ -78,14 +78,17 @@ export function useTransition(source : any, options : UseTransitionOptions) : Us }, duration) } } - ), null + ), + null ); } if (context != null && typeof source == 'string') { context.$watch(source, watchFunc, { immediate } as WatchOptions) - } else { - watch(source, watchFunc, { immediate } as WatchOptions) + } else if(typeof source == 'function'){ + watch(source, watchFunc, { immediate }) + } else if(source instanceof Ref){ + watch(source as Ref, watchFunc, { immediate }) } const stop = ()=>{ diff --git a/uni_modules/lime-shared/animation/uvue.uts b/uni_modules/lime-shared/animation/uvue.uts index 9a10db0..37e2bc9 100644 --- a/uni_modules/lime-shared/animation/uvue.uts +++ b/uni_modules/lime-shared/animation/uvue.uts @@ -1,3 +1,4 @@ +import { raf, cancelRaf} from '../raf' // @ts-nocheck export class Timeline { state : string @@ -13,7 +14,7 @@ export class Timeline { this.state = 'Initiated'; } start() { - if (!(this.state === 'Initiated')) return; + if (!(this.state == 'Initiated')) return; this.state = 'Started'; let startTime = Date.now(); @@ -43,20 +44,26 @@ export class Timeline { if (animation == null) return this.animations.delete(animation); } - clearTimeout(this.tickHandler); + // cancelAnimationFrame(this.tickHandler); if (this.state != 'Started') return - this.tickHandler = setTimeout(() => { + + this.tickHandler = raf(()=>{ this.tick!() - }, 1000 / 60) - // this.tickHandlers.push(this.tickHandler) + }) + + this.tickHandlers.push(this.tickHandler) } - this.tick!() + if(this.tick != null) { + this.tick!() + } + } pause() { if (!(this.state === 'Started')) return; this.state = 'Paused'; this.pauseStart = Date.now(); - clearTimeout(this.tickHandler); + cancelRaf(this.tickHandler); + // cancelRaf(this.tickHandler); } resume() { if (!(this.state === 'Paused')) return; diff --git a/uni_modules/lime-shared/arrayBufferToFile/index.ts b/uni_modules/lime-shared/arrayBufferToFile/index.ts index fd67048..49ee530 100644 --- a/uni_modules/lime-shared/arrayBufferToFile/index.ts +++ b/uni_modules/lime-shared/arrayBufferToFile/index.ts @@ -1,10 +1,8 @@ // @ts-nocheck -// #ifndef APP-IOS || APP-ANDROID +// #ifndef UNI-APP-X && APP export * from './vue.ts' // #endif -// #ifdef UNI-APP-X -// #ifdef APP-IOS || APP-ANDROID +// #ifdef UNI-APP-X && APP export * from './uvue.uts' -// #endif // #endif \ No newline at end of file diff --git a/uni_modules/lime-shared/base64ToPath/index.ts b/uni_modules/lime-shared/base64ToPath/index.ts index 28a3bf5..af9a9d2 100644 --- a/uni_modules/lime-shared/base64ToPath/index.ts +++ b/uni_modules/lime-shared/base64ToPath/index.ts @@ -1,9 +1,9 @@ // @ts-nocheck -// #ifndef APP-IOS || APP-ANDROID +// #ifndef UNI-APP-X && APP export * from './vue.ts' // #endif -// #ifdef APP-IOS || APP-ANDROID +// #ifdef UNI-APP-X && APP export * from './uvue.uts' // #endif diff --git a/uni_modules/lime-shared/canIUseCanvas2d/index.ts b/uni_modules/lime-shared/canIUseCanvas2d/index.ts index 95211d1..be5623a 100644 --- a/uni_modules/lime-shared/canIUseCanvas2d/index.ts +++ b/uni_modules/lime-shared/canIUseCanvas2d/index.ts @@ -1,6 +1,6 @@ // @ts-nocheck -// #ifndef APP-IOS || APP-ANDROID +// #ifndef UNI-APP-X && APP // #ifdef MP-ALIPAY interface My { @@ -57,11 +57,11 @@ export function canIUseCanvas2d(): boolean { // #ifdef MP-TOUTIAO return gte('1.78.0'); // #endif + // #ifdef UNI-APP-X && WEB || UNI-APP-X && APP + return true; + // #endif // #ifndef MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO return false // #endif - // #ifdef APP-IOS || APP-ANDROID || APP-NVUE || APP-VUE - return false; - // #endif } diff --git a/uni_modules/lime-shared/changelog.md b/uni_modules/lime-shared/changelog.md index 9b9b7dc..a5a6125 100644 --- a/uni_modules/lime-shared/changelog.md +++ b/uni_modules/lime-shared/changelog.md @@ -1,3 +1,26 @@ + +## 0.2.7(2025-01-17) +- fix: 针对canvas 平台判断优化 +## 0.2.6(2025-01-09) +- feat: 增加`areaData`中国省市区数据 +## 0.2.5(2025-01-07) +- fix: animation在app上类型问题 +## 0.2.4(2025-01-04) +- feat: getRect类型问题 +## 0.2.3(2025-01-01) +- chore: unitConvert使用uni.rpx2px +## 0.2.2(2024-12-11) +- chore: 动画使用`requestAnimationFrame` +## 0.2.1(2024-11-20) +- feat: 增加`characterLimit` +## 0.2.0(2024-11-14) +- fix: vue2的类型问题 +## 0.1.9(2024-11-14) +- feat: 增加`shuffle` +## 0.1.8(2024-10-08) +- fix: vue2 条件编译 // #ifdef APP-IOS || APP-ANDROID 会生效 +## 0.1.7(2024-09-23) +- fix: raf 类型跟随版本变更 ## 0.1.6(2024-07-24) - fix: vue2 app ts需要明确的后缀,所有补全 - chore: 减少依赖 diff --git a/uni_modules/lime-shared/cloneDeep/index.ts b/uni_modules/lime-shared/cloneDeep/index.ts index 03f85cd..3428c49 100644 --- a/uni_modules/lime-shared/cloneDeep/index.ts +++ b/uni_modules/lime-shared/cloneDeep/index.ts @@ -1,10 +1,10 @@ // @ts-nocheck -// #ifdef APP-IOS || APP-ANDROID +// #ifdef UNI-APP-X && APP export * from './uvue.ts' // #endif -// #ifndef APP-IOS || APP-ANDROID +// #ifndef UNI-APP-X && APP export * from './vue.ts' // #endif \ No newline at end of file diff --git a/uni_modules/lime-shared/components/lime-shared/lime-shared.vue b/uni_modules/lime-shared/components/lime-shared/lime-shared.vue index 284e8f0..e2d7fe2 100644 --- a/uni_modules/lime-shared/components/lime-shared/lime-shared.vue +++ b/uni_modules/lime-shared/components/lime-shared/lime-shared.vue @@ -15,6 +15,9 @@ import { debounce } from '@/uni_modules/lime-shared/debounce' import { fillZero } from '@/uni_modules/lime-shared/fillZero' import { floatAdd } from '@/uni_modules/lime-shared/floatAdd' + import { floatMul } from '@/uni_modules/lime-shared/floatMul' + import { floatDiv } from '@/uni_modules/lime-shared/floatDiv' + import { floatSub } from '@/uni_modules/lime-shared/floatSub' import { getClassStr } from '@/uni_modules/lime-shared/getClassStr' import { getCurrentPage } from '@/uni_modules/lime-shared/getCurrentPage' import { getStyleStr } from '@/uni_modules/lime-shared/getStyleStr' @@ -40,91 +43,102 @@ import { toNumber } from '@/uni_modules/lime-shared/toNumber' import { unitConvert } from '@/uni_modules/lime-shared/unitConvert' import { getCurrentInstance } from '@/uni_modules/lime-shared/vue' + import { capitalizedAmount } from '@/uni_modules/lime-shared/capitalizedAmount' // #ifdef VUE2 type UTSJSONObject = any // #endif const context = getCurrentInstance() - getRect('#shared', context!).then(res =>{ - console.log('res', res.bottom) - }) - getAllRect('#shared', context).then(res =>{ - console.log('res', res) - }) + // getRect('#shared', context!).then(res =>{ + // console.log('res', res.bottom) + // }) + // getAllRect('#shared', context).then(res =>{ + // console.log('res', res) + // }) - console.log('camelCase::', camelCase("hello world")); - console.log('camelCase::', camelCase("my_name_is_john", true)); - console.log('canIUseCanvas2d::', canIUseCanvas2d()); - console.log('clamp::', clamp(5 ,0, 10)); - console.log('cloneDeep::', cloneDeep({a:5})); - console.log('closest::', closest([1, 3, 5, 7, 9], 6)); + // console.log('camelCase::', camelCase("hello world")); + // console.log('camelCase::', camelCase("my_name_is_john", true)); + // console.log('canIUseCanvas2d::', canIUseCanvas2d()); + // console.log('clamp::', clamp(5 ,0, 10)); + // console.log('cloneDeep::', cloneDeep({a:5})); + // console.log('closest::', closest([1, 3, 5, 7, 9], 6)); - const saveData = (data: any) => { - // 模拟保存数据的操作 - console.log(`Saving data: ${data}`); - } + // const saveData = (data: any) => { + // // 模拟保存数据的操作 + // console.log(`Saving data: ${data}`); + // } - const debouncedSaveData = debounce(saveData, 500); - debouncedSaveData('Data 1'); - debouncedSaveData('Data 2'); + // const debouncedSaveData = debounce(saveData, 500); + // debouncedSaveData('Data 1'); + // debouncedSaveData('Data 2'); - console.log('fillZero', fillZero(1)) - console.log('floatAdd', floatAdd(0.1, 0.2)) - console.log('getClassStr', getClassStr({hover: true})) - console.log('getStyleStr', getStyleStr({ color: 'red', fontSize: '16px', backgroundColor: '', border: null })) - console.log('hasOwn', hasOwn({a: true}, 'key')) - console.log('isBase64::', isBase64("SGVsbG8sIFdvcmxkIQ==")); - console.log('isBrowser::', isBrowser); - console.log('isDef::', isDef('6')); - console.log('isEmpty::', isEmpty({a: true})); + // console.log('fillZero', fillZero(1)) + // console.log('floatAdd', floatAdd(0.1, 0.2), floatAdd(1.05, 0.05), floatAdd(0.1, 0.7), floatAdd(0.0001, 0.0002), floatAdd(123.456 , 789.012)) + // console.log('floatMul', floatMul(0.1, 0.02), floatMul(1.0255, 100)) + // console.log('floatDiv', floatDiv(10.44, 100), floatDiv(1.0255, 100), floatDiv(5.419909340994699, 0.2)) + // console.log('floatSub', floatSub(0.4, 0.1), floatSub(1.0255, 100)) + const now = () : number => System.nanoTime() / 1_000_000.0 + console.log('capitalizedAmount', capitalizedAmount(0.4)) + console.log('capitalizedAmount', capitalizedAmount(100)) + console.log('capitalizedAmount', capitalizedAmount(100000000)) + console.log('capitalizedAmount', capitalizedAmount('2023.04')) + console.log('capitalizedAmount', capitalizedAmount(-1024)) + console.log('now', now(), Date.now()) + // console.log('getClassStr', getClassStr({hover: true})) + // console.log('getStyleStr', getStyleStr({ color: 'red', fontSize: '16px', backgroundColor: '', border: null })) + // console.log('hasOwn', hasOwn({a: true}, 'key')) + // console.log('isBase64::', isBase64("SGVsbG8sIFdvcmxkIQ==")); + // console.log('isBrowser::', isBrowser); + // console.log('isDef::', isDef('6')); + // console.log('isEmpty::', isEmpty({a: true})); - const b = () =>{} - console.log('isFunction::', isFunction(b)); - console.log('isNumber::', isNumber('6')); - console.log('isNumeric::', isNumeric('6')); - console.log('isObject::', isObject({})); + // const b = () =>{} + // console.log('isFunction::', isFunction(b)); + // console.log('isNumber::', isNumber('6')); + // console.log('isNumeric::', isNumeric('6')); + // console.log('isObject::', isObject({})); - const promise = ():Promise => { - return new Promise((resolve) => { - resolve(true) - }) - } - const a = promise() - console.log('isPromise::', isPromise(a)); - console.log('isString::', isString('null')); - console.log('kebabCase::', kebabCase('my love')); - console.log('raf::', raf(()=>{ - console.log('raf:::1') - })); - console.log('doubleRaf::', doubleRaf(()=>{ - console.log('doubleRaf:::1') - })); - console.log('random', random(0, 10)) - console.log('random', random(0, 1, 2)) - console.log('range', range(0, 10, 2)) - console.log('sleep', sleep(300).then(res => { - console.log('log') - })) + // const promise = ():Promise => { + // return new Promise((resolve) => { + // resolve(true) + // }) + // } + // const a = promise() + // console.log('isPromise::', isPromise(a)); + // console.log('isString::', isString('null')); + // console.log('kebabCase::', kebabCase('my love')); + // console.log('raf::', raf(()=>{ + // console.log('raf:::1') + // })); + // console.log('doubleRaf::', doubleRaf(()=>{ + // console.log('doubleRaf:::1') + // })); + // console.log('random', random(0, 10)) + // console.log('random', random(0, 1, 2)) + // console.log('range', range(0, 10, 2)) + // console.log('sleep', sleep(300).then(res => { + // console.log('log') + // })) - const handleScroll = (a: string) => { - console.log("Scroll event handled!", a); - } + // const handleScroll = (a: string) => { + // console.log("Scroll event handled!", a); + // } - // // 使用节流函数对 handleScroll 进行节流,间隔时间为 500 毫秒 - const throttledScroll = throttle(handleScroll, 500); - throttledScroll('5'); - const page = getCurrentPage() - console.log('getCurrentPage::', page) + // // // 使用节流函数对 handleScroll 进行节流,间隔时间为 500 毫秒 + // const throttledScroll = throttle(handleScroll, 500); + // throttledScroll('5'); + // const page = getCurrentPage() + // console.log('getCurrentPage::', page) - console.log('toArray', toArray(5)) - console.log('toBoolean', toBoolean(5)) - console.log('toNumber', toNumber('5')) - console.log('unitConvert', unitConvert('5')) + // console.log('toArray', toArray(5)) + // console.log('toBoolean', toBoolean(5)) + // console.log('toNumber', toNumber('5')) + // console.log('unitConvert', unitConvert('5')) // uni.getImageInfo({ // src: '/static/logo.png', @@ -132,6 +146,9 @@ // console.log('res', res) // } // }) + export default { + + } diff --git a/pages/views/renliziyuan/renyuanxinxi/qttongji - 副本.vue b/pages/views/renliziyuan/renyuanxinxi/qttongji - 副本.vue deleted file mode 100644 index 625676a..0000000 --- a/pages/views/renliziyuan/renyuanxinxi/qttongji - 副本.vue +++ /dev/null @@ -1,730 +0,0 @@ - - - - - diff --git a/pages/views/renliziyuan/renyuanxinxi/qttongji.vue b/pages/views/renliziyuan/renyuanxinxi/qttongji.vue index 9a265bf..0948c74 100644 --- a/pages/views/renliziyuan/renyuanxinxi/qttongji.vue +++ b/pages/views/renliziyuan/renyuanxinxi/qttongji.vue @@ -2,19 +2,17 @@ - - - - + + + - - - 选择字段: {{ selectedFieldLabel }} - + + + @@ -87,15 +85,15 @@ const bottomHeight = ref(0); const chart = ref(null); const fieldList = ref([ { - label: '性别', + text: '性别', value: 'xb' }, { - label: '年龄', + text: '年龄', value: 'nl' }, { - label: '学历', + text: '学历', value: 'rylb1' } ]); // 字段列表 @@ -103,10 +101,10 @@ const selectedOrgCode = ref(''); // 当前选择的单位 orgCode const selectedOrgCodeLabel = ref('请选择单位'); // 当前选择的单位名称 const selectedField = ref(''); // 当前选择的字段 const selectedFieldLabel = ref('请选择字段'); // 当前选择的字段名称 -const orgCodeGroupData = ref([]); //按照orgcode进行分组的数据 +const orgCodeGroupData = ref([]); //按照orgcode进行分组的数据 含劳动合同号 const chartData = ref({}); // 图表数据 const personnelList = ref([]); // 人员列表 initChart - +const fieldValues = ref([]); const chartOption = ref({}); function detail(record) { @@ -153,91 +151,209 @@ const initChart = () => { }; // 更新图表 -const updateChart = () => { +const updateChart = (tempchartData) => { // 初始化图表 setTimeout(async () => { if (!chart.value) return; const myChart = await chart.value.init(echarts); - chartOption.value = transformDataForEcharts(chartData.value, selectedOrgCode.value); + console.log(tempchartData); + let temp = JSON.parse(JSON.stringify(tempchartData[0].children)); + let xData = []; + let seriesData = []; + console.log(1, temp); + //当前机构下的数据 transformDataForEcharts + + temp.forEach((item) => { + xData.push(item.name); + }); + + for (let i = 0; i < fieldValues.value.length; i++) { + let tempData = []; + temp.forEach((item) => { + if (item.data[i]) { + tempData.push(item.data[i]); + } else { + tempData.push(0); + } + }); + seriesData.push({ name: fieldValues.value[i], type: 'bar', data: tempData }); + } + + console.log(xData, seriesData, fieldValues.value); myChart.setOption({ xAxis: { type: 'category', - data: chartOption.value.categories.map((code) => `${code}${chartOption.value.children ? ' ▶' : ''}`) + data: xData }, yAxis: { type: 'value' }, - series: chartOption.value.series, + series: seriesData, tooltip: { trigger: 'axis' }, - legend: { data: chartOption.value.series.map((s) => s.name) } + legend: { data: fieldValues.value } }); + // 点击钻取事件 myChart.on('click', (params) => { - const clickedCode = params.name.split(' ')[0]; - const nextData = transformDataForEcharts(originalData, clickedCode); - - if (nextData.categories.length > 0) { - historyStack.push(currentLevel); - currentLevel = clickedCode; - renderChart(nextData); - } else if (nextData.children) { - historyStack.push(currentLevel); - currentLevel = clickedCode; - chartData = transformDataForEcharts(originalData, currentLevel); - renderChart(chartData); - } else { - console.log('已是最末级节点'); - } + // console.log(params.name, params.seriesIndex, params.dataIndex); + console.log(orgCodeGroupData.value); + let updateData = findNodeByOrgCode(orgCodeGroupData.value, params.name); + console.log(updateData); + // updateChart(updateData); }); }, 300); }; +//根据一个键值查找数据 +/** + * 从树状数据中根据 orgCode 获取节点及其子节点数据 + * @param {Array} treeData 树状数据 + * @param {string} targetOrgCode 目标 orgCode + * @returns {Object|null} 匹配的节点及其子节点数据,未找到返回 null + */ +function findNodeByOrgCode(treeData, targetOrgCode) { + // console.log(treeData, targetOrgCode); + for (const node of treeData) { + // 如果当前节点匹配,直接返回该节点及其子节点 + if (node.name === targetOrgCode) { + return node; + } + // 递归检查子节点 + if (node.children && node.children.length > 0) { + const found = findNodeByOrgCode(node.children, targetOrgCode); + if (found) return found; + } + } + return null; +} + +//获取所有的fieldValue +function collectUniqueKeyValues(tree, key) { + const uniqueValues = new Set(); // 使用Set来自动处理唯一性 + + function traverse(node) { + if (node[key] !== undefined) { + uniqueValues.add(node[key]); + } + if (node.children && Array.isArray(node.children)) { + node.children.forEach((child) => traverse(child)); + } + } + + tree.forEach((node) => traverse(node)); // 假设tree是一个数组 + + return Array.from(uniqueValues); // 将Set转换为数组 +} + +// 示例用法 +// const result = findNodeByOrgCode(echartData, "A01A01A01A01"); +// console.log(result); /** * 转换数据为支持钻取的ECharts格式 * @param {Array} data 原始数据 - * @param {string} currentOrgCode 当前组织编码 - * @returns {Object} 包含当前层级数据和子节点信息的对象 + * @param {string} selectOrgCode 当前选择的组织编码 + * @returns {Object} 包含当前层级数据和子节点信息的对象 符合echart的格式 */ -function transformDataForEcharts(data, currentOrgCode = '') { - // 计算当前层级的长度(每级+3) - const currentLevel = currentOrgCode.length; - const nextLevel = currentLevel + 3; - console.log(currentLevel, nextLevel, currentOrgCode, data); - // 过滤当前层级数据 - const currentLevelData = data.filter((item) => item.orgCode.length === currentLevel && (currentLevel === 0 || item.orgCode === currentOrgCode)); - console.log(1); - console.log(currentLevelData); - // 过滤直接子节点(严格前缀匹配) - const children = data - .filter( - (item) => item.orgCode.startsWith(currentOrgCode) && item.orgCode.length === nextLevel && (currentLevel === 0 || item.orgCode.slice(0, currentLevel) === currentOrgCode) - ) - .map((item) => ({ - orgCode: item.orgCode, - hasChildren: data.some((d) => d.orgCode.startsWith(item.orgCode) && d.orgCode.length === nextLevel + 3) - })); - console.log(2, children); - // 按fieldValue分组统计 - const fieldGroups = currentLevelData.reduce((acc, curr) => { - const key = curr.fieldValue; - if (!acc[key]) { - acc[key] = { - name: key, - data: [] - }; +//----------------------------------------------------------------------------------------- +function transformData(selectOrgCode, data) { + const nodes = new Map(); + //获取所有的fieldValue 用于图例和钻取和data[]中的数据顺序保持一致 动态建立fieldValue的数据 + fieldValues.value = collectUniqueKeyValues(data, 'fieldValue'); + // 获取orgCode的所有层级 + function getHierarchy(orgCode) { + const hierarchy = []; + for (let i = selectOrgCode.length; i <= orgCode.length; i += 3) { + hierarchy.push(orgCode.substring(0, i)); } - acc[key].data.push(curr.number); - return acc; - }, {}); + // console.log('hierarchy', hierarchy); + return hierarchy; + } + // 获取父级orgCode + function getParentCode(code) { + if (code.length <= 3) return null; + return code.substring(0, code.length - 3); + } + // 动态赋值series的数据长度 + let tempArrayValue = new Array(fieldValues.value.length).fill(0); + // 创建所有节点并建立父子关系 + data.forEach((entry) => { + const hierarchy = getHierarchy(entry.orgCode); + hierarchy.forEach((code) => { + if (!nodes.has(code)) { + nodes.set(code, { + orgCode: code, + type: 'bar', + data: JSON.parse(JSON.stringify(tempArrayValue)), // 初始化data为[0, 0] 动态 + children: [] + }); + } + }); - return { - categories: currentLevelData.map((d) => d.orgCode), - series: Object.values(fieldGroups), - children: children.length > 0 ? children : null - }; + // console.log('fieldValues', fieldValues.value, fieldValues.value.length, hierarchy); + + // 更新当前节点的data + const node = nodes.get(entry.orgCode); + const fieldValue = parseInt(entry.fieldValue, 10); + + for (let i = 0; i < fieldValues.value.length; i++) { + if (fieldValue === parseInt(fieldValues.value[i], 10)) { + // console.log(555, i, fieldValue, fieldValues.value[i], entry.number); + node.data[i] += entry.number; + } + } + + // console.log(11, node); + + // 建立父子关系 + for (let i = 0; i < hierarchy.length - 1; i++) { + const parentCode = hierarchy[i]; + const childCode = hierarchy[i + 1]; + const parentNode = nodes.get(parentCode); + const childNode = nodes.get(childCode); + if (!parentNode.children.some((c) => c.orgCode === childCode)) { + parentNode.children.push(childNode); + } + } + }); + + // 计算非叶子节点的data(子节点之和) + function computeData(node) { + if (node.children.length === 0) return; + node.data = JSON.parse(JSON.stringify(tempArrayValue)); + node.children.forEach((child) => { + computeData(child); + for (let i = 0; i < fieldValues.value.length; i++) { + // console.log(666, i, node.data[i], child.data[i]); + node.data[i] += child.data[i]; + } + }); + } + + // 获取所有根节点(没有父节点或父节点不存在) + const rootNodes = []; + nodes.forEach((node, code) => { + const parentCode = getParentCode(code); + // console.log(parentCode); + if (!parentCode || !nodes.has(parentCode)) { + rootNodes.push(node); + } + }); + + // 递归计算每个根节点的data + rootNodes.forEach((root) => computeData(root)); + // console.log('rootNodes', rootNodes); + // 转换为目标格式 + function formatTree(node) { + return { + name: node.orgCode, + type: 'bar', + data: node.data, + children: node.children.map((child) => formatTree(child)) + }; + } + + return rootNodes.map((root) => formatTree(root)); } -// 使用示例 -// let currentLevel = 'A01A01'; // 初始层级 -// let chartData = transformDataForEcharts(originalData, currentLevel); +//----------------------------------------------------------------------------------------- //根据 orgCode 的分级格式,递归地汇总本级及其所有下级的数据,并将下级数据放在本级的 children 属性中。 deepseek @@ -253,12 +369,14 @@ const groupByOrgCode = (orgCode, data) => { // 按照 fieldValue 分组 const groupedByFieldValue = {}; filteredData.forEach((item) => { + // console.log(item.orgCode, 11, groupedByFieldValue[item.fieldValue]); if (!groupedByFieldValue[item.fieldValue]) { groupedByFieldValue[item.fieldValue] = { number: 0, ldhth: [] }; } + // console.log(item.orgCode, 22, groupedByFieldValue[item.fieldValue]); groupedByFieldValue[item.fieldValue].number += item.number; groupedByFieldValue[item.fieldValue].ldhth.push(...item.ldhth.split(',')); }); @@ -274,6 +392,8 @@ const groupByOrgCode = (orgCode, data) => { children: [] }; + console.log('本级', result); + // 获取所有下一级的 orgCode const nextLevelOrgCodes = new Set(); filteredData.forEach((item) => { @@ -291,11 +411,10 @@ const groupByOrgCode = (orgCode, data) => { } }); + console.log('全部', result); + return result; }; - -//----------------------------------------------------------------------------------------- - // 获取统计数据 then const fetchStatisticsData = async () => { if (!selectedOrgCode.value || !selectedField.value) return; @@ -304,11 +423,11 @@ const fetchStatisticsData = async () => { orgCode: selectedOrgCode.value, field: selectedField.value }); - // console.log(res); //deepseek + // console.log(res); //deepseek orgCodeGroupData.value = groupByOrgCode(selectedOrgCode.value, res); - console.log(orgCodeGroupData.value); - chartData.value = orgCodeGroupData.value.children; - updateChart(); + chartData.value = transformData(selectedOrgCode.value, res); + // console.log(chartData.value); + updateChart(chartData.value); } catch (error) { console.error('获取统计数据失败:', error); } @@ -336,10 +455,21 @@ const onOrgCodeChange = (e, data) => { }; const onFieldChange = (e) => { - const index = e.detail.value; - selectedField.value = fieldList.value[index].value; - selectedFieldLabel.value = fieldList.value[index].label; - fetchStatisticsData(); + console.log(e); + try { + selectedField.value = e; + for (var index = 0; index < fieldList.length; index++) { + var element = array[index]; + if (element.value === e) { + selectedFieldLabel.value = element.text; + } + } + console.log(selectedFieldLabel); + fetchStatisticsData(); + } catch (error) { + //TODO handle the exception + console.log(error); + } }; const onChartClick = (e) => { @@ -349,90 +479,154 @@ const onChartClick = (e) => { } }; -