diff --git a/klp-ui/src/api/hrm/index.js b/klp-ui/src/api/hrm/index.js new file mode 100644 index 00000000..3b8a7089 --- /dev/null +++ b/klp-ui/src/api/hrm/index.js @@ -0,0 +1,341 @@ +import request from '@/utils/request' + +// 组织 +export function listOrg(query) { + return request({ + url: '/hrm/org/list', + method: 'get', + params: query + }) +} +export function allOrg(query) { + return request({ + url: '/hrm/org/all', + method: 'get', + params: query + }) +} +export function addOrg(data) { + return request({ + url: '/hrm/org', + method: 'post', + data + }) +} +export function updateOrg(data) { + return request({ + url: '/hrm/org', + method: 'put', + data + }) +} +export function delOrg(orgIds) { + return request({ + url: `/hrm/org/${orgIds}`, + method: 'delete' + }) +} +export function getOrg(orgId) { + return request({ + url: `/hrm/org/${orgId}`, + method: 'get' + }) +} + +// 员工 +export function listEmployee(query) { + return request({ + url: '/hrm/employee/list', + method: 'get', + params: query + }) +} +export function allEmployee(query) { + return request({ + url: '/hrm/employee/all', + method: 'get', + params: query + }) +} +export function addEmployee(data) { + return request({ + url: '/hrm/employee', + method: 'post', + data + }) +} +export function updateEmployee(data) { + return request({ + url: '/hrm/employee', + method: 'put', + data + }) +} +export function delEmployee(empIds) { + return request({ + url: `/hrm/employee/${empIds}`, + method: 'delete' + }) +} +export function getEmployee(empId) { + return request({ + url: `/hrm/employee/${empId}`, + method: 'get' + }) +} + +// 证书与合同 +export function listCertificate(query) { + return request({ + url: '/hrm/certificate/list', + method: 'get', + params: query + }) +} +export function listContract(query) { + return request({ + url: '/hrm/contract/list', + method: 'get', + params: query + }) +} + +// 员工组织岗位关系 +export function listEmpOrgPosition(query) { + return request({ + url: '/hrm/empOrg/list', + method: 'get', + params: query + }) +} + +// 职级/岗位 +export function listGrade(query) { + return request({ + url: '/hrm/grade/list', + method: 'get', + params: query + }) +} +export function listPosition(query) { + return request({ + url: '/hrm/position/list', + method: 'get', + params: query + }) +} + +// 班次/排班/打卡/考勤 +export function listShift(query) { + return request({ + url: '/hrm/shift/list', + method: 'get', + params: query + }) +} +export function listSchedule(query) { + return request({ + url: '/hrm/schedule/list', + method: 'get', + params: query + }) +} +export function listPunch(query) { + return request({ + url: '/hrm/punch/list', + method: 'get', + params: query + }) +} +export function listAttendCalc(query) { + return request({ + url: '/hrm/attend/list', + method: 'get', + params: query + }) +} +export function listLeaveBalance(query) { + return request({ + url: '/hrm/leave/balance/list', + method: 'get', + params: query + }) +} + +// 申请单 +export function listLeaveReq(query) { + return request({ + url: '/hrm/leave/req/list', + method: 'get', + params: query + }) +} +export function listOvertimeReq(query) { + return request({ + url: '/hrm/overtime/req/list', + method: 'get', + params: query + }) +} +export function listTravelReq(query) { + return request({ + url: '/hrm/travel/req/list', + method: 'get', + params: query + }) +} +export function listSealReq(query) { + return request({ + url: '/hrm/seal/list', + method: 'get', + params: query + }) +} +export function getSealReq(bizId) { + return request({ + url: `/hrm/seal/${bizId}`, + method: 'get' + }) +} +export function addSealReq(data) { + return request({ + url: '/hrm/seal', + method: 'post', + data + }) +} +export function updateSealReq(data) { + return request({ + url: '/hrm/seal', + method: 'put', + data + }) +} +export function delSealReq(bizIds) { + return request({ + url: `/hrm/seal/${bizIds}`, + method: 'delete' + }) +} +export function approveSealReq(bizId) { + return request({ + url: `/hrm/seal/${bizId}/approve`, + method: 'post' + }) +} +export function rejectSealReq(bizId) { + return request({ + url: `/hrm/seal/${bizId}/reject`, + method: 'post' + }) +} +export function cancelSealReq(bizId) { + return request({ + url: `/hrm/seal/${bizId}/cancel`, + method: 'post' + }) +} +export function stampSealJava(bizId, data) { + return request({ + url: `/hrm/seal/${bizId}/stamp/java`, + method: 'post', + data + }) +} +export function stampSealPython(bizId, data) { + return request({ + url: `/hrm/seal/${bizId}/stamp/python`, + method: 'post', + data + }) +} + +// 流程任务 +export function listFlowTask(query) { + return request({ + url: '/hrm/flow/task/list', + method: 'get', + params: query + }) +} +export function listTodoFlowTask(assigneeUserId) { + return request({ + url: '/hrm/flow/task/todo', + method: 'get', + params: { assigneeUserId } + }) +} +export function approveFlowTask(taskId, data) { + return request({ + url: `/hrm/flow/task/${taskId}/approve`, + method: 'post', + data + }) +} +export function rejectFlowTask(taskId, data) { + return request({ + url: `/hrm/flow/task/${taskId}/reject`, + method: 'post', + data + }) +} +export function withdrawFlowTask(taskId, data) { + return request({ + url: `/hrm/flow/task/${taskId}/withdraw`, + method: 'post', + data + }) +} + +export function listFlowAction(query) { + return request({ + url: '/hrm/flow/action/list', + method: 'get', + params: query + }) +} +export function listFlowForm(query) { + return request({ + url: '/hrm/flow/form/list', + method: 'get', + params: query + }) +} +export function getFlowForm(formId) { + return request({ + url: `/hrm/flow/form/${formId}`, + method: 'get' + }) +} + +// 薪酬 +export function listPayPlan(query) { + return request({ + url: '/hrm/pay/plan/list', + method: 'get', + params: query + }) +} +export function listPayRun(query) { + return request({ + url: '/hrm/pay/run/list', + method: 'get', + params: query + }) +} +export function listPayslip(query) { + return request({ + url: '/hrm/payslip/list', + method: 'get', + params: query + }) +} + +// 指标快照 +export function listStatSnapshot(query) { + return request({ + url: '/hrm/stat/snapshot/list', + method: 'get', + params: query + }) +} diff --git a/klp-ui/src/api/l2/pdo.js b/klp-ui/src/api/l2/pdo.js index f621540d..823b4a09 100644 --- a/klp-ui/src/api/l2/pdo.js +++ b/klp-ui/src/api/l2/pdo.js @@ -2,7 +2,7 @@ import axios from 'axios' export default function createFetch(url) { const l2Request = axios.create({ - baseURL: url, + baseURL: 'http://' + url, headers: { 'Content-Type': 'application/json' }, diff --git a/klp-ui/src/api/l2/plan.js b/klp-ui/src/api/l2/plan.js index e1fef910..0db59892 100644 --- a/klp-ui/src/api/l2/plan.js +++ b/klp-ui/src/api/l2/plan.js @@ -44,7 +44,7 @@ function formatDateFields(data) { export default function createFetch(url) { const l2Request = axios.create({ - baseURL: url, + baseURL: 'http://' + url, headers: { 'Content-Type': 'application/json' }, diff --git a/klp-ui/src/api/l2/report.js b/klp-ui/src/api/l2/report.js index c425a27a..cdbea23d 100644 --- a/klp-ui/src/api/l2/report.js +++ b/klp-ui/src/api/l2/report.js @@ -2,7 +2,7 @@ import axios from 'axios' export default function createFetch(url) { const l2Request = axios.create({ - baseURL: url, + baseURL: 'http://' + url, headers: { 'Content-Type': 'application/json' }, diff --git a/klp-ui/src/api/l2/roller.js b/klp-ui/src/api/l2/roller.js index c672f2b8..f356b56d 100644 --- a/klp-ui/src/api/l2/roller.js +++ b/klp-ui/src/api/l2/roller.js @@ -2,7 +2,7 @@ import axios from 'axios' export default function createFetch(url) { const l2Request = axios.create({ - baseURL: url, + baseURL: 'http://' + url, headers: { 'Content-Type': 'application/json' }, diff --git a/klp-ui/src/api/l2/steelGrade.js b/klp-ui/src/api/l2/steelGrade.js index 08169fcf..68de1c8c 100644 --- a/klp-ui/src/api/l2/steelGrade.js +++ b/klp-ui/src/api/l2/steelGrade.js @@ -2,7 +2,7 @@ import axios from 'axios' export default function createFetch(url) { const l2Request = axios.create({ - baseURL: url, + baseURL: 'http://' + url, headers: { 'Content-Type': 'application/json' }, diff --git a/klp-ui/src/api/l2/stop.js b/klp-ui/src/api/l2/stop.js index 43e430cc..fac87984 100644 --- a/klp-ui/src/api/l2/stop.js +++ b/klp-ui/src/api/l2/stop.js @@ -2,7 +2,7 @@ import axios from 'axios' export default function createFetch(url) { const l2Request = axios.create({ - baseURL: url, + baseURL: 'http://' + url, headers: { 'Content-Type': 'application/json' }, diff --git a/klp-ui/src/api/l2/track.js b/klp-ui/src/api/l2/track.js index 856e87dc..d1bd59d3 100644 --- a/klp-ui/src/api/l2/track.js +++ b/klp-ui/src/api/l2/track.js @@ -2,7 +2,7 @@ import axios from 'axios' export default function createFetch(url) { const l2Request = axios.create({ - baseURL: url, + baseURL: 'http://' + url, headers: { 'Content-Type': 'application/json' }, diff --git a/klp-ui/src/utils/websocketManager.js b/klp-ui/src/utils/websocketManager.js new file mode 100644 index 00000000..5352f380 --- /dev/null +++ b/klp-ui/src/utils/websocketManager.js @@ -0,0 +1,137 @@ +/** + * WebSocket 管理器 + * 用于管理多个 WebSocket 连接 + */ + +class WebSocketManager { + constructor(url) { + this.connections = new Map() + this.baseUrl = url + } + + /** + * 创建 WebSocket 连接 + * @param {String} type - WebSocket 类型 (track_measure, track_position, track_signal, track_matmap, calc_setup_result) + * @param {Function} onMessage - 接收消息的回调函数 + * @param {Function} onOpen - 连接打开的回调函数 + * @param {Function} onError - 错误回调函数 + * @param {Function} onClose - 关闭回调函数 + */ + connect(type, { onMessage, onOpen, onError, onClose } = {}) { + // 如果已存在连接,先断开 + if (this.connections.has(type)) { + this.disconnect(type) + } + + const url = `${this.baseUrl}?type=${type}` + console.log(`[WebSocket] 正在连接: ${type}`) + + try { + const socket = new WebSocket(url) + + socket.onopen = (event) => { + console.log(`[WebSocket] 连接成功: ${type}`) + if (onOpen) onOpen(event) + } + + socket.onmessage = (event) => { + try { + const data = JSON.parse(event.data) + if (onMessage) onMessage(data) + } catch (error) { + console.error(`[WebSocket] 数据解析失败 (${type}):`, error) + // 如果不是 JSON,直接传递原始数据 + if (onMessage) onMessage(event.data) + } + } + + socket.onerror = (error) => { + console.error(`[WebSocket] 连接错误 (${type}):`, error) + if (onError) onError(error) + } + + socket.onclose = (event) => { + console.log(`[WebSocket] 连接关闭 (${type}):`, event.code, event.reason) + this.connections.delete(type) + + if (onClose) { + onClose(event) + } else if (event.code !== 1000) { + // 非正常关闭,3秒后自动重连 + console.log(`[WebSocket] 3秒后尝试重连: ${type}`) + setTimeout(() => { + this.connect(type, { onMessage, onOpen, onError, onClose }) + }, 3000) + } + } + + this.connections.set(type, socket) + return socket + } catch (error) { + console.error(`[WebSocket] 创建连接失败 (${type}):`, error) + // 失败后3秒重试 + setTimeout(() => { + this.connect(type, { onMessage, onOpen, onError, onClose }) + }, 3000) + } + } + + /** + * 断开指定类型的连接 + */ + disconnect(type) { + const socket = this.connections.get(type) + if (socket) { + console.log(`[WebSocket] 主动断开: ${type}`) + socket.close(1000, '主动关闭') + this.connections.delete(type) + } + } + + /** + * 断开所有连接 + */ + disconnectAll() { + console.log('[WebSocket] 断开所有连接') + this.connections.forEach((socket, type) => { + this.disconnect(type) + }) + } + + /** + * 获取指定类型的连接状态 + */ + isConnected(type) { + const socket = this.connections.get(type) + return socket && socket.readyState === WebSocket.OPEN + } + + /** + * 获取所有连接状态 + */ + getAllStatus() { + const status = {} + this.connections.forEach((socket, type) => { + status[type] = socket.readyState === WebSocket.OPEN + }) + return status + } + + /** + * 发送消息(如果需要) + */ + send(type, message) { + const socket = this.connections.get(type) + if (socket && socket.readyState === WebSocket.OPEN) { + const data = typeof message === 'string' ? message : JSON.stringify(message) + socket.send(data) + return true + } + console.warn(`[WebSocket] 无法发送消息,连接未打开: ${type}`) + return false + } +} + +// 导出单例 +export default WebSocketManager + diff --git a/klp-ui/src/views/hrm/attendance/index.vue b/klp-ui/src/views/hrm/attendance/index.vue new file mode 100644 index 00000000..bdcd2eed --- /dev/null +++ b/klp-ui/src/views/hrm/attendance/index.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/klp-ui/src/views/hrm/index.vue b/klp-ui/src/views/hrm/index.vue new file mode 100644 index 00000000..66dbbb58 --- /dev/null +++ b/klp-ui/src/views/hrm/index.vue @@ -0,0 +1,396 @@ + + + + + diff --git a/klp-ui/src/views/hrm/org/index.vue b/klp-ui/src/views/hrm/org/index.vue new file mode 100644 index 00000000..76b720c5 --- /dev/null +++ b/klp-ui/src/views/hrm/org/index.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/klp-ui/src/views/hrm/payroll/index.vue b/klp-ui/src/views/hrm/payroll/index.vue new file mode 100644 index 00000000..5342d943 --- /dev/null +++ b/klp-ui/src/views/hrm/payroll/index.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/klp-ui/src/views/hrm/requests/index.vue b/klp-ui/src/views/hrm/requests/index.vue new file mode 100644 index 00000000..c47a9c79 --- /dev/null +++ b/klp-ui/src/views/hrm/requests/index.vue @@ -0,0 +1,407 @@ + + + + + diff --git a/klp-ui/src/views/hrm/workbench/index.vue b/klp-ui/src/views/hrm/workbench/index.vue new file mode 100644 index 00000000..3c778f02 --- /dev/null +++ b/klp-ui/src/views/hrm/workbench/index.vue @@ -0,0 +1,11 @@ + + + diff --git a/klp-ui/src/views/lines/index.vue b/klp-ui/src/views/lines/index.vue index fcd16480..42a521dc 100644 --- a/klp-ui/src/views/lines/index.vue +++ b/klp-ui/src/views/lines/index.vue @@ -1,14 +1,13 @@