af-mobile-client-vue3 1.4.68 → 1.4.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/__dummy__ +9 -9
  2. package/build/vite/optimize.ts +36 -36
  3. package/package.json +120 -121
  4. package/public/favicon.svg +4 -4
  5. package/scripts/verifyCommit.js +19 -19
  6. package/src/components/common/MateChat/components/MateChatContent.vue +274 -274
  7. package/src/components/common/MateChat/components/MateChatHeader.vue +337 -337
  8. package/src/components/common/MateChat/index.vue +444 -444
  9. package/src/components/common/MateChat/types.ts +247 -247
  10. package/src/components/common/otherCharge/ChargePrintSelectorAndRemarks.vue +137 -137
  11. package/src/components/common/otherCharge/CodePayment.vue +357 -357
  12. package/src/components/common/otherCharge/FileUploader.vue +602 -602
  13. package/src/components/common/otherCharge/GridFileUploader.vue +846 -846
  14. package/src/components/common/otherCharge/PaymentMethodSelector.vue +202 -202
  15. package/src/components/common/otherCharge/PaymentMethodSelectorCard.vue +45 -45
  16. package/src/components/common/otherCharge/ReceiptModal.vue +273 -273
  17. package/src/components/common/otherCharge/index.ts +43 -43
  18. package/src/components/core/ImageUploader/index.vue +9 -2
  19. package/src/components/data/OtherCharge/OtherChargeItemModal.vue +547 -547
  20. package/src/components/data/UserDetail/types.ts +1 -1
  21. package/src/components/data/XCellList/index.vue +1 -1
  22. package/src/components/data/XReportGrid/XAddReport/index.ts +1 -1
  23. package/src/components/data/XReportGrid/XReportDrawer/index.ts +1 -1
  24. package/src/components/data/XTag/index.vue +10 -10
  25. package/src/components/layout/TabBarLayout/index.vue +40 -40
  26. package/src/hooks/useCommon.ts +9 -9
  27. package/src/plugins/AppData.ts +38 -38
  28. package/src/router/invoiceRoutes.ts +33 -33
  29. package/src/services/api/common.ts +109 -109
  30. package/src/services/api/manage.ts +8 -8
  31. package/src/services/api/search.ts +16 -16
  32. package/src/services/restTools.ts +56 -56
  33. package/src/utils/authority-utils.ts +84 -84
  34. package/src/utils/crypto.ts +39 -39
  35. package/src/utils/queryFormDefaultRangePicker.ts +57 -57
  36. package/src/utils/runEvalFunction.ts +13 -13
  37. package/src/views/component/EvaluateRecordView/index.vue +40 -40
  38. package/src/views/component/MateChat/MateChatView.vue +10 -10
  39. package/src/views/component/XCellDetailView/index.vue +217 -217
  40. package/src/views/component/XCellListView/index.vue +138 -107
  41. package/src/views/component/XFormGroupView/index.vue +82 -78
  42. package/src/views/component/XFormView/index.vue +46 -41
  43. package/src/views/component/XReportFormIframeView/index.vue +47 -47
  44. package/src/views/component/XReportFormView/index.vue +13 -13
  45. package/src/views/component/XSignatureView/index.vue +50 -50
  46. package/src/views/component/notice.vue +46 -46
  47. package/src/views/component/topNav.vue +36 -36
  48. package/src/views/invoiceShow/index.vue +61 -61
  49. package/src/views/user/login/index.vue +22 -22
  50. package/pnpm-lock.yaml +0 -11070
