From 0059b3cb42d9d7f8013bec1ff9186039c4d8cefb Mon Sep 17 00:00:00 2001 From: dhr <2216804034@qq.com> Date: Mon, 15 Sep 2025 16:07:10 +0800 Subject: [PATCH 01/12] 0915 --- .env.development | 4 ++-- .../landTransfer/BusinessLedger/landTransferLedger/index.vue | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.env.development b/.env.development index c17e50e..dd2742e 100644 --- a/.env.development +++ b/.env.development @@ -11,11 +11,11 @@ VITE_APP_ENV = 'development' # 李陈杰 209 # VITE_APP_BASE_API = 'http://192.168.110.209:8899' # 曾涛 -VITE_APP_BASE_API = 'http://192.168.110.149:8899' +VITE_APP_BASE_API = 'http://192.168.110.210:8899' # 罗成 # VITE_APP_BASE_API = 'http://192.168.110.188:8899' # 朱银 -VITE_APP_BASE_API = 'http://192.168.110.149:8899' +# VITE_APP_BASE_API = 'http://192.168.110.149:8899' #曾涛 # VITE_APP_BASE_API = 'http://192.168.110.171:8899' # 屈展航 diff --git a/src/views/project/landTransfer/BusinessLedger/landTransferLedger/index.vue b/src/views/project/landTransfer/BusinessLedger/landTransferLedger/index.vue index 6fa7411..a68a458 100644 --- a/src/views/project/landTransfer/BusinessLedger/landTransferLedger/index.vue +++ b/src/views/project/landTransfer/BusinessLedger/landTransferLedger/index.vue @@ -22,7 +22,7 @@
租金 - {{ proxy.formatPrice(detailInfo.rentSum) / 1000 }} 万元 + {{ proxy.formatPrice(detailInfo.rentSum) / 10000 }} 万元
From 91162f1dc4321c3f73339edbe77e1d8c6000228e Mon Sep 17 00:00:00 2001 From: dhr <2216804034@qq.com> Date: Mon, 15 Sep 2025 19:30:07 +0800 Subject: [PATCH 02/12] 0915 --- .env.development | 2 +- src/views/dhr_demo/baoxiuguanli.vue | 17 +++++++++++++--- src/views/dhr_demo/qiangxiuguanli.vue | 20 ++++++++++++++----- src/views/dhr_demo/shiyanrenwu.vue | 15 +++++++++----- src/views/dhr_demo/xunjianrenwu.vue | 8 ++++++-- .../landTransferLedger/index.vue | 8 +++++++- 6 files changed, 53 insertions(+), 17 deletions(-) diff --git a/.env.development b/.env.development index dd2742e..6f45dfa 100644 --- a/.env.development +++ b/.env.development @@ -11,7 +11,7 @@ VITE_APP_ENV = 'development' # 李陈杰 209 # VITE_APP_BASE_API = 'http://192.168.110.209:8899' # 曾涛 -VITE_APP_BASE_API = 'http://192.168.110.210:8899' +VITE_APP_BASE_API = 'http://192.168.110.149:8899' # 罗成 # VITE_APP_BASE_API = 'http://192.168.110.188:8899' # 朱银 diff --git a/src/views/dhr_demo/baoxiuguanli.vue b/src/views/dhr_demo/baoxiuguanli.vue index f2c0165..f093912 100644 --- a/src/views/dhr_demo/baoxiuguanli.vue +++ b/src/views/dhr_demo/baoxiuguanli.vue @@ -95,8 +95,8 @@
- 详情 - + 详情 + {{ task.actionText }}
@@ -853,7 +853,18 @@ const handleInspection7 = () => { align-items: center; padding-top: 12px; border-top: 1px solid #f0f2f5; - margin-top: 12px; + position: absolute; + bottom: 16px; + right: 16px; + left: 16px; + background-color: #fff; + padding: 12px 0 0 0; + z-index: 10; +} + +.task-actions .el-button { + border-radius: 16px; + padding: 6px 16px; } .task-card::before { diff --git a/src/views/dhr_demo/qiangxiuguanli.vue b/src/views/dhr_demo/qiangxiuguanli.vue index e4c06f4..c0ee4c8 100644 --- a/src/views/dhr_demo/qiangxiuguanli.vue +++ b/src/views/dhr_demo/qiangxiuguanli.vue @@ -112,8 +112,8 @@
- 详情 - + 详情 + {{ task.actionText }}
@@ -701,10 +701,20 @@ const handleInspection7 = () => { display: flex; justify-content: flex-end; align-items: center; - padding-top: 16px; + padding-top: 12px; border-top: 1px solid #f0f2f5; - margin-top: auto; /* 自动推到最底部 */ - gap: 8px; + position: absolute; + bottom: 16px; + right: 16px; + left: 16px; + background-color: #fff; + padding: 12px 0 0 0; + z-index: 10; +} + +.task-actions .el-button { + border-radius: 16px; + padding: 6px 16px; } .action-btn { diff --git a/src/views/dhr_demo/shiyanrenwu.vue b/src/views/dhr_demo/shiyanrenwu.vue index b4787c0..1dbbd7a 100644 --- a/src/views/dhr_demo/shiyanrenwu.vue +++ b/src/views/dhr_demo/shiyanrenwu.vue @@ -106,8 +106,8 @@
- 详情 - + 详情 + {{ task.actionText }}
@@ -564,7 +564,7 @@ const handleInspection7 = () => { .task-card { background-color: #fff; - border-radius: 8px; + border-radius: 16px; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05); padding: 16px 16px 60px 16px; /* 底部留出更多空间给按钮 */ transition: box-shadow 0.2s ease; @@ -588,6 +588,11 @@ const handleInspection7 = () => { z-index: 10; } +.task-actions .el-button { + border-radius: 16px; + padding: 6px 16px; +} + .task-card::before { content: ''; position: absolute; @@ -635,8 +640,8 @@ const handleInspection7 = () => { } .task-status { - padding: 4px 10px; - border-radius: 6px; + padding: 4px 12px; + border-radius: 16px; font-size: 12px; font-weight: 500; border: 1px solid transparent; diff --git a/src/views/dhr_demo/xunjianrenwu.vue b/src/views/dhr_demo/xunjianrenwu.vue index f804f2b..c4952c4 100644 --- a/src/views/dhr_demo/xunjianrenwu.vue +++ b/src/views/dhr_demo/xunjianrenwu.vue @@ -106,8 +106,8 @@
- 详情 - + 详情 + {{ task.actionText }}
@@ -588,6 +588,10 @@ const handleInspection7 = () => { z-index: 10; } +.task-actions .el-button { + border-radius: 16px; + padding: 6px 16px; +} .task-card::before { content: ''; position: absolute; diff --git a/src/views/project/landTransfer/BusinessLedger/landTransferLedger/index.vue b/src/views/project/landTransfer/BusinessLedger/landTransferLedger/index.vue index a68a458..a5552f2 100644 --- a/src/views/project/landTransfer/BusinessLedger/landTransferLedger/index.vue +++ b/src/views/project/landTransfer/BusinessLedger/landTransferLedger/index.vue @@ -22,7 +22,13 @@
租金 - {{ proxy.formatPrice(detailInfo.rentSum) / 10000 }} 万元 + {{ + detailInfo.rentSum && !isNaN(detailInfo.rentSum) + ? detailInfo.rentSum >= 10000 + ? proxy.formatPrice((detailInfo.rentSum / 10000).toFixed(2)) + ' 万元' + : proxy.formatPrice(detailInfo.rentSum) + ' 元' + : '0.00 元' + }}
From cdf5dfcdaea2874e6023dbe5c05898eb4dfa07e2 Mon Sep 17 00:00:00 2001 From: dhr <2216804034@qq.com> Date: Mon, 15 Sep 2025 20:02:32 +0800 Subject: [PATCH 03/12] 0915 --- src/views/dhr_demo/xunjianjihua.vue | 339 ++++++++++++++++++++++------ 1 file changed, 274 insertions(+), 65 deletions(-) diff --git a/src/views/dhr_demo/xunjianjihua.vue b/src/views/dhr_demo/xunjianjihua.vue index 662bc78..f488edf 100644 --- a/src/views/dhr_demo/xunjianjihua.vue +++ b/src/views/dhr_demo/xunjianjihua.vue @@ -55,7 +55,7 @@ >
- 搜索 + 搜索
@@ -97,19 +97,19 @@

本月完成巡检

-

42

+

{{ completedInspections }}

发现问题数

-

7

+

{{ totalProblems }}

已解决问题

-

5

+

{{ solvedProblems }}

平均完成时间

-

45分钟

+

{{ avgCompletionTime }}

@@ -117,54 +117,87 @@
- +
-

本月完成巡检

-
- +

进度指标对比

+
+ - - + + + + + + - + + - + +
-

已解决问题

-

72%

+
+
+

平均完成度

+

+ {{ averageRate.toFixed(1) }}% +

+
+
+ -
+
-
- 已解决 +
+ 完成率 {{ completionRate }}%
-
- 未解决 +
+ 解决率 {{ resolutionRate }}% +
+
+
+ 及时率 {{ timelinessRate }}%
@@ -175,28 +208,28 @@
完成率 - 68% + {{ completionRate }}%
-
-
+
+
解决率 - 72% + {{ resolutionRate }}%
-
-
+
+
及时率 - 60% + {{ timelinessRate }}%
-
-
+
+
@@ -212,46 +245,58 @@
温度异常率 - 85% + {{ problemTypes.temperature }}%
-
-
+
+
内存使用率 - 62% + {{ problemTypes.memory }}%
-
-
+
+
CPU负载 - 45% + {{ problemTypes.cpu }}%
-
-
+
+
响应时间 - 30% + {{ problemTypes.responseTime }}%
-
-
+
+
磁盘空间状态 - 15% + {{ problemTypes.diskSpace }}%
-
-
+
+
@@ -271,7 +316,7 @@
-
+

数据库性能巡检

正常 @@ -308,7 +353,7 @@
-
+

生产服务器日常巡检

需关注 @@ -352,7 +397,7 @@
-
+

网络设备安全巡检

有问题 @@ -396,7 +441,7 @@ ++ ++ +diff --git a/src/components/uploadImg/index.vue b/src/components/uploadImg/index.vue +new file mode 100644 +index 0000000..ee5f100 +--- /dev/null ++++ b/src/components/uploadImg/index.vue +@@ -0,0 +1,244 @@ ++ ++ ++ ++ ++ +diff --git a/src/main.ts b/src/main.ts +index 8197ba2..94ff1c3 100644 +--- a/src/main.ts ++++ b/src/main.ts +@@ -55,12 +55,14 @@ setLocal('host', '121.37.237.116'); + setLocal('rtmpPort', '28451'); + setLocal('rtcPort', '28453'); + setLocal('dockSocketUrl', 'ws://58.17.134.85:9512/websocket'); ++window['$HOSTSRC'] = 'ws://58.17.134.85:8920/ws'; + + // 修改 el-dialog 默认点击遮照为不关闭 + /*import { ElDialog } from 'element-plus'; + ElDialog.props.closeOnClickModal.default = false;*/ + // **main.js** + import { vue3ScrollSeamless } from 'vue3-scroll-seamless'; ++import uploader from 'vue-simple-uploader'; + import bus from './utils/bus'; + import $message from '@/plugins/modal'; + +@@ -74,6 +76,8 @@ app.use(print); + app.use(i18n); + app.use(VXETable); + app.use(plugins); ++app.use(uploader); ++ + app.use(bus); + app.component('vue3ScrollSeamless', vue3ScrollSeamless); + // 自定义指令 +diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts +index 7efcf2d..4678281 100644 +--- a/src/store/modules/permission.ts ++++ b/src/store/modules/permission.ts +@@ -45,7 +45,9 @@ export const usePermissionStore = defineStore('permission', () => { + sidebarRouters.value = routes; + }; + const generateRoutes = async (): Promise => { +- const res = await getRouters(useUserStoreHook().selectedProject?.id || '0'); ++ const id = useUserStoreHook().selectedProject ? useUserStoreHook().selectedProject.id : '0'; ++ console.log('🚀 ~ generateRoutes ~ useUserStoreHook().selectedProject?.id:', id); ++ const res = await getRouters(id); + const { data } = res; + const sdata = JSON.parse(JSON.stringify(data)); + const rdata = JSON.parse(JSON.stringify(data)); +diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts +index e04a9f5..00081bc 100644 +--- a/src/store/modules/user.ts ++++ b/src/store/modules/user.ts +@@ -44,9 +44,9 @@ export const useUserStore = defineStore('user', () => { + const permissionList = ref>([]); // 用户所有权限列表 + const roleList = ref>([]); // 用户所有角色列表 + +- const projects = ref>([]); ++ const projects = ref>([]); + // 从localStorage获取缓存的项目,如果没有则默认为null +- const selectedProject = ref<{ id: string; name: string } | null>(getSelectedProjectFromStorage()); ++ const selectedProject = ref<{ id: string; name: string; goId: string } | null>(getSelectedProjectFromStorage()); + const ProjectTeamList = ref(getProjectTeamListFromStorage()); + + /** +@@ -72,7 +72,8 @@ export const useUserStore = defineStore('user', () => { + if (projectRes?.data) { + const projectList = projectRes.data.map((p) => ({ + id: p.projectId, +- name: p.projectName || '未知项目' ++ name: p.projectName || '未知项目', ++ goId: p.goId + })); + setProjects(projectList); + // 如果有缓存的选中项目,且该项目在当前项目列表中存在,则使用缓存的项目 +@@ -144,6 +145,7 @@ export const useUserStore = defineStore('user', () => { + roles.value = []; + permissions.value = []; + removeToken(); ++ $cache.local.remove('goToken'); // 清除Go服务Token缓存 + // 清除项目缓存 + $cache.local.remove('selectedProject'); + $cache.local.remove('ProjectTeamList'); +@@ -153,11 +155,12 @@ export const useUserStore = defineStore('user', () => { + avatar.value = value; + }; + +- const setProjects = (projectList: Array<{ id: string; name: string }>) => { ++ const setProjects = (projectList: Array<{ id: string; name: string; goId: string }>) => { + projects.value = projectList; + }; + +- const setSelectedProject = (project: { id: string; name: string }) => { ++ const setSelectedProject = (project: { id: string; name: string; goId: string }) => { ++ console.log('🚀 ~ setSelectedProject ~ project:', project); + selectedProject.value = project; + saveSelectedProjectToStorage(project); + }; +diff --git a/src/utils/auth.ts b/src/utils/auth.ts +index 0b21b0b..33152c7 100644 +--- a/src/utils/auth.ts ++++ b/src/utils/auth.ts +@@ -10,6 +10,10 @@ export const setToken = (access_token: string) => (tokenStorage.value = access_t + + export const removeToken = () => (tokenStorage.value = null); + ++export const getGoToken = () => { ++ return getLocal('goToken'); ++}; ++ + export const getDockSocketUrl = () => { + return getLocal('dockSocketUrl'); + }; +diff --git a/src/utils/exportDataToExcel.js b/src/utils/exportDataToExcel.js +new file mode 100644 +index 0000000..50ae697 +--- /dev/null ++++ b/src/utils/exportDataToExcel.js +@@ -0,0 +1,146 @@ ++// 封装exceljs ++import ExcelJS from 'exceljs'; ++import FileSaver from 'file-saver'; ++/** ++ * 导出数据到Excel方法 ++ * @param {Array[Object]} config.data 表格数据 ++ * @param {Array[String]} config.fields 字段列表 ++ * @param {Array[String]} config.headers excel表头列表[[]],可以是多级表头[['A1','B1'],['A2','B2']] ++ * @param {Array[Object]} config.merges 需要合并的单元格,需要考虑表头的行数[{row:1, col:1, rowspan: 1, colspan: 2}] ++ * @param {Array[Object]} config.attrs 单元格样式配置 ++ * @param {Array[Object]} config.views 工作表视图配置 ++ * @param {Array[Number]} config.columnsWidth 每个字段列对应的宽度 ++ * @param {Object} config.protect 工作表保护【此配置会保护全表,一般推荐只针对单元格进行保护配置】 ++ * @param {String} config.sheetName 工作表名称,默认从sheet1开始 ++ * @param {String} fileName excel文件名称 ++ */ ++export function exportDataToExcel(config, fileName) { ++ if (!config) return; ++ const options = { ++ fileName: fileName || `导出excel文件【${Date.now()}】.xlsx`, ++ worksheets: [], ++ }; ++ if (!Array.isArray(config)) { ++ config = [config]; ++ } ++ config.forEach((item) => { ++ // 深拷贝data【JSON.stringify有缺陷,可自行换成_.cloneDeep】 ++ const data = JSON.parse(JSON.stringify(item.data)); ++ const results = data.map((obj) => { ++ return item.fields.map((key) => { ++ return obj[key]; ++ }); ++ }); ++ // 生成完整excel数据 ++ let excelData = []; ++ excelData = excelData.concat(item.headers).concat(results); ++ // 单元格合并处理【excel数据的第一行/列是从1开始】 ++ let excelMerges = []; ++ excelMerges = item.merges.map((m) => { ++ return [m.row + 1, m.col + 1, m.row + m.rowspan, m.col + m.colspan]; ++ }); ++ // 单元格配置处理【excel数据的第一行/列是从1开始】 ++ let excelAttrs = []; ++ excelAttrs = item.attrs.map((attr) => { ++ attr.rowStart += 1; ++ attr.rowEnd += 1; ++ attr.colStart += 1; ++ attr.colEnd += 1; ++ return attr; ++ }); ++ options.worksheets.push({ ++ data: excelData, ++ merges: excelMerges, ++ attrs: excelAttrs, ++ views: item.views, ++ columnsWidth: item.columnsWidth, ++ protect: item.protect, ++ sheetName: item.sheetName, ++ }); ++ }); ++ createExcel(options); ++} ++// 创建Excel文件方法 ++async function createExcel(options) { ++ if (!options.worksheets.length) return; ++ // 创建工作簿 ++ const workbook = new ExcelJS.Workbook(); ++ for (let i = 0; i < options.worksheets.length; i++) { ++ const sheetOption = options.worksheets[i]; ++ // 创建工作表 ++ const sheet = workbook.addWorksheet(sheetOption.sheetName || 'sheet' + (i + 1)); ++ // 添加数据行 ++ sheet.addRows(sheetOption.data); ++ // 配置视图 ++ sheet.views = sheetOption.views; ++ // 单元格合并处理【开始行,开始列,结束行,结束列】 ++ if (sheetOption.merges) { ++ sheetOption.merges.forEach((item) => { ++ sheet.mergeCells(item); ++ }); ++ } ++ // 工作表保护 ++ if (sheetOption.protect) { ++ const res = await sheet.protect(sheetOption.protect.password, sheetOption.protect.options); ++ } ++ // 单元格样式处理 ++ if (sheetOption.attrs.length) { ++ sheetOption.attrs.forEach((item) => { ++ const attr = item.attr || {}; ++ // 获取开始行-结束行; 开始列-结束列 ++ const rowStart = item.rowStart; ++ const rowEnd = item.rowEnd; ++ const colStart = item.colStart; ++ const colEnd = item.colEnd; ++ if (rowStart) { ++ // 设置行 ++ for (let r = rowStart; r <= rowEnd; r++) { ++ // 获取当前行 ++ const row = sheet.getRow(r); ++ if (colStart) { ++ // 列设置 ++ for (let c = colStart; c <= colEnd; c++) { ++ // 获取当前单元格 ++ const cell = row.getCell(c); ++ Object.keys(attr).forEach((key) => { ++ // 给当前单元格设置定义的样式 ++ cell[key] = attr[key]; ++ }); ++ } ++ } else { ++ // 未设置列,整行设置【大纲级别】 ++ Object.keys(attr).forEach((key) => { ++ row[key] = attr[key]; ++ }); ++ } ++ } ++ } else if (colStart) { ++ // 未设置行,只设置了列 ++ for (let c = colStart; c <= colEnd; c++) { ++ // 获取当前列,整列设置【大纲级别】 ++ const column = sheet.getColumn(c); ++ Object.keys(attr).forEach((key) => { ++ column[key] = attr[key]; ++ }); ++ } ++ } else { ++ // 没有设置具体的行列,则为整表设置 ++ Object.keys(attr).forEach((key) => { ++ sheet[key] = attr[key]; ++ }); ++ } ++ }); ++ } ++ // 列宽设置 ++ if (sheetOption.columnsWidth) { ++ for (let i = 0; i < sheet.columns.length; i++) { ++ sheet.columns[i].width = sheetOption.columnsWidth[i]; ++ } ++ } ++ } ++ // 生成excel文件 ++ workbook.xlsx.writeBuffer().then((buffer) => { ++ // application/octet-stream 二进制数据 ++ FileSaver.saveAs(new Blob([buffer], { type: 'application/octet-stream' }), options.fileName); ++ }); ++} +diff --git a/src/utils/exportExcel.ts b/src/utils/exportExcel.ts +new file mode 100644 +index 0000000..ecd7a74 +--- /dev/null ++++ b/src/utils/exportExcel.ts +@@ -0,0 +1,212 @@ ++import { exportSalary } from '@/api/project/projectTeam'; ++import { exportDataToExcel } from '@/utils/exportDataToExcel.js'; ++ ++export function useExcelExport() { ++ // 数据整合函数 ++ const exportConfig = (obj, proxy, times) => { ++ // 如果导出前要处理数据,需要深克隆一份表格数据,然后进行处理 ++ let time = proxy.parseTime(new Date(times), '{y}年{m}月'); // 当前年月 ++ let header1 = ['建筑施工企业现场人员考勤表(' + time + ')']; ++ let projectName = '项目部名称:' + obj.projectName; ++ let teamName = '班组类别:' + obj.teamName; ++ let header2 = []; ++ let header3 = [projectName + ' ' + teamName]; ++ const header = ['序号', '姓名/日期', '身份证号']; ++ let columnsWidth = [6, 10, 26]; // 表格宽度 ++ let obj1 = { index: '', name: '', identity_card: '' }; ++ let fields = ['index', 'row', 'identity_card']; ++ ++ // 计算当前月天数 ++ let years = times.split('-')[0]; ++ let month = times.split('-')[1]; ++ let listLength = new Date(years, month, 0).getDate(); ++ ++ for (let index = 0; index < listLength; index++) { ++ obj1['day' + index] = ''; ++ fields.push('day' + index); ++ header.push(index + 1); ++ columnsWidth.push(4); ++ } ++ ++ header.push('合计'); ++ fields.push('sum'); ++ header.push('是否离场'); ++ fields.push('type'); ++ header.push('签字'); ++ fields.push('sign'); ++ ++ // 上方共用 ++ let data = []; ++ if (!(obj.team && obj.team.length)) return; ++ ++ obj.team.forEach((item, index) => { ++ let obj = { row: '', index: '', identity_card: '' }; ++ ++ for (let key in item.attendance) { ++ let j = parseInt(key.split('-')[2]) - 1; ++ obj['day' + j] = item.attendance[key]; ++ } ++ ++ obj.row = item.row; ++ obj.index = index + 1; ++ obj.identity_card = item.identity_card; ++ ++ let start = ''; // 从表格那一列哪一行开始 ++ let end = ''; // 从表格那一列哪一行结束 ++ let cols = 5 + index; // 行数 ++ start = 'D' + cols; ++ ++ // 判断当月天数 获取表格中最后一天的列标识 ++ if (listLength == 28) { ++ end = 'AE' + cols; ++ } else if (listLength == 29) { ++ end = 'AF' + cols; ++ } else if (listLength == 30) { ++ end = 'AG' + cols; ++ } else { ++ end = 'AH' + cols; ++ } ++ ++ obj.sum = { formula: 'SUM(' + start + ':' + end + ')', result: 0 }; ++ obj.sign = ''; ++ obj.type = item.type ? '离场' : '未离场'; ++ data.push(obj); ++ }); ++ ++ const merges = [ ++ // 单元格合并 ++ { row: 0, col: 0, rowspan: 1, colspan: listLength + 5 }, ++ { row: 2, col: 0, rowspan: 1, colspan: listLength + 5 }, ++ { row: obj.team.length + 5, col: 0, rowspan: 1, colspan: 3 }, ++ { row: obj.team.length + 5, col: 3, rowspan: 1, colspan: 10 }, ++ { row: obj.team.length + 5, col: 13, rowspan: 1, colspan: 10 }, ++ { row: obj.team.length + 5, col: 23, rowspan: 1, colspan: 10 } ++ ]; ++ ++ data.push({}); ++ // 表格尾部标题 ++ data.push({ ++ index: '制表人:', ++ day0: '班组负责人', ++ day10: '项目负责人', ++ day20: '制表日期' ++ }); ++ data.push({ ++ index: '注:', ++ row: '1、本考勤表必须按照每日实际工时进行填写;' ++ }); ++ data.push({ ++ row: '2、本考勤表作为工资计发的重要依据。' ++ }); ++ ++ const config = { ++ data, ++ fields, ++ headers: [header1, header2, header3, header], ++ merges, ++ attrs: [], ++ view: [], ++ columnsWidth, ++ sheetName: obj.teamName ++ }; ++ ++ // 设置全表单元格边框,居中布局 ++ config.attrs.push({ ++ rowStart: 3, ++ rowEnd: config.data.length - 1, ++ colStart: 0, ++ colEnd: config.fields.length - 1, ++ attr: { ++ alignment: { vertical: 'middle', horizontal: 'center' }, ++ border: { ++ top: { style: 'thin' }, ++ left: { style: 'thin' }, ++ bottom: { style: 'thin' }, ++ right: { style: 'thin' } ++ } ++ } ++ }); ++ ++ // 设置表头字体加粗 ++ config.attrs.push({ ++ rowStart: 0, ++ rowEnd: 0, ++ colStart: 0, ++ colEnd: config.fields.length - 1, ++ attr: { ++ alignment: { vertical: 'middle', horizontal: 'center' }, ++ font: { ++ bold: true, ++ size: '16' ++ } ++ } ++ }); ++ ++ config.attrs.push({ ++ rowStart: 2, ++ rowEnd: 2, ++ colStart: 0, ++ colEnd: config.fields.length - 1, ++ attr: { ++ alignment: { vertical: 'middle', horizontal: 'center' } ++ } ++ }); ++ ++ return config; ++ }; ++ ++ // 导出函数 ++ const exportExcel = async (obj, proxy, name = undefined) => { ++ try { ++ const res = await exportSalary(obj); ++ ++ if (res.code === 0 && res.data.AttendanceAllOne) { ++ let config = []; ++ let AttendanceAllOne = res.data.AttendanceAllOne; ++ ++ // 处理每个表格 ++ AttendanceAllOne.forEach((item) => { ++ let datas = exportConfig(item, proxy, obj.years); ++ if (datas) { ++ config.push(datas); ++ } ++ }); ++ ++ // 获取项目名 ++ let projectName = ''; ++ if (name) { ++ projectName = res.data.AttendanceAllOne[0].projectName + '-' + name; ++ } else { ++ projectName = res.data.AttendanceAllOne[0].projectName; ++ } ++ ++ let year = obj.years.split('-')[0]; ++ let month = obj.years.split('-')[1]; ++ ++ // 导出Excel ++ exportDataToExcel(config, `${projectName}-${year}年${month}月考勤表.xlsx`); ++ } else if (res.code === 0) { ++ ElMessage({ ++ message: '暂无考勤数据', ++ type: 'warning' ++ }); ++ } else { ++ ElMessage({ ++ message: res.message || '导出失败', ++ type: 'error' ++ }); ++ } ++ } catch (error) { ++ ElMessage({ ++ message: '导出过程出错', ++ type: 'error' ++ }); ++ console.error('Excel导出错误:', error); ++ } ++ }; ++ ++ return { ++ exportConfig, ++ exportExcel ++ }; ++} +diff --git a/src/utils/projectTeam.ts b/src/utils/projectTeam.ts +index c0c8d23..37cf7fb 100644 +--- a/src/utils/projectTeam.ts ++++ b/src/utils/projectTeam.ts +@@ -7,18 +7,18 @@ export const getProjectTeam = async () => { + const isPermission = useUserStore().permissions.some((item) => item == 'project:team:list'); + if (!isPermission && useUserStore().permissions[0] != '*:*:*') return; + +- const { id } = $cache.local.getJSON('selectedProject'); ++ const { goId } = $cache.local.getJSON('selectedProject'); + const res = await listProjectTeam({ + pageNum: 1, + pageSize: 20, + orderByColumn: 'createTime', + isAsc: 'desc', +- projectId: id ++ projectId: goId + }); + +- const list = res.rows.map((projectTeam: ProjectTeamVO) => ({ ++ const list = res.data.list.map((projectTeam: ProjectTeamVO) => ({ + value: projectTeam.id, +- label: projectTeam.teamName ++ label: projectTeam.name + })); + $cache.local.setJSON('ProjectTeamList', list); + }; +diff --git a/src/utils/request-go.ts b/src/utils/request-go.ts +new file mode 100644 +index 0000000..2eeaa5a +--- /dev/null ++++ b/src/utils/request-go.ts +@@ -0,0 +1,271 @@ ++import $cache from '@/plugins/cache'; ++import useUserStore from '@/store/modules/user'; ++import request from '@/utils/request'; ++import axios from 'axios'; ++import sign from '@/utils/sign.js'; ++import CryptoJS from 'crypto-js'; ++/** ++ * 包装 request 请求,统一使用 Go 服务地址作为 baseURL ++ * @param config 原始请求配置 ++ */ ++ ++const BASE_GO_URL = import.meta.env.VITE_APP_BASE_API_GO; ++ ++interface RequestGo extends Function { ++ (config: any): Promise; ++ download?: (url: string, params: any, filename: string) => void; ++} ++ ++// 加密密钥 ++const corySecretKey = 'happyCoryOrTieHanHan202410151415'; ++ ++// 配置新建一个 axios 实例 ++const service = axios.create({ ++ baseURL: BASE_GO_URL as any, ++ timeout: 120000, ++ headers: { 'Content-Type': 'application/json' } ++}); ++ ++// 不需要修改项目id的接口数组 ++const whiteUrl = [ ++ '/api/wxApplet/wxApplet/sysProjectTeam/list', ++ '/api/wxApplet/wxApplet/sysProjectTeam/add', ++ '/api/wxApplet/wxApplet/sysProjectTeam/edit', ++ '/api/v1/test/testFollowInfo/add', ++ '/api/wxApplet/wxApplet/busConstructionUser/changePay', ++ // 获取项目资料文件夹 ++ '/api/v1/system/documentData/treeStructureData', ++ '/api/v1/system/busConstructionUser/exportSalary', ++ '/api/v1/system/busSalaryDetails/list', ++ '/api/v1/system/ys7Devices/add', ++ '/api/v1/system/ys7Devices/edit', ++ '/api/v1/system/subProject/add', ++ '/api/v1/system/subProject/edit', ++ '/api/v1/system/subProject/list', ++ '/api/v1/system/workStatus/getTree', ++ '/api/v1/system/sysProjectIntroduce/list', ++ '/api/v1/system/sysProjectIntroduce/add', ++ '/api/v1/system/sysProjectIntroduce/edit', ++ '/video/hat/manage/api/v1/video/device/list', ++ '/video/hat/manage/api/v1/video/project/bind', ++ '/api/v1/system/notifications/publish', ++ '/api/v1/system/notifications/list', ++ '/api/v1/system/notifications/edit', ++ '/webodm/api/v1/taskCreate', ++ '/webodm/api/v1/taskProcess', ++ '/webodm/api/v1/download', ++ '/api/v1/system/manageTaskRecord/upDataResource', ++ '/api/v1/system/ys7Devices/list', ++ '/api/v1/system/busFolderFile/add', ++ '/api/v1/system/manageTaskRecordResource/voluntarilyReq', ++ '/api/v1/system/busAttendanceMachine/edit', ++ '/api/v1/system/qianqiFangzhen/add', ++ '/api/v1/system/qianqiNibianqi/add' ++]; ++ ++const exceptionStr = '/api/v1/test/'; // /api/v1/test/*接口拦截 ++ ++// 添加请求拦截器 ++service.interceptors.request.use( ++ (config: any) => { ++ // 在发送请求之前做些什么 token ++ const token = $cache.local.get('goToken'); ++ if (token) { ++ config.headers = config.headers || {}; ++ (config.headers as any)['Authorization'] = `Bearer ${token}`; ++ } ++ ++ const stores = useUserStore(); ++ if (!whiteUrl.includes(config.url) && !config.url.includes(exceptionStr)) { ++ if (config.params && Reflect.has(config.params, 'projectId')) { ++ config.params.projectId = stores.selectedProject.goId; ++ } ++ // 处理FormData中的projectId ++ if (config.data instanceof FormData && config.data.has('projectId')) { ++ config.data.set('projectId', stores.selectedProject.goId); ++ } ++ } ++ let dataInfoReq = {}; ++ if (config.method === 'get' || config.method === 'delete') { ++ config.params = config.params || {}; ++ dataInfoReq = JSON.parse(JSON.stringify(config.params)); ++ const encryptedParam = encryptAES256(JSON.stringify(dataInfoReq), corySecretKey); ++ if ($cache.local.get('i18n') != null) { ++ config.params = { coryKey: encryptedParam, corySimplifiedToTraditional: $cache.local.get('i18n') }; ++ } else { ++ config.params = { coryKey: encryptedParam }; ++ } ++ } else { ++ // 处理FormData类型 ++ if (config.data instanceof FormData) { ++ // 将FormData转换为普通对象 ++ dataInfoReq = Object.fromEntries(config.data.entries()); ++ // 重新创建一个新的FormData实例 ++ const newFormData = new FormData(); ++ const encryptedData = encryptAES256(JSON.stringify(dataInfoReq), corySecretKey); ++ ++ newFormData.append('coryKey', encryptedData); ++ if ($cache.local.get('i18n') != null) { ++ newFormData.append('corySimplifiedToTraditional', $cache.local.get('i18n')); ++ } ++ ++ // 如果有文件,需要重新添加 ++ for (let [key, value] of config.data.entries()) { ++ if (value instanceof File) { ++ newFormData.append(key, value); ++ } ++ } ++ ++ config.data = newFormData; ++ // 设置Content-Type为undefined,让浏览器自动设置boundary ++ config.headers['Content-Type'] = undefined; ++ } else { ++ dataInfoReq = config.data; ++ const encryptedData = encryptAES256(JSON.stringify(dataInfoReq), corySecretKey); ++ if ($cache.local.get('i18n') != null) { ++ config.data = { coryKey: encryptedData, corySimplifiedToTraditional: $cache.local.get('i18n') }; ++ } else { ++ config.data = { coryKey: encryptedData }; ++ } ++ } ++ } ++ ++ const { timestamp, nonce, sign: signature } = sign(dataInfoReq); ++ config.headers.timestamp = timestamp; ++ config.headers.nonce = nonce; ++ config.headers.sign = signature; ++ ++ return config; ++ }, ++ (error) => { ++ // 对请求错误做些什么 ++ return Promise.reject(error); ++ } ++); ++// 添加响应拦截器 ++service.interceptors.response.use( ++ (response) => { ++ // 对响应数据进行解密操作 ++ try { ++ // 处理特殊情况:data为空值或不需要解密的情况 ++ if (response.data.data === null || response.data.data === '' || response.data.data === undefined) { ++ return response.data; ++ } ++ ++ // 检查响应数据格式 ++ if (typeof response.data.data !== 'string') { ++ // 尝试将非字符串数据转换为字符串 ++ try { ++ response.data.data = JSON.stringify(response.data.data); ++ } catch (convertError) { ++ throw new Error('响应数据格式不正确,无法转换为字符串'); ++ } ++ } ++ // 执行解密 ++ const decryptedData = decryptAES256(response.data.data, corySecretKey); ++ // 正确处理解密后的数据 ++ if (decryptedData && typeof decryptedData === 'object') { ++ // 保持response.data的结构不变,只替换data字段的内容 ++ response.data = { ++ ...response.data, ++ data: decryptedData ++ }; ++ } else { ++ // 如果解密后的数据不是对象,可能需要特殊处理 ++ response.data.data = decryptedData; ++ } ++ if (response.data.code !== 0) { ++ ElMessage.error(response.data.message); ++ } ++ return response.data; ++ } catch (decryptError) { ++ // 提供更友好的错误信息 ++ if (decryptError.message.includes('无效的Base64格式')) { ++ ElMessage.error('数据格式错误:接收到无效的加密数据'); ++ } else { ++ ElMessage.error('数据解密失败,请联系管理员'); ++ } ++ ++ return Promise.reject(decryptError); ++ } ++ }, ++ (error) => { ++ // 对响应错误做点什么 ++ if (error.message.indexOf('timeout') !== -1) { ++ ElMessage.error('网络超时'); ++ } else if (error.message === 'Network Error') { ++ ElMessage.error('网络连接错误'); ++ } else { ++ console.log(error, '网络错误'); ++ ++ if (error.response.data) ElMessage.error(error.response.statusText); ++ else { ++ ElMessage.error('接口路径找不到'); ++ console.log(error, '接口路径找不到'); ++ } ++ } ++ return Promise.reject(error); ++ } ++); ++ ++// 加密函数 ++function encryptAES256(plainText: string, key: string): string | null { ++ try { ++ const parsedKey = CryptoJS.enc.Utf8.parse(key); ++ const iv = CryptoJS.lib.WordArray.random(16); ++ const plainTextWordArray = CryptoJS.enc.Utf8.parse(plainText); ++ const encrypted = CryptoJS.AES.encrypt(plainTextWordArray, parsedKey, { ++ iv: iv, ++ mode: CryptoJS.mode.CBC, ++ padding: CryptoJS.pad.Pkcs7 ++ }); ++ const encryptedData = iv.concat(encrypted.ciphertext); ++ return encryptedData.toString(CryptoJS.enc.Base64); ++ } catch (err) { ++ console.error('Encryption error:', err.message); ++ return null; ++ } ++} ++ ++// 增强的解密函数,处理各种输入情况 ++function decryptAES256(encryptedData: string, key: string): any { ++ // eslint-disable-next-line no-useless-catch ++ try { ++ // 检查输入是否为有效的Base64字符串 ++ if (!/^[A-Za-z0-9+/=]+$/.test(encryptedData)) { ++ // 尝试对非标准Base64字符串进行处理 ++ // 移除可能的前缀 ++ const cleanData = encryptedData.replace(/^data:.*?;base64,/, '').replace(/\s/g, ''); // 移除空格 ++ ++ if (!/^[A-Za-z0-9+/=]+$/.test(cleanData)) { ++ throw new Error('无效的Base64格式'); ++ } ++ ++ return decryptAES256(cleanData, key); ++ } ++ ++ const decodedData = CryptoJS.enc.Base64.parse(encryptedData); ++ const iv = CryptoJS.lib.WordArray.create(decodedData.words.slice(0, 4)); ++ const encryptedText = CryptoJS.lib.WordArray.create(decodedData.words.slice(4)); ++ const parsedKey = CryptoJS.enc.Utf8.parse(key); ++ ++ const decrypted = CryptoJS.AES.decrypt({ ciphertext: encryptedText }, parsedKey, { ++ iv: iv, ++ mode: CryptoJS.mode.CBC, ++ padding: CryptoJS.pad.Pkcs7 ++ }); ++ ++ const decryptedStr = decrypted.toString(CryptoJS.enc.Utf8); ++ ++ // 尝试解析为JSON ++ try { ++ return JSON.parse(decryptedStr); ++ } catch (jsonError) { ++ return decryptedStr; ++ } ++ } catch (err) { ++ throw err; ++ } ++} ++// 导出 axios 实例 ++export default service; +diff --git a/src/utils/request.ts b/src/utils/request.ts +index 66780df..20b51ac 100644 +--- a/src/utils/request.ts ++++ b/src/utils/request.ts +@@ -45,7 +45,7 @@ service.interceptors.request.use( + // 是否需要加密 + const isEncrypt = config.headers?.isEncrypt === 'true'; + +- if (getToken() && !isToken) { ++ if (getToken() && !isToken && !config.headers?.Authorization) { + config.headers['Authorization'] = 'Bearer ' + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改 + } + // get请求映射params参数 +diff --git a/src/utils/sign.js b/src/utils/sign.js +new file mode 100644 +index 0000000..13df2cd +--- /dev/null ++++ b/src/utils/sign.js +@@ -0,0 +1,50 @@ ++import crypto from 'crypto-js'; ++let coyr = 'coyrOrtiehanhan1223202409111457'; ++// 生成 nonce(随机生成一个16位的字符串) ++function generateNonce() { ++ const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; ++ let nonce = ''; ++ for (let i = 0; i < 16; i++) { ++ nonce += chars.charAt(Math.floor(Math.random() * chars.length)); ++ } ++ return nonce; ++} ++// 生成当前时间戳(格式为 yyyyMMddHHmmss) ++function generateTimestamp() { ++ return new Date().getTime(); ++} ++// 生成 MD5 哈希(需要引入第三方库,如 crypto-js) ++function md5Hash(str) { ++ return crypto.MD5(str).toString(); ++} ++ ++// 生成 SHA-256 哈希(需要引入第三方库,如 crypto-js) ++function sha256Hash(str) { ++ return crypto.SHA256(str).toString(); ++} ++// 生成签名 ++function generateSignature(params, timestamp, nonce) { ++ // 加密 ++ let coyr1 = md5Hash(coyr); ++ // 拼接时间戳、nonce 和 secretKey ++ let signStr = coyr1 + timestamp + nonce; ++ // MD5 加密 ++ const md5Str = md5Hash(signStr); ++ // SHA-256 加密 ++ let aaaa = sha256Hash(md5Str); ++ return aaaa; ++} ++function sign(data) { ++ // 生成签名 ++ const timestamp = generateTimestamp(); ++ const nonce = generateNonce(); ++ const sign = generateSignature(data, timestamp, nonce); ++ return { ++ timestamp, ++ nonce, ++ sign, ++ }; ++} ++// 封装 ++ ++export default sign; +diff --git a/src/utils/storage.ts b/src/utils/storage.ts +new file mode 100644 +index 0000000..a983f80 +--- /dev/null ++++ b/src/utils/storage.ts +@@ -0,0 +1,59 @@ ++import Cookies from 'js-cookie'; ++ ++/** ++ * window.localStorage 浏览器永久缓存 ++ * @method set 设置永久缓存 ++ * @method get 获取永久缓存 ++ * @method remove 移除永久缓存 ++ * @method clear 移除全部永久缓存 ++ */ ++export const Local = { ++ // 设置永久缓存 ++ set(key: string, val: any) { ++ window.localStorage.setItem(key, JSON.stringify(val)); ++ }, ++ // 获取永久缓存 ++ get(key: string) { ++ let json: any = window.localStorage.getItem(key); ++ return JSON.parse(json); ++ }, ++ // 移除永久缓存 ++ remove(key: string) { ++ window.localStorage.removeItem(key); ++ }, ++ // 移除全部永久缓存 ++ clear() { ++ window.localStorage.clear(); ++ }, ++}; ++ ++/** ++ * window.sessionStorage 浏览器临时缓存 ++ * @method set 设置临时缓存 ++ * @method get 获取临时缓存 ++ * @method remove 移除临时缓存 ++ * @method clear 移除全部临时缓存 ++ */ ++export const Session = { ++ // 设置临时缓存 ++ set(key: string, val: any) { ++ if (key === 'token') return Cookies.set(key, val); ++ window.sessionStorage.setItem(key, JSON.stringify(val)); ++ }, ++ // 获取临时缓存 ++ get(key: string) { ++ if (key === 'token') return Cookies.get(key); ++ let json: any = window.sessionStorage.getItem(key); ++ return JSON.parse(json); ++ }, ++ // 移除临时缓存 ++ remove(key: string) { ++ if (key === 'token') return Cookies.remove(key); ++ window.sessionStorage.removeItem(key); ++ }, ++ // 移除全部临时缓存 ++ clear() { ++ Cookies.remove('token'); ++ window.sessionStorage.clear(); ++ }, ++}; +diff --git a/src/views/busMachineryDetail/list/component/add.vue b/src/views/busMachineryDetail/list/component/add.vue +new file mode 100644 +index 0000000..69d9f21 +--- /dev/null ++++ b/src/views/busMachineryDetail/list/component/add.vue +@@ -0,0 +1,232 @@ ++ ++ ++ +diff --git a/src/views/busMachineryDetail/list/component/detail.vue b/src/views/busMachineryDetail/list/component/detail.vue +new file mode 100644 +index 0000000..88f631f +--- /dev/null ++++ b/src/views/busMachineryDetail/list/component/detail.vue +@@ -0,0 +1,219 @@ ++ ++ ++ +diff --git a/src/views/busMachineryDetail/list/component/edit.vue b/src/views/busMachineryDetail/list/component/edit.vue +new file mode 100644 +index 0000000..d33816f +--- /dev/null ++++ b/src/views/busMachineryDetail/list/component/edit.vue +@@ -0,0 +1,253 @@ ++ ++ ++ ++ ++ +diff --git a/src/views/busMachineryDetail/list/component/model.ts b/src/views/busMachineryDetail/list/component/model.ts +new file mode 100644 +index 0000000..fd0c0c0 +--- /dev/null ++++ b/src/views/busMachineryDetail/list/component/model.ts +@@ -0,0 +1,55 @@ ++export interface BusMachineryDetailTableColumns { ++ id:number; // 序号 ++ checkoutNumber:string; // 检验证编号 ++ checkoutUnit:string; // 检验单位 ++ checkoutDate:string; // 检定日期/有效期 ++ status:string; // 施工类型状态 ++ entryTime:string; // 入场时间 ++ createdAt:string; // 创建时间 ++ remark:string; // 备注 ++ picture:any[]; // 4张图片,逗号分隔 ++} ++ ++ ++export interface BusMachineryDetailInfoData { ++ id:number|undefined; // 序号 ++ checkoutNumber:string|undefined; // 检验证编号 ++ checkoutUnit:string|undefined; // 检验单位 ++ checkoutDate:string|undefined; // 检定日期/有效期 ++ status:string|undefined; // 施工类型状态 ++ entryTime:string|undefined; // 入场时间 ++ createBy:string|undefined; // 创建者 ++ updateBy:string|undefined; // 更新者 ++ createdAt:string|undefined; // 创建时间 ++ updatedAt:string|undefined; // 更新时间 ++ deletedAt:string|undefined; // 删除时间 ++ remark:string|undefined; // 备注 ++ picture:any[]; // 4张图片,逗号分隔 ++ type: undefined, // 出入场 ++} ++ ++ ++export interface BusMachineryDetailTableDataState { ++ ids:any[]; ++ tableData: { ++ data: Array; ++ total: number; ++ loading: boolean; ++ param: { ++ pageNum: number; ++ pageSize: number; ++ checkoutNumber: string|undefined; ++ status: string|undefined; ++ entryTime: string|undefined; ++ dateRange: string[]; ++ }; ++ }; ++} ++ ++ ++export interface BusMachineryDetailEditState{ ++ loading:boolean; ++ isShowDialog: boolean; ++ formData:BusMachineryDetailInfoData; ++ rules: object; ++} +\ No newline at end of file +diff --git a/src/views/busMachineryDetail/list/index.vue b/src/views/busMachineryDetail/list/index.vue +new file mode 100644 +index 0000000..227c975 +--- /dev/null ++++ b/src/views/busMachineryDetail/list/index.vue +@@ -0,0 +1,339 @@ ++ ++ ++ +diff --git a/src/views/cory/workMessage/index.vue b/src/views/cory/workMessage/index.vue +index 805cdc0..314d417 100644 +--- a/src/views/cory/workMessage/index.vue ++++ b/src/views/cory/workMessage/index.vue +@@ -111,8 +111,7 @@ import { useUserStoreHook } from '@/store/modules/user'; + import type { FormInstance, FormRules } from 'element-plus'; + import Notice from './components/notice.vue'; + import { listContactTypeformtemplate } from '@/api/cory/contactformtemplate'; +-import { addContactnotice, delContactnotice, listContactnotice } from '@/api/cory/contactnotice'; +-import { listProjectTeamForeman } from '@/api/project/projectTeam'; ++import { addContactnotice, delContactnotice, listContactnotice, listProjectTeamForeman } from '@/api/cory/contactnotice'; + import { foremanQuery, ProjectTeamForemanResp } from '@/api/project/projectTeam/types'; + + const { proxy } = getCurrentInstance() as ComponentInternalInstance; +@@ -265,6 +264,7 @@ const getList = async () => { + tableData.value = res.rows; + total.value = res.total || 0; + // 获取项目班组信息 ++ console.log('🚀 ~ getList ~ currentProject.value?.id:', currentProject.value?.id); + const teamRes = await listProjectTeamForeman(currentProject.value?.id); + teamList.value = teamRes.data; + teamOpt.value = teamList.value.map((team: ProjectTeamForemanResp) => ({ +diff --git a/src/views/demo/components/qixiang.vue b/src/views/demo/components/qixiang.vue +index 58629bb..966a713 100644 +--- a/src/views/demo/components/qixiang.vue ++++ b/src/views/demo/components/qixiang.vue +@@ -1,224 +1,218 @@ + + +- ++ +diff --git a/src/views/demo3/components/line2.vue b/src/views/demo3/components/line2.vue +deleted file mode 100644 +index e69de29..0000000 +diff --git a/src/views/design/technicalStandard/component/documentsDeails.vue b/src/views/design/technicalStandard/component/documentsDeails.vue +index 99e9705..9fa82db 100644 +--- a/src/views/design/technicalStandard/component/documentsDeails.vue ++++ b/src/views/design/technicalStandard/component/documentsDeails.vue +@@ -3,8 +3,8 @@ +
+ +
+- +- ++ ++ + +
+
+diff --git a/src/views/design/technicalStandard/component/documentsEdit.vue b/src/views/design/technicalStandard/component/documentsEdit.vue +index 3a0754b..d282d99 100644 +--- a/src/views/design/technicalStandard/component/documentsEdit.vue ++++ b/src/views/design/technicalStandard/component/documentsEdit.vue +@@ -3,8 +3,8 @@ +
+ +
+- +- ++ ++ + +
+
+diff --git a/src/views/enterpriseLarge/digitalizationScreen/components/leftPage.vue b/src/views/enterpriseLarge/digitalizationScreen/components/leftPage.vue +index 6264c41..32112dc 100644 +--- a/src/views/enterpriseLarge/digitalizationScreen/components/leftPage.vue ++++ b/src/views/enterpriseLarge/digitalizationScreen/components/leftPage.vue +@@ -118,21 +118,21 @@ const indicators = ref([ + name: '风电项目', + value: '288.88', + unit: '个', +- iconPath: '/src/assets/images/contract.png' ++ iconPath: '/assets/demo/contract.png' + }, + { + id: '3', + name: '光伏项目总容量', + value: '158.88', + unit: 'MW', +- iconPath: '/src/assets/images/totalCapacity.png' ++ iconPath: '/assets/demo/totalCapacity.png' + }, + { + id: '4', + name: '风电项目总容量', + value: '18', + unit: 'MW', +- iconPath: '/src/assets/images/todayConstruction.png' ++ iconPath: '/assets/demo/todayConstruction.png' + } + ]); + +diff --git a/src/views/enterpriseLarge/digitalizationScreen/components/rightPage.vue b/src/views/enterpriseLarge/digitalizationScreen/components/rightPage.vue +index ad7f90b..f32bc55 100644 +--- a/src/views/enterpriseLarge/digitalizationScreen/components/rightPage.vue ++++ b/src/views/enterpriseLarge/digitalizationScreen/components/rightPage.vue +@@ -107,6 +107,7 @@ const processedDataList = ref([]); + //获取数据 + const getData = async () => { + const res = await projectProgress(); ++ console.log('🚀 ~ getData ~ res:', res); + if (res.code == 200) { + capacityData.value = res.data; + // processedDataList.value = res.data.projectProgressDetailList; +@@ -143,7 +144,7 @@ const initPieChart = () => { + }; + }); + pieOption.series.data = data; +- ++ console.log(data); + // pieOption.graphic[0].style.text = totalPercent.value + '%'; + pieChart = echarts.init(pieChartRef.value, null, { + renderer: 'canvas', +diff --git a/src/views/enterpriseLarge/digitalizationScreen/index.vue b/src/views/enterpriseLarge/digitalizationScreen/index.vue +index fead15c..f7e3a4e 100644 +--- a/src/views/enterpriseLarge/digitalizationScreen/index.vue ++++ b/src/views/enterpriseLarge/digitalizationScreen/index.vue +@@ -31,15 +31,15 @@ const isHideOther = ref(false); + * 切换中心页面全屏 + */ + const handleChangePage = () => { +- if (isFull.value) { +- isFull.value = false; +- setTimeout(() => { +- isHideOther.value = false; +- }, 500); +- } else { +- isFull.value = true; +- isHideOther.value = true; +- } ++ // if (isFull.value) { ++ // isFull.value = false; ++ // setTimeout(() => { ++ // isHideOther.value = false; ++ // }, 500); ++ // } else { ++ // isFull.value = true; ++ // isHideOther.value = true; ++ // } + }; + + +diff --git a/src/views/formalities/formalitiesAreConsolidated/index.vue b/src/views/formalities/formalitiesAreConsolidated/index.vue +index 1b7bdad..952c7d8 100644 +--- a/src/views/formalities/formalitiesAreConsolidated/index.vue ++++ b/src/views/formalities/formalitiesAreConsolidated/index.vue +@@ -95,8 +95,8 @@ + + +
+
+- ++ +
+
+-
+- +-
03-18 15:00
+-
未佩戴安全帽
++
++ ++
{{ parseTime(item.createdAt, '{m}-{d} {h}:{i}') }}
++
{{ item.describe }}
+
+
+
+- ++ +
+
+
+ + +- ++ + + +diff --git a/src/views/machinery/component/detail.vue b/src/views/machinery/component/detail.vue +new file mode 100644 +index 0000000..06e4907 +--- /dev/null ++++ b/src/views/machinery/component/detail.vue +@@ -0,0 +1,156 @@ ++ ++ ++ +diff --git a/src/views/machinery/component/edit.vue b/src/views/machinery/component/edit.vue +new file mode 100644 +index 0000000..9a178d7 +--- /dev/null ++++ b/src/views/machinery/component/edit.vue +@@ -0,0 +1,184 @@ ++ ++ ++ +diff --git a/src/views/machinery/component/model.ts b/src/views/machinery/component/model.ts +new file mode 100644 +index 0000000..f8125fb +--- /dev/null ++++ b/src/views/machinery/component/model.ts +@@ -0,0 +1,59 @@ ++export interface BusMachineryTableColumns { ++ id:number; // 序号 ++ machineryName:string; // 机械名称 ++ machineryNumber:string; // 编号 ++ checkoutNumber:string; // 检验证编号 ++ checkoutUnit:string; // 检验单位 ++ checkoutDate:string; // 检定日期/有效期 ++ status:string; // 施工类型状态 ++ createdAt:string; // 创建时间 ++} ++ ++ ++export interface BusMachineryInfoData { ++ id:number|undefined; // 序号 ++ machineryName:string|undefined; // 机械名称 ++ machineryNumber:string|undefined; // 编号 ++ projectId:number|undefined; // 项目id ++ checkoutNumber:string|undefined; // 检验证编号 ++ checkoutUnit:string|undefined; // 检验单位 ++ checkoutDate:string|undefined; // 检定日期/有效期 ++ status:boolean; // 施工类型状态 ++ createBy:string|undefined; // 创建者 ++ updateBy:string|undefined; // 更新者 ++ createdAt:string|undefined; // 创建时间 ++ updatedAt:string|undefined; // 更新时间 ++ deletedAt:string|undefined; // 删除时间 ++ number:number|undefined; //数量 ++ entryTime: string|undefined; // 进场时间 ++ principal: string|undefined; // 负责人 ++ remark: string|undefined; // 备注 ++} ++ ++ ++export interface BusMachineryTableDataState { ++ ids:any[]; ++ tableData: { ++ data: Array; ++ total: number; ++ loading: boolean; ++ param: { ++ pageNum: number; ++ pageSize: number; ++ id: number|undefined; ++ machineryName: string|undefined; ++ status: string|undefined; ++ createdAt: string|undefined; ++ dateRange: string[]; ++ projectId: undefined, ++ }; ++ }; ++} ++ ++ ++export interface BusMachineryEditState{ ++ loading:boolean; ++ isShowDialog: boolean; ++ formData:BusMachineryInfoData; ++ rules: object; ++} +\ No newline at end of file +diff --git a/src/views/machinery/index.vue b/src/views/machinery/index.vue +index d97b660..20a545b 100644 +--- a/src/views/machinery/index.vue ++++ b/src/views/machinery/index.vue +@@ -1,295 +1,532 @@ + + +- + +diff --git a/src/views/project/reissueCard/index.vue b/src/views/project/reissueCard/index.vue +index 73081b0..dc5c70d 100644 +--- a/src/views/project/reissueCard/index.vue ++++ b/src/views/project/reissueCard/index.vue +@@ -4,30 +4,15 @@ +
+ + +- +- +- +- +- +- +- ++ ++ + + +- +- ++ ++ ++ + + +- +- +- +- +- +- +- +- +- +- +- + + 搜索 + 重置 +@@ -38,75 +23,41 @@ + + + +- ++ + + + +- ++ + +- ++ ++ + + + +- ++ ++ + +- +- +- + + +- +- +- +- +- +- +- --> +- +- ++ ++ + + + +- + + +- +-
+- +- +- 同意 +- 拒绝 +- +- +- +- +- +-
+- +- +-
+ +
+ 补卡申请 +@@ -173,15 +124,13 @@ + + + +diff --git a/src/views/project/salaryExcel/component/detail.vue b/src/views/project/salaryExcel/component/detail.vue +new file mode 100644 +index 0000000..02388d2 +--- /dev/null ++++ b/src/views/project/salaryExcel/component/detail.vue +@@ -0,0 +1,233 @@ ++ ++ ++ +diff --git a/src/views/project/salaryExcel/component/documentsDetail/index.vue b/src/views/project/salaryExcel/component/documentsDetail/index.vue +new file mode 100644 +index 0000000..3a64ee2 +--- /dev/null ++++ b/src/views/project/salaryExcel/component/documentsDetail/index.vue +@@ -0,0 +1,190 @@ ++ ++ ++ +diff --git a/src/views/project/salaryExcel/component/uploadSalary.vue b/src/views/project/salaryExcel/component/uploadSalary.vue +new file mode 100644 +index 0000000..695d8e7 +--- /dev/null ++++ b/src/views/project/salaryExcel/component/uploadSalary.vue +@@ -0,0 +1,167 @@ ++ ++ ++ +diff --git a/src/views/project/salaryExcel/index.vue b/src/views/project/salaryExcel/index.vue +index 3bc4c76..7f784ed 100644 +--- a/src/views/project/salaryExcel/index.vue ++++ b/src/views/project/salaryExcel/index.vue +@@ -43,23 +43,23 @@ + + + +- ++ +
+ + + +diff --git a/src/views/project/subManagementUser/component/ConstructionUserDetail.vue b/src/views/project/subManagementUser/component/ConstructionUserDetail.vue +index 73907f6..596718e 100644 +--- a/src/views/project/subManagementUser/component/ConstructionUserDetail.vue ++++ b/src/views/project/subManagementUser/component/ConstructionUserDetail.vue +@@ -6,7 +6,11 @@ + + + +- ++ + + + +diff --git a/src/views/project/subManagementUser/index.vue b/src/views/project/subManagementUser/index.vue +index ddc5af4..aa34d46 100644 +--- a/src/views/project/subManagementUser/index.vue ++++ b/src/views/project/subManagementUser/index.vue +@@ -517,6 +517,7 @@ const { proxy } = getCurrentInstance() as any; + const { type_of_work, user_sex_type, user_clock_type, user_file_type, user_status_type, wage_measure_unit_type } = toRefs( + proxy?.useDict('type_of_work', 'user_sex_type', 'user_clock_type', 'user_file_type', 'user_status_type', 'wage_measure_unit_type') + ); ++console.log('🚀 ~ user_sex_type:', user_sex_type); + // 获取用户 store + const userStore = useUserStoreHook(); + // 从 store 中获取项目列表和当前选中的项目 +@@ -573,7 +574,7 @@ const initFormData: ConstructionUserForm = { + nickName: undefined, + facePic: undefined, + userName: undefined, +- projectId: currentProject.value?.id, ++ projectId: currentProject.value.id, + contractorId: undefined, + teamId: undefined, + status: undefined, +@@ -610,7 +611,7 @@ const data = reactive>({ + openid: undefined, + nickName: undefined, + userName: undefined, +- projectId: currentProject.value?.id, ++ projectId: currentProject.value.id, + contractorId: undefined, + teamId: undefined, + status: undefined, +@@ -778,7 +779,7 @@ const getContractorList = async () => { + const res = await listContractor({ + pageNum: 1, + pageSize: 20, +- projectId: currentProject.value?.id ++ projectId: currentProject.value.id + }); + contractorOpt.value = res.rows.map((contractor: ContractorVO) => ({ + value: contractor.id, +@@ -904,7 +905,7 @@ const downloadTemplate = async () => { + text: 'Loading', + background: 'rgba(0, 0, 0, 0.7)' + }); +- const res = await dowloadConstructionUserTemplate({ projectId: currentProject.value?.id }); ++ const res = await dowloadConstructionUserTemplate({ projectId: currentProject.value.id }); + loadingInstance.close(); + }; + +@@ -954,7 +955,7 @@ const submitForm = () => { + console.log(valid); + if (valid) { + buttonLoading.value = true; +- form.value.projectId = currentProject.value?.id; ++ form.value.projectId = currentProject.value.id; + if (form.value.id) { + await updateConstructionUser(form.value).finally(() => (buttonLoading.value = false)); + } else { +@@ -975,7 +976,7 @@ const handleJoinBlacklist = async (row?: ConstructionUserVO) => { + await proxy?.$modal.confirm('确认要将该员工加入黑名单吗?').finally(() => (loading.value = false)); + await addConstructionBlacklist({ + userId: row.id, +- projectId: currentProject.value?.id ++ projectId: currentProject.value.id + }); + proxy?.$modal.msgSuccess('加入成功'); + await getList(); +@@ -1049,7 +1050,7 @@ const setSalary = async () => { + const handlePlayCardStatus = async (e) => { + playCardLoding.value = true; + const clock = e ? 1 : 0; +- await updateConstructionUserPlayCardStatus({ projectId: currentProject.value?.id, clock }); ++ await updateConstructionUserPlayCardStatus({ projectId: currentProject.value.id, clock }); + proxy?.$modal.msgSuccess('修改成功'); + getList(); + playCardLoding.value = false; +@@ -1066,7 +1067,7 @@ const handleClockStatus = async (row: ConstructionUserVO) => { + + //监听项目id刷新数据 + const listeningProject = watch( +- () => currentProject.value?.id, ++ () => currentProject.value.id, + (nid, oid) => { + queryParams.value.projectId = nid; + form.value.projectId = nid; +diff --git a/src/views/project/subcontract/index.vue b/src/views/project/subcontract/index.vue +index 28a9c25..292ff57 100644 +--- a/src/views/project/subcontract/index.vue ++++ b/src/views/project/subcontract/index.vue +@@ -231,7 +231,8 @@ const reset = () => { + /** 搜索按钮操作 */ + const handleQuery = () => { + queryParams.value.pageNum = 1; +- if (contractorList.value.length == 1) queryParams.value.contractorId = contractorList.value[0].id; ++ console.log('🚀 ~ handleQuery ~ contractorList.value:', contractorList.value); ++ if (contractorList.value?.length == 1) queryParams.value.contractorId = contractorList.value[0].id; + getList(); + }; + +diff --git a/src/views/project/workWage/index.vue b/src/views/project/workWage/index.vue +index caecbf2..38ccf87 100644 +--- a/src/views/project/workWage/index.vue ++++ b/src/views/project/workWage/index.vue +@@ -4,16 +4,16 @@ +
+ + +- +- ++ ++ + + + +- ++ + + +- +- +- +- +- +- +- ++ + + +- +- +- +- +- +- +- +- ++ ++ + + + + +diff --git a/src/views/safety/safetyLog/component/SafetyLogDetailDialog.vue b/src/views/safety/safetyLog/component/SafetyLogDetailDialog.vue +index 2d57f1e..3646189 100644 +--- a/src/views/safety/safetyLog/component/SafetyLogDetailDialog.vue ++++ b/src/views/safety/safetyLog/component/SafetyLogDetailDialog.vue +@@ -2,70 +2,63 @@ + +

安全日志

+ +- 记录人:{{ safetyLogDetail?.creator?.name }} +- 记录时间:{{ safetyLogDetail?.createTime }} ++ 记录人:{{ safetyLogDetail?.fill }} ++ 记录时间:{{ safetyLogDetail?.createdAt }} + + +- {{ currentProject?.name }} ++ {{ safetyLogDetail?.projectName }} ++ {{ safetyLogDetail?.dateOfOccurrence }} + +- {{ safetyLogDetail?.dateOfOccurrence }} +- +- ++ + 最高:{{ safetyLogDetail?.airTemperatureMax }}(℃) + 最低:{{ safetyLogDetail?.airTemperatureMin }}(℃) + +- +- ++ ++ {{ safetyLogDetail?.climateName }} + +- ++ + {{ safetyLogDetail?.progress }} + +- ++ + {{ safetyLogDetail?.jobContent }} + +- +- {{ safetyLogDetail?.discloseCondition }} ++ ++ {{ safetyLogDetail?.discloseTheFacts }} + +- +- {{ safetyLogDetail?.activityCondition }} ++ ++ {{ safetyLogDetail?.progressOfActivity }} + +- +- {{ safetyLogDetail?.examineCondition }} ++ ++ {{ safetyLogDetail?.examine }} + +- +- {{ safetyLogDetail?.implementCondition }} ++ ++ {{ safetyLogDetail?.implementation }} + +- +- {{ safetyLogDetail?.safetyInspectionCondition }} ++ ++ {{ safetyLogDetail?.safetyInspectionSituation }} + +- {{ safetyLogDetail?.stoppageOrOvertime }} ++ {{ safetyLogDetail?.stoppageOrOvertime }} + +- +- {{ safetyLogDetail?.otherCondition }} ++ ++ {{ safetyLogDetail?.otherRecords }} + +- ++ + +- +- ++ ++ {{ item.name }} ++ + + +- {{ safetyLogDetail?.remark }} +- ++ + +
+ +@@ -88,6 +81,8 @@ import { OssVO } from '@/api/system/oss/types'; + interface Props { + safetyLogId?: string | number; + } ++const BASE_URL = import.meta.env.VITE_APP_BASE_API_GO; ++console.log('🚀 ~ BASE_URL:', BASE_URL); + + const { proxy } = getCurrentInstance() as ComponentInternalInstance; + const { weather_type } = toRefs(proxy?.useDict('weather_type')); +@@ -105,7 +100,7 @@ const fileUrl = ref(''); + const get = async () => { + loading.value = true; + const res = await getSafetyLog(props.safetyLogId); +- if (res.data && res.code === 200) { ++ if (res.data && res.code === 0) { + safetyLogDetail.value = res.data; + if (res.data.fileId) { + const fileRes = await listByIds(res.data.fileId.split(',')); +diff --git a/src/views/safety/safetyLog/index.vue b/src/views/safety/safetyLog/index.vue +index 97b253b..3328c84 100644 +--- a/src/views/safety/safetyLog/index.vue ++++ b/src/views/safety/safetyLog/index.vue +@@ -1,16 +1,11 @@ + +
+- +- +- ++ ++ + + + + + +- ++ +
+ + +- ++ + +- +- ++ + +- +- ++ ++ ++ ++ + +- +- ++ ++ ++ ++ + +- +- +- ++ ++ ++ + + +- +- ++ ++ + +- +- ++ ++ + +- +- ++ ++ + +- +- ++ ++ + +- +- ++ ++ + +- +- ++ ++ + +- +- ++ ++ + +- +- ++ ++ + +- +- ++ ++ + +- +- ++ ++ + + +- ++ + + + + ++ + + + +@@ -148,11 +190,13 @@ import { addSafetyLog, delSafetyLog, getSafetyLog, listSafetyLog, updateSafetyLo + import { SafetyLogForm, SafetyLogQuery, SafetyLogVO } from '@/api/safety/safetyLog/types'; + import { useUserStoreHook } from '@/store/modules/user'; + import { dayjs } from 'element-plus'; ++import { busHseSecurityLogList } from '@/api/project/goUser/index'; + + import SafetyLogDetailDialog from '@/views/safety/safetyLog/component/SafetyLogDetailDialog.vue'; + + const { proxy } = getCurrentInstance() as ComponentInternalInstance; + const { weather_type } = toRefs(proxy?.useDict('weather_type')); ++ + // 获取用户 store + const userStore = useUserStoreHook(); + // 从 store 中获取项目列表和当前选中的项目 +@@ -173,9 +217,10 @@ const dialog = reactive({ + title: '' + }); + +-const initFormData: SafetyLogForm = { ++const initFormData: any = { + id: undefined, +- projectId: currentProject.value?.id, ++ projectId: currentProject.value.goId, ++ file: undefined, + dateOfOccurrence: undefined, + airTemperatureMax: undefined, + airTemperatureMin: undefined, +@@ -198,7 +243,7 @@ const data = reactive>({ + queryParams: { + pageNum: 1, + pageSize: 10, +- projectId: currentProject.value?.id, ++ projectId: currentProject.value.goId, + dateOfOccurrence: undefined, + airTemperatureMax: undefined, + airTemperatureMin: undefined, +@@ -214,8 +259,8 @@ const data = reactive>({ + otherCondition: undefined, + remark: undefined, + creatorName: undefined, +- orderByColumn: "createTime", +- isAsc: "desc", ++ orderByColumn: 'createTime', ++ isAsc: 'desc', + params: {} + }, + rules: { +@@ -229,9 +274,9 @@ const { queryParams, form, rules } = toRefs(data); + /** 查询安全日志列表 */ + const getList = async () => { + loading.value = true; +- const res = await listSafetyLog(queryParams.value); +- safetyLogList.value = res.rows; +- total.value = res.total; ++ const res = await busHseSecurityLogList(queryParams.value); ++ safetyLogList.value = res.data.list; ++ total.value = res.data.total; + loading.value = false; + }; + +@@ -273,32 +318,17 @@ const handleShowDialog = (row?: SafetyLogVO) => { + currentSafetyLogId.value = row.id; + showDetailDialog.value = true; + }; +- +-/** 新增按钮操作 */ +-const handleAdd = () => { +- reset(); +- dialog.visible = true; +- dialog.title = '添加安全日志'; +-}; +- +-/** 修改按钮操作 */ +-const handleUpdate = async (row?: SafetyLogVO) => { +- reset(); +- const _id = row?.id || ids.value[0]; +- const res = await getSafetyLog(_id); +- Object.assign(form.value, res.data); +- dialog.visible = true; +- dialog.title = '修改安全日志'; +-}; +- + /** 提交按钮 */ ++const uploadRef = ref(); + const submitForm = () => { + safetyLogFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + buttonLoading.value = true; +- form.value.projectId = currentProject.value?.id; +- if (form.value.id) { +- await updateSafetyLog(form.value).finally(() => (buttonLoading.value = false)); ++ form.value.projectId = currentProject.value?.goId; ++ if (fileStatus.value) { ++ await uploadRef.value.submitUpload().finally((res) => { ++ buttonLoading.value = false; ++ }); + } else { + await addSafetyLog(form.value).finally(() => (buttonLoading.value = false)); + } +@@ -318,20 +348,28 @@ const handleDelete = async (row?: SafetyLogVO) => { + await getList(); + }; + +-/** 导出按钮操作 */ +-const handleExport = () => { +- proxy?.download( +- 'safety/safetyLog/export', +- { +- ...queryParams.value +- }, +- `safetyLog_${new Date().getTime()}.xlsx` +- ); ++/** 新增按钮操作 */ ++const fileStatus = ref(false); ++const handleAdd = (type?: string) => { ++ reset(); ++ if (weather_type.value.length == 5) { ++ weather_type.value = weather_type.value.filter((item) => item.value != '3'); ++ weather_type.value[2].value = '3'; ++ } ++ console.log('🚀 ~ handleAdd ~ type:', type); ++ if (type == 'file') { ++ fileStatus.value = true; ++ } else { ++ fileStatus.value = false; ++ } ++ ++ dialog.visible = true; ++ dialog.title = '添加安全日志'; + }; + + //监听项目id刷新数据 + const listeningProject = watch( +- () => currentProject.value?.id, ++ () => currentProject.value.goId, + (nid, oid) => { + queryParams.value.projectId = nid; + form.value.projectId = nid; +diff --git a/src/views/safety/safetyWeeklyReport/component/add.vue b/src/views/safety/safetyWeeklyReport/component/add.vue +new file mode 100644 +index 0000000..4083477 +--- /dev/null ++++ b/src/views/safety/safetyWeeklyReport/component/add.vue +@@ -0,0 +1,110 @@ ++ ++ ++ +diff --git a/src/views/safety/safetyWeeklyReport/component/documentsDetail/index.vue b/src/views/safety/safetyWeeklyReport/component/documentsDetail/index.vue +new file mode 100644 +index 0000000..5d5fbaa +--- /dev/null ++++ b/src/views/safety/safetyWeeklyReport/component/documentsDetail/index.vue +@@ -0,0 +1,186 @@ ++ ++ ++ +diff --git a/src/views/safety/safetyWeeklyReport/component/documentsEdit/index.vue b/src/views/safety/safetyWeeklyReport/component/documentsEdit/index.vue +new file mode 100644 +index 0000000..3059b35 +--- /dev/null ++++ b/src/views/safety/safetyWeeklyReport/component/documentsEdit/index.vue +@@ -0,0 +1,186 @@ ++ ++ ++ +diff --git a/src/views/safety/safetyWeeklyReport/component/icon/full.png b/src/views/safety/safetyWeeklyReport/component/icon/full.png +new file mode 100644 +index 0000000..973cf14 +Binary files /dev/null and b/src/views/safety/safetyWeeklyReport/component/icon/full.png differ +diff --git a/src/views/safety/safetyWeeklyReport/component/icon/suo.png b/src/views/safety/safetyWeeklyReport/component/icon/suo.png +new file mode 100644 +index 0000000..80f2233 +Binary files /dev/null and b/src/views/safety/safetyWeeklyReport/component/icon/suo.png differ +diff --git a/src/views/safety/safetyWeeklyReport/component/model.ts b/src/views/safety/safetyWeeklyReport/component/model.ts +new file mode 100644 +index 0000000..90873c4 +--- /dev/null ++++ b/src/views/safety/safetyWeeklyReport/component/model.ts +@@ -0,0 +1,58 @@ ++export interface BusWeeklySecurityReportTableColumns { ++ id:number; // 主键ID ++ projectId:number; // 项目ID ++ projectName:string; // 项目名称 ++ scope:string; // 周期范围 ++ scopeEnd:string; // 周期范围结束 ++ path:string; // 文件位置 ++ createBy:string; // 创建者 ++ updateBy:string; // 更新者 ++ createdAt:string; // 创建时间 ++} ++ ++ ++export interface BusWeeklySecurityReportInfoData { ++ id:number|undefined; // 主键ID ++ projectId:number|undefined; // 项目ID ++ projectName:string|undefined; // 项目名称 ++ scope:string|undefined; // 周期范围 ++ scopeEnd:string|undefined; // 周期范围结束 ++ path:string|undefined; // 文件位置 ++ createBy:string|undefined; // 创建者 ++ updateBy:string|undefined; // 更新者 ++ createdAt:string|undefined; // 创建时间 ++ updatedAt:string|undefined; // 更新时间 ++ deletedAt:string|undefined; // 删除时间 ++} ++ ++ ++export interface BusWeeklySecurityReportTableDataState { ++ ids:any[]; ++ tableData: { ++ data: Array; ++ total: number; ++ loading: boolean; ++ param: { ++ pageNum: number; ++ pageSize: number; ++ id: number|undefined; ++ projectId: number|undefined; ++ projectName: string|undefined; ++ scope: string|undefined; ++ scopeEnd: string|undefined; ++ path: string|undefined; ++ createBy: string|undefined; ++ updateBy: string|undefined; ++ createdAt: string|undefined; ++ dateRange: string[]; ++ }; ++ }; ++} ++ ++ ++export interface BusWeeklySecurityReportEditState{ ++ loading:boolean; ++ isShowDialog: boolean; ++ formData:BusWeeklySecurityReportInfoData; ++ rules: object; ++} +\ No newline at end of file +diff --git a/src/views/safety/safetyWeeklyReport/index.vue b/src/views/safety/safetyWeeklyReport/index.vue +index 2ac4adf..670cfb7 100644 +--- a/src/views/safety/safetyWeeklyReport/index.vue ++++ b/src/views/safety/safetyWeeklyReport/index.vue +@@ -1,112 +1,95 @@ + +- +- ++ +diff --git a/src/views/safety/teamMeeting/component/TeamMeetingDetailDrawer.vue b/src/views/safety/teamMeeting/component/TeamMeetingDetailDrawer.vue +index 7ead441..b344963 100644 +--- a/src/views/safety/teamMeeting/component/TeamMeetingDetailDrawer.vue ++++ b/src/views/safety/teamMeeting/component/TeamMeetingDetailDrawer.vue +@@ -3,19 +3,17 @@ + + {{ teamMeetingDetail?.compereName }} + +- +- {{teamMeetingDetail?.participantList.map(item => item.name).join(",")}} ++ {{ item }}, + + {{ teamMeetingDetail?.teamName }} +- {{ teamMeetingDetail?.contractorName }} +- {{ dayjs(teamMeetingDetail?.meetingDate).format('YYYY 年 MM 月 DD 日') +- }} +- {{ teamMeetingDetail?.createTime }} ++ {{ teamMeetingDetail?.labourserviceName }} ++ {{ dayjs(teamMeetingDetail?.meetingDate).format('YYYY 年 MM 月 DD 日') }} ++ {{ teamMeetingDetail?.createdAt }} + {{ teamMeetingDetail?.content }} + + +- +- ++ ++ + + + +@@ -37,9 +35,10 @@ const loading = ref(false); + const teamMeetingDetail = ref(); + const get = async () => { + loading.value = true; +- const res = await getTeamMeeting(props.teamMeetingId); +- if (res.data && res.code === 200) { ++ const res = await getTeamMeeting({ id: props.teamMeetingId }); ++ if (res.data && res.code === 0) { + teamMeetingDetail.value = res.data; ++ teamMeetingDetail.value.pictureUrlList = res.data?.picture.split(','); + } + loading.value = false; + }; +diff --git a/src/views/safety/teamMeeting/index.vue b/src/views/safety/teamMeeting/index.vue +index 5a45dfa..a6e4c2c 100644 +--- a/src/views/safety/teamMeeting/index.vue ++++ b/src/views/safety/teamMeeting/index.vue +@@ -1,13 +1,11 @@ + + +- +- +- ++ + + + + +- +- ++ + + + + + +- ++ + + + +@@ -99,14 +73,12 @@ + + + +- ++ + + + + +- ++ + + + +@@ -136,9 +108,7 @@ + + + +diff --git a/src/views/system/user/comm/roleInfo.vue b/src/views/system/user/comm/roleInfo.vue +index c4f4ce5..6867a26 100644 +--- a/src/views/system/user/comm/roleInfo.vue ++++ b/src/views/system/user/comm/roleInfo.vue +@@ -274,6 +274,7 @@ const initData = async () => { + try { + // 获取项目列表 + const projectRes = await listProject(); ++ console.log('🚀 ~ initData ~ projectRes:', projectRes); + projectOptions.value = projectRes.rows.map((item: any) => ({ + id: item.id, + projectName: item.projectName, +diff --git a/src/views/tender/supplierInput/index.vue b/src/views/tender/supplierInput/index.vue +index 4c35487..86ed4f0 100644 +--- a/src/views/tender/supplierInput/index.vue ++++ b/src/views/tender/supplierInput/index.vue +@@ -812,7 +812,7 @@ onUnmounted(() => { + } + } + +-.upload-file-list .ele-upload-list__item-content { ++.upload-file-list .upload-list__item-content { + display: flex; + justify-content: space-between; + align-items: center; +diff --git a/src/views/tool/gen/index.vue b/src/views/tool/gen/index.vue +index b4df31b..451895d 100644 +--- a/src/views/tool/gen/index.vue ++++ b/src/views/tool/gen/index.vue +@@ -113,8 +113,8 @@ + + + diff --git a/src/views/dhr_demo/xunjianjihua.vue b/src/views/dhr_demo/xunjianjihua.vue index f488edf..1f6d7fe 100644 --- a/src/views/dhr_demo/xunjianjihua.vue +++ b/src/views/dhr_demo/xunjianjihua.vue @@ -117,89 +117,10 @@
- +

进度指标对比

-
- - - - - - - - - - - - - - - - -
-
-
-

平均完成度

-

- {{ averageRate.toFixed(1) }}% -

-
-
-
-
- - -
-
-
- 完成率 {{ completionRate }}% -
-
-
- 解决率 {{ resolutionRate }}% -
-
-
- 及时率 {{ timelinessRate }}% -
-
+
@@ -211,7 +132,7 @@ {{ completionRate }}%
-
+
@@ -220,7 +141,7 @@ {{ resolutionRate }}%
-
+
@@ -229,7 +150,7 @@ {{ timelinessRate }}%
-
+
@@ -441,9 +362,10 @@