From 1176c30e571143fa4c6c3c6aea6bfea9e6390ed0 Mon Sep 17 00:00:00 2001 From: QSuser Date: Thu, 20 Mar 2025 23:01:14 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=88=A0=E9=99=A4draw?= =?UTF-8?q?ingNumber=20+=20'=E6=95=B0=E9=87=8F=E4=B8=8D=E8=83=BD=E5=B0=91?= =?UTF-8?q?=E4=BA=8E=E5=B7=B2=E6=8A=95=E4=BA=A7=E6=95=B0=E9=87=8F'=20+=20d?= =?UTF-8?q?oingNumber=20+=20'=EF=BC=88=E5=AE=8C=E5=B7=A5+=E5=9C=A8?= =?UTF-8?q?=E4=BA=A7=EF=BC=89=20=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/allowance.ts | 74 ++++ src/router/menus/report.ts | 18 + src/views/notice/detail.vue | 4 +- src/views/report/AllowanceReport.vue | 280 +++++++++++++ src/views/report/Attendance2Calendar.vue | 200 +++++++++ .../report/inspection/AllowanceEditDialog.vue | 379 ++++++++++++++++++ 6 files changed, 953 insertions(+), 2 deletions(-) create mode 100644 src/api/allowance.ts create mode 100644 src/views/report/AllowanceReport.vue create mode 100644 src/views/report/Attendance2Calendar.vue create mode 100644 src/views/report/inspection/AllowanceEditDialog.vue diff --git a/src/api/allowance.ts b/src/api/allowance.ts new file mode 100644 index 0000000..6b40673 --- /dev/null +++ b/src/api/allowance.ts @@ -0,0 +1,74 @@ +// @/api/allowance.ts +import http from '@/lib/http'; + +// ✅ 在 AllowanceItem 中添加临时字段用于 UI 控制 +export interface AllowanceItem { + id?: number; + userName: string; + jobNumber?: string; + hireNaturalYear: string | number; + hireYear: number; + housingAllowance: number; + attendanceDays: number; + commuteDistance: number; + allowanceMethod: '现金' | '油卡'; + allowanceAmount: number; + lunchAllowance: number; + homeAllowance: number; + cashSubsidyTotal: number; + oilCardSubsidyTotal: number; + allowanceMonth?: string; + // ✅ 添加临时字段用于 UI 控制(不提交到后端) + housingStatus?: '享有' | '不享有'; +} + +export interface UpdateAllowanceParams { + jobNumber: string; + allowanceMethod: '现金' | '油卡'; + housingAllowance: number; + homeAllowance: number; + allowanceMonth: string; + // 可选字段 + allowanceAmount?: number; + lunchAllowance?: number; + cashSubsidyTotal?: number; + oilCardSubsidyTotal?: number; +} + +export interface RecalculateParams { + attendanceDays: number; + commuteDistance: number; + allowanceMethod: '现金' | '油卡'; + housingAllowance: number; + homeAllowance: number; +} + +export async function queryAllowanceApi(params: QueryParams) { + return http.getRequest('/allowance/select', params); +} + +export async function getAllowanceListApi() { + const response = await http.getRequest('/allowance/list'); + return response; +} + +export async function updateAllowanceApi(params: UpdateAllowanceParams) { + const response = await http.postRequest('/allowance/update', params); + return response; +} + +export async function generateAllowanceApi() { + const response = await http.postRequest('/allowance/generate', {}); + return response; +} + +export async function recalculateApi(params: RecalculateParams) { + const response = await http.postRequest('/allowance/recalculate', params); + return response; +} + +export interface QueryParams { + userName?: string; + allowanceMethod?: '现金' | '油卡'; + allowanceMonth?: string; +} \ No newline at end of file diff --git a/src/router/menus/report.ts b/src/router/menus/report.ts index 2201b86..6238adf 100644 --- a/src/router/menus/report.ts +++ b/src/router/menus/report.ts @@ -94,6 +94,24 @@ export default { icon: 'el-icon-s-help' }, component: () => import('@/views/report/inspection/inspection_qualified.vue'), + }, + { + path: '/report/allowance', + name: 'AllowanceReport', + meta: { + title: '公司补贴报表', + icon: 'el-icon-notebook-1' + }, + component: () => import('@/views/report/AllowanceReport.vue') + }, + { + path: '/report/attendance/calendar', + name: 'AttendanceCalendar', + meta: { + title: '考勤日历报表', + icon: 'el-icon-date' + }, + component: () => import('@/views/report/Attendance2Calendar.vue') } ] diff --git a/src/views/notice/detail.vue b/src/views/notice/detail.vue index ae8aed0..1098e15 100644 --- a/src/views/notice/detail.vue +++ b/src/views/notice/detail.vue @@ -664,7 +664,7 @@ export default class DialogDetail extends Vue { return } } - +/* for (var i = 0; i < this.notice.productList.length; i++) { if (this.notice.productList[i].number < this.notice.productList[i].workingNumber + this.notice.productList[i].finishedNumber) { let doingNumber = this.notice.productList[i].workingNumber + this.notice.productList[i].finishedNumber @@ -673,7 +673,7 @@ export default class DialogDetail extends Vue { return } } - +*/ // 发送请求 let result = await this.EDIT_NOTICE({ ...this.notice }) if (result) { diff --git a/src/views/report/AllowanceReport.vue b/src/views/report/AllowanceReport.vue new file mode 100644 index 0000000..dd3ea62 --- /dev/null +++ b/src/views/report/AllowanceReport.vue @@ -0,0 +1,280 @@ + + + + + \ No newline at end of file diff --git a/src/views/report/Attendance2Calendar.vue b/src/views/report/Attendance2Calendar.vue new file mode 100644 index 0000000..39c32d9 --- /dev/null +++ b/src/views/report/Attendance2Calendar.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/src/views/report/inspection/AllowanceEditDialog.vue b/src/views/report/inspection/AllowanceEditDialog.vue new file mode 100644 index 0000000..5279210 --- /dev/null +++ b/src/views/report/inspection/AllowanceEditDialog.vue @@ -0,0 +1,379 @@ + + + \ No newline at end of file -- Gitee From 1a0a1737a5b5d46fdb8ffce5fab289ee8b8e4a93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=82=85=E5=AD=90=E8=88=AA?= <1145984569@qq.com> Date: Sun, 4 Jan 2026 16:09:34 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=85=AC?= =?UTF-8?q?=E5=8F=B8=E8=A1=A5=E8=B4=B4=E6=8A=A5=E8=A1=A8=E5=92=8C=E8=80=83?= =?UTF-8?q?=E5=8B=A4=E6=97=A5=E5=8E=86=E6=8A=A5=E8=A1=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -- Gitee From 4f55fa4901549b0d7caf887f2f4aac28793e0e8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=82=85=E5=AD=90=E8=88=AA?= <1145984569@qq.com> Date: Sun, 4 Jan 2026 17:16:30 +0800 Subject: [PATCH 3/6] Merge branch 'master' into devfzh --- .env.loacl | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .env.loacl diff --git a/.env.loacl b/.env.loacl new file mode 100644 index 0000000..d38bd8b --- /dev/null +++ b/.env.loacl @@ -0,0 +1,2 @@ +NODE_ENV=development +VUE_APP_URL_PREFIX='/api' \ No newline at end of file -- Gitee From a8d14ad8ba2959bb065f6c3beebb9e06c753e3fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=82=85=E5=AD=90=E8=88=AA?= <1145984569@qq.com> Date: Tue, 6 Jan 2026 20:03:42 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E8=80=83=E5=8B=A4=E6=97=A5=E5=8E=86?= =?UTF-8?q?=E8=A1=A8=E4=BF=AE=E6=94=B9=E5=AE=8C=E5=96=84=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E4=BA=86.xlsx=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/attendance2.ts | 61 ++++++++ src/views/report/Attendance2Calendar.vue | 177 +++++++++++++++++------ 2 files changed, 192 insertions(+), 46 deletions(-) create mode 100644 src/api/attendance2.ts diff --git a/src/api/attendance2.ts b/src/api/attendance2.ts new file mode 100644 index 0000000..4ff2443 --- /dev/null +++ b/src/api/attendance2.ts @@ -0,0 +1,61 @@ +// @/api/attendance2.ts +import http from '@/lib/http'; + +// --- 1. 类型定义 (不再从本文件导入,直接在此定义) --- +/** + * 考勤列表项接口 + */ +export interface AttendanceItem { + username: string; // 姓名 + jobNumber: string; // 工号 + attendanceCount: number; // 出勤天数 + commuteCount: number; // 异常次数 + absenceCount: number; // 缺勤次数 + calendar: { + [date: string]: string; // 动态日期数据 + }; + [key: string]: any; // 允许扩展其他属性 +} + +/** + * 请求参数接口 + */ +export interface AttendanceParams { + year: number; + month: number; + name?: string; + jobNumber?: string; +} + +/** + * 后端统一响应格式 + */ +export interface AttendanceResponse { + success: boolean; + message: string; + data: AttendanceItem[]; + [key: string]: any; +} + +// --- 2. API 方法封装 --- +/** + * 获取考勤日历列表(无搜索条件时) + */ +export async function fetchAttendanceCalendar(params: AttendanceParams) { + return http.getRequest('/api/attendance2/calendar', params) as Promise; +} + +/** + * 搜索考勤数据(带姓名/工号条件) + */ +export async function searchAttendanceData(params: AttendanceParams) { + return http.getRequest('/api/attendance2/search', params) as Promise; +} + +/** + * 上传考勤 Excel 文件 + */ +export async function uploadAttendanceExcel(file: File) { + const url = process.env.VUE_APP_URL_PREFIX + '/api/attendance2/upload'; + return http.uploadRequest(url, file) as Promise; +} \ No newline at end of file diff --git a/src/views/report/Attendance2Calendar.vue b/src/views/report/Attendance2Calendar.vue index 39c32d9..71601a7 100644 --- a/src/views/report/Attendance2Calendar.vue +++ b/src/views/report/Attendance2Calendar.vue @@ -6,6 +6,9 @@ + + + 重置 + + +
+ + 上传考勤Excel +
只能上传 xlsx/xls 文件,大小不超过 2MB
+
+

