8.9 KiB
8.9 KiB
WiiCITMS - 企业信息管理系统
WiiCITMS 是一个企业信息管理系统,提供组织结构管理、人事管理、工作流审批、通知推送等功能。本文档主要介绍系统的架构和使用方法。
系统特性
- 组织架构管理:支持多级组织结构,岗位管理
- 人事管理:员工信息管理,员工岗位分配
- 权限管理:基于角色和岗位的权限控制
- 工作流引擎:可定制的审批流程
- 实时通知:使用SSE技术的实时消息推送系统
系统架构
系统采用Go语言开发,主要组件包括:
- 数据层:使用SQL Server存储数据
- 业务逻辑层:实现业务逻辑和处理
- API层:提供基于MCP的API接口
- 通知服务:基于SSE的实时通知系统
SSE通知系统使用指南
什么是SSE
SSE(Server-Sent Events)是一种服务器推送技术,允许服务器向客户端推送数据。与WebSocket不同,SSE是单向的(只能服务器向客户端发送数据),但实现更简单,对服务器资源消耗更小。
连接SSE服务
前端连接示例
使用原生JavaScript连接SSE服务:
// 创建SSE连接
const connectToSSE = (userGuid) => {
const evtSource = new EventSource(`/api/v1/events?userGuid=${userGuid}`);
// 连接打开时的处理
evtSource.onopen = () => {
console.log('SSE连接已建立');
};
// 连接错误处理
evtSource.onerror = (error) => {
console.error('SSE连接错误:', error);
// 可以在这里实现重连逻辑
setTimeout(() => connectToSSE(userGuid), 5000);
};
// 处理职位变动通知
evtSource.addEventListener('position_change', (event) => {
const data = JSON.parse(event.data);
console.log('收到职位变动通知:', data);
// 在这里处理通知,如显示提醒、更新界面等
});
// 处理审批通知
evtSource.addEventListener('approval_notice', (event) => {
const data = JSON.parse(event.data);
console.log('收到审批通知:', data);
// 在这里处理通知
});
// 处理消息提醒
evtSource.addEventListener('message_notification', (event) => {
const data = JSON.parse(event.data);
console.log('收到消息提醒:', data);
// 在这里处理通知
});
// 处理系统通知
evtSource.addEventListener('system_notification', (event) => {
const data = JSON.parse(event.data);
console.log('收到系统通知:', data);
// 在这里处理通知
});
// 返回SSE实例,以便在需要时关闭连接
return evtSource;
};
// 使用示例
const userGuid = '12345678-1234-1234-1234-123456789012'; // 用户的GUID
const sseConnection = connectToSSE(userGuid);
// 在退出页面或不需要时关闭连接
window.addEventListener('beforeunload', () => {
if (sseConnection) {
sseConnection.close();
}
});
使用Vue.js的示例
// SSE.js - SSE服务封装
export default {
connection: null,
connect(userGuid, handlers = {}) {
this.connection = new EventSource(`/api/v1/events?userGuid=${userGuid}`);
this.connection.onopen = handlers.onOpen || (() => console.log('SSE连接已建立'));
this.connection.onerror = handlers.onError || ((error) => console.error('SSE连接错误:', error));
// 注册事件处理器
if (handlers.onPositionChange) {
this.connection.addEventListener('position_change', (event) => {
const data = JSON.parse(event.data);
handlers.onPositionChange(data);
});
}
if (handlers.onApprovalNotice) {
this.connection.addEventListener('approval_notice', (event) => {
const data = JSON.parse(event.data);
handlers.onApprovalNotice(data);
});
}
if (handlers.onMessageNotification) {
this.connection.addEventListener('message_notification', (event) => {
const data = JSON.parse(event.data);
handlers.onMessageNotification(data);
});
}
if (handlers.onSystemNotification) {
this.connection.addEventListener('system_notification', (event) => {
const data = JSON.parse(event.data);
handlers.onSystemNotification(data);
});
}
return this.connection;
},
disconnect() {
if (this.connection) {
this.connection.close();
this.connection = null;
}
}
};
// 在Vue组件中使用
import SSEService from './SSE';
export default {
data() {
return {
notifications: [],
}
},
created() {
const userGuid = this.$store.state.user.guid;
SSEService.connect(userGuid, {
onPositionChange: (data) => {
this.notifications.push({
type: 'position',
title: data.title,
content: data.content,
time: new Date(),
});
this.$notify({
title: data.title,
message: data.content,
type: 'info'
});
},
onApprovalNotice: (data) => {
this.notifications.push({
type: 'approval',
title: data.title,
content: data.content,
time: new Date(),
});
this.$notify({
title: data.title,
message: data.content,
type: 'warning'
});
},
});
},
beforeDestroy() {
SSEService.disconnect();
}
}
后端发送通知示例
可以通过以下方式在后端代码中发送通知:
使用MCP工具发送通知
// 示例1: 发送职位变动通知
mcpClient.CallTool(ctx, "notifyPositionChange", map[string]interface{}{
"staffGuid": "12345678-1234-1234-1234-123456789012",
"title": "职位变更通知",
"content": "您已被调整为市场部经理",
"oldPosition": "市场专员",
"newPosition": "市场经理",
})
// 示例2: 发送审批通知
mcpClient.CallTool(ctx, "notifyApproval", map[string]interface{}{
"staffGuid": "12345678-1234-1234-1234-123456789012",
"title": "请假申请已审批",
"content": "您的请假申请已被批准",
"approvalId": "AP2025091210001",
"approvalState": "已通过",
})
// 示例3: 广播系统通知
mcpClient.CallTool(ctx, "broadcastSystemNotification", map[string]interface{}{
"title": "系统维护通知",
"content": "系统将于今晚22:00-23:00进行维护,请提前做好工作安排",
"category": "维护",
"severity": "信息",
})
在Go代码中直接发送通知
import "WiiCITMS/servers/notification"
// 示例1: 发送职位变动通知
notification.NotifyPositionChange(
[]string{"12345678-1234-1234-1234-123456789012"},
notification.PositionChangePayload{
NotificationPayload: notification.NotificationPayload{
Title: "职位变更通知",
Content: "您已被调整为市场部经理",
},
OldPosition: "市场专员",
NewPosition: "市场经理",
ChangeType: "晋升",
},
)
// 示例2: 发送审批通知
notification.NotifyApproval(
[]string{"12345678-1234-1234-1234-123456789012"},
notification.ApprovalNoticePayload{
NotificationPayload: notification.NotificationPayload{
Title: "请假申请已审批",
Content: "您的请假申请已被批准",
},
ApprovalID: "AP2025091210001",
ApprovalState: "已通过",
Approver: "张经理",
},
)
// 示例3: 广播系统通知
notification.BroadcastSystemNotification(
notification.SystemNotificationPayload{
NotificationPayload: notification.NotificationPayload{
Title: "系统维护通知",
Content: "系统将于今晚22:00-23:00进行维护,请提前做好工作安排",
},
Category: "维护",
Severity: "信息",
},
)
通知类型
系统支持以下几种通知类型:
- 职位变动通知 (
position_change): 当员工职位发生变化时发送 - 审批通知 (
approval_notice): 当工作流审批状态发生变化时发送 - 消息提醒 (
message_notification): 普通消息提醒 - 系统通知 (
system_notification): 系统级别的通知,可广播给所有用户
配置说明
SSE服务默认在MCP端口+1的端口上运行,例如如果MCP服务在8080端口,则SSE服务会在8081端口。可以通过修改main.go中的配置进行调整。
API文档
系统API基于MCP (Meta Command Protocol) 实现,提供了丰富的业务功能接口。
主要API分类
- 组织架构API: 组织、岗位管理
- 员工管理API: 员工信息、员工岗位分配
- 权限管理API: 权限分配、权限检查
- 工作流API: 流程定义、实例管理、审批操作
- 通知API: 发送通知、获取在线用户
有关详细API文档,请参考系统内部文档或代码注释。
系统要求
- Go 1.18或更高版本
- SQL Server 2019或更高版本
- 现代Web浏览器(支持ES6和SSE)
许可证
版权所有 © 2025 WiiUniverse