diff --git a/src/views/project-management/contract/revenue-contract/ContractEdit.vue b/src/views/project-management/contract/revenue-contract/ContractEdit.vue
index caf1c1c..b4802c6 100644
--- a/src/views/project-management/contract/revenue-contract/ContractEdit.vue
+++ b/src/views/project-management/contract/revenue-contract/ContractEdit.vue
@@ -7,16 +7,8 @@
-
-
+
+
diff --git a/src/views/project-management/contract/revenue-contract/index.vue b/src/views/project-management/contract/revenue-contract/index.vue
index 1c80b57..6c70c57 100644
--- a/src/views/project-management/contract/revenue-contract/index.vue
+++ b/src/views/project-management/contract/revenue-contract/index.vue
@@ -148,38 +148,18 @@ interface ContractItem {
// 搜索表单
const searchForm = reactive({
- contractName: '',
contractCode: '',
client: '',
status: '',
- signDate: '',
+ signDateRange: [] as [string, string] | [],
page: 1,
size: 10,
})
// 查询条件配置
const queryFormColumns = [
- {
- field: 'contractName',
- label: '合同名称',
- type: 'input' as const,
- props: {
- placeholder: '请输入合同名称',
- },
- },
- {
- field: 'client',
- label: '客户',
- type: 'input' as const,
- props: {
- placeholder: '请输入客户名称',
- },
- },
- {
- field: 'status',
- label: '合同状态',
- type: 'select' as const,
- props: {
+ { field: 'client', label: '客户', type: 'input' as const, props: { placeholder: '请输入客户名称' } },
+ { field: 'status', label: '合同状态', type: 'select' as const, props: {
placeholder: '请选择合同状态',
options: [
{ label: '未确认', value: '未确认' },
@@ -191,6 +171,10 @@ const queryFormColumns = [
],
},
},
+ { field: 'signDateRange', label: '签署时间', type: 'range-picker' as const, props: {
+ placeholder: ['开始时间', '结束时间'], showTime: true, format: 'YYYY-MM-DD HH:mm:ss',
+ }
+ },
]
// 表格列配置
@@ -222,27 +206,39 @@ const fetchContractList = async () => {
const params = {
page: searchForm.page,
pageSize: searchForm.size,
- contractName: searchForm.contractName,
code: searchForm.contractCode,
customer: searchForm.client,
contractStatus: searchForm.status,
- signDate: searchForm.signDate,
+ signDateStart: Array.isArray(searchForm.signDateRange) && searchForm.signDateRange.length === 2 ? searchForm.signDateRange[0] : undefined,
+ signDateEnd: Array.isArray(searchForm.signDateRange) && searchForm.signDateRange.length === 2 ? searchForm.signDateRange[1] : undefined,
}
const response = await http.get('/contract/list', params)
if (response.code === 200) {
- // 过滤出类型为"收入合同"的数据
const allContracts = response.rows || []
- const revenueContracts = allContracts.filter((item: ContractItem) => item.type === '收入合同')
+ let revenueContracts = allContracts.filter((item: ContractItem) => item.type === '收入合同')
+
+ // 如果后端未按时间段过滤,则在前端兜底过滤
+ const range = Array.isArray(searchForm.signDateRange) && searchForm.signDateRange.length === 2 ? searchForm.signDateRange : null
+ if (range) {
+ const [start, end] = range
+ const s = new Date(start as any).getTime(), e = new Date(end as any).getTime()
+ if (!Number.isNaN(s) && !Number.isNaN(e)) {
+ revenueContracts = revenueContracts.filter((item: ContractItem) => {
+ if (!item.signDate) return false
+ const t = new Date(item.signDate as any).getTime()
+ return !Number.isNaN(t) && t >= s && t <= e
+ })
+ }
+ }
- // 计算未收款金额
dataList.value = revenueContracts.map((item: ContractItem) => ({
...item,
pendingAmount: (item.amount || 0) - (item.receivedAmount || 0),
}))
- pagination.total = Number.parseInt(response.total) || 0
+ pagination.total = dataList.value.length
} else {
Message.error(response.msg || '获取合同列表失败')
dataList.value = []
@@ -290,11 +286,10 @@ const search = async () => {
const reset = () => {
Object.assign(searchForm, {
- contractName: '',
contractCode: '',
client: '',
status: '',
- signDate: '',
+ signDateRange: [],
page: 1,
size: 10,
})
@@ -362,7 +357,8 @@ const handleAddSubmit = async () => {
paymentDate: newContractData.value.paymentDate || null,
performanceDeadline: newContractData.value.performanceDeadline || null,
productService: newContractData.value.productService || '',
- projectId: newContractData.value.projectId || '',
+ // 新建时不传 projectId,而是传项目名称
+ projectName: newContractData.value.projectName || '',
salespersonId: (newContractData.value as any).salespersonId || '',
signDate: newContractData.value.signDate || null,
type: newContractData.value.type || '收入合同',
From 3657b1914c02bdf593c0e8e420a6f9ef18829076 Mon Sep 17 00:00:00 2001
From: Maple <869445424@qq.com>
Date: Tue, 12 Aug 2025 10:50:04 +0800
Subject: [PATCH 3/9] =?UTF-8?q?fix:=E5=90=88=E5=90=8C=E5=8A=9F=E8=83=BD?=
=?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=BA=A7=E5=93=81?=
=?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../contract/expense-contract/ContractEdit.vue | 5 +++++
.../contract/revenue-contract/ContractEdit.vue | 5 +++++
2 files changed, 10 insertions(+)
diff --git a/src/views/project-management/contract/expense-contract/ContractEdit.vue b/src/views/project-management/contract/expense-contract/ContractEdit.vue
index 78278fe..78ece19 100644
--- a/src/views/project-management/contract/expense-contract/ContractEdit.vue
+++ b/src/views/project-management/contract/expense-contract/ContractEdit.vue
@@ -91,6 +91,11 @@
+
+
+
+
+
diff --git a/src/views/project-management/contract/revenue-contract/ContractEdit.vue b/src/views/project-management/contract/revenue-contract/ContractEdit.vue
index b4802c6..f756e1b 100644
--- a/src/views/project-management/contract/revenue-contract/ContractEdit.vue
+++ b/src/views/project-management/contract/revenue-contract/ContractEdit.vue
@@ -91,6 +91,11 @@
+
+
+
+
+
From b6cb51a5e9bc68e6d1a88c9cddb2ce0ff510aa2f Mon Sep 17 00:00:00 2001
From: chabai <14799297+dhasjklhdfjkasfbhfasfj@user.noreply.gitee.com>
Date: Tue, 12 Aug 2025 14:18:00 +0800
Subject: [PATCH 4/9] =?UTF-8?q?=E5=95=86=E5=8A=A1=E6=95=B0=E6=8D=AE?=
=?UTF-8?q?=E5=BA=93=E4=BF=A1=E6=81=AF=E6=A8=A1=E5=9D=97=E6=9B=B4=E5=90=8D?=
=?UTF-8?q?=E4=B8=BA=E6=99=BA=E8=83=BD=E5=95=86=E5=8A=A1=EF=BC=8C=E5=88=9D?=
=?UTF-8?q?=E6=AD=A5=E5=AE=9E=E7=8E=B0=E6=96=87=E4=BB=B6=E6=8E=92=E5=BA=8F?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/apis/bussiness/index.ts | 6 +-
src/apis/bussiness/type.ts | 2 +
src/router/route.ts | 4 +-
src/types/auto-imports.d.ts | 2 +-
src/views/bussiness-data/bussiness.vue | 160 +++++++++++++++++++++++--
5 files changed, 162 insertions(+), 12 deletions(-)
diff --git a/src/apis/bussiness/index.ts b/src/apis/bussiness/index.ts
index a28311e..8e9ab09 100644
--- a/src/apis/bussiness/index.ts
+++ b/src/apis/bussiness/index.ts
@@ -1,4 +1,4 @@
-// @/apis/bussiness/index.ts - 商务数据库信息模块API
+// @/apis/bussiness/index.ts - 智能商务API
import http from '@/utils/http'
import type {
FolderInfo,
@@ -59,7 +59,9 @@ export function getFilesApi(params?: FileListParams) {
page: params?.page || 1,
pageSize: params?.pageSize || 10,
folderId: params?.folderId || '0',
- fileName: params?.fileName
+ fileName: params?.fileName,
+ sortField: params?.sortField,
+ sortOrder: params?.sortOrder
}
})
}
diff --git a/src/apis/bussiness/type.ts b/src/apis/bussiness/type.ts
index 6fa269a..8d6f0e7 100644
--- a/src/apis/bussiness/type.ts
+++ b/src/apis/bussiness/type.ts
@@ -31,6 +31,8 @@ export interface FileListParams {
pageSize?: number
folderId?: string
fileName?: string
+ sortField?: string
+ sortOrder?: string
}
/** 文件夹列表响应 */
diff --git a/src/router/route.ts b/src/router/route.ts
index 99cb49e..2f749c1 100644
--- a/src/router/route.ts
+++ b/src/router/route.ts
@@ -1104,7 +1104,7 @@ export const systemRoutes: RouteRecordRaw[] = [
},
// ],
// },
- // 商务数据库信息模块
+ // 智能商务模块
{
path: '/bussiness-knowledge',
name: 'bussinesskonwledge',
@@ -1117,7 +1117,7 @@ export const systemRoutes: RouteRecordRaw[] = [
name: 'bussiness-knowledge',
component: () => import('@/views/bussiness-data/bussiness.vue'),
meta: {
- title: '商务数据库信息',
+ title: '智能商务',
icon: 'info-circle',
hidden: false,
},
diff --git a/src/types/auto-imports.d.ts b/src/types/auto-imports.d.ts
index eab6be6..369aad4 100644
--- a/src/types/auto-imports.d.ts
+++ b/src/types/auto-imports.d.ts
@@ -70,6 +70,6 @@ declare global {
// for type re-export
declare global {
// @ts-ignore
- export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue'
+ export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
import('vue')
}
diff --git a/src/views/bussiness-data/bussiness.vue b/src/views/bussiness-data/bussiness.vue
index cb61fc2..49f236c 100644
--- a/src/views/bussiness-data/bussiness.vue
+++ b/src/views/bussiness-data/bussiness.vue
@@ -242,10 +242,42 @@
@@ -613,6 +645,18 @@ const fileCurrentPage = ref(1);
const filePageSize = ref(10);
const totalFiles = ref(0);
+// 排序状态
+const sortField = ref('');
+const sortOrder = ref('');
+
+// 排序字段映射(前端显示名 -> 后端字段名)
+const sortFieldMap = {
+ 'fileName': 'file_name',
+ 'fileType': 'file_type',
+ 'fileSize': 'file_size',
+ 'uploadTime': 'upload_time'
+};
+
// 表单数据
const folderForm = reactive({
id: '',
@@ -941,6 +985,9 @@ const handleFileSearch = () => {
console.log('文件搜索关键词:', fileSearchKeyword.value);
// 重置到第一页并搜索
fileCurrentPage.value = 1;
+ // 搜索时重置排序状态
+ sortField.value = '';
+ sortOrder.value = '';
console.log('重置文件页码为:', fileCurrentPage.value);
if (currentFolderId.value) {
loadFiles(currentFolderId.value);
@@ -960,6 +1007,9 @@ const handleFileSearchInput = (value) => {
searchTimeout.value = setTimeout(() => {
console.log('=== 防抖文件搜索执行 ===');
fileCurrentPage.value = 1;
+ // 搜索时重置排序状态
+ sortField.value = '';
+ sortOrder.value = '';
console.log('重置文件页码为:', fileCurrentPage.value);
if (currentFolderId.value) {
loadFiles(currentFolderId.value);
@@ -976,6 +1026,9 @@ const handleFileSearchClear = () => {
console.log('清除文件搜索定时器');
}
fileCurrentPage.value = 1;
+ // 清除搜索时重置排序状态
+ sortField.value = '';
+ sortOrder.value = '';
console.log('重置文件页码为:', fileCurrentPage.value);
if (currentFolderId.value) {
loadFiles(currentFolderId.value);
@@ -985,12 +1038,20 @@ const handleFileSearchClear = () => {
const loadFiles = async (folderId) => {
try {
loading.value = true;
- const res = await getFilesApi({
+ const apiParams = {
folderId: folderId,
page: fileCurrentPage.value,
pageSize: filePageSize.value,
fileName: fileSearchKeyword.value || undefined
- });
+ };
+
+ // 添加排序参数
+ if (sortField.value && sortOrder.value) {
+ apiParams.sortField = sortField.value;
+ apiParams.sortOrder = sortOrder.value;
+ }
+
+ const res = await getFilesApi(apiParams);
// 根据后端返回的数据结构处理
if (res.code === 200 && res.data) {
@@ -1012,6 +1073,26 @@ const loadFiles = async (folderId) => {
}
};
+// 排序处理函数
+const handleSortChange = (field) => {
+ const backendField = sortFieldMap[field];
+
+ if (!backendField) return;
+
+ // 切换排序方向
+ if (sortField.value === backendField) {
+ sortOrder.value = sortOrder.value === 'asc' ? 'desc' : 'asc';
+ } else {
+ // 新字段,默认降序
+ sortField.value = backendField;
+ sortOrder.value = 'desc';
+ }
+
+ // 重新加载文件列表
+ if (currentFolderId.value) {
+ loadFiles(currentFolderId.value);
+ }
+};
// 文件夹点击事件
// const handleFolderClick = (folderId) => {
@@ -1030,8 +1111,10 @@ const handleFolderSelect = (selectedKeys, info) => {
const folderId = selectedKeys[0];
if (currentFolderId.value !== folderId) {
fileCurrentPage.value = 1;
- // 切换文件夹时清空文件搜索关键词
+ // 切换文件夹时清空文件搜索关键词和排序状态
fileSearchKeyword.value = '';
+ sortField.value = '';
+ sortOrder.value = '';
}
currentFolderId.value = folderId;
loadFiles(folderId);
@@ -1136,6 +1219,9 @@ const handleBreadcrumbClick = (index) => {
if (index === 0) {
// 点击"知识库",回到根目录
currentFolderId.value = '0';
+ // 重置排序状态
+ sortField.value = '';
+ sortOrder.value = '';
loadFiles('0');
} else {
// 点击其他路径项,需要找到对应的文件夹ID
@@ -1146,6 +1232,9 @@ const handleBreadcrumbClick = (index) => {
const targetFolder = folderList.value.find(folder => folder.name === targetFolderName);
if (targetFolder) {
currentFolderId.value = targetFolder.id;
+ // 重置排序状态
+ sortField.value = '';
+ sortOrder.value = '';
loadFiles(targetFolder.id);
}
}
@@ -1307,6 +1396,9 @@ const refreshData = async () => {
// 强制清空搜索关键词,确保显示所有文件夹
searchKeyword.value = '';
currentPage.value = 1;
+ // 刷新时重置排序状态
+ sortField.value = '';
+ sortOrder.value = '';
await initData();
if (currentFolderId.value) {
@@ -3464,6 +3556,60 @@ onMounted(() => {
}
}
+/* 可排序表头样式 */
+.sortable-header {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 6px;
+ cursor: pointer;
+ padding: 4px 8px;
+ border-radius: 4px;
+ transition: all 0.2s ease;
+ user-select: none;
+}
+
+.sortable-header:hover {
+ background: var(--color-fill-2);
+ color: var(--color-primary);
+}
+
+.sort-indicator {
+ display: flex;
+ flex-direction: column;
+ gap: 1px;
+ margin-left: 4px;
+}
+
+.sort-arrow {
+ width: 0;
+ height: 0;
+ border-left: 3px solid transparent;
+ border-right: 3px solid transparent;
+ transition: all 0.2s ease;
+}
+
+.sort-arrow.up {
+ border-bottom: 3px solid var(--color-text-4);
+}
+
+.sort-arrow.down {
+ border-top: 3px solid var(--color-text-4);
+}
+
+.sort-arrow.active {
+ border-bottom-color: var(--color-primary);
+ border-top-color: var(--color-primary);
+}
+
+.sortable-header:hover .sort-arrow.up {
+ border-bottom-color: var(--color-primary);
+}
+
+.sortable-header:hover .sort-arrow.down {
+ border-top-color: var(--color-primary);
+}
+
/* 文件分页样式 */
.file-pagination {
position: absolute;
From 6a531706e1c87894a78256b403f07d4ef71f2c87 Mon Sep 17 00:00:00 2001
From: "Mr.j" <2221464500@qq.com>
Date: Tue, 12 Aug 2025 14:25:58 +0800
Subject: [PATCH 5/9] =?UTF-8?q?=E6=8A=8A=E5=AE=A1=E6=89=B9=E4=BF=A1?=
=?UTF-8?q?=E6=81=AF=E6=94=BE=E5=9C=A8=E4=B8=AA=E4=BA=BA=E4=B8=AD=E5=BF=83?=
=?UTF-8?q?=E6=89=80=E5=9C=A8=E4=B8=8B=E6=8B=89=E6=A1=86=E6=B6=88=E6=81=AF?=
=?UTF-8?q?=E4=B8=AD=E5=BF=83=E9=87=8C=EF=BC=8C=E9=93=83=E9=93=9B=E5=9B=BE?=
=?UTF-8?q?=E6=A0=87=E5=A4=84=E6=94=B9=E4=B8=BA=E8=81=8A=E5=A4=A9=E6=B6=88?=
=?UTF-8?q?=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ApprovalMessageItem.vue | 297 ++++++++++++++++++
src/components/NotificationCenter/index.vue | 62 ++--
.../components/HeaderRightBar/index.vue | 103 ++++--
src/types/auto-imports.d.ts | 2 +-
src/types/components.d.ts | 61 ----
5 files changed, 425 insertions(+), 100 deletions(-)
create mode 100644 src/components/NotificationCenter/ApprovalMessageItem.vue
diff --git a/src/components/NotificationCenter/ApprovalMessageItem.vue b/src/components/NotificationCenter/ApprovalMessageItem.vue
new file mode 100644
index 0000000..bd8a07b
--- /dev/null
+++ b/src/components/NotificationCenter/ApprovalMessageItem.vue
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ notification.content }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/NotificationCenter/index.vue b/src/components/NotificationCenter/index.vue
index 948be76..7fb4ccf 100644
--- a/src/components/NotificationCenter/index.vue
+++ b/src/components/NotificationCenter/index.vue
@@ -1,15 +1,13 @@
-
-
-
-
-
-
-
- 消息中心
-
-
+
+
@@ -229,16 +227,37 @@ const reminderForm = ref({
// 计算属性
const notifications = computed(() => notificationService.getAllNotifications())
-const unreadCount = computed(() => notificationService.unreadCount.value)
+const unreadCount = computed(() => {
+ const count = notificationService.unreadCount.value
+ // 确保返回有效的数字,避免NaN
+ if (typeof count === 'number' && !isNaN(count) && isFinite(count)) {
+ return count
+ }
+ return 0
+})
const totalCount = computed(() => notifications.value.length)
-const pendingCount = computed(() => notificationService.pendingCount.value)
-const equipmentCount = computed(() =>
- notificationService.equipmentBorrowCount.value +
- notificationService.equipmentReturnCount.value +
- notificationService.equipmentMaintenanceCount.value +
- notificationService.equipmentAlertCount.value
-)
-const urgentCount = computed(() => notificationService.urgentCount.value)
+const pendingCount = computed(() => {
+ const count = notificationService.pendingCount.value
+ if (typeof count === 'number' && !isNaN(count) && isFinite(count)) {
+ return count
+ }
+ return 0
+})
+const equipmentCount = computed(() => {
+ const borrowCount = notificationService.equipmentBorrowCount.value || 0
+ const returnCount = notificationService.equipmentReturnCount.value || 0
+ const maintenanceCount = notificationService.equipmentMaintenanceCount.value || 0
+ const alertCount = notificationService.equipmentAlertCount.value || 0
+
+ return borrowCount + returnCount + maintenanceCount + alertCount
+})
+const urgentCount = computed(() => {
+ const count = notificationService.urgentCount.value
+ if (typeof count === 'number' && !isNaN(count) && isFinite(count)) {
+ return count
+ }
+ return 0
+})
const hasUrgentNotifications = computed(() => urgentCount.value > 0)
// 过滤后的消息列表
@@ -644,6 +663,11 @@ onUnmounted(() => {
clearInterval(reminderCheckInterval)
}
})
+
+// 暴露方法给父组件
+defineExpose({
+ toggleDropdown
+})
diff --git a/src/types/auto-imports.d.ts b/src/types/auto-imports.d.ts
index eab6be6..369aad4 100644
--- a/src/types/auto-imports.d.ts
+++ b/src/types/auto-imports.d.ts
@@ -70,6 +70,6 @@ declare global {
// for type re-export
declare global {
// @ts-ignore
- export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue'
+ export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
import('vue')
}
diff --git a/src/types/components.d.ts b/src/types/components.d.ts
index 2c3bca4..7fa6b1b 100644
--- a/src/types/components.d.ts
+++ b/src/types/components.d.ts
@@ -7,68 +7,7 @@ export {}
declare module 'vue' {
export interface GlobalComponents {
- ApprovalAssistant: typeof import('./../components/ApprovalAssistant/index.vue')['default']
- Avatar: typeof import('./../components/Avatar/index.vue')['default']
- Breadcrumb: typeof import('./../components/Breadcrumb/index.vue')['default']
- CellCopy: typeof import('./../components/CellCopy/index.vue')['default']
- Chart: typeof import('./../components/Chart/index.vue')['default']
- ColumnSetting: typeof import('./../components/GiTable/src/components/ColumnSetting.vue')['default']
- CronForm: typeof import('./../components/GenCron/CronForm/index.vue')['default']
- CronModal: typeof import('./../components/GenCron/CronModal/index.vue')['default']
- DateRangePicker: typeof import('./../components/DateRangePicker/index.vue')['default']
- DayForm: typeof import('./../components/GenCron/CronForm/component/day-form.vue')['default']
- FilePreview: typeof import('./../components/FilePreview/index.vue')['default']
- GiCellAvatar: typeof import('./../components/GiCell/GiCellAvatar.vue')['default']
- GiCellGender: typeof import('./../components/GiCell/GiCellGender.vue')['default']
- GiCellStatus: typeof import('./../components/GiCell/GiCellStatus.vue')['default']
- GiCellTag: typeof import('./../components/GiCell/GiCellTag.vue')['default']
- GiCellTags: typeof import('./../components/GiCell/GiCellTags.vue')['default']
- GiCodeView: typeof import('./../components/GiCodeView/index.vue')['default']
- GiDot: typeof import('./../components/GiDot/index.tsx')['default']
- GiEditTable: typeof import('./../components/GiEditTable/GiEditTable.vue')['default']
- GiFooter: typeof import('./../components/GiFooter/index.vue')['default']
- GiForm: typeof import('./../components/GiForm/src/GiForm.vue')['default']
- GiIconBox: typeof import('./../components/GiIconBox/index.vue')['default']
- GiIconSelector: typeof import('./../components/GiIconSelector/index.vue')['default']
- GiIframe: typeof import('./../components/GiIframe/index.vue')['default']
- GiOption: typeof import('./../components/GiOption/index.vue')['default']
- GiOptionItem: typeof import('./../components/GiOptionItem/index.vue')['default']
- GiPageLayout: typeof import('./../components/GiPageLayout/index.vue')['default']
- GiSpace: typeof import('./../components/GiSpace/index.vue')['default']
- GiSplitButton: typeof import('./../components/GiSplitButton/index.vue')['default']
- GiSplitPane: typeof import('./../components/GiSplitPane/index.vue')['default']
- GiSplitPaneFlexibleBox: typeof import('./../components/GiSplitPane/components/GiSplitPaneFlexibleBox.vue')['default']
- GiSvgIcon: typeof import('./../components/GiSvgIcon/index.vue')['default']
- GiTable: typeof import('./../components/GiTable/src/GiTable.vue')['default']
- GiTag: typeof import('./../components/GiTag/index.tsx')['default']
- GiThemeBtn: typeof import('./../components/GiThemeBtn/index.vue')['default']
- HourForm: typeof import('./../components/GenCron/CronForm/component/hour-form.vue')['default']
- Icon403: typeof import('./../components/icons/Icon403.vue')['default']
- Icon404: typeof import('./../components/icons/Icon404.vue')['default']
- Icon500: typeof import('./../components/icons/Icon500.vue')['default']
- IconBorders: typeof import('./../components/icons/IconBorders.vue')['default']
- IconTableSize: typeof import('./../components/icons/IconTableSize.vue')['default']
- IconTreeAdd: typeof import('./../components/icons/IconTreeAdd.vue')['default']
- IconTreeReduce: typeof import('./../components/icons/IconTreeReduce.vue')['default']
- ImageImport: typeof import('./../components/ImageImport/index.vue')['default']
- ImageImportWizard: typeof import('./../components/ImageImportWizard/index.vue')['default']
- IndustrialImageList: typeof import('./../components/IndustrialImageList/index.vue')['default']
- JsonPretty: typeof import('./../components/JsonPretty/index.vue')['default']
- MinuteForm: typeof import('./../components/GenCron/CronForm/component/minute-form.vue')['default']
- MonthForm: typeof import('./../components/GenCron/CronForm/component/month-form.vue')['default']
- NotificationCenter: typeof import('./../components/NotificationCenter/index.vue')['default']
- ParentView: typeof import('./../components/ParentView/index.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
- SecondForm: typeof import('./../components/GenCron/CronForm/component/second-form.vue')['default']
- SplitPanel: typeof import('./../components/SplitPanel/index.vue')['default']
- TextCopy: typeof import('./../components/TextCopy/index.vue')['default']
- TurbineGrid: typeof import('./../components/TurbineGrid/index.vue')['default']
- UserSelect: typeof import('./../components/UserSelect/index.vue')['default']
- Verify: typeof import('./../components/Verify/index.vue')['default']
- VerifyPoints: typeof import('./../components/Verify/Verify/VerifyPoints.vue')['default']
- VerifySlide: typeof import('./../components/Verify/Verify/VerifySlide.vue')['default']
- WeekForm: typeof import('./../components/GenCron/CronForm/component/week-form.vue')['default']
- YearForm: typeof import('./../components/GenCron/CronForm/component/year-form.vue')['default']
}
}
From 7fa5beee2ff53e7d35b14b04725c4070928b7f43 Mon Sep 17 00:00:00 2001
From: Maple <869445424@qq.com>
Date: Tue, 12 Aug 2025 14:43:44 +0800
Subject: [PATCH 6/9] =?UTF-8?q?add:=20=E8=AE=A2=E5=8D=95=E7=AE=A1=E7=90=86?=
=?UTF-8?q?=E7=9A=84=E5=89=8D=E7=AB=AF=E9=A1=B5=E9=9D=A2=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E4=BA=86=EF=BC=8C=E4=BD=86=E6=98=AF=E5=9B=A0=E4=B8=BA=E6=9A=82?=
=?UTF-8?q?=E6=97=B6=E4=B8=8D=E6=B8=85=E6=A5=9A=E8=AE=A2=E5=8D=95=E7=9A=84?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5=E9=82=A3=E4=BA=9B=EF=BC=8C=E5=90=8E=E7=AB=AF?=
=?UTF-8?q?=E4=B9=9F=E6=B2=A1=E6=9C=89=E7=9B=B8=E5=AF=B9=E5=BA=94=E7=9A=84?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/types/components.d.ts | 62 +++++++
.../order-management/index.vue | 154 +++++++++++++++++-
2 files changed, 215 insertions(+), 1 deletion(-)
diff --git a/src/types/components.d.ts b/src/types/components.d.ts
index 7fa6b1b..73dac61 100644
--- a/src/types/components.d.ts
+++ b/src/types/components.d.ts
@@ -7,7 +7,69 @@ export {}
declare module 'vue' {
export interface GlobalComponents {
+ ApprovalAssistant: typeof import('./../components/ApprovalAssistant/index.vue')['default']
+ ApprovalMessageItem: typeof import('./../components/NotificationCenter/ApprovalMessageItem.vue')['default']
+ Avatar: typeof import('./../components/Avatar/index.vue')['default']
+ Breadcrumb: typeof import('./../components/Breadcrumb/index.vue')['default']
+ CellCopy: typeof import('./../components/CellCopy/index.vue')['default']
+ Chart: typeof import('./../components/Chart/index.vue')['default']
+ ColumnSetting: typeof import('./../components/GiTable/src/components/ColumnSetting.vue')['default']
+ CronForm: typeof import('./../components/GenCron/CronForm/index.vue')['default']
+ CronModal: typeof import('./../components/GenCron/CronModal/index.vue')['default']
+ DateRangePicker: typeof import('./../components/DateRangePicker/index.vue')['default']
+ DayForm: typeof import('./../components/GenCron/CronForm/component/day-form.vue')['default']
+ FilePreview: typeof import('./../components/FilePreview/index.vue')['default']
+ GiCellAvatar: typeof import('./../components/GiCell/GiCellAvatar.vue')['default']
+ GiCellGender: typeof import('./../components/GiCell/GiCellGender.vue')['default']
+ GiCellStatus: typeof import('./../components/GiCell/GiCellStatus.vue')['default']
+ GiCellTag: typeof import('./../components/GiCell/GiCellTag.vue')['default']
+ GiCellTags: typeof import('./../components/GiCell/GiCellTags.vue')['default']
+ GiCodeView: typeof import('./../components/GiCodeView/index.vue')['default']
+ GiDot: typeof import('./../components/GiDot/index.tsx')['default']
+ GiEditTable: typeof import('./../components/GiEditTable/GiEditTable.vue')['default']
+ GiFooter: typeof import('./../components/GiFooter/index.vue')['default']
+ GiForm: typeof import('./../components/GiForm/src/GiForm.vue')['default']
+ GiIconBox: typeof import('./../components/GiIconBox/index.vue')['default']
+ GiIconSelector: typeof import('./../components/GiIconSelector/index.vue')['default']
+ GiIframe: typeof import('./../components/GiIframe/index.vue')['default']
+ GiOption: typeof import('./../components/GiOption/index.vue')['default']
+ GiOptionItem: typeof import('./../components/GiOptionItem/index.vue')['default']
+ GiPageLayout: typeof import('./../components/GiPageLayout/index.vue')['default']
+ GiSpace: typeof import('./../components/GiSpace/index.vue')['default']
+ GiSplitButton: typeof import('./../components/GiSplitButton/index.vue')['default']
+ GiSplitPane: typeof import('./../components/GiSplitPane/index.vue')['default']
+ GiSplitPaneFlexibleBox: typeof import('./../components/GiSplitPane/components/GiSplitPaneFlexibleBox.vue')['default']
+ GiSvgIcon: typeof import('./../components/GiSvgIcon/index.vue')['default']
+ GiTable: typeof import('./../components/GiTable/src/GiTable.vue')['default']
+ GiTag: typeof import('./../components/GiTag/index.tsx')['default']
+ GiThemeBtn: typeof import('./../components/GiThemeBtn/index.vue')['default']
+ HourForm: typeof import('./../components/GenCron/CronForm/component/hour-form.vue')['default']
+ Icon403: typeof import('./../components/icons/Icon403.vue')['default']
+ Icon404: typeof import('./../components/icons/Icon404.vue')['default']
+ Icon500: typeof import('./../components/icons/Icon500.vue')['default']
+ IconBorders: typeof import('./../components/icons/IconBorders.vue')['default']
+ IconTableSize: typeof import('./../components/icons/IconTableSize.vue')['default']
+ IconTreeAdd: typeof import('./../components/icons/IconTreeAdd.vue')['default']
+ IconTreeReduce: typeof import('./../components/icons/IconTreeReduce.vue')['default']
+ ImageImport: typeof import('./../components/ImageImport/index.vue')['default']
+ ImageImportWizard: typeof import('./../components/ImageImportWizard/index.vue')['default']
+ IndustrialImageList: typeof import('./../components/IndustrialImageList/index.vue')['default']
+ JsonPretty: typeof import('./../components/JsonPretty/index.vue')['default']
+ MinuteForm: typeof import('./../components/GenCron/CronForm/component/minute-form.vue')['default']
+ MonthForm: typeof import('./../components/GenCron/CronForm/component/month-form.vue')['default']
+ NotificationCenter: typeof import('./../components/NotificationCenter/index.vue')['default']
+ ParentView: typeof import('./../components/ParentView/index.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
+ SecondForm: typeof import('./../components/GenCron/CronForm/component/second-form.vue')['default']
+ SplitPanel: typeof import('./../components/SplitPanel/index.vue')['default']
+ TextCopy: typeof import('./../components/TextCopy/index.vue')['default']
+ TurbineGrid: typeof import('./../components/TurbineGrid/index.vue')['default']
+ UserSelect: typeof import('./../components/UserSelect/index.vue')['default']
+ Verify: typeof import('./../components/Verify/index.vue')['default']
+ VerifyPoints: typeof import('./../components/Verify/Verify/VerifyPoints.vue')['default']
+ VerifySlide: typeof import('./../components/Verify/Verify/VerifySlide.vue')['default']
+ WeekForm: typeof import('./../components/GenCron/CronForm/component/week-form.vue')['default']
+ YearForm: typeof import('./../components/GenCron/CronForm/component/year-form.vue')['default']
}
}
diff --git a/src/views/project-management/order-management/index.vue b/src/views/project-management/order-management/index.vue
index 89b1f33..22ffeda 100644
--- a/src/views/project-management/order-management/index.vue
+++ b/src/views/project-management/order-management/index.vue
@@ -1,11 +1,163 @@
+
+
+
+
+
+
+
+
+
+
+ {{ card.iconChar }}
+
+
{{ card.value }}
+
{{ card.title }}
+
+
+
+
+
+
+
+
+
+
+ 新增订单
+
+
+
+
+
+ {{ record.status }}
+
+ {}">查看
+ {}">编辑
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
From f1da2f0077af9f54d20a033d2e44d07e428233d2 Mon Sep 17 00:00:00 2001
From: Maple <869445424@qq.com>
Date: Tue, 12 Aug 2025 14:51:23 +0800
Subject: [PATCH 7/9] =?UTF-8?q?add:=20=E8=AE=A2=E5=8D=95=E7=AE=A1=E7=90=86?=
=?UTF-8?q?=E7=9A=84=E5=89=8D=E7=AB=AF=E9=A1=B5=E9=9D=A2=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E4=BA=86=EF=BC=8C=E4=BD=86=E6=98=AF=E5=9B=A0=E4=B8=BA=E6=9A=82?=
=?UTF-8?q?=E6=97=B6=E4=B8=8D=E6=B8=85=E6=A5=9A=E8=AE=A2=E5=8D=95=E7=9A=84?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5=E9=82=A3=E4=BA=9B=EF=BC=8C=E5=90=8E=E7=AB=AF?=
=?UTF-8?q?=E4=B9=9F=E6=B2=A1=E6=9C=89=E7=9B=B8=E5=AF=B9=E5=BA=94=E7=9A=84?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/types/auto-imports.d.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/types/auto-imports.d.ts b/src/types/auto-imports.d.ts
index 369aad4..eab6be6 100644
--- a/src/types/auto-imports.d.ts
+++ b/src/types/auto-imports.d.ts
@@ -70,6 +70,6 @@ declare global {
// for type re-export
declare global {
// @ts-ignore
- export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
+ export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue'
import('vue')
}
From 3fb4cc09502d0d3836edcd754bff48a0ef4e8740 Mon Sep 17 00:00:00 2001
From: chabai <14799297+dhasjklhdfjkasfbhfasfj@user.noreply.gitee.com>
Date: Tue, 12 Aug 2025 15:50:05 +0800
Subject: [PATCH 8/9] =?UTF-8?q?=E6=99=BA=E8=83=BD=E5=95=86=E5=8A=A1?=
=?UTF-8?q?=E6=A8=A1=E5=9D=97=E9=80=82=E9=85=8D=E4=B8=BB=E9=A2=98=E5=88=87?=
=?UTF-8?q?=E6=8D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/bussiness-data/bussiness.vue | 198 ++++++++++++-------------
1 file changed, 95 insertions(+), 103 deletions(-)
diff --git a/src/views/bussiness-data/bussiness.vue b/src/views/bussiness-data/bussiness.vue
index 49f236c..dcc7abf 100644
--- a/src/views/bussiness-data/bussiness.vue
+++ b/src/views/bussiness-data/bussiness.vue
@@ -4,10 +4,9 @@
-
-
+
@@ -305,7 +282,7 @@
- {{ formatFileSize(file.fileSize || file.size) }}
+ {{ formatFileListSize(file.fileSize || file.size) }}
@@ -682,7 +659,7 @@ const fileListTemp = ref([]);
const folderFormRef = ref(null);
const uploadFormRef = ref(null);
const uploadRef = ref(null);
-const folderColor = '#165DFF';
+const folderColor = 'var(--color-primary)';
const refreshing = ref(false);
const folderSubmitting = ref(false);
const uploading = ref(false);
@@ -1624,7 +1601,7 @@ const fileColor = (extension) => {
bmp: '#722ed1',
webp: '#13c2c2'
};
- return colorMap[extension.toLowerCase()] || '#8c8c8c';
+ return colorMap[extension.toLowerCase()] || 'var(--color-text-3)';
};
@@ -1881,8 +1858,8 @@ const showTextPreview = async (blob, fileName) => {
maxWidth: '100%',
maxHeight: '70vh',
overflow: 'auto',
- backgroundColor: '#f8f9fa',
- border: '1px solid #e9ecef',
+ backgroundColor: 'var(--color-fill-1)',
+ border: '1px solid var(--color-border)',
borderRadius: '8px',
padding: '20px',
fontFamily: "'Consolas', 'Monaco', 'Courier New', monospace",
@@ -1890,7 +1867,7 @@ const showTextPreview = async (blob, fileName) => {
lineHeight: '1.6',
whiteSpace: 'pre-wrap',
wordBreak: 'break-word',
- color: '#333',
+ color: 'var(--color-text-1)',
textAlign: 'left'
}
}, text)
@@ -2336,6 +2313,21 @@ const formatFileSize = (fileSize) => {
return `${(size / (1024 * 1024 * 1024)).toFixed(1)} GB`;
};
+// 专门用于文件列表的格式化函数(假设后端返回的是KB单位)
+const formatFileListSize = (fileSize) => {
+ const size = Number(fileSize);
+ if (isNaN(size) || size < 0) return '未知';
+
+ // 假设后端返回的是KB单位
+ if (size < 1024) {
+ return `${size} KB`;
+ } else if (size < 1024 * 1024) {
+ return `${(size / 1024).toFixed(1)} MB`;
+ } else {
+ return `${(size / (1024 * 1024)).toFixed(1)} GB`;
+ }
+};
+
const fileTypeText = (type) => {
@@ -2458,7 +2450,7 @@ onMounted(() => {