{{ selectedMonth }} 考勤表

-
注:绿色为出勤,红色为缺勤,深灰色为没有相关数据,白色为未到日期
+
注:绿色为出勤,红色为缺勤,黄色为异常,深灰色为没有相关数据,白色为未到日期
+ + + + + - -
@@ -71,75 +95,126 @@ export default { month: '' }, attendanceList: [], - dates: [], // 生成当月所有日期 - selectedMonth: '' + dates: [], + selectedMonth: '', + uploadUrl: '/api/attendance2/upload' }; }, methods: { + // ✅ 新增:获取 token(用于上传) + getToken() { + return sessionStorage.getItem('token') || ''; + }, + async loadData() { if (!this.searchForm.month) { this.$message.warning('请选择月份'); return; } - - const [year, month] = this.searchForm.month.split('-').map(Number); + const [year, monthStr] = this.searchForm.month.split('-'); + const yearNum = parseInt(year, 10); + const monthNum = parseInt(monthStr, 10); try { - let res; + let params = { year: yearNum, month: monthNum }; + let url; if (this.searchForm.name || this.searchForm.jobNumber) { - res = await this.$http.get('/api/attendance2/search', { - params: { - year, - month, - name: this.searchForm.name, - jobNumber: this.searchForm.jobNumber - } - }); + url = '/api/attendance2/search'; + if (this.searchForm.name) params.name = this.searchForm.name; + if (this.searchForm.jobNumber) params.jobNumber = this.searchForm.jobNumber; } else { - res = await this.$http.get('/api/attendance2/calendar', { - params: { year, month } - }); + url = '/api/attendance2/calendar'; } - // 处理响应结果,提取data部分 - this.attendanceList = res.data.data || res.data; - this.generateDates(year, month); + const res = await this.$http.get(url, { params }); + + let data = res.data; + if (data && typeof data === 'object' && Array.isArray(data.data)) { + data = data.data; + } else if (!Array.isArray(data)) { + data = []; + } + this.attendanceList = data; + this.generateDates(yearNum, monthNum); this.selectedMonth = this.searchForm.month; } catch (error) { console.error('加载考勤数据失败:', error); - this.$message.error('加载数据失败'); + this.$message.error('加载数据失败,请稍后重试'); } }, generateDates(year, month) { const daysInMonth = new Date(year, month, 0).getDate(); + const paddedMonth = month < 10 ? '0' + month : '' + month; this.dates = []; - for (let i = 1; i <= daysInMonth; i++) { - const day = i < 10 ? `0${i}` : `${i}`; - this.dates.push(`${year}-${month < 10 ? '0' + month : month}-${day}`); + for (let day = 1; day <= daysInMonth; day++) { + const paddedDay = day < 10 ? '0' + day : '' + day; + this.dates.push(`${year}-${paddedMonth}-${paddedDay}`); } }, getCellClass(status, date) { const today = new Date(); const currentDate = new Date(date); const isFuture = currentDate > today; - - if (isFuture) return 'cell-white'; // 未来日期为白色 - if (!status) return 'cell-gray'; // 未打卡或无记录为灰色 - if (status === '出勤') return 'cell-green'; // 出勤为绿色 - if (status === '缺勤') return 'cell-red'; // 缺勤为红色 - return 'cell-default'; // 其他状态 + if (isFuture) return 'cell-white'; + if (!status) return 'cell-gray'; + if (status === '出勤') return 'cell-green'; + if (status === '缺勤') return 'cell-red'; + if (status === '异常') return 'cell-yellow'; + if (status === '未到') return 'cell-white'; + if (status === '缺失') return 'cell-gray'; + return 'cell-default'; }, resetSearch() { + const now = new Date(); this.searchForm = { jobNumber: '', name: '', - month: `${new Date().getFullYear()}-${new Date().getMonth() + 1}` + month: `${now.getFullYear()}-${now.getMonth() + 1}` }; this.loadData(); + }, + handleUploadSuccess(response, file, fileList) { + const msg = response && response.message ? response.message : '上传成功'; + this.$message.success(msg); + this.loadData(); // 重新加载当前月份数据 + }, + handleUploadError(error, file, fileList) { + let msg = '未知错误'; + if (error && error.response && error.response.data && error.response.data.message) { + msg = error.response.data.message; + } else if (error && error.message) { + msg = error.message; + } + this.$message.error('上传失败: ' + msg); + }, + beforeUpload(file) { + const validTypes = [ + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'application/vnd.ms-excel' + ]; + const isExcel = validTypes.includes(file.type) || + file.name.toLowerCase().endsWith('.xlsx') || + file.name.toLowerCase().endsWith('.xls'); + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isExcel) { + this.$message.error('只能上传 Excel 文件(.xlsx 或 .xls)!'); + return false; + } + if (!isLt2M) { + this.$message.error('文件大小不能超过 2MB!'); + return false; + } + return true; } }, mounted() { - this.searchForm.month = `${new Date().getFullYear()}-${new Date().getMonth() + 1}`; + const now = new Date(); + this.searchForm.month = `${now.getFullYear()}-${now.getMonth() + 1}`; this.selectedMonth = this.searchForm.month; this.loadData(); + + // 可选:动态设置 API 基础路径 + if (process.env.VUE_APP_API_BASE_URL) { + this.uploadUrl = process.env.VUE_APP_API_BASE_URL + '/api/attendance2/upload'; + } } }; @@ -148,23 +223,19 @@ export default { .attendance-container { padding: 20px; } - .filter-card { margin-bottom: 20px; } - .table-card /deep/ .el-table th { background-color: #f5f7fa; } - .calendar-grid { display: flex; flex-wrap: wrap; gap: 2px; } - .calendar-grid > div { - flex: 0 0 calc(3.225% - 2px); /* 31天约3.225% */ + flex: 0 0 calc(3.225% - 2px); height: 30px; line-height: 30px; text-align: center; @@ -172,29 +243,43 @@ export default { border-radius: 2px; cursor: default; } - .cell-white { background-color: white; border: 1px solid #eee; + color: #999; } - .cell-gray { background-color: #f0f0f0; border: 1px solid #ddd; + color: #666; } - .cell-green { background-color: #90ee90; border: 1px solid #7cb342; + color: #333; } - .cell-red { background-color: #ff6347; border: 1px solid #e53935; + color: white; +} +.cell-yellow { + background-color: #ffd700; + border: 1px solid #ffc107; + color: #333; } - .cell-default { background-color: #e0e0e0; border: 1px solid #bdbdbd; + color: #333; +} +.upload-demo { + display: inline-block; + margin-right: 10px; +} +.el-upload__tip { + font-size: 12px; + color: #999; + margin-top: 4px; } - + \ No newline at end of file -- Gitee From bd17f8518c8b94b1841aeb36bdfd4f27013b0369 Mon Sep 17 00:00:00 2001 From: Young <6534230+youngf4@user.noreply.gitee.com> Date: Tue, 6 Jan 2026 12:13:16 +0000 Subject: [PATCH 5/6] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20.env?= =?UTF-8?q?.loacl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.loacl | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .env.loacl diff --git a/.env.loacl b/.env.loacl deleted file mode 100644 index d38bd8b..0000000 --- a/.env.loacl +++ /dev/null @@ -1,2 +0,0 @@ -NODE_ENV=development -VUE_APP_URL_PREFIX='/api' \ No newline at end of file -- Gitee From 1f5a5467dac57b2d3d589775566e435905d77dee Mon Sep 17 00:00:00 2001 From: BrendanLi136 Date: Sun, 8 Mar 2026 15:06:50 +0800 Subject: [PATCH 6/6] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=8A=A0=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/file_server_api.ts | 11 ++++ src/views/inspection/inspection_guide.vue | 47 ++++++++++++++++- .../process-route/add_process_detail.vue | 47 ++++++++++++++++- .../process-route/version_management.vue | 50 ++++++++++++++++++- 4 files changed, 149 insertions(+), 6 deletions(-) diff --git a/src/api/file_server_api.ts b/src/api/file_server_api.ts index a2e265e..7253dd6 100644 --- a/src/api/file_server_api.ts +++ b/src/api/file_server_api.ts @@ -119,6 +119,17 @@ export const fileServerAPI = { } }) }, + + // 应用文件版本 + async applyFileVersion(fileId, isApplied) { + // Ensure file server token exists + await this.ensureFileServerToken() + + return erpRequest.post('/file-api/third/chunk/apply', { + fileId, + isApplied: isApplied + }) + }, // Ensure file server token exists async ensureFileServerToken() { diff --git a/src/views/inspection/inspection_guide.vue b/src/views/inspection/inspection_guide.vue index 3535922..22caf34 100644 --- a/src/views/inspection/inspection_guide.vue +++ b/src/views/inspection/inspection_guide.vue @@ -75,6 +75,11 @@ 下载 + + + 关闭 @@ -198,6 +203,16 @@ export default class InspectionGuide extends Vue { uploadFile: any = null uploadType = '' currentRow: any = null + + // 获取当前用户工号 + get currentJobNumber() { + return sessionStorage.getItem('jobNumber') || '' + } + + // 判断是否显示应用版本操作列 + get canShowApplyVersion() { + return this.currentJobNumber === 'BL999' + } async submitForm() { try { @@ -267,7 +282,7 @@ export default class InspectionGuide extends Vue { } // Transform API response to frontend format - this.currentFiles = response.data.data.map((file) => { + let transformedFiles = response.data.data.map((file) => { // Determine file type based on extension let fileType = 'other' const parts = file.fileName.split('.') @@ -284,9 +299,18 @@ export default class InspectionGuide extends Vue { // uploader: file.uploader || '系统', date: file.uploadTime || new Date().toISOString().split('T')[0], url: file.fileUrl || '', - type: fileType + type: fileType, + fileId: file.fileId || file.id || '', + applyVersion: file.applyVersion === '1' || file.applyVersion === 1 ? 1 : 0 } }) + + // For non-BL999 users, only show files where applyVersion is 1 + if (this.currentJobNumber !== 'BL999') { + transformedFiles = transformedFiles.filter(file => file.applyVersion === 1) + } + + this.currentFiles = transformedFiles } catch (error) { console.error('Failed to get file list:', error) // this.$message.warning('获取文件列表失败,显示模拟数据') @@ -322,6 +346,25 @@ export default class InspectionGuide extends Vue { document.body.removeChild(link) } + async handleApplyChange(file) { + // Only allow BL999 user to apply version + if (this.currentJobNumber !== 'BL999') { + this.$message.warning('您没有权限执行此操作') + return + } + + try { + const isAppliedValue = file.applyVersion ? 1 : 0 + await chunkUploadAPI.applyFileVersion(file.fileId, isAppliedValue) + const action = file.applyVersion ? '应用' : '取消应用' + this.$message.success(`${action}文件版本成功`) + } catch (error) { + console.error('Failed to apply file version:', error) + file.applyVersion = file.applyVersion ? 0 : 1 + this.$message.error('操作失败,请重试') + } + } + // Upload methods handleUpload(type, row) { this.uploadType = type diff --git a/src/views/process-route/add_process_detail.vue b/src/views/process-route/add_process_detail.vue index c12efda..d516b0e 100644 --- a/src/views/process-route/add_process_detail.vue +++ b/src/views/process-route/add_process_detail.vue @@ -241,6 +241,11 @@ 下载 + + + @@ -374,6 +379,16 @@ export default class EditProcessDetail extends Vue { type: 'other' } previewUrl = '' + + // 获取当前用户工号 + get currentJobNumber() { + return sessionStorage.getItem('jobNumber') || '' + } + + // 判断是否显示应用版本操作列 + get canShowApplyVersion() { + return this.currentJobNumber === 'BL999' + } canEdit: boolean = false readOnly: boolean = true @@ -1125,7 +1140,7 @@ export default class EditProcessDetail extends Vue { } // Transform API response to frontend format - this.currentFiles = response.data.data.map((file) => { + let transformedFiles = response.data.data.map((file) => { // Determine file type based on extension let fileType = 'other' const parts = file.fileName.split('.') @@ -1142,9 +1157,18 @@ export default class EditProcessDetail extends Vue { // uploader: file.uploader || '系统', date: file.uploadTime || new Date().toISOString().split('T')[0], url: file.fileUrl || '', - type: fileType + type: fileType, + fileId: file.fileId || file.id || '', + applyVersion: file.applyVersion === '1' || file.applyVersion === 1 ? 1 : 0 } }) + + // For non-BL999 users, only show files where applyVersion is 1 + if (this.currentJobNumber !== 'BL999') { + transformedFiles = transformedFiles.filter(file => file.applyVersion === 1) + } + + this.currentFiles = transformedFiles } catch (error) { console.error('Failed to get file list:', error) // this.$message.warning('获取文件列表失败,显示模拟数据') @@ -1180,6 +1204,25 @@ export default class EditProcessDetail extends Vue { document.body.removeChild(link) } + async handleApplyChange(file: any) { + // Only allow BL999 user to apply version + if (this.currentJobNumber !== 'BL999') { + this.$message.warning('您没有权限执行此操作') + return + } + + try { + const isAppliedValue = file.applyVersion ? 1 : 0 + await chunkUploadAPI.applyFileVersion(file.fileId, isAppliedValue) + const action = file.applyVersion ? '应用' : '取消应用' + this.$message.success(`${action}文件版本成功`) + } catch (error) { + console.error('Failed to apply file version:', error) + file.applyVersion = file.applyVersion ? 0 : 1 + this.$message.error('操作失败,请重试') + } + } + formatFileSize(bytes) { if (bytes === 0) return '0 Bytes' const k = 1024 diff --git a/src/views/process-route/version_management.vue b/src/views/process-route/version_management.vue index a2f62a2..1fac723 100644 --- a/src/views/process-route/version_management.vue +++ b/src/views/process-route/version_management.vue @@ -82,6 +82,11 @@ 下载 + + + @@ -152,6 +157,15 @@ const vuexProcess = namespace('TwoProcess') } }) export default class Index extends Vue { + // 获取当前用户工号 + get currentJobNumber() { + return sessionStorage.getItem('jobNumber') || '' + } + + // 判断是否显示应用版本操作列 + get canShowApplyVersion() { + return this.currentJobNumber === 'BL999' + } public $refs!: { addDialog: any deleteProcess: any @@ -340,7 +354,7 @@ export default class Index extends Vue { } // Transform API response to frontend format - this.currentFiles = response.data.data.map((file) => { + let transformedFiles = response.data.data.map((file) => { // Determine file type based on extension let fileType = 'other' const parts = file.fileName.split('.') @@ -357,9 +371,18 @@ export default class Index extends Vue { // uploader: file.uploader || '系统', date: file.uploadTime || new Date().toISOString().split('T')[0], url: file.fileUrl || '', - type: fileType + type: fileType, + fileId: file.fileId || file.id || '', + applyVersion: file.applyVersion === '1' || file.applyVersion === 1 ? 1 : 0 } }) + + // For non-BL999 users, only show files where applyVersion is 1 + if (this.currentJobNumber !== 'BL999') { + transformedFiles = transformedFiles.filter(file => file.applyVersion === 1) + } + + this.currentFiles = transformedFiles } catch (error) { console.error('Failed to get file list:', error) // this.$message.warning('获取文件列表失败,显示模拟数据') @@ -397,6 +420,29 @@ export default class Index extends Vue { document.body.removeChild(link) } + async handleApplyChange(file) { + // Only allow BL999 user to apply version + if (this.currentJobNumber !== 'BL999') { + this.$message.warning('您没有权限执行此操作') + return + } + + try { + const isAppliedValue = file.applyVersion ? 1 : 0 + await chunkUploadAPI.applyFileVersion(file.fileId, isAppliedValue) + const action = file.applyVersion ? '应用' : '取消应用' + this.$message.success(`${action}文件版本成功`) + } catch (error) { + console.error('Failed to apply file version:', error) + file.applyVersion = file.applyVersion ? 0 : 1 + this.$message.error('操作失败,请重试') + } + } + + applyVersion(row) { + + } + // Upload methods handleUpload(type, row) { this.uploadType = type -- Gitee