@@ -1,56 +1,56 @@
1
- import { http } from '@af-mobile-client-vue3/utils/http'
2
-
3
- /**
4
- * GET请求
5
- * @param url 请求地址
6
- * @param params 路径参数
7
- */
8
- export function get<T = any>(url: string, params?: any): Promise<T> {
9
- return http.request<T>({
10
- url,
11
- method: 'GET',
12
- params,
13
- })
14
- }
15
-
16
- /**
17
- * POST请求
18
- * @param url 请求地址
19
- * @param data 请求参数
20
- */
21
- /**
22
- * POST请求
23
- * @param url 请求地址
24
- * @param data 请求参数
25
- */
26
- export function post<T = any>(url: string, data: any): Promise<T> {
27
- return http.request <T>({
28
- url,
29
- method: 'POST',
30
- data,
31
- })
32
- }
33
-
34
- export function postWithConfig<T = any>(url: string, data: any, config: any): Promise<T> {
35
- return http.request<T>({
36
- url,
37
- method: 'POST',
38
- data,
39
- headers: { ...config },
40
- })
41
- }
42
-
43
- /**
44
- * DELETE请求
45
- * @param url 请求地址
46
- * @param data 查询参数
47
- * @param config 额外的配置项(如自定义头信息等)
48
- */
49
- export function del<T = any>(url: string, data?: any, config?: any): Promise<T> {
50
- return http.request<T>({
51
- url,
52
- method: 'DELETE',
53
- data,
54
- ...config,
55
- })
56
- }
1
+ import { http } from '@af-mobile-client-vue3/utils/http'
2
+
3
+ /**
4
+ * GET请求
5
+ * @param url 请求地址
6
+ * @param params 路径参数
7
+ */
8
+ export function get<T = any>(url: string, params?: any): Promise<T> {
9
+ return http.request<T>({
10
+ url,
11
+ method: 'GET',
12
+ params,
13
+ })
14
+ }
15
+
16
+ /**
17
+ * POST请求
18
+ * @param url 请求地址
19
+ * @param data 请求参数
20
+ */
21
+ /**
22
+ * POST请求
23
+ * @param url 请求地址
24
+ * @param data 请求参数
25
+ */
26
+ export function post<T = any>(url: string, data: any): Promise<T> {
27
+ return http.request <T>({
28
+ url,
29
+ method: 'POST',
30
+ data,
31
+ })
32
+ }
33
+
34
+ export function postWithConfig<T = any>(url: string, data: any, config: any): Promise<T> {
35
+ return http.request<T>({
36
+ url,
37
+ method: 'POST',
38
+ data,
39
+ headers: { ...config },
40
+ })
41
+ }
42
+
43
+ /**
44
+ * DELETE请求
45
+ * @param url 请求地址
46
+ * @param data 查询参数
47
+ * @param config 额外的配置项(如自定义头信息等)
48
+ */
49
+ export function del<T = any>(url: string, data?: any, config?: any): Promise<T> {
50
+ return http.request<T>({
51
+ url,
52
+ method: 'DELETE',
53
+ data,
54
+ ...config,
55
+ })
56
+ }
@@ -1,84 +1,84 @@
1
- /**
2
- * 判断是否有路由的权限
3
- * @param authority 路由权限配置
4
- * @param permissions 用户权限集合
5
- */
6
- function hasPermission(authority: any, permissions: any): boolean {
7
- let required: string = '*'
8
- if (typeof authority === 'string')
9
- required = authority
10
- else if (Array.isArray(authority))
11
- required = authority.toString()
12
- else if (typeof authority === 'object')
13
- required = authority.permission
14
-
15
- return required === '*' || hasAnyItem(required, permissions, (r, t) => !!(r === t || r === t.id))
16
- }
17
-
18
- /**
19
- * 判断是否有路由需要的角色
20
- * @param authority 路由权限配置
21
- * @param roles 用户角色集合
22
- */
23
- function hasRole(authority, roles) {
24
- let required
25
- if (typeof authority === 'object')
26
- required = authority.role
27
-
28
- return authority === '*' || hasAnyItem(required, roles, (r, t) => !!(r === t || r === t.id))
29
- }
30
-
31
- /**
32
- * 判断目标数组是否有所需元素
33
- * @param {string | string[]}required 所需元素,数组或单个元素
34
- * @param {string[] | object[]} source 目标数组
35
- * @param {Function} filter 匹配条件
36
- * (r: String, s: String|Object) => boolean
37
- */
38
- function hasAnyItem(required, source, filter): boolean {
39
- if (!required)
40
- return false
41
-
42
- const checkedList = Array.isArray(required) ? required : [required]
43
- return !!source.find(s => checkedList.find(r => filter(r, s)))
44
- }
45
-
46
- /**
47
- * 路由权限校验
48
- * @param route 路由
49
- * @param permissions 用户权限集合
50
- * @param roles 用户角色集合
51
- */
52
- function hasAuthority(route, permissions, roles) {
53
- // TODO 此处判断可能有问题
54
- if (!route.meta.pAuthorities)
55
- return true
56
-
57
- const authorities = [...route.meta.pAuthorities, route.meta.authority]
58
- for (const authority of authorities) {
59
- if (!hasPermission(authority, permissions) && !hasRole(authority, roles))
60
- return false
61
- }
62
- return true
63
- }
64
-
65
- /**
66
- * 根据权限配置过滤菜单数据
67
- * @param menuData
68
- * @param permissions
69
- * @param roles
70
- */
71
- function filterMenu(menuData, permissions, roles) {
72
- return menuData.filter((menu) => {
73
- if (menu.meta && menu.meta.invisible === undefined) {
74
- if (!hasAuthority(menu, permissions, roles))
75
- return false
76
- }
77
- if (menu.children && menu.children.length > 0)
78
- menu.children = filterMenu(menu.children, permissions, roles)
79
-
80
- return true
81
- })
82
- }
83
-
84
- export { filterMenu, hasAuthority }
1
+ /**
2
+ * 判断是否有路由的权限
3
+ * @param authority 路由权限配置
4
+ * @param permissions 用户权限集合
5
+ */
6
+ function hasPermission(authority: any, permissions: any): boolean {
7
+ let required: string = '*'
8
+ if (typeof authority === 'string')
9
+ required = authority
10
+ else if (Array.isArray(authority))
11
+ required = authority.toString()
12
+ else if (typeof authority === 'object')
13
+ required = authority.permission
14
+
15
+ return required === '*' || hasAnyItem(required, permissions, (r, t) => !!(r === t || r === t.id))
16
+ }
17
+
18
+ /**
19
+ * 判断是否有路由需要的角色
20
+ * @param authority 路由权限配置
21
+ * @param roles 用户角色集合
22
+ */
23
+ function hasRole(authority, roles) {
24
+ let required
25
+ if (typeof authority === 'object')
26
+ required = authority.role
27
+
28
+ return authority === '*' || hasAnyItem(required, roles, (r, t) => !!(r === t || r === t.id))
29
+ }
30
+
31
+ /**
32
+ * 判断目标数组是否有所需元素
33
+ * @param {string | string[]}required 所需元素,数组或单个元素
34
+ * @param {string[] | object[]} source 目标数组
35
+ * @param {Function} filter 匹配条件
36
+ * (r: String, s: String|Object) => boolean
37
+ */
38
+ function hasAnyItem(required, source, filter): boolean {
39
+ if (!required)
40
+ return false
41
+
42
+ const checkedList = Array.isArray(required) ? required : [required]
43
+ return !!source.find(s => checkedList.find(r => filter(r, s)))
44
+ }
45
+
46
+ /**
47
+ * 路由权限校验
48
+ * @param route 路由
49
+ * @param permissions 用户权限集合
50
+ * @param roles 用户角色集合
51
+ */
52
+ function hasAuthority(route, permissions, roles) {
53
+ // TODO 此处判断可能有问题
54
+ if (!route.meta.pAuthorities)
55
+ return true
56
+
57
+ const authorities = [...route.meta.pAuthorities, route.meta.authority]
58
+ for (const authority of authorities) {
59
+ if (!hasPermission(authority, permissions) && !hasRole(authority, roles))
60
+ return false
61
+ }
62
+ return true
63
+ }
64
+
65
+ /**
66
+ * 根据权限配置过滤菜单数据
67
+ * @param menuData
68
+ * @param permissions
69
+ * @param roles
70
+ */
71
+ function filterMenu(menuData, permissions, roles) {
72
+ return menuData.filter((menu) => {
73
+ if (menu.meta && menu.meta.invisible === undefined) {
74
+ if (!hasAuthority(menu, permissions, roles))
75
+ return false
76
+ }
77
+ if (menu.children && menu.children.length > 0)
78
+ menu.children = filterMenu(menu.children, permissions, roles)
79
+
80
+ return true
81
+ })
82
+ }
83
+
84
+ export { filterMenu, hasAuthority }
@@ -1,39 +1,39 @@
1
- import AesEncryptJS from 'crypto-js'
2
-
3
- export default {
4
- /**
5
- * AES加密
6
- *
7
- * @param word
8
- * @param encryKey
9
- */
10
- AESEncrypt(word: string, encryKey: string): string {
11
- const key = AesEncryptJS.enc.Utf8.parse(encryKey)
12
- const srcs = AesEncryptJS.enc.Utf8.parse(word)
13
- const encrypted = AesEncryptJS.AES.encrypt(srcs, key, {
14
- mode: AesEncryptJS.mode.ECB,
15
- padding: AesEncryptJS.pad.Pkcs7,
16
- })
17
- return encrypted.toString()
18
- },
19
- /**
20
- * AES解密
21
- *
22
- * @param word
23
- * @param encryKey
24
- */
25
- AESDecrypt(word: string, encryKey: string): any {
26
- const key = AesEncryptJS.enc.Utf8.parse(encryKey)
27
- const decrypt = AesEncryptJS.AES.decrypt(word, key, {
28
- mode: AesEncryptJS.mode.ECB,
29
- padding: AesEncryptJS.pad.Pkcs7,
30
- })
31
- const ret = AesEncryptJS.enc.Utf8.stringify(decrypt).toString()
32
- try {
33
- return JSON.parse(ret)
34
- }
35
- catch {
36
- return ret
37
- }
38
- },
39
- }
1
+ import AesEncryptJS from 'crypto-js'
2
+
3
+ export default {
4
+ /**
5
+ * AES加密
6
+ *
7
+ * @param word
8
+ * @param encryKey
9
+ */
10
+ AESEncrypt(word: string, encryKey: string): string {
11
+ const key = AesEncryptJS.enc.Utf8.parse(encryKey)
12
+ const srcs = AesEncryptJS.enc.Utf8.parse(word)
13
+ const encrypted = AesEncryptJS.AES.encrypt(srcs, key, {
14
+ mode: AesEncryptJS.mode.ECB,
15
+ padding: AesEncryptJS.pad.Pkcs7,
16
+ })
17
+ return encrypted.toString()
18
+ },
19
+ /**
20
+ * AES解密
21
+ *
22
+ * @param word
23
+ * @param encryKey
24
+ */
25
+ AESDecrypt(word: string, encryKey: string): any {
26
+ const key = AesEncryptJS.enc.Utf8.parse(encryKey)
27
+ const decrypt = AesEncryptJS.AES.decrypt(word, key, {
28
+ mode: AesEncryptJS.mode.ECB,
29
+ padding: AesEncryptJS.pad.Pkcs7,
30
+ })
31
+ const ret = AesEncryptJS.enc.Utf8.stringify(decrypt).toString()
32
+ try {
33
+ return JSON.parse(ret)
34
+ }
35
+ catch {
36
+ return ret
37
+ }
38
+ },
39
+ }
@@ -1,57 +1,57 @@
1
- /**
2
- * 根据类型获取日期区间字符串
3
- * @param type '当年' | 'curMonth' | '当日'
4
- * @param show 区分实际值还是显示值, true为实际值, false为显示值
5
- * @returns [start, end] 例:['2024-01-01 00:00:00', '2024-12-31 23:59:59']
6
- */
7
- export function getRangeByType(type: string, show: boolean): [string, string] {
8
- const now = new Date()
9
- const year = now.getFullYear()
10
- const month = (now.getMonth() + 1).toString().padStart(2, '0')
11
- const day = now.getDate().toString().padStart(2, '0')
12
-
13
- if (!show) {
14
- if (type === 'curYear') {
15
- return [
16
- `${year}-01-01 00:00:00`,
17
- `${year}-12-31 23:59:59`,
18
- ]
19
- }
20
- if (type === 'curMonth') {
21
- const lastDay = new Date(year, now.getMonth() + 1, 0).getDate()
22
- return [
23
- `${year}-${month}-01 00:00:00`,
24
- `${year}-${month}-${lastDay.toString().padStart(2, '0')} 23:59:59`,
25
- ]
26
- }
27
- if (type === 'curDay') {
28
- return [
29
- `${year}-${month}-${day} 00:00:00`,
30
- `${year}-${month}-${day} 23:59:59`,
31
- ]
32
- }
33
- }
34
- if (show) {
35
- if (type === 'curYear') {
36
- return [
37
- `${year}-01-01`,
38
- `${year}-12-31`,
39
- ]
40
- }
41
- if (type === 'curMonth') {
42
- const lastDay = new Date(year, now.getMonth() + 1, 0).getDate()
43
- return [
44
- `${year}-${month}-01`,
45
- `${year}-${month}-${lastDay.toString().padStart(2, '0')}`,
46
- ]
47
- }
48
- if (type === 'curDay') {
49
- return [
50
- `${year}-${month}-${day}`,
51
- `${year}-${month}-${day}`,
52
- ]
53
- }
54
- }
55
- // 兜底返回空字符串数组
56
- return ['', '']
57
- }
1
+ /**
2
+ * 根据类型获取日期区间字符串
3
+ * @param type '当年' | 'curMonth' | '当日'
4
+ * @param show 区分实际值还是显示值, true为实际值, false为显示值
5
+ * @returns [start, end] 例:['2024-01-01 00:00:00', '2024-12-31 23:59:59']
6
+ */
7
+ export function getRangeByType(type: string, show: boolean): [string, string] {
8
+ const now = new Date()
9
+ const year = now.getFullYear()
10
+ const month = (now.getMonth() + 1).toString().padStart(2, '0')
11
+ const day = now.getDate().toString().padStart(2, '0')
12
+
13
+ if (!show) {
14
+ if (type === 'curYear') {
15
+ return [
16
+ `${year}-01-01 00:00:00`,
17
+ `${year}-12-31 23:59:59`,
18
+ ]
19
+ }
20
+ if (type === 'curMonth') {
21
+ const lastDay = new Date(year, now.getMonth() + 1, 0).getDate()
22
+ return [
23
+ `${year}-${month}-01 00:00:00`,
24
+ `${year}-${month}-${lastDay.toString().padStart(2, '0')} 23:59:59`,
25
+ ]
26
+ }
27
+ if (type === 'curDay') {
28
+ return [
29
+ `${year}-${month}-${day} 00:00:00`,
30
+ `${year}-${month}-${day} 23:59:59`,
31
+ ]
32
+ }
33
+ }
34
+ if (show) {
35
+ if (type === 'curYear') {
36
+ return [
37
+ `${year}-01-01`,
38
+ `${year}-12-31`,
39
+ ]
40
+ }
41
+ if (type === 'curMonth') {
42
+ const lastDay = new Date(year, now.getMonth() + 1, 0).getDate()
43
+ return [
44
+ `${year}-${month}-01`,
45
+ `${year}-${month}-${lastDay.toString().padStart(2, '0')}`,
46
+ ]
47
+ }
48
+ if (type === 'curDay') {
49
+ return [
50
+ `${year}-${month}-${day}`,
51
+ `${year}-${month}-${day}`,
52
+ ]
53
+ }
54
+ }
55
+ // 兜底返回空字符串数组
56
+ return ['', '']
57
+ }
@@ -1,13 +1,13 @@
1
- export function executeStrFunction(funcString, args) {
2
- // 使用 eval 执行传入的函数字符串
3
- // eslint-disable-next-line no-eval
4
- return eval(`(${funcString})`)(...args)
5
- }
6
-
7
- export function executeStrFunctionByContext(context, fnStr, args) {
8
- // 使用 new Function 创建函数,并绑定 context 作为 this
9
- // eslint-disable-next-line no-new-func
10
- const fn = new Function(`return (${fnStr});`)()
11
- // 使用 bind 绑定 context,并立即调用
12
- return fn.bind(context)(...args)
13
- }
1
+ export function executeStrFunction(funcString, args) {
2
+ // 使用 eval 执行传入的函数字符串
3
+ // eslint-disable-next-line no-eval
4
+ return eval(`(${funcString})`)(...args)
5
+ }
6
+
7
+ export function executeStrFunctionByContext(context, fnStr, args) {
8
+ // 使用 new Function 创建函数,并绑定 context 作为 this
9
+ // eslint-disable-next-line no-new-func
10
+ const fn = new Function(`return (${fnStr});`)()
11
+ // 使用 bind 绑定 context,并立即调用
12
+ return fn.bind(context)(...args)
13
+ }
@@ -1,40 +1,40 @@
1
- <script setup lang="ts">
2
- import XCellList from '@af-mobile-client-vue3/components/data/XCellList/index.vue'
3
- import NormalDataLayout from '@af-mobile-client-vue3/components/layout/NormalDataLayout/index.vue'
4
-
5
- import {
6
- Icon as VanIcon,
7
- } from 'vant'
8
- import { ref } from 'vue'
9
-
10
- const configName = ref('get_evaluate_by_id')
11
- </script>
12
-
13
- <template>
14
- <NormalDataLayout title="评价纪录">
15
- <template #layout_header_row_right_col>
16
- <VanIcon class="header_row_icon" name="filter-o" />
17
- </template>
18
- <template #layout_content>
19
- <XCellList :config-name="configName" id-key="t_id" service-name="af-revenue" />
20
- </template>
21
- </NormalDataLayout>
22
- </template>
23
-
24
- <style scoped lang="less">
25
- .header_row_icon {
26
- font-size: 18px;
27
- }
28
- //.van-tabs {
29
- // display: flex;
30
- // flex-flow: column;
31
- // height: 100%;
32
- //}
33
- //:deep(.van-tabs__content) {
34
- // flex: 1;
35
- //}
36
- //:deep(.van-tab__panel) {
37
- // height: 100%;
38
- // max-height: 100vh;
39
- //}
40
- </style>
1
+ <script setup lang="ts">
2
+ import XCellList from '@af-mobile-client-vue3/components/data/XCellList/index.vue'
3
+ import NormalDataLayout from '@af-mobile-client-vue3/components/layout/NormalDataLayout/index.vue'
4
+
5
+ import {
6
+ Icon as VanIcon,
7
+ } from 'vant'
8
+ import { ref } from 'vue'
9
+
10
+ const configName = ref('get_evaluate_by_id')
11
+ </script>
12
+
13
+ <template>
14
+ <NormalDataLayout title="评价纪录">
15
+ <template #layout_header_row_right_col>
16
+ <VanIcon class="header_row_icon" name="filter-o" />
17
+ </template>
18
+ <template #layout_content>
19
+ <XCellList :config-name="configName" id-key="t_id" service-name="af-revenue" />
20
+ </template>
21
+ </NormalDataLayout>
22
+ </template>
23
+
24
+ <style scoped lang="less">
25
+ .header_row_icon {
26
+ font-size: 18px;
27
+ }
28
+ //.van-tabs {
29
+ // display: flex;
30
+ // flex-flow: column;
31
+ // height: 100%;
32
+ //}
33
+ //:deep(.van-tabs__content) {
34
+ // flex: 1;
35
+ //}
36
+ //:deep(.van-tab__panel) {
37
+ // height: 100%;
38
+ // max-height: 100vh;
39
+ //}
40
+ </style>
@@ -1,10 +1,10 @@
1
- <script setup lang="ts">
2
- import MateChat from '@af-mobile-client-vue3/components/common/MateChat/index.vue'
3
-
4
- // 配置名称,从云端配置中心获取配置
5
- const configName = '用户端AiChat配置'
6
- </script>
7
-
8
- <template>
9
- <MateChat :config-name="configName" service-name="af-wechat" />
10
- </template>
1
+ <script setup lang="ts">
2
+ import MateChat from '@af-mobile-client-vue3/components/common/MateChat/index.vue'
3
+
4
+ // 配置名称,从云端配置中心获取配置
5
+ const configName = '用户端AiChat配置'
6
+ </script>
7
+
8
+ <template>
9
+ <MateChat :config-name="configName" service-name="af-wechat" />
10
+ </template>