1
This commit is contained in:
@@ -1,235 +0,0 @@
|
||||
# 指令流程映射关系文档
|
||||
|
||||
## 📋 完整的指令执行流程
|
||||
|
||||
本文档说明从 Admin 前端到 boss-automation-nodejs 的完整指令映射关系。
|
||||
|
||||
## 🔄 执行流程图
|
||||
|
||||
```
|
||||
Admin 前端 (pla_account_detail.vue)
|
||||
↓ commandType
|
||||
plaAccountServer.runCommand()
|
||||
↓ HTTP POST
|
||||
后端 API (pla_account.js)
|
||||
↓ taskType
|
||||
taskQueue.addTask()
|
||||
↓
|
||||
taskQueue.getTaskCommands()
|
||||
↓ command_type
|
||||
command.executeCommand()
|
||||
↓
|
||||
jobManager[command_type]()
|
||||
↓ MQTT action
|
||||
boss-automation-nodejs
|
||||
↓
|
||||
BossService[action]()
|
||||
```
|
||||
|
||||
## 📊 完整映射表
|
||||
|
||||
| Admin commandType | taskType | command_type | MQTT action | Boss 方法 | 说明 |
|
||||
|------------------|----------|--------------|-------------|-----------|------|
|
||||
| `get_login_qr_code` | `get_login_qr_code` | `getLoginQrCode` | `get_login_qr_code` | `get_login_qr_code()` | 获取登录二维码 |
|
||||
| `openBotDetection` | `openBotDetection` | `openBotDetection` | `openBotDetection` | `openBotDetection()` | 打开测试页 |
|
||||
| `get_resume` | `get_resume` | `getOnlineResume` | `get_resume` | `get_resume()` | 获取用户简历 |
|
||||
| `get_user_info` | `get_user_info` | `getUserInfo` | `get_user_info` | `get_user_info()` | 获取用户信息 |
|
||||
| `search_jobs` | `search_jobs` | `searchJob` | `search_jobs` | `search_jobs()` | 搜索岗位 |
|
||||
| `getJobList` | `getJobList` | `getJobList` | `getJobList` | `getJobList()` | 获取岗位列表 |
|
||||
| `getChatList` | `getChatList` | `getChatList` | `getChatList` | `getChatList()` | 获取聊天列表 |
|
||||
|
||||
## 🔍 详细说明
|
||||
|
||||
### 1. Admin 前端 (commandType)
|
||||
|
||||
在 `pla_account_detail.vue` 中定义的操作类型:
|
||||
|
||||
```javascript
|
||||
actionMenuList: [
|
||||
{
|
||||
value: 'get_login_qr_code',
|
||||
label: '用户登录',
|
||||
commandType: 'get_login_qr_code',
|
||||
commandName: '获取登录二维码'
|
||||
},
|
||||
{
|
||||
value: 'getJobList',
|
||||
label: '岗位列表',
|
||||
commandType: 'getJobList',
|
||||
commandName: '获取岗位列表'
|
||||
},
|
||||
// ...
|
||||
]
|
||||
```
|
||||
|
||||
### 2. 后端 API (taskType)
|
||||
|
||||
在 `pla_account.js` 中,`commandType` 直接作为 `taskType` 传递:
|
||||
|
||||
```javascript
|
||||
const task = await task_status.create({
|
||||
sn_code: account.sn_code,
|
||||
taskType: commandConfig.type, // 使用 commandType
|
||||
taskName: commandName || commandConfig.name,
|
||||
taskParams: JSON.stringify(finalParams)
|
||||
});
|
||||
```
|
||||
|
||||
### 3. 任务队列 (command_type)
|
||||
|
||||
在 `taskQueue.js` 的 `getTaskCommands()` 方法中,将 `taskType` 映射为 `command_type`:
|
||||
|
||||
```javascript
|
||||
async getTaskCommands(task) {
|
||||
const { taskType, taskParams } = task;
|
||||
|
||||
switch (taskType) {
|
||||
case 'get_login_qr_code':
|
||||
return [{
|
||||
command_type: 'getLoginQrCode', // jobManager 方法名
|
||||
command_name: '获取登录二维码',
|
||||
command_params: JSON.stringify({ platform })
|
||||
}];
|
||||
|
||||
case 'getJobList':
|
||||
return [{
|
||||
command_type: 'getJobList', // jobManager 方法名
|
||||
command_name: '获取岗位列表',
|
||||
command_params: JSON.stringify({ keyword, platform })
|
||||
}];
|
||||
|
||||
// ...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 指令管理器 (jobManager 方法)
|
||||
|
||||
在 `command.js` 中调用 `jobManager` 的方法:
|
||||
|
||||
```javascript
|
||||
async executeCommand(taskId, command, mqttClient) {
|
||||
const commandType = command.command_type;
|
||||
const commandParams = JSON.parse(command.command_params);
|
||||
|
||||
// 调用 jobManager 的方法
|
||||
if (commandType && jobManager[commandType]) {
|
||||
result = await jobManager[commandType](sn_code, mqttClient, commandParams);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5. MQTT 通信 (action)
|
||||
|
||||
在 `jobManager.js` 中,通过 MQTT 发送指令:
|
||||
|
||||
```javascript
|
||||
async getJobList(sn_code, mqttClient, params = {}) {
|
||||
const response = await mqttClient.publishAndWait(sn_code, {
|
||||
platform: 'boss',
|
||||
action: "getJobList", // MQTT action,对应 Boss 方法名
|
||||
data: { keyword, pageCount }
|
||||
});
|
||||
return response.data;
|
||||
}
|
||||
```
|
||||
|
||||
### 6. Boss 模块执行
|
||||
|
||||
在 `boss-automation-nodejs` 中,根据 `action` 调用对应方法:
|
||||
|
||||
```javascript
|
||||
// modules/index.js
|
||||
async executeAction(platform, action, data) {
|
||||
const modules = this.getModules();
|
||||
|
||||
// 调用 BossService[action]
|
||||
let result = await modules[platform][action](data);
|
||||
return result;
|
||||
}
|
||||
```
|
||||
|
||||
## ⚠️ 关键注意事项
|
||||
|
||||
### 1. 命名一致性
|
||||
|
||||
- **Admin commandType** → 用户界面显示的操作类型
|
||||
- **taskType** → 任务类型,与 commandType 相同
|
||||
- **command_type** → jobManager 中的方法名(驼峰命名)
|
||||
- **MQTT action** → Boss 模块中的方法名(可能有别名)
|
||||
|
||||
### 2. 参数传递
|
||||
|
||||
参数在整个流程中的传递:
|
||||
|
||||
```javascript
|
||||
// Admin 前端
|
||||
commandParams: { keyword: '前端', platform: 'boss' }
|
||||
↓
|
||||
// taskParams
|
||||
taskParams: { keyword: '前端', platform: 'boss' }
|
||||
↓
|
||||
// command_params
|
||||
command_params: '{"keyword":"前端","platform":"boss"}'
|
||||
↓
|
||||
// jobManager 方法参数
|
||||
params: { keyword: '前端', platform: 'boss' }
|
||||
↓
|
||||
// MQTT data
|
||||
data: { keyword: '前端', pageCount: 3 }
|
||||
↓
|
||||
// Boss 方法参数
|
||||
data: { keyword: '前端', pageCount: 3 }
|
||||
```
|
||||
|
||||
### 3. 别名支持
|
||||
|
||||
Boss 模块中的别名方法:
|
||||
|
||||
```javascript
|
||||
// BossService 类中
|
||||
async openBotDetection(data) {
|
||||
return this.open_bot_detection(data);
|
||||
}
|
||||
|
||||
async get_resume(data) {
|
||||
return this.getOnlineResume(data);
|
||||
}
|
||||
|
||||
async search_jobs(data) {
|
||||
return this.searchJob(data);
|
||||
}
|
||||
```
|
||||
|
||||
## 🐛 常见问题
|
||||
|
||||
### Q1: 提示"未知的指令类型"
|
||||
|
||||
**原因:** `command_type` 在 `jobManager` 中不存在
|
||||
|
||||
**解决:**
|
||||
1. 检查 `taskQueue.js` 中的 `getTaskCommands()` 方法
|
||||
2. 确保 `command_type` 与 `jobManager` 中的方法名一致
|
||||
|
||||
### Q2: MQTT 消息发送失败
|
||||
|
||||
**原因:** `action` 在 Boss 模块中不存在
|
||||
|
||||
**解决:**
|
||||
1. 检查 `jobManager.js` 中的 MQTT action
|
||||
2. 确保 Boss 模块中有对应的方法或别名
|
||||
|
||||
### Q3: 参数传递错误
|
||||
|
||||
**原因:** 参数格式不正确
|
||||
|
||||
**解决:**
|
||||
1. 确保 `command_params` 是 JSON 字符串
|
||||
2. 在 `jobManager` 中正确解析参数
|
||||
3. 在 MQTT 消息中正确传递参数
|
||||
|
||||
---
|
||||
|
||||
**创建时间**: 2025-11-13
|
||||
**作者**: Augment Agent
|
||||
|
||||
@@ -1,686 +0,0 @@
|
||||
徽标
|
||||
工单管理
|
||||
合并请求
|
||||
里程碑
|
||||
探索
|
||||
zc
|
||||
/
|
||||
admin_core
|
||||
代码
|
||||
工单
|
||||
合并请求
|
||||
Actions
|
||||
软件包
|
||||
项目
|
||||
版本发布
|
||||
百科
|
||||
动态
|
||||
设置
|
||||
文件
|
||||
使用说明.md
|
||||
完整使用文档.md
|
||||
快速开始.md
|
||||
.gitignore
|
||||
README.md
|
||||
babel.config.js
|
||||
package-lock.json
|
||||
package.json
|
||||
postcss.config.js
|
||||
webpack.config.js
|
||||
admin_core
|
||||
/
|
||||
_doc
|
||||
/
|
||||
使用说明.md
|
||||
|
||||
张成
|
||||
463d7921c1
|
||||
1
|
||||
1分钟前
|
||||
18 KiB
|
||||
Admin Framework 使用说明
|
||||
一个基于 Vue2 的通用后台管理系统框架,包含完整的系统功能、登录、路由管理、布局等核心功能。
|
||||
|
||||
📦 框架特性
|
||||
✨ 核心功能
|
||||
✅ 简化的 API - 只需调用 createApp() 即可完成所有初始化
|
||||
✅ 模块化设计 - 组件、路由、状态管理等功能按模块组织
|
||||
✅ 完整的系统管理页面 - 用户、角色、菜单、日志等管理
|
||||
✅ 登录和权限管理 - 完整的登录流程和权限控制
|
||||
✅ 动态路由管理 - 基于权限菜单的动态路由生成
|
||||
✅ Vuex 状态管理 - 用户、应用状态管理
|
||||
✅ 全局组件库 - Tables、Editor、Upload、TreeGrid、FieldRenderer、FloatPanel 等
|
||||
✅ 工具库 - HTTP、日期、Token、Cookie 等工具
|
||||
✅ 内置样式 - base.less、animate.css、iconfont 等
|
||||
✅ 响应式布局 - 支持移动端适配
|
||||
🎯 内置页面组件
|
||||
主页组件 (HomePage) - 欢迎页面,显示系统标题
|
||||
系统管理页面 (SysUser, SysRole, SysLog, SysParamSetup)
|
||||
高级管理页面 (SysMenu, SysControl, SysTitle)
|
||||
登录页面 (LoginPage)
|
||||
错误页面 (Page401, Page404, Page500)
|
||||
🛠️ 内置工具
|
||||
HTTP 工具 (http) - 封装了 axios,支持拦截器、文件上传下载
|
||||
UI 工具 (uiTool) - 删除确认、树形转换、响应式设置、文件下载
|
||||
通用工具 (tools) - 日期格式化、UUID 生成、Cookie 操作、深拷贝等
|
||||
文件下载 - 支持 CSV 等格式的文件下载,自动处理换行符
|
||||
🚀 快速开始
|
||||
方式一:使用 Demo 项目(推荐)
|
||||
我们提供了一个完整的 demo 项目,可以直接运行查看效果:
|
||||
|
||||
# 1. 进入 demo 项目
|
||||
cd demo
|
||||
|
||||
# 2. 安装依赖
|
||||
npm install
|
||||
|
||||
# 3. 启动开发服务器
|
||||
npm run dev
|
||||
浏览器会自动打开 http://localhost:8080,查看:
|
||||
|
||||
/login - 登录页面
|
||||
/home - 主页
|
||||
/system/user - 用户管理
|
||||
/ball/games - 业务示例页面
|
||||
方式二:构建框架
|
||||
# 1. 安装依赖
|
||||
npm install
|
||||
|
||||
# 2. 构建框架
|
||||
npm run build
|
||||
|
||||
# 3. 产物在 dist/admin-framework.js
|
||||
🎯 极简使用方式
|
||||
只需 3 步即可完成集成!
|
||||
1. 引入框架
|
||||
import AdminFramework from './admin-framework.js'
|
||||
2. 创建应用
|
||||
const app = AdminFramework.createApp({
|
||||
title: '我的管理系统',
|
||||
apiUrl: 'http://localhost:9098/admin_api/',
|
||||
componentMap: {
|
||||
'business/product': ProductComponent,
|
||||
'business/order': OrderComponent
|
||||
}
|
||||
})
|
||||
3. 挂载应用
|
||||
app.$mount('#app')
|
||||
就这么简单! 框架会自动完成所有初始化工作。
|
||||
|
||||
📖 完整使用指南
|
||||
1. 项目结构准备
|
||||
your-project/
|
||||
├── src/
|
||||
│ ├── config/
|
||||
│ │ └── index.js # 配置文件
|
||||
│ ├── libs/
|
||||
│ │ └── admin-framework.js # 框架文件
|
||||
│ ├── views/
|
||||
│ │ └── business/ # 业务页面
|
||||
│ ├── api/
|
||||
│ │ └── business/ # 业务 API
|
||||
│ ├── App.vue
|
||||
│ └── main.js
|
||||
├── package.json
|
||||
└── webpack.config.js
|
||||
2. 安装依赖
|
||||
npm install vue vue-router vuex view-design axios dayjs js-cookie vuex-persistedstate
|
||||
3. 创建配置文件
|
||||
在 src/config/index.js 中:
|
||||
|
||||
module.exports = {
|
||||
title: '你的系统名称',
|
||||
homeName: '首页',
|
||||
apiUrl: 'http://localhost:9090/admin_api/',
|
||||
uploadUrl: 'http://localhost:9090/admin_api/upload',
|
||||
cookieExpires: 7,
|
||||
uploadMaxLimitSize: 10,
|
||||
oss: {
|
||||
region: 'oss-cn-shanghai',
|
||||
accessKeyId: 'your-key',
|
||||
accessKeySecret: 'your-secret',
|
||||
bucket: 'your-bucket',
|
||||
url: 'http://your-bucket.oss-cn-shanghai.aliyuncs.com',
|
||||
basePath: 'your-path/'
|
||||
}
|
||||
}
|
||||
4. 创建 main.js(新版本 - 推荐)
|
||||
import AdminFramework from './libs/admin-framework.js'
|
||||
|
||||
// 导入业务组件(根据权限菜单接口的 component 字段)
|
||||
import GamesComponent from './views/ball/games.vue'
|
||||
import PayOrdersComponent from './views/order/pay_orders.vue'
|
||||
|
||||
// 🎉 只需一行代码!框架自动完成所有初始化
|
||||
const app = AdminFramework.createApp({
|
||||
title: '我的管理系统',
|
||||
apiUrl: 'http://localhost:9098/admin_api/',
|
||||
componentMap: {
|
||||
'ball/games': GamesComponent,
|
||||
'order/pay_orders': PayOrdersComponent
|
||||
// 添加更多业务组件...
|
||||
},
|
||||
onReady() {
|
||||
console.log('应用已启动!')
|
||||
// 应用启动完成后的回调
|
||||
}
|
||||
})
|
||||
|
||||
// 挂载应用
|
||||
app.$mount('#app')
|
||||
5. 创建 App.vue
|
||||
<template>
|
||||
<div id="app">
|
||||
<router-view/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'App'
|
||||
}
|
||||
</script>
|
||||
🔧 API 使用指南
|
||||
框架实例方法
|
||||
createApp(config) - 推荐使用
|
||||
创建应用实例(新版本 API)
|
||||
|
||||
const app = AdminFramework.createApp({
|
||||
title: '我的管理系统', // 应用标题(必需)
|
||||
apiUrl: 'http://localhost:9098/admin_api/', // API 基础地址(必需)
|
||||
uploadUrl: 'http://localhost:9098/admin_api/upload', // 上传地址(可选,默认为 apiUrl + 'upload')
|
||||
componentMap: { // 业务组件映射(可选)
|
||||
'business/product': ProductComponent,
|
||||
'business/order': OrderComponent
|
||||
},
|
||||
onReady() { // 应用启动完成回调(可选)
|
||||
console.log('应用已启动!')
|
||||
}
|
||||
})
|
||||
工具库使用
|
||||
HTTP 工具
|
||||
// 在组件中使用
|
||||
export default {
|
||||
async mounted() {
|
||||
// GET 请求
|
||||
const res = await this.$http.get('/api/users', { page: 1 })
|
||||
|
||||
// POST 请求
|
||||
const result = await this.$http.post('/api/users', { name: 'test' })
|
||||
|
||||
// 文件导出
|
||||
await this.$http.fileExport('/api/export', { type: 'excel' })
|
||||
}
|
||||
}
|
||||
|
||||
// 在非 Vue 组件中使用
|
||||
import AdminFramework from './libs/admin-framework.js'
|
||||
const res = await AdminFramework.http.get('/api/users')
|
||||
UI 工具
|
||||
// 在组件中使用
|
||||
export default {
|
||||
methods: {
|
||||
handleDelete() {
|
||||
// 删除确认
|
||||
this.$uiTool.delConfirm(() => {
|
||||
// 执行删除逻辑
|
||||
})
|
||||
|
||||
// 设置响应式字体
|
||||
this.$uiTool.setRem()
|
||||
|
||||
// 树形转换
|
||||
const treeData = this.$uiTool.transformTree(flatData)
|
||||
}
|
||||
}
|
||||
}
|
||||
功能工具
|
||||
// 在组件中使用
|
||||
export default {
|
||||
methods: {
|
||||
downloadFile() {
|
||||
// 文件下载
|
||||
this.$uiTool.downloadFile(response, 'filename.csv')
|
||||
}
|
||||
}
|
||||
}
|
||||
通用工具
|
||||
// 在组件中使用
|
||||
export default {
|
||||
methods: {
|
||||
formatDate() {
|
||||
// 日期格式化
|
||||
return this.$tools.formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss')
|
||||
},
|
||||
|
||||
generateId() {
|
||||
// UUID 生成
|
||||
return this.$tools.generateUUID()
|
||||
},
|
||||
|
||||
setCookie() {
|
||||
// Cookie 操作
|
||||
this.$tools.setCookie('name', 'value')
|
||||
const value = this.$tools.getCookie('name')
|
||||
}
|
||||
}
|
||||
}
|
||||
Store 模块使用
|
||||
user 模块
|
||||
// 登录
|
||||
await this.$store.dispatch('user/handleLogin', {
|
||||
userFrom: { username, password },
|
||||
Main: AdminFramework.Main,
|
||||
ParentView: AdminFramework.ParentView,
|
||||
Page404: AdminFramework.Page404
|
||||
})
|
||||
|
||||
// 登出
|
||||
this.$store.dispatch('user/handleLogOut')
|
||||
|
||||
// 设置权限菜单
|
||||
this.$store.dispatch('user/setAuthorityMenus', {
|
||||
Main: AdminFramework.Main,
|
||||
ParentView: AdminFramework.ParentView,
|
||||
Page404: AdminFramework.Page404
|
||||
})
|
||||
|
||||
// 获取用户信息
|
||||
const userName = this.$store.getters['user/userName']
|
||||
const token = this.$store.state.user.token
|
||||
app 模块
|
||||
// 设置面包屑
|
||||
this.$store.commit('app/setBreadCrumb', route)
|
||||
|
||||
// 获取系统标题
|
||||
this.$store.dispatch('app/getSysTitle', {
|
||||
defaultTitle: '系统名称',
|
||||
defaultLogo: '/logo.png'
|
||||
})
|
||||
|
||||
// 获取系统配置
|
||||
const sysFormModel = this.$store.getters['app/sysFormModel']
|
||||
🗂️ 组件映射配置
|
||||
业务组件映射
|
||||
当后端权限菜单接口返回组件路径时,需要配置映射表:
|
||||
|
||||
// 1. 导入业务组件
|
||||
import GamesComponent from './views/ball/games.vue'
|
||||
import PayOrdersComponent from './views/order/pay_orders.vue'
|
||||
|
||||
// 2. 配置映射
|
||||
const componentMap = {
|
||||
'ball/games': GamesComponent,
|
||||
'ball/games.vue': GamesComponent, // 支持带 .vue 后缀
|
||||
'order/pay_orders': PayOrdersComponent,
|
||||
'order/pay_orders.vue': PayOrdersComponent
|
||||
}
|
||||
|
||||
// 3. 在 Vue.use 时传入
|
||||
Vue.use(AdminFramework, {
|
||||
config,
|
||||
ViewUI,
|
||||
VueRouter,
|
||||
Vuex,
|
||||
createPersistedState,
|
||||
componentMap // 传入组件映射表
|
||||
})
|
||||
框架已自动映射的系统组件
|
||||
以下组件无需配置,框架已自动映射:
|
||||
|
||||
✅ home/index - 主页
|
||||
✅ system/sys_user - 用户管理
|
||||
✅ system/sys_role - 角色管理
|
||||
✅ system/sys_log - 日志管理
|
||||
✅ system/sys_param_setup - 参数设置
|
||||
✅ system/sys_menu - 菜单管理
|
||||
✅ system/sys_control - 控制器管理
|
||||
✅ system/sys_title - 系统标题设置
|
||||
🌐 全局访问
|
||||
window.framework
|
||||
框架实例会自动暴露到全局,可以在任何地方访问:
|
||||
|
||||
// 在非 Vue 组件中使用
|
||||
const http = window.framework.http
|
||||
const uiTool = window.framework.uiTool
|
||||
const config = window.framework.config
|
||||
|
||||
// HTTP 请求
|
||||
const res = await window.framework.http.get('/api/users')
|
||||
|
||||
// UI 工具
|
||||
window.framework.uiTool.delConfirm(() => {
|
||||
// 删除逻辑
|
||||
})
|
||||
Vue 原型方法
|
||||
在 Vue 组件中可以直接使用:
|
||||
|
||||
export default {
|
||||
methods: {
|
||||
async loadData() {
|
||||
// 直接使用 this.$xxx
|
||||
const res = await this.$http.get('/api/users')
|
||||
this.$uiTool.delConfirm(() => {})
|
||||
this.$tools.formatDate(new Date())
|
||||
this.$uiTool.downloadFile(response, 'file.csv')
|
||||
}
|
||||
}
|
||||
}
|
||||
📁 文件下载功能
|
||||
使用 downloadFile 方法
|
||||
框架提供了便捷的文件下载功能,支持 CSV 等格式:
|
||||
|
||||
// 在 Vue 组件中使用
|
||||
export default {
|
||||
methods: {
|
||||
// 导出数据
|
||||
exportData() {
|
||||
// 调用 API 获取数据
|
||||
this.$http.fileExport('/api/export', params).then(res => {
|
||||
// 使用 downloadFile 下载
|
||||
this.$uiTool.downloadFile(res, '数据导出.csv')
|
||||
this.$Message.success('导出成功!')
|
||||
}).catch(error => {
|
||||
this.$Message.error('导出失败:' + error.message)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
支持的数据格式
|
||||
CSV 格式:自动处理换行符,保持表格格式
|
||||
Blob 对象:支持二进制文件下载
|
||||
文本数据:支持纯文本文件下载
|
||||
自动处理特性
|
||||
✅ 换行符保持:CSV 文件的换行符会被正确保持
|
||||
✅ 文件名处理:自动清理文件名中的特殊字符
|
||||
✅ 浏览器兼容:支持所有现代浏览器
|
||||
✅ 内存管理:自动清理临时 URL 对象
|
||||
🎨 全局组件使用
|
||||
FloatPanel - 浮动面板组件
|
||||
FloatPanel 是一个浮动在父窗体上的面板组件,类似于抽屉效果,常用于详情展示、表单编辑等场景。
|
||||
|
||||
基本使用:
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<Button @click="showPanel">打开浮动面板</Button>
|
||||
|
||||
<FloatPanel
|
||||
ref="floatPanel"
|
||||
title="详情面板"
|
||||
position="right"
|
||||
:show-back="true"
|
||||
back-text="返回"
|
||||
@back="handleBack"
|
||||
>
|
||||
<div>这里是面板内容</div>
|
||||
</FloatPanel>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
methods: {
|
||||
showPanel() {
|
||||
// 通过 ref 调用 show 方法显示面板
|
||||
this.$refs.floatPanel.show()
|
||||
},
|
||||
hidePanel() {
|
||||
// 通过 ref 调用 hide 方法隐藏面板
|
||||
this.$refs.floatPanel.hide()
|
||||
},
|
||||
handleBack() {
|
||||
console.log('返回按钮被点击')
|
||||
this.hidePanel()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
属性说明:
|
||||
|
||||
属性 类型 默认值 说明
|
||||
title String '' 面板标题
|
||||
width String/Number '100%' 面板宽度(字符串或数字),默认占满父容器
|
||||
height String/Number '100%' 面板高度(字符串或数字),默认占满父容器
|
||||
position String 'right' 面板位置:left、right、top、bottom、center
|
||||
showBack Boolean true 是否显示返回按钮
|
||||
showClose Boolean false 是否显示关闭按钮
|
||||
backText String '返回' 返回按钮文字
|
||||
closeOnClickBackdrop Boolean false 点击遮罩是否关闭
|
||||
mask Boolean false 是否显示遮罩(默认不显示)
|
||||
zIndex Number 1000 层级
|
||||
方法:
|
||||
|
||||
方法 说明 参数
|
||||
show(callback) 显示面板 callback: 可选的回调函数
|
||||
hide() 隐藏面板 -
|
||||
事件:
|
||||
|
||||
事件 说明 参数
|
||||
back 点击返回按钮时触发 -
|
||||
插槽:
|
||||
|
||||
插槽 说明
|
||||
default 面板主体内容
|
||||
header-right 头部右侧内容(可用于添加自定义按钮)
|
||||
位置说明:
|
||||
|
||||
left: 从左侧滑入
|
||||
right: 从右侧滑入(默认)
|
||||
top: 从顶部滑入
|
||||
bottom: 从底部滑入
|
||||
center: 居中显示,带缩放动画
|
||||
完整示例:
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<Button @click="openDetailPanel">查看详情</Button>
|
||||
|
||||
<FloatPanel
|
||||
ref="detailPanel"
|
||||
title="用户详情"
|
||||
position="right"
|
||||
:show-back="true"
|
||||
:show-close="true"
|
||||
back-text="返回"
|
||||
@back="handleBack"
|
||||
>
|
||||
<template #header-right>
|
||||
<Button type="primary" @click="handleSave">保存</Button>
|
||||
</template>
|
||||
|
||||
<div class="detail-content">
|
||||
<Form :model="formData" :label-width="100">
|
||||
<FormItem label="用户名">
|
||||
<Input v-model="formData.username" />
|
||||
</FormItem>
|
||||
<FormItem label="邮箱">
|
||||
<Input v-model="formData.email" />
|
||||
</FormItem>
|
||||
</Form>
|
||||
</div>
|
||||
</FloatPanel>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
formData: {
|
||||
username: '',
|
||||
email: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
openDetailPanel() {
|
||||
this.$refs.detailPanel.show()
|
||||
},
|
||||
handleBack() {
|
||||
this.$refs.detailPanel.hide()
|
||||
},
|
||||
handleSave() {
|
||||
// 保存逻辑
|
||||
console.log('保存数据', this.formData)
|
||||
this.$Message.success('保存成功')
|
||||
this.$refs.detailPanel.hide()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
特性说明:
|
||||
|
||||
✅ 基于父元素定位,不会遮挡菜单
|
||||
✅ 宽度和高度默认 100%,占满父容器
|
||||
✅ 无遮罩背景,完全浮在父页面上
|
||||
✅ 路由切换或组件销毁时自动关闭
|
||||
✅ 支持多种位置和动画效果
|
||||
✅ 支持自定义头部右侧内容
|
||||
📝 业务开发示例
|
||||
创建业务页面
|
||||
<!-- src/views/business/product.vue -->
|
||||
<template>
|
||||
<div>
|
||||
<h1>产品管理</h1>
|
||||
<Button @click="loadData">加载数据</Button>
|
||||
<Tables :columns="columns" :data="list" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
list: [],
|
||||
columns: [
|
||||
{ title: 'ID', key: 'id' },
|
||||
{ title: '名称', key: 'name' },
|
||||
{ title: '价格', key: 'price' }
|
||||
]
|
||||
}
|
||||
},
|
||||
async mounted() {
|
||||
await this.loadData()
|
||||
},
|
||||
methods: {
|
||||
async loadData() {
|
||||
// 使用框架提供的 http 工具
|
||||
const res = await this.$http.get('/product/list', { page: 1 })
|
||||
this.list = res.data
|
||||
},
|
||||
|
||||
async handleDelete(id) {
|
||||
// 使用框架提供的 UI 工具
|
||||
this.$uiTool.delConfirm(async () => {
|
||||
await this.$http.post('/product/delete', { id })
|
||||
this.$Message.success('删除成功')
|
||||
await this.loadData()
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
创建业务 API
|
||||
// src/api/business/productServer.js
|
||||
// 注意:不需要 import http,直接使用 http
|
||||
|
||||
class ProductServer {
|
||||
async getList(params) {
|
||||
return await http.get('/product/list', params)
|
||||
}
|
||||
|
||||
async save(data) {
|
||||
return await http.post('/product/save', data)
|
||||
}
|
||||
|
||||
async delete(id) {
|
||||
return await http.post('/product/delete', { id })
|
||||
}
|
||||
|
||||
async exportCsv(params) {
|
||||
return await http.fileExport('/product/export', params)
|
||||
}
|
||||
}
|
||||
|
||||
export default new ProductServer()
|
||||
❓ 常见问题
|
||||
Q1: 打包后文件太大怎么办?
|
||||
A: 框架已经将 Vue、VueRouter、Vuex、ViewUI、Axios 设置为外部依赖,不会打包进去。确保在项目中单独安装这些依赖。
|
||||
|
||||
Q2: 如何只使用部分功能?
|
||||
A: 可以按需导入:
|
||||
|
||||
import { http, uiTool, tools } from './libs/admin-framework.js'
|
||||
Q3: 权限菜单中的业务页面显示 404 怎么办?
|
||||
A: 需要配置组件映射表:
|
||||
|
||||
Vue.use(AdminFramework, {
|
||||
// ... 其他配置
|
||||
componentMap: {
|
||||
'ball/games': GamesComponent,
|
||||
'order/pay_orders': PayOrdersComponent
|
||||
}
|
||||
})
|
||||
Q4: 如何自定义配置?
|
||||
A: 修改 config/index.js 文件:
|
||||
|
||||
module.exports = {
|
||||
title: '你的系统名称',
|
||||
apiUrl: 'http://your-api-url/',
|
||||
// ... 其他配置
|
||||
}
|
||||
Q5: 如何使用登录功能?
|
||||
A: 在组件中:
|
||||
|
||||
export default {
|
||||
methods: {
|
||||
async login() {
|
||||
await this.$store.dispatch('user/handleLogin', {
|
||||
userFrom: { username: 'admin', password: '123456' },
|
||||
Main: AdminFramework.Main,
|
||||
ParentView: AdminFramework.ParentView,
|
||||
Page404: AdminFramework.Page404
|
||||
})
|
||||
this.$router.push({ name: 'home' })
|
||||
}
|
||||
}
|
||||
}
|
||||
Q6: 需要单独引入样式文件吗?
|
||||
A: 不需要! 框架已内置所有样式:
|
||||
|
||||
✅ base.less - 基础样式
|
||||
✅ animate.css - 动画样式
|
||||
✅ ivewExpand.less - ViewUI 扩展样式
|
||||
✅ iconfont.css - 字体图标样式
|
||||
只需引入框架即可:
|
||||
|
||||
import AdminFramework from './libs/admin-framework.js'
|
||||
Vue.use(AdminFramework, { ... })
|
||||
📦 技术栈
|
||||
Vue 2.6+
|
||||
Vue Router 3.x
|
||||
Vuex 3.x
|
||||
View Design (iView) 4.x
|
||||
Axios
|
||||
Less
|
||||
Webpack 5
|
||||
📄 许可证
|
||||
MIT License
|
||||
|
||||
👨💻 作者
|
||||
light
|
||||
|
||||
祝开发愉快! 🎉
|
||||
|
||||
如有问题,请查看 Demo 项目示例或联系开发团队。
|
||||
|
||||
Powered by Gitea
|
||||
当前版本:
|
||||
1.24.6
|
||||
页面:
|
||||
273ms
|
||||
模板:
|
||||
13ms
|
||||
许可证
|
||||
API
|
||||
@@ -1,59 +0,0 @@
|
||||
# full_flow 删除说明
|
||||
|
||||
## ✅ 已删除的 full_flow 相关代码
|
||||
|
||||
### 1. 任务处理器注册
|
||||
- ✅ 删除了 `registerTaskHandlers()` 中的 `full_flow` 处理器注册
|
||||
- ✅ 删除了 `handleFullFlowTask()` 方法
|
||||
|
||||
### 2. 手动任务处理
|
||||
- ✅ 修改了 `handleManualJobRequest()`,移除了 `full_flow` 的特殊处理
|
||||
- ✅ 将 `manualExecuteJobFlow()` 标记为废弃,抛出错误提示
|
||||
|
||||
### 3. 定时任务
|
||||
- ✅ 修改了 `executeScheduledJobFlow()`,移除了 `full_flow` 任务添加
|
||||
- ✅ 添加了注释说明 `full_flow` 已废弃
|
||||
|
||||
### 4. 任务队列
|
||||
- ✅ 删除了 `taskQueue.js` 中 `getTaskCommands()` 的 `case 'full_flow':` 分支
|
||||
|
||||
### 5. 配置
|
||||
- ✅ 删除了 `config.js` 中 `taskTimeouts.full_flow` 配置
|
||||
- ✅ 删除了 `config.js` 中 `taskPriorities.full_flow` 配置
|
||||
|
||||
### 6. 数据模型注释
|
||||
- ✅ 更新了 `task_status.js` 模型中的 `taskType` 注释,移除了 `full_flow` 说明
|
||||
|
||||
## 📝 保留的方法(已废弃)
|
||||
|
||||
以下方法已标记为废弃,但保留在代码中以便向后兼容:
|
||||
|
||||
1. **`manualExecuteJobFlow()`**
|
||||
- 状态:已废弃
|
||||
- 行为:抛出错误,提示使用其他任务类型
|
||||
- 位置:`api/middleware/schedule/index.js:681`
|
||||
|
||||
2. **`executeScheduledJobFlow()`**
|
||||
- 状态:定时任务已注释,方法保留但不再添加 `full_flow` 任务
|
||||
- 位置:`api/middleware/schedule/index.js:578`
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
1. **定时任务已禁用**
|
||||
- `executeScheduledJobFlow()` 的定时任务调用已被注释
|
||||
- 如需恢复定时任务,请使用其他任务类型(如 `auto_deliver`)
|
||||
|
||||
2. **替代方案**
|
||||
- 如需执行完整流程,请使用:
|
||||
- `auto_deliver` - 自动投递任务
|
||||
- `get_job_list` - 获取岗位列表
|
||||
- `apply_job` - 投递简历
|
||||
- 其他独立任务类型
|
||||
|
||||
|
||||
## 🔄 后续建议
|
||||
|
||||
如果不再需要以下方法,可以考虑完全删除:
|
||||
- `executeScheduledJobFlow()` - 如果定时任务不再使用
|
||||
- `manualExecuteJobFlow()` - 如果所有调用都已更新
|
||||
|
||||
24
_doc/js/app.25a32752.js
Normal file
24
_doc/js/app.25a32752.js
Normal file
File diff suppressed because one or more lines are too long
20463
_doc/js/chat.js
Normal file
20463
_doc/js/chat.js
Normal file
File diff suppressed because it is too large
Load Diff
5781
_doc/js/mqtt.js
Normal file
5781
_doc/js/mqtt.js
Normal file
File diff suppressed because it is too large
Load Diff
176
_doc/task.md
176
_doc/task.md
@@ -1,176 +0,0 @@
|
||||
# task_status_${snCode} 主题推送位置分析
|
||||
|
||||
## 一、推送位置(服务端)
|
||||
|
||||
### 1. 任务状态变更推送 (`task_status_update`)
|
||||
|
||||
**位置**: `autoAiWorkSys/api/middleware/schedule/taskQueue.js`
|
||||
|
||||
**方法**: `notifyTaskStatusChange(sn_code, taskData)`
|
||||
|
||||
**推送时机**:
|
||||
- ✅ **任务开始执行时** (第586行)
|
||||
- 状态: `running`
|
||||
- 进度: `0`
|
||||
- 触发位置: `executeTask` 方法中,任务开始执行时
|
||||
|
||||
- ✅ **任务完成时** (第631行)
|
||||
- 状态: `completed`
|
||||
- 进度: `100`
|
||||
- 触发位置: `executeTask` 方法中,任务成功完成后
|
||||
|
||||
- ✅ **任务失败时** (第675行)
|
||||
- 状态: `failed`
|
||||
- 进度: `0`
|
||||
- 错误信息: `errorMessage`
|
||||
- 触发位置: `executeTask` 方法中,任务执行失败时
|
||||
|
||||
**推送内容**:
|
||||
```javascript
|
||||
{
|
||||
action: 'task_status_update',
|
||||
data: {
|
||||
taskId: task.id,
|
||||
taskName: task.taskName,
|
||||
taskType: task.taskType,
|
||||
status: 'running' | 'completed' | 'failed',
|
||||
progress: 0 | 100,
|
||||
errorMessage?: string,
|
||||
endTime?: Date
|
||||
},
|
||||
timestamp: string
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 任务状态摘要推送 (`task_status_summary`)
|
||||
|
||||
**位置**: `autoAiWorkSys/api/middleware/schedule/taskQueue.js`
|
||||
|
||||
**方法**: `sendTaskStatusSummary(sn_code)`
|
||||
|
||||
**推送时机**:
|
||||
- ✅ **定时推送** (每10秒一次)
|
||||
- 位置: `autoAiWorkSys/api/middleware/schedule/scheduledJobs.js`
|
||||
- 方法: `syncTaskStatusSummary()`
|
||||
- 条件: 只向在线设备推送(最后心跳时间 < 3分钟)
|
||||
|
||||
**推送内容**:
|
||||
```javascript
|
||||
{
|
||||
action: 'task_status_summary',
|
||||
data: {
|
||||
sn_code: string,
|
||||
currentTask: {
|
||||
taskId: number,
|
||||
taskName: string,
|
||||
taskType: string,
|
||||
status: 'running',
|
||||
progress: number,
|
||||
currentStep: string,
|
||||
startTime: Date,
|
||||
jobTitle?: string, // 新增:职位名称
|
||||
companyName?: string // 新增:公司名称
|
||||
} | null,
|
||||
pendingTasks: Array<{
|
||||
taskId: number,
|
||||
taskName: string,
|
||||
taskType: string,
|
||||
status: 'pending',
|
||||
scheduledTime: Date,
|
||||
priority: number
|
||||
}>,
|
||||
nextTaskTime: Date | null,
|
||||
pendingCount: number, // 队列中的任务数
|
||||
totalPendingCount: number, // 总待执行数(包括当前任务的剩余步骤)
|
||||
mqttTopic: string,
|
||||
timestamp: string
|
||||
},
|
||||
timestamp: string
|
||||
}
|
||||
```
|
||||
|
||||
## 二、接收位置(客户端)
|
||||
|
||||
### 1. MQTT 订阅
|
||||
|
||||
**位置**: `boss-automation-nodejs/src/services/mqttService.js`
|
||||
|
||||
**订阅时机**: MQTT 连接成功后 (第360行)
|
||||
|
||||
**订阅代码**:
|
||||
```javascript
|
||||
const taskStatusTopic = `task_status_${this.config.snCode}`;
|
||||
this.client.subscribe(taskStatusTopic, { qos: 1 });
|
||||
```
|
||||
|
||||
### 2. 消息处理
|
||||
|
||||
**位置**: `boss-automation-nodejs/src/services/mqttService.js`
|
||||
|
||||
**处理方法**: `handleMessage` (第292行)
|
||||
|
||||
**处理逻辑**:
|
||||
- 如果 `action === 'task_status_update'`:
|
||||
- 发送到渲染进程: `task:status-update`
|
||||
|
||||
- 如果 `action === 'task_status_summary'`:
|
||||
- 发送到渲染进程: `task:status-summary`
|
||||
|
||||
### 3. 渲染进程接收
|
||||
|
||||
**位置**: `boss-automation-nodejs/app/mixins/taskMixin.js`
|
||||
|
||||
**方法**:
|
||||
- `onTaskStatusUpdate(taskData)` - 处理任务状态变更
|
||||
- `onTaskStatusSummary(summary)` - 处理任务状态摘要
|
||||
|
||||
**事件监听**: `boss-automation-nodejs/app/mixins/eventListenerMixin.js`
|
||||
|
||||
## 三、当前推送策略分析
|
||||
|
||||
### ✅ 优点
|
||||
1. **实时性**: 任务状态变更立即推送
|
||||
2. **完整性**: 定时推送完整的状态摘要
|
||||
3. **可靠性**: 只向在线设备推送,避免资源浪费
|
||||
|
||||
### ⚠️ 潜在问题
|
||||
1. **推送频率**: 定时任务每10秒推送一次,可能过于频繁
|
||||
2. **重复推送**: 任务状态变更和定时摘要可能推送重复信息
|
||||
3. **推送时机**: 某些关键状态变更可能没有及时推送(如进度更新)
|
||||
|
||||
## 四、建议的优化方案
|
||||
|
||||
### 方案1: 减少定时推送频率
|
||||
- 当前: 每10秒推送一次
|
||||
- 建议: 改为每30秒或60秒推送一次
|
||||
- 理由: 任务状态变更已实时推送,定时推送主要用于同步完整状态
|
||||
|
||||
### 方案2: 只在关键时机推送摘要
|
||||
- 任务队列变化时推送(新增/删除任务)
|
||||
- 当前任务完成/失败时推送
|
||||
- 定时推送作为兜底(频率降低)
|
||||
|
||||
### 方案3: 合并推送
|
||||
- 将任务状态变更和摘要合并为一个消息
|
||||
- 减少消息数量,提高效率
|
||||
|
||||
### 方案4: 添加进度更新推送
|
||||
- 任务执行过程中,定期推送进度更新
|
||||
- 例如:每完成10%进度推送一次
|
||||
|
||||
## 五、需要推送的场景建议
|
||||
|
||||
### ✅ 必须推送的场景
|
||||
1. **任务开始执行** - 立即推送状态变更
|
||||
2. **任务完成** - 立即推送状态变更 + 状态摘要
|
||||
3. **任务失败** - 立即推送状态变更 + 状态摘要
|
||||
4. **任务队列变化** - 新增/删除任务时推送摘要
|
||||
|
||||
### ⚠️ 可选推送的场景
|
||||
1. **进度更新** - 每10%或每完成一个步骤推送一次
|
||||
2. **定时同步** - 作为兜底,频率降低到30-60秒
|
||||
|
||||
### ❌ 不需要推送的场景
|
||||
1. **任务状态未变化** - 避免重复推送相同状态
|
||||
2. **设备离线** - 不向离线设备推送
|
||||
|
||||
453
_doc/公司xinxi.md
453
_doc/公司xinxi.md
@@ -1,453 +0,0 @@
|
||||
序号 证券代码 公司中文名称 注册地址 公司电话 公司电子邮件地址 公司网站
|
||||
1 300890.SZ 上海市翔丰华科技股份有限公司 上海市宝山区萧云路635弄11号一层 86-21-66566217 public@xfhinc.com www.xiangfenghua.com
|
||||
2 000863.SZ 三湘印象股份有限公司 上海市杨浦区逸仙路333号501室 86-21-65364018 sxgf000863@sxgf.com www.sxgf.com
|
||||
3 001266.SZ 上海宏英智能科技股份有限公司 上海市嘉定区真南路4268号2幢J11387室 86-21-37829918 info@smartsh.com;smart@smartsh.com www.smartsh.com
|
||||
4 002022.SZ 上海科华生物工程股份有限公司 上海市徐汇区钦州北路1189号 86-21-64954576 kehua@skhb.com www.skhb.com
|
||||
5 002028.SZ 思源电气股份有限公司 上海市闵行区金都路4399号 86-21-61610958 IR@SIEYUAN.COM www.sieyuan.com
|
||||
6 002058.SZ 上海威尔泰工业自动化股份有限公司 上海市闵行区虹中路263号1幢 86-21-64656828 dm@welltech.com.cn;dm@welleteh.com.cn www.welltech.cn
|
||||
7 002116.SZ 中国海诚工程科技股份有限公司 上海市徐汇区宝庆路21号 86-21-64314018 haisum@haisum.com www.haisum.com
|
||||
8 002158.SZ 上海汉钟精机股份有限公司 上海市金山区枫泾镇建贡路108号 86-21-57350280*1005,86-21-57350280*1132,86-21-57350280*1131 IR@hanbell.cn;amywu@hanbell.cn;gracechiu@hanbell.cn www.hanbell.com.cn
|
||||
9 002162.SZ 上海悦心健康集团股份有限公司 上海市闵行区浦江镇三鲁公路2121号 86-21-54333699 zqb@cimic.com www.everjoyhealth.com
|
||||
10 002178.SZ 上海延华智能科技(集团)股份有限公司 上海市普陀区西康路1255号6楼602 86-21-61818686*309 yanhua_sh@126.com www.chinaforwards.com
|
||||
11 002184.SZ 上海海得控制系统股份有限公司 上海市闵行区新骏环路777号 86-21-60572990 002184@hite.com.cn www.hite.com.cn
|
||||
12 002195.SZ 上海岩山科技股份有限公司 上海市自由贸易试验区张江路665号三层 86-21-64822345,86-21-61462195 stock@stonehill-tech.com www.stonehill-tech.com
|
||||
13 002211.SZ 上海宏达新材料股份有限公司 上海市闵行区春常路18号1幢2层A区 86-21-64036071 hongda@002211sh.com;wangyanjie@002211sh.com;huanglei@002211sh.com www.002211sh.com
|
||||
14 002252.SZ 上海莱士血液制品股份有限公司 上海市奉贤区望园路2009号 86-21-22130888*217 raas@raas-corp.com www.raas-corp.com
|
||||
15 002269.SZ 上海美特斯邦威服饰股份有限公司 上海市浦东新区康桥东路800号 86-21-38119999,86-21-68182996 Corporate@metersbonwe.com corp.metersbonwe.com
|
||||
16 002278.SZ 上海神开石油化工装备股份有限公司 上海市闵行区浦星公路1769号 86-21-64293895 skdb@shenkai.com www.shenkai.com
|
||||
17 002324.SZ 上海普利特复合材料股份有限公司 上海市青浦区赵巷镇沪青平公路2855弄1号12楼 86-21-31115910 dsh@pret.com.cn;chumh@pret.com.cn;yangfan@pret.com.cn;caiq@pret.com.cn www.pret.com.cn
|
||||
18 002328.SZ 上海新朋实业股份有限公司 上海市青浦区华新镇华隆路1698号 86-21-31166512 xinpengstock@xinpeng.com www.xinpeng.com
|
||||
19 002346.SZ 上海柘中集团股份有限公司 上海市奉贤区联合北路215号第5幢2501室 86-21-57403737 lilizhuan@zhezhong.com;yangyifei@zhezhong.com www.zhezhong.com
|
||||
20 002401.SZ 中远海运科技股份有限公司 上海市浦东新区沈家弄路738号 86-21-65969398 yu.jianzhong@coscoshipping.com;ma.chi@coscoshipping.com tech.coscoshipping.com
|
||||
21 002451.SZ 上海摩恩电气股份有限公司 上海市浦东新区江山路2829号 86-21-58979608 investor@mornelectric.com;huangsz@mornelectric.com www.mornelectric.com
|
||||
22 002454.SZ 上海加冷松芝汽车空调股份有限公司 上海市闵行区莘庄工业区华宁路4999号 86-21-52634750,86-21-52634750*1602 shstock@shsongz.com.cn;chenrui@shsongz.com www.shsongz.com.cn
|
||||
23 002486.SZ 上海嘉麟杰纺织品股份有限公司 上海市金山区亭林镇亭枫公路1918号 86-10-63541462 investor@challenge-21c.com;jljzqb@challenge-21c.com www.challenge-21c.com
|
||||
24 002506.SZ 协鑫集成科技股份有限公司 上海市奉贤区南桥镇江海经济园区 86-512-69832889 gclsizqb@gclsi.com www.gclsi.com
|
||||
25 002527.SZ 上海新时达电气股份有限公司 上海市嘉定区思义路1560号 86-21-69926000,86-21-69896737 liujing@stepelectric.com;step@stepelectric.com;wanzx@stepelectric.com www.stepelectric.com
|
||||
26 002561.SZ 上海徐家汇商城股份有限公司 上海市徐汇区肇嘉浜路1068号 86-21-64269991,86-21-64269999 xjh@xjh-sc.com;xu3958@sina.com;xyq@xjh-sc.com www.xjh-sc.com
|
||||
27 002565.SZ 上海顺灏新材料科技股份有限公司 上海市普陀区真陈路200号 86-21-66278702 investor@shunhostock.com;duyunbo@shunhostock.com;zhouxiaofeng@shunhostock.com www.shunhostock.com
|
||||
28 002568.SZ 上海百润投资控股集团股份有限公司 上海市浦东新区康桥工业区康桥东路558号 86-21-58160073 Bairun@bairun.net;Chen.wang@bairun.net;Jiajie.tang@bairun.net www.bairun.net
|
||||
29 002605.SZ 上海姚记科技股份有限公司 上海市嘉定区黄渡镇曹安路4218号 86-21-53308852,86-21-69595008 secretarybd@yaojipoker.com;ir@yaoji.cn www.yaojikeji.com
|
||||
30 002636.SZ 金安国纪集团股份有限公司 上海市松江区工业区宝胜路33号 86-21-57747138 gdmir@goldenmax.cn www.goldenmax.cn
|
||||
31 002669.SZ 康达新材料(集团)股份有限公司 上海市奉贤区雷州路169号 86-21-50770196,86-21-50779159 kdxc@shkdchem.com www.shkdchem.com
|
||||
32 002706.SZ 上海良信电器股份有限公司 上海市浦东新区申江南路2000号 86-21-68586651,86-21-68586632 wangrui22629@sh-liangxin.com;chengqiugao@sh-liangxin.com www.sh-liangxin.com
|
||||
33 002825.SZ 上海纳尔实业股份有限公司 上海市浦东新区新场镇新瀚路26号 86-21-31272888 ir@nar.com.cn;qiyan@nar.com.cn www.nar.com.cn
|
||||
34 002858.SZ 力盛云动(上海)体育科技股份有限公司 上海市松江区佘山镇沈砖公路3000号 86-21-62418755 ir@lsaisports.com;panyujie@lsaisports.com www.lsaisports.com
|
||||
35 300008.SZ 天海融合防务装备技术股份有限公司 上海市松江区莘砖公路518号10幢8层 86-21-60859800*9374,86-21-60859800*9837,86-21-60859745 public@bestwaysh.com;luyingying@bestwaysh.com;dongwenjie@bestwaysh.com www.bestwaysh.com
|
||||
36 300017.SZ 网宿科技股份有限公司 上海市嘉定区环城路200号 86-21-64685982 wangsudmb@wangsu.com www.wangsu.com
|
||||
37 300039.SZ 上海凯宝药业股份有限公司 上海市奉贤区工业综合开发区程普路88号 86-21-37572069 kbyydmb@126.com www.xykb.com
|
||||
38 300059.SZ 东方财富信息股份有限公司 上海市嘉定区宝安公路2999号1幢 86-21-54660526 dongmi@eastmoney.com www.eastmoney.com
|
||||
39 300061.SZ 旗天科技集团股份有限公司 上海市金山区山阳镇亭卫公路1000号2幢203室 86-21-60975620 investor@qt300061.com www.qt300061.com
|
||||
40 300067.SZ 上海安诺其集团股份有限公司 上海市青浦区工业园区菘华路881号 86-21-59867500 investor@anoky.com.cn www.anoky.com.cn
|
||||
41 300074.SZ 华平信息技术股份有限公司 上海市杨浦区国权北路1688弄A6座 86-21-65650210 ir@avcon.com.cn www.avcon.com.cn
|
||||
42 300126.SZ 锐奇控股股份有限公司 上海市松江区新桥镇新茸路5号 86-21-57825832 300126@china-ken.com www.ken-tools.com
|
||||
43 300129.SZ 泰胜风能集团股份有限公司 上海市金山区卫清东路1988号 86-21-57243692 liweitao@shtsp.com;ir@shtsp.com;chenjie@shtsp.com;chenyiyao@shtsp.com www.shtsp.com
|
||||
44 300153.SZ 上海科泰电源股份有限公司 上海市青浦区张江高新区青浦园天辰路1633号 86-21-69758019,86-21-69758012 irm@cooltechsh.com;xukun@cooltechsh.com;dengjie@cooltechsh.com www.cooltechsh.com
|
||||
45 300168.SZ 万达信息股份有限公司 上海市徐汇区桂平路481号20号楼5层 86-21-62489636 invest@wondersgroup.com www.wondersgroup.com
|
||||
46 300170.SZ 上海汉得信息技术股份有限公司 上海市青浦区汇联路33号 86-21-50177372,86-21-67002300 investors@vip.hand-china.com www.hand-china.com
|
||||
47 300171.SZ 东富龙科技集团股份有限公司 上海市闵行区都会路1509号4幢 86-21-64909699 dfl@tofflon.com www.tofflon.com
|
||||
48 300180.SZ 上海华峰超纤科技股份有限公司 上海市金山区亭卫南路888号 86-21-57243140 fu.juan@huafeng.com;chu.yuxi@huafeng.com microfibre.huafeng.com
|
||||
49 300222.SZ 科大智能科技股份有限公司 上海市松江区泗砖路777号1幢503室 86-21-50804882 kdzn@csg.com.cn;mjb@csg.com.cn www.csg.com.cn
|
||||
50 300225.SZ 上海金力泰化工股份有限公司 上海市奉贤区楚工路139号 86-21-31156097 knttzxx@knt.cn www.knt.cn
|
||||
51 300226.SZ 上海钢联电子商务股份有限公司 上海市宝山区园丰路68号 86-21-26093997 public@mysteel.com about.mysteel.com
|
||||
52 300230.SZ 上海永利带业股份有限公司 上海市青浦区徐泾镇徐旺路58号 86-21-59884061 yongli@yonglibelt.com;ycl@yonglibelt.com;zhongmm@yonglibelt.com www.yonglibelt.com
|
||||
53 300236.SZ 上海新阳半导体材料股份有限公司 上海市松江区思贤路3600号 86-21-57850066 info@sinyang.com.cn www.sinyang.com.cn
|
||||
54 300245.SZ 上海天玑科技股份有限公司 上海市闵行区田林路1016号6号楼 86-21-54278888 public@dnt.com.cn www.dnt.com.cn
|
||||
55 300253.SZ 卫宁健康科技集团股份有限公司 上海市浦东新区东育路255弄4号3楼B29 86-21-80331033 wndsh@winning.com.cn www.winning.com.cn
|
||||
56 300257.SZ 开山集团股份有限公司 上海市自由贸易试验区临港新片区飞渡路851号 86-570-3662177,86-21-62261893 zqtzb@kaishangroup.com;yang.jianjun@kaishangroup.com;wan.shiqi@kaishangroup.com www.kaishancomp.com
|
||||
57 300272.SZ 开能健康科技集团股份有限公司 上海市浦东新区川沙镇川大路508,518号 86-21-58599901 dongmiban@canature.com www.canature.com
|
||||
58 300286.SZ 安科瑞电气股份有限公司 上海市嘉定区育绿路253号 86-21-69158331 acrel@acrel.cn www.acrel.cn
|
||||
59 300326.SZ 上海凯利泰医疗科技股份有限公司 上海市浦东新区张江高科技园东区瑞庆路528号23幢 86-21-50728758 KMC@shkmc.com.cn;mengchensun@shkmc.com.cn www.kineticmedinc.com.cn
|
||||
60 300327.SZ 中颖电子股份有限公司 上海市长宁区金钟路767弄3号 86-21-61219988,86-21-61219988*1688 ir@sinowealth.com;dpsino168@126.com;jxsino327@126.com www.sinowealth.com
|
||||
61 300378.SZ 鼎捷数智股份有限公司 上海市静安区江场路1377弄绿地中央广场7号20层 86-21-51791699 digiwin-zhengquan@digiwin.com www.digiwin.com
|
||||
62 300380.SZ 上海安硕信息技术股份有限公司 上海市杨浦区国泰路11号2308室 86-21-55137223 ir@amarsoft.com www.amarsoft.com
|
||||
63 300398.SZ 上海飞凯材料科技股份有限公司 上海市宝山区潘泾路2999号 86-21-50322662 investor@phichem.com.cn www.phichem.com.cn
|
||||
64 300462.SZ 上海华铭智能终端设备股份有限公司 上海市松江区茸梅路895号 86-21-57784382,86-21-57784382*288 hmzn300462@hmmachine.com www.hmmachine.com
|
||||
65 300483.SZ 首华燃气科技(上海)股份有限公司 上海市闵行区元江路5000号 86-21-58831588,86-10-52253050 db@primagas.com.cn;qian.zhang@primagas.com.cn;zhulin.wang@primagas.com.cn www.primagas.com.cn
|
||||
66 300493.SZ 上海润欣科技股份有限公司 上海市徐汇区田林路200号A号楼301室 86-21-54264260 investment@fortune-co.com www.fortune-co.com
|
||||
67 300501.SZ 上海海顺新型药用包装材料股份有限公司 上海市松江区莘砖公路3456弄 86-21-37017626,86-21-37667766 ir@hysum.com;zhengquan@haishunpackaging.com;zhengquan@hysum.com www.hysum.com
|
||||
68 300508.SZ 上海维宏电子科技股份有限公司 上海市闵行区都会路975弄119号1幢501室 86-21-33587515 weihongzq@weihong.com.cn www.weihong.com.cn
|
||||
69 300511.SZ 上海雪榕生物科技股份有限公司 上海市奉贤区汇丰西路1487号 86-21-37198681 xrtz@xuerong.com www.xuerong.com
|
||||
70 300551.SZ 上海古鳌电子科技股份有限公司 上海市普陀区同普路1225弄6号 86-21-22252595 ir@gooao.cn www.gooao.cn
|
||||
71 300578.SZ 上海会畅通讯股份有限公司 上海市金山区吕巷镇红光路4200-4201号2757室 86-21-61321868,86-21-60716636,86-21-60716686 BDoffice@bizconf.cn www.bizconf.cn
|
||||
72 300590.SZ 上海移为通信技术股份有限公司 上海市闵行区新龙路500弄30号 86-21-54450318 stock@queclink.com www.queclink.com
|
||||
73 300609.SZ 汇纳科技股份有限公司 上海市浦东新区中国(上海)自由贸易试验区川和路55弄6号 86-21-60220636,86-21-31759693 sadep@winnerinf.com www.winnerinf.com
|
||||
74 300613.SZ 上海富瀚微电子股份有限公司 上海市徐汇区宜山路717号6楼 86-21-64066786,86-21-61121558,86-21-64066785 stock@fullhan.com www.fullhan.com
|
||||
75 300627.SZ 上海华测导航技术股份有限公司 上海市青浦区徐泾镇高泾路599号C座(一照多址企业) 86-21-64950939 huace@huace.cn www.huace.cn
|
||||
76 300642.SZ 上海透景生命科技股份有限公司 上海市浦东新区汇庆路412号 86-21-50495115 info@tellgen.com www.tellgen.com
|
||||
77 300762.SZ 上海瀚讯信息技术股份有限公司 上海市嘉定区鹤友路258号 86-21-62386622,86-21-32510369 Info_disclosure@jushri.com www.jushri.com
|
||||
78 300802.SZ 上海矩子科技股份有限公司 上海市徐汇区云锦路701号33层3301单元(实际29层) 86-21-64969730 investors@jutze.com.cn www.jutze.com.cn
|
||||
79 300892.SZ 品渥食品股份有限公司 上海市松江区佘山镇新宅路777弄3号 86-21-51863006 securities@pinlive.com www.pinlive.com
|
||||
80 300899.SZ 上海凯鑫分离技术股份有限公司 上海市浦东新区中国(上海)自由贸易试验区张江路665号3层 86-21-58988820 shkx@keysino.cn www.keysinosep.com
|
||||
81 300915.SZ 上海海融食品科技股份有限公司 上海市奉贤区金汇镇金斗路666号 86-21-37560135 hrkj@hiroad.sh.cn www.hiroad.sh.cn
|
||||
82 300947.SZ 上海德必文化创意产业发展(集团)股份有限公司 上海市长宁区安化路492号1幢707室 86-21-60701389 sec@dobechina.com www.dobechina.com
|
||||
83 300963.SZ 上海中洲特种合金材料股份有限公司 上海市嘉定工业区世盛路580号 86-21-59966058 zhz@shzztc.com;wyj@shzztc.com;gjy@shzztc.com www.alloy-china.com
|
||||
84 300983.SZ 上海尤安建筑设计股份有限公司 上海市宝山区一二八纪念路968号1618室 86-21-35324001 uachina@uachina.com.cn www.uachina.com.cn
|
||||
85 300999.SZ 益海嘉里金龙鱼食品集团股份有限公司 上海市浦东新区中国(上海)自由贸易试验区博成路1379号15层 86-21-31823188 jinlongyu_ir@cn.wilmar-intl.com www.yihaikerry.net.cn
|
||||
86 301000.SZ 上海肇民新材料科技股份有限公司 上海市金山区金山卫镇秦弯路633号 86-21-57930288 stock@hps-sh.com www.hps-sh.com
|
||||
87 301001.SZ 上海凯淳实业股份有限公司 上海市金山工业区天工路857号2幢2401室 86-21-55080030 IR@kaytune.com www.kaytune.com
|
||||
88 301005.SZ 超捷紧固系统(上海)股份有限公司 上海市嘉定区丰硕路100弄39号 86-21-59907242 lihongtao@shchaojie.com.cn;liss@shchaojie.com.cn www.shchaojie.com.cn
|
||||
89 301024.SZ 上海霍普建筑设计事务所股份有限公司 上海市浦东新区中国(上海)自由贸易试验区滨江大道469号中企财富世纪大厦5层,10层(实际楼层4层,9层) 86-21-58783137 ir@hyp-arch.com www.hyp-arch.com
|
||||
90 301025.SZ 读客文化股份有限公司 上海市金山区枫泾镇枫湾路531,535号1幢1层103室 86-21-33608311 stock@dookbook.com;wangkun@dookbook.com;liubaorui@dookbook.com www.dookbook.com
|
||||
91 301037.SZ 上海保立佳化工股份有限公司 上海市奉贤区泰日镇大叶公路6828号 86-21-31167902 dongban@baolijia.com.cn www.baolijia.com.cn
|
||||
92 301046.SZ 上海能辉科技股份有限公司 上海市普陀区金通路799,899,999号17幢3层307室 86-21-50896255 nenghui@nhet.com.cn;luolianming@nhet.com.cn;yangjing@nhet.com.cn www.nhet.com.cn
|
||||
93 301060.SZ 上海兰卫医学检验所股份有限公司 上海市长宁区临新路268弄1号楼4-9层 86-21-31778162 labway@labway.cn www.labway.cn
|
||||
94 301062.SZ 上海艾录包装股份有限公司 上海市金山区山阳镇阳乐路88号 86-21-57293030*6507 info@ailugroup.com www.ailugroup.com
|
||||
95 301070.SZ 开勒环境科技(上海)股份有限公司 上海市松江区新桥镇新格路505号3幢2楼南5区 86-21-57685221 kaledongmi@kalefans.com www.kalefans.com
|
||||
96 301099.SZ 上海雅创电子集团股份有限公司 上海市闵行区春光路99弄62号2-3楼及402-405室 86-21-51866509,86-21-51516111*8033 security@yctexin.com www.yctexin.com
|
||||
97 301151.SZ 上海冠龙阀门节能设备股份有限公司 上海市嘉定区南翔镇德园路815号 86-21-31229378 investor@karon-valve.com www.karon-valve.com
|
||||
98 301156.SZ 上海美农生物科技股份有限公司 上海市嘉定区沥红路151号 86-21-59546881 mnsw@sinomenon.com www.sinomenon.com
|
||||
99 301161.SZ 上海唯万密封科技股份有限公司 上海市浦东新区龙东大道6111号1幢2层B216室 86-21-68184680 voneseals@voneseals.com;yuxin_wang@voneseals.com www.voneseals.com
|
||||
100 301166.SZ 上海优宁维生物科技股份有限公司 上海市杨浦区控江路1690号1505室 86-21-38939097,86-21-38939070 ir@univ-bio.com www.univ-bio.com
|
||||
101 301228.SZ 实朴检测技术(上海)股份有限公司 上海市闵行区中春路1288号34幢3层301室,4层401室 86-21-64881367 IR@sepchina.cn www.sepchina.cn
|
||||
102 301230.SZ 上海泓博智源医药股份有限公司 上海市浦东新区庆达路315号23幢 86-21-50720100 info@pharmaresources.cn www.pharmaresources.cn
|
||||
103 301257.SZ 普蕊斯(上海)医药科技开发股份有限公司 上海市黄浦区思南路105号1号楼108室 86-21-60755800 IR@smo-clinplus.com www.smo-clinplus.com
|
||||
104 301273.SZ 上海瑞晨环保科技股份有限公司 上海市嘉定区申霞路358号3幢C区 86-21-55789678 wanghanze@richenenergy.com;wenya@richenenergy.com www.richenenergy.com.cn
|
||||
105 301289.SZ 上海国缆检测股份有限公司 上海市宝山区真陈路888号 86-21-65493333*2201,86-21-65493333*2612 guolandb@ticw.com.cn www.ticw.com.cn
|
||||
106 301303.SZ 上海真兰仪表科技股份有限公司 上海市青浦区崧达路800号 86-21-31166688,86-21-31167958 info@zenner-metering.com www.zenner-metering.com
|
||||
107 301419.SZ 上海阿莱德实业集团股份有限公司 上海市奉贤区奉炮公路1368号6栋 86-21-56480200 allied@allied-corp.com;zoe.zhou@allied-corp.com;xiafan.li@allied-corp.com www.allied-corp.com
|
||||
108 600000.SH 上海浦东发展银行股份有限公司 上海市黄浦区中山东一路12号 86-21-63611226,86-21-61618888 ligm-hhht@spdb.com.cn;wur2@spdb.com.cn;bdo@spdb.com.cn;zhangj8@spdb.com.cn www.spdb.com.cn
|
||||
109 600009.SH 上海国际机场股份有限公司 上海市浦东新区启航路900号 86-21-68341609 ir@shairport.com www.avinex.com
|
||||
110 600018.SH 上海国际港务(集团)股份有限公司 上海市自由贸易试验区临港新片区同汇路1号综合大楼A区4楼 86-21-55333388 dongmi@portshanghai.com.cn;600018@portshanghai.com.cn www.portshanghai.com.cn
|
||||
111 600019.SH 宝山钢铁股份有限公司 上海市宝山区富锦路885号宝钢指挥中心 86-21-26647000 ir@baosteel.com www.baosteel.com
|
||||
112 600021.SH 上海电力股份有限公司 上海市浦东新区高科西路1号上电大厦 86-21-23108718,86-21-23108800 sepco@shanghaipower.com;shanghaipower@spic.com.cn www.shanghaipower.com
|
||||
113 600026.SH 中远海运能源运输股份有限公司 上海市中国(上海)自由贸易试验区临港新片区业盛路188号A-1015室 86-21-65967678 ir.energy@coscoshipping.com energy.coscoshipping.com
|
||||
114 600061.SH 国投资本股份有限公司 上海市中国(上海)自由贸易试验区北张家浜路128号204-3,204-4,204-5室 86-10-83325163 600061@sdic.com.cn www.sdiccapital.com
|
||||
115 600072.SH 中船科技股份有限公司 上海市杨浦区周家嘴路3255号10楼 86-21-63022385 mail@cssckj.com www.cssckj.com
|
||||
116 600073.SH 上海光明肉业集团股份有限公司 上海市浦东新区川桥路1501号7幢101室 86-21-22866016,86-21-55669312 ml@shanghaimaling.com;ir@shanghaimaling.com;ir@brightmeat.com www.brightmeat.com
|
||||
117 600081.SH 东风电子科技股份有限公司 上海市闵行区浦江镇新骏环路88号13幢203室 86-21-52917811 postmaster@detc.com.cn;zhengming@detc.com.cn;lifei@detc.com.cn;luww@detc.com.cn www.detc.com.cn
|
||||
118 600088.SH 中视传媒股份有限公司 上海市浦东新区福山路450号新天国际大厦17层A座 86-21-68765168 irmanager@ctv-media.com.cn www.ctv-media.com.cn
|
||||
119 600094.SH 上海大名城企业股份有限公司 上海市闵行区红松东路1116号1幢5楼A区 86-21-62478900,86-21-62470088 dmc@greattown.cn;chizhiqiang@greattown.cn;zhangyanqi@greattown.cn www.greattown.cn
|
||||
120 600097.SH 上海开创国际海洋资源股份有限公司 上海市浦东新区外高桥保税区新灵路118号1201A室 86-21-65686875,86-21-65690310 ir@skmic.sh.cn www.skmic.sh.cn
|
||||
121 600104.SH 上海汽车集团股份有限公司 上海市浦东新区中国(上海)自由贸易试验区松涛路563号1号楼509室 86-21-22011138 saicmotor@saic.com.cn www.saicmotor.com
|
||||
122 600115.SH 中国东方航空股份有限公司 上海市浦东新区国际机场机场大道66号 86-21-22330932 ir@ceair.com www.ceair.com
|
||||
123 600119.SH 长发集团长江投资实业股份有限公司 上海市浦东新区中国(上海)自由贸易试验区世纪大道1500号 86-21-66601817,86-21-66601819 cjtzdb@cjtz.cn;shiqinyu@cjtz.cn www.cjtz.cn
|
||||
124 600150.SH 中国船舶工业股份有限公司 上海市浦东新区自由贸易试验区浦东大道1号 86-21-68860618 stock@csscholdings.com;zhangdb@csscholdings.com csscholdings.cssc.net.cn
|
||||
125 600151.SH 上海航天汽车机电股份有限公司 上海市中国(上海)自由贸易试验区浦东新区榕桥路661号 86-21-64827176 saae@ht-saae.com www.ht-saae.com
|
||||
126 600170.SH 上海建工集团股份有限公司 上海市浦东新区中国(上海)自由贸易试验区福山路33号 86-21-35100838,86-21-35318170 sc@china-scg.cn;ir@scg.com.cn www.scg.com.cn
|
||||
127 600171.SH 上海贝岭股份有限公司 上海市徐汇区漕河泾开发区宜山路810号 86-21-24261157 bloffice@belling.com.cn www.belling.com.cn
|
||||
128 600193.SH 上海创兴资源开发股份有限公司 上海市浦东新区康桥路1388号三楼A 86-21-58125999,86-4000960980 cxzy@shprd.cn
|
||||
129 600196.SH 上海复星医药(集团)股份有限公司 上海市普陀区曹杨路510号9楼 86-21-33987870 ir@fosunpharma.com www.fosunpharma.com
|
||||
130 600210.SH 上海紫江企业集团股份有限公司 上海市闵行区莘庄工业区申富路618号 86-21-62377118 zijiangqy@zijiangqy.com;zjqy@zijiangqy.com www.zijiangqy.com
|
||||
131 600272.SH 上海开开实业股份有限公司 上海市静安区新闸路921号201室K02 86-21-62712002 dm@chinesekk.com www.chinesekk.com
|
||||
132 600278.SH 东方国际创业股份有限公司 上海市浦东新区自由贸易试验区张杨路707号2221室 86-21-62789999,86-21-52291197,86-21-52291198,86-21-62785521 oiehq@oie.com.cn www.oie.com.cn
|
||||
133 600284.SH 上海浦东建设股份有限公司 上海市浦东新区自由贸易试验区川桥路701弄3号7楼 86-21-58206677 pdjs600284@pdjs.com.cn;dongmi@pdjs.com.cn;zhengdai@pdjs.com.cn www.pdjs.com.cn
|
||||
134 600315.SH 上海家化联合股份有限公司 上海市虹口区保定路527号 86-21-35907000,86-21-35907666 ir@jahwa.com.cn www.jahwa.com.cn
|
||||
135 600320.SH 上海振华重工(集团)股份有限公司 上海市浦东新区浦东南路3470号 86-21-50390727 IR@ZPMC.COM www.zpmc.com
|
||||
136 600420.SH 上海现代制药股份有限公司 上海市浦东新区建陆路378号 86-21-52372865,86-21-62510990 xd_zhengquanban@sinopharm.com;shyndec@sinopharm.com www.shyndec.com
|
||||
137 600490.SH 鹏欣环球资源股份有限公司 上海市普陀区曹杨路1888弄11号11楼1102室-70 86-21-61679636 600490@pengxinzy.com.cn www.pengxinzy.com.cn
|
||||
138 600500.SH 中化国际(控股)股份有限公司 上海市中国(上海)自由贸易试验区长清北路233号12层 86-21-68373780 600500@sinochem.com www.sinochemintl.com
|
||||
139 600503.SH 华丽家族股份有限公司 上海市奉贤区星火开发区阳明路1号8幢1层105室 86-21-62376199 dmb@deluxe-family.com www.deluxe-family.com
|
||||
140 600508.SH 上海大屯能源股份有限公司 上海市浦东新区中国(上海)自由贸易试验区浦东南路256号 86-21-68864621 sh600508@263.net www.sdtny.com
|
||||
141 600517.SH 国网英大股份有限公司 上海市浦东新区自由贸易试验区国耀路211号C座9层 86-21-51796818 600517@sgcc.com.cn www.gwydgf.com
|
||||
142 600530.SH 上海交大昂立股份有限公司 上海市松江区环城路666号 86-21-54277820,86-21-54277865 stock@mail.onlly.com.cn www.onlly.com.cn
|
||||
143 600597.SH 光明乳业股份有限公司 上海市闵行区吴中路578号 86-21-54584520,86-21-64655801,86-21-64307739 chenzhongjie@brightdairy.com;600597@brightdairy.com www.brightdairy.com
|
||||
144 600601.SH 方正科技集团股份有限公司 上海市南京西路1515号嘉里商务中心9楼 86-21-58400030 IR@founder.com www.foundertech.com
|
||||
145 600602.SH 云赛智联股份有限公司 上海市浦东新区张江高科技园区张衡路200号1号楼2楼 86-21-62980202 webmaster@inesa-it.com;stock@inesa-it.com www.inesa-it.com
|
||||
146 600604.SH 上海市北高新股份有限公司 上海市静安区共和新路3088弄2号1008室 86-21-66528130 zhengquan@shibei.com www.shibeiht.com
|
||||
147 600605.SH 上海汇通能源股份有限公司 上海市浦东新区康桥路1100号 86-21-62560000 securities@huitong-sh.com www.huitongenergy.com
|
||||
148 600606.SH 绿地控股集团股份有限公司 上海市黄浦区打浦路700号 86-21-63600606,86-21-23296400,86-21-23296512 ir@ldjt.com.cn www.ldjt.com.cn
|
||||
149 600608.SH 上海宽频科技股份有限公司 上海市闵行区东川路555号丙楼5110室 86-21-62317066,86-871-64646840 invest@600608.net;yunfeng@600608.net;Zhao_z@600608.net www.600608.net
|
||||
150 600611.SH 大众交通(集团)股份有限公司 上海市徐汇区中山西路1515号大众大厦12楼 86-21-64289122 DZJT@96822.COM;fwj@96822.com WWW.96822.COM
|
||||
151 600612.SH 老凤祥股份有限公司 上海市黄浦区南京西路190号四层,五层 86-21-54480605,86-21-64833388*608 lfx600612@lfxgf.com;legal@lfxgf.com www.laofengxiang.com
|
||||
152 600613.SH 上海神奇制药投资管理股份有限公司 上海市浦东新区上川路995号 86-21-53750009 shanghaiys@126.com www.gzsq.com
|
||||
153 600616.SH 上海金枫酒业股份有限公司 上海市浦东新区张杨路579号(三鑫大厦内) 86-21-58352625,86-21-50812727*908 lily@jinfengwine.com;lqc@jinfengwine.com;jfjy@jinfengwine.com www.jinfengwine.com
|
||||
154 600618.SH 上海氯碱化工股份有限公司 上海市金山区化学工业区神工路200号 86-21-23536618 dshmss@scacc.com;Chenlihua_lj@shhuayi.com;yubin@shhuayi.com www.scacc.com
|
||||
155 600619.SH 上海海立(集团)股份有限公司 上海市中国(上海)自由贸易试验区宁桥路888号 86-21-58547777,86-21-58547618 luomin@highly.cc;yanghh@highly.cc;heartfelt@highly.cc www.highly.cc
|
||||
156 600620.SH 上海市天宸股份有限公司 上海市长宁区延安西路2067号29楼 86-21-62782233 tc@shstc.com;fuyunfei@shstc.com;xuxuyu@shstc.com www.shstc.com
|
||||
157 600621.SH 上海华鑫股份有限公司 上海市徐汇区云锦路277号20层 86-21-54967663,86-21-54967667 huzk@shchinafortune.com;shfc@shchinafortune.com;zhangjt@shchinafortune.com www.shchinafortune.com
|
||||
158 600622.SH 光大嘉宝股份有限公司 上海市嘉定区清河路55号6-7F 86-21-59529711 600622@ebjb.com www.ebjb.com
|
||||
159 600623.SH 上海华谊集团股份有限公司 上海市静安区常德路809号 86-21-23530152 IR@shhuayi.com;jupei@shhuayi.com www.doublecoinholdings.com
|
||||
160 600624.SH 上海复旦复华科技股份有限公司 上海市奉贤区汇丰北路1515弄1号2幢107室 86-21-63872288 forward@forwardgroup.com www.forwardgroup.com
|
||||
161 600626.SH 上海申达股份有限公司 上海市中国(上海)自由贸易试验区世博村路231号2单元3层328室 86-21-62328282 600626@sh-shenda.com www.sh-shenda.com
|
||||
162 600628.SH 上海新世界股份有限公司 上海市黄浦区南京西路2-88号 86-21-63871786 xsjhuyi@163.com;newworld@newworld-china.com;wwt26@163.com www.newworld-china.com
|
||||
163 600629.SH 华东建筑集团股份有限公司 上海市黄浦区汉口路151号 86-21-62464018,86-21-52524567 ir@arcplus.com.cn www.arcplus.com.cn
|
||||
164 600630.SH 上海龙头(集团)股份有限公司 上海市黄浦区制造局路584号8号楼2楼201室 86-21-58128888,86-21-63159108,86-21-34061116 ltdsh@shanghaidragon.com.cn;longtou@shanghaidragon.com.cn www.shanghaidragon.com.cn
|
||||
165 600635.SH 上海大众公用事业(集团)股份有限公司 上海市中国(上海)自由贸易试验区浦东新区商城路518号 86-21-64280679,86-21-64288698 dmbstock@dzug.cn www.dzug.cn
|
||||
166 600636.SH 国新文化控股股份有限公司 上海市闵行区龙吴路4411号 86-10-68313202 bod@crhc.cn www.crhc-culture.com
|
||||
167 600637.SH 东方明珠新媒体股份有限公司 上海市徐汇区宜山路757号 86-21-33396637 dongban@opg.cn www.opg.cn
|
||||
168 600638.SH 上海新黄浦实业集团股份有限公司 上海市黄浦区北京东路668号东楼32层 86-21-63238888 stock@600638.com;600638@600638.com www.600638.com
|
||||
169 600639.SH 上海金桥出口加工区开发股份有限公司 上海市自由贸易试验区新金桥路28号 86-21-50307702 jqir@shpdjq.com www.shpdjq.com
|
||||
170 600640.SH 新国脉数字文化股份有限公司 上海市普陀区江宁路1207号4,18,20-21楼 86-21-62762171 600640@chinatelecom.cn www.new-gm.cn
|
||||
171 600641.SH 上海先导基电科技股份有限公司 中国(上海)自由贸易试验区浦明路1500号12层(名义楼层15层) 86-21-50367718 info@600641.com.cn www.600641.com.cn
|
||||
172 600642.SH 申能股份有限公司 上海市闵行区虹井路159号5楼 86-21-33570888,86-21-63900642 zhengquan@shenergy.com.cn www.shenergy.net.cn
|
||||
173 600643.SH 上海爱建集团股份有限公司 上海市浦东新区泰谷路168号 86-21-64396600 dongmi@aj.com.cn;xinfang@aj.com.cn www.aj.com.cn
|
||||
174 600648.SH 上海外高桥集团股份有限公司 上海市浦东新区杨高北路889号 86-21-51980848,86-21-51980806 gudong@shwgq.cn;gudong@wgq.cn www.china-ftz.com
|
||||
175 600649.SH 上海城投控股股份有限公司 上海市浦东新区北艾路1540号 86-21-66981171,86-21-66981376 ctkg@600649sh.com www.sh600649.com
|
||||
176 600650.SH 上海锦江在线网络服务股份有限公司 上海市中国(上海)自由贸易试验区浦东大道1号 86-21-63218800 shenyun@jinjiangonline.com;IR@jinjiangonline.com www.jinjiangonline.com
|
||||
177 600651.SH 上海飞乐音响股份有限公司 上海市嘉定区嘉新公路1001号第七幢 86-21-61549299 office@facs.com.cn www.facs.com.cn
|
||||
178 600655.SH 上海豫园旅游商城(集团)股份有限公司 上海市黄浦区复兴东路2号1幢1111室 86-21-23029999,86-21-23028571 obd@yuyuantm.com.cn www.yuyuantm.com.cn
|
||||
179 600661.SH 上海新南洋昂立教育科技股份有限公司 上海市徐汇区淮海西路55号11C 86-21-62818544,86-21-62811383 yangxiaoling@onlyedu.com;tzzrx@onlyedu.com;xujingyun@onlyedu.com www.onlyedu.com
|
||||
180 600662.SH 上海外服控股集团股份有限公司 上海市中国(上海)自由贸易试验区张杨路655号707室 86-21-65670587 ir@fsg.com.cn;Jenny.yu@fsg.com.cn;haiyuan.zhu@fsg.com.cn www.fsg.com.cn
|
||||
181 600663.SH 上海陆家嘴金融贸易区开发股份有限公司 上海市中国(上海)自由贸易试验区浦东大道981号 86-21-33848801 invest@ljz.com.cn www.ljz.com.cn
|
||||
182 600675.SH 中华企业股份有限公司 上海市静安区华山路2号 86-21-20772222,86-21-20772700,86-21-20770176 zhqydm@cecl.com.cn;zhqy@cecl.com.cn www.cecl.com.cn
|
||||
183 600676.SH 上海交运集团股份有限公司 上海市浦东新区曹路工业园区民冬路239号 86-21-63172168,86-21-63178257 jygf@sh163.net www.cnsjy.com
|
||||
184 600679.SH 上海凤凰企业(集团)股份有限公司 上海市金山区金山工业区开乐大街158号6号楼 86-21-32795679,86-21-32795689 master@phoenix.com.cn;zpc@phoenix.com.cn;mw@phoenix.com.cn www.phoenix.com.cn
|
||||
185 600688.SH 中国石化上海石油化工股份有限公司 上海市金山区金一路48号 86-21-57943143,86-21-57933728 spc@spc.com.cn;yuguangxian@spc.com.cn;liugang@spc.com.cn;huanglixin@spc.com.cn www.spc.com.cn
|
||||
186 600689.SH 上海三毛企业(集团)股份有限公司 上海市浦东新区自由贸易试验区浦东大道1476号,1482号1401-1415室 86-21-63059496,86-21-63028180 wuxy@600689.com;sanmaogroup@600689.com;zhouzy@600689.com;hegy@600689.com www.600689.com
|
||||
187 600692.SH 上海亚通股份有限公司 上海市崇明区城桥镇八一路1号 86-21-69695918,86-21-69692618 leibnize@126.com;yt69692618@126.com;ytgfwhl@163.com www.shanghaiyatong.com
|
||||
188 600696.SH 上海贵酒股份有限公司 上海市奉贤区南桥镇沪发路65弄1号 86-851-22292688,86-851-22276618 IRM600696@163.com www.sh600696.com
|
||||
189 600708.SH 光明房地产集团股份有限公司 上海市中国(上海)自由贸易试验区临港新片区丽正路1628号9幢2层A-75室 86-21-32211128,86-21-61102888 zhengchao@bre600708.com;tzzrx@bre600708.com;supengcheng@bre600708.com www.bre600708.com
|
||||
190 600732.SH 上海爱旭新能源股份有限公司 上海市浦东新区秋月路26号4幢201-1室 86-579-85912509 IR@aikosolar.com www.aikosolar.com
|
||||
191 600741.SH 华域汽车系统股份有限公司 上海市静安区威海路489号 86-21-23102080 huayuqiche@hasco-group.com www.hasco-group.com
|
||||
192 600748.SH 上海实业发展股份有限公司 上海市中国(上海)自由贸易试验区浦东南路1085号华申大厦六楼 86-21-53858686 sid748@sidlgroup.com www.sidlgroup.com
|
||||
193 600754.SH 上海锦江国际酒店股份有限公司 中国(上海)自由贸易试验区杨高南路889号东锦江大酒店商住楼四层(B区域) 86-21-63217132 JJIR@jinjianghotels.com www.jinjianghotels.sh.cn
|
||||
194 600816.SH 建元信托股份有限公司 上海市杨浦区控江路1553号-1555号A座301室 86-21-63410710 600816@j-yuantrust.com www.j-yuantrust.com
|
||||
195 600818.SH 中路股份有限公司 上海市浦东新区南六公路818号 86-21-52860258 600818@zhonglu.com.cn www.zhonglu.com.cn
|
||||
196 600819.SH 上海耀皮玻璃集团股份有限公司 上海市中国(上海)自由贸易试验区张东路1388号4-5幢 86-21-61633599*2041,86-21-61633599*2237 stock@sypglass.com www.sypglass.com
|
||||
197 600820.SH 上海隧道工程股份有限公司 上海市徐汇区宛平南路1099号 86-21-65419590 stecodd@stec.net;600820@stec.net www.stec.net
|
||||
198 600822.SH 上海物资贸易股份有限公司 上海市黄浦区南苏州路325号7楼 86-21-63231818 600822@shwuzi.com;600822@shwmgf.com www.600822sh.com
|
||||
199 600824.SH 上海益民商业集团股份有限公司 上海市黄浦区淮海中路809号甲七楼 86-21-64339888 yimin@yimingroup.com www.yimingroup.com
|
||||
200 600825.SH 上海新华传媒股份有限公司 上海市闵行区剑川路951号5号楼1层西侧 86-21-60376284 xhcmpublic@xhmedia.com www.xhmedia.com
|
||||
201 600826.SH 东浩兰生会展集团股份有限公司 上海市浦东新区陆家嘴东路161号2602室 86-21-63366287,86-21-63366275,86-21-63366298 stock@dlg-expo.com;zhangrongjian@dlg-expo.com;yujingyun@dlg-expo.com www.dlg-expo.com
|
||||
202 600827.SH 上海百联集团股份有限公司 上海市浦东新区张杨路501号11楼1101室 86-21-63223344,86-21-63229537 blgf600827@bl.com www.bailian.sh.cn
|
||||
203 600833.SH 上海第一医药股份有限公司 上海市黄浦区南京东路616号 86-21-64337282 shcred@online.sh.cn shdyyy.com.cn
|
||||
204 600834.SH 上海申通地铁股份有限公司 上海市中国(上海)自由贸易试验区浦电路489号 86-21-54259953,86-21-54259971 600834@shtmetro.com;sunsihui@shtmetro.com;zhuying@shtmetro.com www.shtmetro.com
|
||||
205 600835.SH 上海机电股份有限公司 上海市浦东新区北张家浜路128号 86-21-68547168 shjddm@chinasec.cn;xhh@chinasec.cn;sec@chinasec.cn www.chinasec.cn
|
||||
206 600838.SH 上海九百股份有限公司 上海市静安区愚园路300号6楼D室 86-21-62569866,86-21-62569829,86-21-62729898*838 shjb838@shjb600838.com www.shjb600838.com
|
||||
207 600841.SH 上海新动力汽车科技股份有限公司 上海市杨浦区军工路2636号 86-21-60652207 snatdsh@snat.com www.snat.com
|
||||
208 600843.SH 上工申贝(集团)股份有限公司 上海市中国(上海)自由贸易试验区世纪大道1500号东方大厦12楼A-D室 86-21-68407515 600843@sgsbgroup.com;wuwj@sgsbgroup.com;shenlj@sgsbgroup.com www.sgsbgroup.com
|
||||
209 600845.SH 上海宝信软件股份有限公司 上海市浦东新区自由贸易试验区郭守敬路515号 86-21-20378893 investor@baosight.com www.baosight.com
|
||||
210 600846.SH 上海同济科技实业股份有限公司 上海市中国(上海)自由贸易试验区栖山路33号 86-21-65985860 tjkjsy@tjkjsy.com.cn www.tjkjsy.com.cn
|
||||
211 600848.SH 上海临港控股股份有限公司 上海市松江区莘砖公路668号3层 86-21-64855827 ir@shlingang.com www.lingangholding.com
|
||||
212 600850.SH 中电科数字技术股份有限公司 上海市嘉定区城北路378号1605室 86-21-33390000,86-21-33390288 ecczb@shecc.com;dm@shecc.com www.shecc.com
|
||||
213 600851.SH 上海海欣集团股份有限公司 上海市松江区洞泾镇长兴路688号 86-21-57698100,86-21-63917000,86-21-57698031 600851@haixin.com;haq@haixin.com;zg@haixin.com www.haixin.com
|
||||
214 600882.SH 上海妙可蓝多食品科技股份有限公司 上海市奉贤区金汇镇工业路899号8幢 86-21-50188700 ir@milkland.com.cn www.milkground.cn
|
||||
215 600895.SH 上海张江高科技园区开发股份有限公司 中国(上海)自由贸易试验区春晓路289号802室 86-21-38959000 investors@600895.com www.600895.com;www.600895.cn
|
||||
216 600958.SH 东方证券股份有限公司 上海市黄浦区中山南路119号东方证券大厦 86-21-63325888,86-21-63326373 wangrf@orientsec.com.cn;litingting@orientsec.com.cn;ir@orientsec.com.cn www.dfzq.com.cn
|
||||
217 601021.SH 春秋航空股份有限公司 上海市长宁区虹桥路2599号 86-21-32315288 ir@ch.com www.ch.com
|
||||
218 601156.SH 东方航空物流股份有限公司 上海市浦东机场机场大道66号 86-21-22365112 EAL-IR@ceair.com www.eal-ceair.com
|
||||
219 601200.SH 上海环境集团股份有限公司 上海市长宁区虹桥路1881号 86-21-63901005,86-21-68907088,86-21-52564780 shhj@shenvir.com www.sh601200.com
|
||||
220 601211.SH 国泰海通证券股份有限公司 上海市浦东新区自由贸易试验区商城路618号 86-21-38676798 dshbgs@gtht.com www.gtht.com
|
||||
221 601229.SH 上海银行股份有限公司 上海市黄浦区中山南路688号 86-21-68475888,86-21-68476988 ir@bosc.cn;webmaster@bosc.cn www.bosc.cn
|
||||
222 601231.SH 环旭电子股份有限公司 上海市浦东新区张江高科技园区集成电路产业区张东路1558号 86-21-58968418 Public@usiglobal.com www.usiglobal.com
|
||||
223 601328.SH 交通银行股份有限公司 上海市浦东新区银城中路188号 86-21-58766688 investor@bankcomm.com www.bankcomm.com;www.bankcomm.cn
|
||||
224 601519.SH 上海大智慧股份有限公司 上海市中国(上海)自由贸易试验区郭守敬路498号浦东软件园14幢22301-130座 86-21-20219988*39117 Ir@gw.com.cn www.gw.com.cn
|
||||
225 601595.SH 上海电影股份有限公司 上海市徐汇区漕溪北路595号 86-21-33391000,86-21-33391188 huayifan@sh-sfc.com;sygf@sh-sfc.com;ir@sh-sfc.com www.sh-sfc.com
|
||||
226 601601.SH 中国太平洋保险(集团)股份有限公司 上海市黄浦区中山南路1号 86-21-58767282 ir@cpic.com.cn www.cpic.com.cn
|
||||
227 601607.SH 上海医药集团股份有限公司 上海市浦东新区张江路92号 86-21-63730908 pharm@sphchina.com;boardoffice@sphchina.com www.sphchina.com
|
||||
228 601611.SH 中国核工业建设股份有限公司 上海市青浦区西虹桥商务区蟠龙路500号 86-21-31858805,86-21-31858801,86-21-31858860 dong_sh@cnecc.com;zhangyunpu@cnecc.com www.cnecc.com
|
||||
229 601616.SH 上海广电电气(集团)股份有限公司 上海市奉贤区环城东路123弄1号4幢三层 86-21-67101661 office@csge.com www.sgeg.cn
|
||||
230 601696.SH 中银国际证券股份有限公司 上海市浦东新区银城中路200号中银大厦39层 86-21-20328000 webmaster@bocichina.com;IR@bocichina.com www.bocichina.com
|
||||
231 601702.SH 上海华峰铝业股份有限公司 上海市金山区月工路1111号 86-21-67276833,86-21-67276853 hfly@huafeng.com www.huafonal.com
|
||||
232 601727.SH 上海电气集团股份有限公司 上海市长宁区华山路1100弄16号 86-21-33261888 service@shanghai-electric.com;ir@shanghai-electric.com www.shanghai-electric.com
|
||||
233 601788.SH 光大证券股份有限公司 上海市静安区新闸路1508号 86-21-22169914 ebs@ebscn.com;independentdirector@ebscn.com www.ebscn.com
|
||||
234 601825.SH 上海农村商业银行股份有限公司 上海市黄浦区中山东二路70号 86-21-61899333,86-21-962999 ir@shrcb.com www.shrcb.com
|
||||
235 601828.SH 红星美凯龙家居集团股份有限公司 上海市浦东新区临御路518号6楼F801室 86-21-52820220 ir@chinaredstar.com www.chinaredstar.com
|
||||
236 601866.SH 中远海运发展股份有限公司 上海市浦东新区自由贸易试验区国贸大厦A-538室 86-21-65967333,86-21-65966105 ir@coscoshipping.com development.coscoshipping.com
|
||||
237 601872.SH 招商局能源运输股份有限公司 上海市浦东新区自由贸易试验区西里路55号9楼912A室 86-852-28597361,86-21-63361872 IR@cmhk.com www.cmenergyshipping.com
|
||||
238 601968.SH 上海宝钢包装股份有限公司 上海市宝山区罗东路1818号 86-21-56766307 ir601968@baosteel.com www.baosteelpackaging.com
|
||||
239 603006.SH 上海联明机械股份有限公司 上海市浦东新区川沙路905号 86-21-58560017 yangmingmin@shanghailm.com;ir@shanghailm.com;duanyinyu@shanghailm.com www.shanghailmjx.com
|
||||
240 603009.SH 上海北特科技集团股份有限公司 上海市嘉定区华亭镇高石路(北新村内)(一照多址企业) 86-21-62190266*666 touzizhe@beite.net.cn www.beite.net.cn
|
||||
241 603012.SH 上海创力集团股份有限公司 上海市青浦区新康路889号 86-21-59869117 shcl@shclkj.com www.shclkj.com
|
||||
242 603020.SH 爱普香料集团股份有限公司 上海市嘉定区曹新公路33号 86-21-66523100 jye@cnaff.com;hanqing.qin@cnaff.com www.cnaff.com
|
||||
243 603022.SH 上海新通联包装股份有限公司 上海市宝山区罗北路1238号 86-21-36535008 zqb@xtl.sh.cn www.xtlpacking.com
|
||||
244 603030.SH 上海全筑控股集团股份有限公司 上海市青浦区朱家角镇沪青平公路6335号7幢461 86-21-33372630 ir@trendzone.com.cn;Sunhaijun@trendzone.com www.trendzone.com.cn
|
||||
245 603037.SH 上海凯众材料科技股份有限公司 上海市浦东新区建业路813号 86-21-58388958 kaizhongdm@carthane.com www.carthane.com
|
||||
246 603039.SH 泛微网络科技股份有限公司 上海市奉贤区环城西路3006号 86-21-68869298*6109,86-21-68869298*2032 weaver@weaver.com.cn;jolin.zhou@weaver.com.cn;Haohan.gu@weaver.com.cn www.weaver.com.cn
|
||||
247 603056.SH 德邦物流股份有限公司 上海市青浦区徐泾镇徐祥路316号1幢 86-21-39288106 ir@deppon.com www.deppon.com
|
||||
248 603057.SH 紫燕食品集团股份有限公司 上海市闵行区申南路215号 86-21-52969658 ziyan@ziyanfoods.com www.ziyanfoods.com
|
||||
249 603068.SH 博通集成电路(上海)股份有限公司 上海市中国(上海)自由贸易试验区张东路1387号41幢101(复式)室2F-3F/102(复式)室 86-21-51086811*8899 IR@bekencorp.com www.bekencorp.com
|
||||
250 603083.SH 上海剑桥科技股份有限公司 上海市闵行区陈行公路2388号8幢501室 86-21-60904272 investor@cigtech.com www.cigtech.com
|
||||
251 603108.SH 上海润达医疗科技股份有限公司 上海市金山区卫昌路1018号1号楼201室 86-21-68406213 board@rundamedical.com www.rundamedical.com
|
||||
252 603121.SH 上海华培数能科技(集团)股份有限公司 上海市青浦区崧秀路218号3幢厂房 86-21-31838505 board@sinotec.cn www.sinotec.cn
|
||||
253 603122.SH 合富(中国)医疗科技股份有限公司 中国(上海)自由贸易试验区新灵路118号606B室 86-21-60378999,86-21-60378999*8668 ir_cowealth@cowealth.com ch.cowealth.com
|
||||
254 603128.SH 港中旅华贸国际物流股份有限公司 上海市黄浦区南京西路338号20楼 86-21-63588811 ird@ctsfreight.com www.ctsfreight.com
|
||||
255 603131.SH 上海沪工焊接集团股份有限公司 上海市青浦区外青松公路7177号 86-21-59715700 hggf@hugong.com www.hugong.com
|
||||
256 603153.SH 上海建科咨询集团股份有限公司 上海市徐汇区宛平南路75号 86-21-64390809,86-21-31655960 ir@sribs.com www.sribs.com
|
||||
257 603159.SH 上海亚虹模具股份有限公司 上海市奉贤区沪杭公路732号 86-21-37596575 yahong@xxyhmj.com.cn;sumy@xxyhmj.com.cn;baohan@xxyhmj.com.cn www.yahong-mold.com
|
||||
258 603170.SH 上海宝立食品科技股份有限公司 上海市松江茸北工业区茸兴路433号 86-21-31823950 bolex_office@bolexfoods.com www.bolexfoods.com
|
||||
259 603189.SH 上海网达软件股份有限公司 上海市浦东新区自由贸易试验区川桥路409号 86-21-50306629 sunlin@wondertek.com.cn;xuwen@wondertek.com.cn www.wondertek.com.cn
|
||||
260 603192.SH 上海汇得科技股份有限公司 上海市金山区金山卫镇春华路180号 86-21-37285599,86-21-37285501 hdkj@shhdsz.com www.shhdsz.com
|
||||
261 603196.SH 日播时尚集团股份有限公司 上海市松江区中山街道茸阳路98号1幢2层 86-21-80104103 ir@ribo.com.cn www.ribo-group.com
|
||||
262 603197.SH 上海保隆汽车科技股份有限公司 上海市松江区沈砖公路5500号 86-21-31273333 sbac@baolong.biz;wenjianfeng@chinabaolong.net;zhanghongmei@chinabaolong.net www.baolong.biz
|
||||
263 603200.SH 上海洗霸科技股份有限公司 上海市嘉定区博学路138号6幢,7幢 86-21-55384785,86-21-65424668 shech@china-xiba.com;lchen@china-xiba.com www.china-xiba.com
|
||||
264 603211.SH 晋拓科技股份有限公司 上海市松江区新浜工业园区胡甪路368号 86-21-57898686 webmaster@jintuo.com.cn www.sh-jintuo.com
|
||||
265 603214.SH 上海爱婴室商务服务股份有限公司 上海市浦东新区浦东大道2123号3E-1157室 86-21-68470177 investor.list@aiyingshi.com www.aiyingshi.com
|
||||
266 603226.SH 菲林格尔家居科技股份有限公司 上海市奉贤区林海公路7001号 86-21-67192899 zqswb@vohringer.com www.vohringer.com
|
||||
267 603232.SH 格尔软件股份有限公司 上海市静安区江场西路299弄5号601室 86-21-62327028 stock@koal.com www.koal.com
|
||||
268 603236.SH 上海移远通信技术股份有限公司 上海市松江区泗泾镇高技路205弄6号5层513室 86-21-51086236*6778 yiyuan@quectel.com www.quectel.com
|
||||
269 603256.SH 宏和电子材料科技股份有限公司 上海市浦东康桥工业区秀沿路123号 86-21-38299688*6666 Honghe_news@gracefabric.com www.gracefabric.com
|
||||
270 603324.SH 上海盛剑科技股份有限公司 上海市嘉定区汇发路301号 86-21-60712858 ir@sheng-jian.com www.sheng-jian.com
|
||||
271 603329.SH 上海雅仕投资发展股份有限公司 上海市浦东新区自由贸易试验区浦东南路855号33H室 86-21-68596223 info@ace-sulfert.com www.aceonline.cn
|
||||
272 603330.SH 天洋新材(上海)科技股份有限公司 上海市嘉定区南翔镇惠平路505号 86-21-69122665 wenliang.geng@hotmelt.com.cn;zhijun.lu@hotmelt.com.cn;IR@hotmelt.com.cn www.hotmelt.com.cn
|
||||
273 603365.SH 上海水星家用纺织品股份有限公司 上海市奉贤区沪杭公路1487号 86-21-57435982 sxjf@shuixing.com www.shuixing.com
|
||||
274 603378.SH 亚士创能科技(上海)股份有限公司 上海市青浦区工业园区新涛路28号综合楼三层,四层 86-21-59705888,86-21-59705888*8393 dmb@cuanon.com www.cuanon.com
|
||||
275 603466.SH 上海风语筑文化科技股份有限公司 上海市静安区江场三路191号 86-21-56206468 licheng@fengyuzhu.com;ir@fengyuzhu.com;linshijing@fengyuzhu.com www.fengyuzhu.com
|
||||
276 603496.SH 恒为科技(上海)股份有限公司 上海市徐汇区乐山路33号103室 86-21-61002983 securities.affairs@embedway.com www.embedway.com
|
||||
277 603499.SH 上海翔港包装科技股份有限公司 上海市浦东新区泥城镇翠波路299号 86-21-58075851 tangjun@sunglow-tec.com;xg@sunglow-tec.com;lidanqing@sunglow-tec.com www.sunglow-tec.com
|
||||
278 603501.SH 豪威集成电路(集团)股份有限公司 上海市浦东新区自由贸易试验区龙东大道3000号1幢C楼7层 86-21-50805043 will_stock@corp.ovt.com www.omnivision-group.com
|
||||
279 603515.SH 欧普照明股份有限公司 上海市浦东新区龙东大道6111号1幢411室 86-21-38550000*6720 Public@opple.com www.opple.com.cn
|
||||
280 603565.SH 上海中谷物流股份有限公司 上海市浦东新区双惠路99号综合楼106室 86-21-31761722 ir@zhonggu56.com;daixin@zhonggu56.com;liqiqi@zhonggu56.com www.zhonggu56.com
|
||||
281 603579.SH 上海荣泰健康科技股份有限公司 上海市青浦区朱枫公路1226号 86-21-59833669 Public@rotai.com www.rotai.com
|
||||
282 603580.SH 艾艾精密工业输送系统(上海)股份有限公司 上海市静安区万荣路700号7幢A240室 86-21-65305237 zhengquanbu@aabelt.com.cn www.aabelt.com.cn
|
||||
283 603587.SH 地素时尚股份有限公司 上海市长宁区仙霞路579弄38号第2幢103室 86-21-31085111,86-21-31085300 info@dazzle-fashion.com www.dazzle-fashion.com
|
||||
284 603619.SH 中曼石油天然气集团股份有限公司 上海市中国(上海)自由贸易试验区临港新片区南汇新城镇飞渡路2099号1幢1层 86-21-61048060 ssbgs@zpec.com;office@zpec.com www.zpec.com
|
||||
285 603633.SH 上海徕木电子股份有限公司 上海市闵行区中春路7319号 86-21-67679072 ir@laimu.com.cn www.laimu.com.cn
|
||||
286 603648.SH 上海畅联国际物流股份有限公司 上海市中国(上海)自由贸易试验区冰克路500号5-6幢 86-21-20895888 investor-relations@chinaslc.com www.chinaslc.com
|
||||
287 603650.SH 彤程新材料集团股份有限公司 上海市浦东新区自由贸易试验区银城中路501号上海中心25层2501室 86-21-62109966 securities@rachem.com www.rachem.com
|
||||
288 603659.SH 上海璞泰来新能源科技集团股份有限公司 上海市浦东新区自由贸易试验区芳春路400号1幢301-96室 86-21-61902930 IR@putailai.com www.putailai.com
|
||||
289 603681.SH 上海永冠众诚新材料科技(集团)股份有限公司 上海市青浦区朱家角工业园区康工路15号 86-21-59830677 ir@ygtape.com;sq@ygtape.com www.ygtape.com
|
||||
290 603682.SH 上海锦和商业经营管理(集团)股份有限公司 上海市徐汇区虹漕路68号43幢18楼 86-21-52399283 dongban@jinhe.sh.cn www.iyuejie.com
|
||||
291 603683.SH 上海晶华胶粘新材料股份有限公司 上海市松江区永丰街道大江路89号 86-21-31167522,86-512-80179506 xiaochan.pan@smithcn.com;zijie.chen@smithcn.com;jhxc@smithcn.com www.smithcn.com
|
||||
292 603690.SH 上海至纯洁净系统科技股份有限公司 上海市闵行区紫海路170号 86-21-80238290 dong_ban@pncs.cn www.pncs.cn
|
||||
293 603713.SH 密尔克卫智能供应链服务集团股份有限公司 上海市浦东新区中国(上海)自由贸易试验区金葵路158号4-11层 86-21-80228498 ir@mwclg.com www.mwclg.com
|
||||
294 603718.SH 上海海利生物技术股份有限公司 上海市奉贤区自由贸易试验区临港新片区正博路1881号19幢一层1002室 86-21-60890892,86-21-60890888 ir@hile-bio.com;china@hile-bio.com www.hile-bio.com
|
||||
295 603728.SH 上海鸣志电器股份有限公司 上海市闵行区闵北路88弄1-30号109幢1层7101室 86-21-52634688 dm@moons.com.cn www.moons.com.cn
|
||||
296 603729.SH 上海龙韵文创科技集团股份有限公司 上海市松江区佘山三角街9号 86-21-58823977 longyuntzz@obm.com.cn www.obm.com.cn
|
||||
297 603730.SH 上海岱美汽车内饰件股份有限公司 上海市浦东新区北蔡镇莲溪路1299号 86-21-68945881 IR@daimay.com www.daimay.com
|
||||
298 603777.SH 上海来伊份股份有限公司 上海市松江区九亭镇久富路300号 86-21-51760952 corporate@laiyifen.com;linyun1@laiyifen.com www.laiyifen.com
|
||||
299 603786.SH 科博达技术股份有限公司 上海市浦东新区自由贸易试验区祖冲之路2388号1-2幢 86-21-60978935 keboda@keboda.com www.keboda.com
|
||||
300 603790.SH 上海雅运纺织化工股份有限公司 上海市徐汇区银都路388号16幢275-278室 86-21-69136448 ir@argus.net.cn www.argus.net.cn
|
||||
301 603855.SH 华荣科技股份有限公司 上海市嘉定区宝钱公路555号 86-21-59999999 warom@warom.com;zxr@warom.com;hrzhd@warom.com www.warom.com
|
||||
302 603868.SH 上海飞科电器股份有限公司 上海市松江区广富林东路555号 86-21-52858888*839 flyco@flyco.com www.flyco.com
|
||||
303 603881.SH 上海数据港股份有限公司 上海市静安区江场路1401弄14号1601室 86-21-31762186 ir@athub.com www.athub.com
|
||||
304 603885.SH 上海吉祥航空股份有限公司 上海市浦东新区自由贸易试验区康桥东路8号 86-21-61988832 ir@juneyaoair.com www.juneyaoair.com
|
||||
305 603886.SH 上海元祖梦果子股份有限公司 上海市青浦区赵巷镇嘉松中路6088号 86-21-59755678*6800 gansoinfo@ganso.net www.ganso.com.cn
|
||||
306 603887.SH 上海城地香江数据科技股份有限公司 上海市嘉定区恒永路518弄1号B区502-1 86-21-52806755 shchengdi@163.com www.shcd.cc
|
||||
307 603895.SH 上海天永智能装备股份有限公司 上海市嘉定区外冈镇汇宝路555号3幢2层A区 86-21-50675528,86-21-69920928 lvaihua@ty-industries.com;943731796@qq.com www.ty-industries.com
|
||||
308 603899.SH 上海晨光文具股份有限公司 上海市奉贤区金钱公路3469号3号楼 86-21-57475621 ir@mg-pen.com www.mg-pen.com
|
||||
309 603918.SH 上海金桥信息股份有限公司 上海市浦东新区郭守敬路498号12幢21302;21319室 86-21-33674997,86-21-33674396 shaole@shgbit.com;gaodd@shgbit.com;yaoming@shgbit.com;shgbit@shgbit.com www.shgbit.com
|
||||
310 603956.SH 上海威派格智慧水务股份有限公司 上海市嘉定区恒定路1号 86-21-69080885 zqswb@shwpg.com www.shwpg.com
|
||||
311 603960.SH 上海克来机电自动化工程股份有限公司 上海市宝山区罗东路1555号4幢 86-21-33850028 kelai.jidian@sh-kelai.com www.sh-kelai.com
|
||||
312 603987.SH 上海康德莱企业发展集团股份有限公司 上海市嘉定区高潮路658号1幢2楼 86-21-69113502 kdl@kdlchina.net;dm@kdlchina.net;oult@kdlchina.com www.kdlchina.cn
|
||||
313 605050.SH 福然德股份有限公司 上海市宝山区潘泾路3759号(宝山工业园区) 86-21-66898585,86-21-66898558 shcq@scmfriend.com;zqb@scmfriend.com www.scmfriend.com
|
||||
314 605081.SH 上海太和水科技发展股份有限公司 上海市金山区枫泾镇曹黎路38弄19号1957室 86-21-65661627 dongmiban@shtaihe.net www.shtaihe.net
|
||||
315 605098.SH 上海行动教育科技股份有限公司 上海市闵行区兴虹路168弄3号201室B区 86-21-33535658 lindayang@xdjy100.com;dongban@xdjy100.com www.xdjy100.com
|
||||
316 605128.SH 上海沿浦精工科技(集团)股份有限公司 上海市闵行区浦江镇江凯路128号 86-21-64918973*8101 ypgf@shyanpu.com www.shyanpu.com
|
||||
317 605136.SH 上海丽人丽妆化妆品股份有限公司 上海市松江区乐都西路825弄89,90号6层618室 86-21-64663911 shlrlz@lrlz.com www.lrlz.com
|
||||
318 605151.SH 西上海汽车服务股份有限公司 上海市嘉定区恒裕路517号 86-21-59573618 servicesh@wsasc.com.cn www.wsasc.com.cn
|
||||
319 605186.SH 上海健麾信息技术股份有限公司 上海市松江区中辰路299号1幢104室 86-21-58380355 stock@g-healthy.com www.g-healthy.com
|
||||
320 605208.SH 上海永茂泰汽车科技股份有限公司 上海市青浦区练塘镇章练塘路577号 86-21-59815266 ymtauto@ymtauto.com www.ymtauto.com
|
||||
321 605222.SH 上海起帆电缆股份有限公司 上海市金山区张堰镇振康路238号 86-21-37217999 qifancable@188.com www.qifancable.com
|
||||
322 605289.SH 上海罗曼科技股份有限公司 上海市杨浦区杨树浦路1196号5层 86-21-65031217,86-21-65031217*208,86-21-65031217*222 IRmanager@luoman.com.cn;Zhangzhengyu@luoman.com.cn;shlm@shluoman.cn www.shluoman.cn;www.luoman.com.cn
|
||||
323 605338.SH 中饮巴比食品股份有限公司 上海市松江区车墩镇茸江路785号 86-21-57797068 ir@babifood.com www.babifood.com
|
||||
324 605339.SH 南侨食品集团(上海)股份有限公司 上海市徐汇区宜山路1397号A栋12层 86-21-61955678 ncfgs@ncbakery.com www.ncbakery.com
|
||||
325 605398.SH 上海新炬网络信息技术股份有限公司 上海市青浦区外青松公路7548弄588号1幢1层R区113室 86-21-52908588 IR@shsnc.com www.shsnc.com
|
||||
326 605598.SH 上海港湾基础建设(集团)股份有限公司 上海市金山区漕泾镇亭卫公路3316号1幢二层207室 86-21-65638550 ir@geoharbour.com www.geoharbour.com
|
||||
327 688008.SH 澜起科技股份有限公司 上海市徐汇区漕宝路181号1幢15层 86-21-54679039 ir@montage-tech.com www.montage-tech.com/cn
|
||||
328 688012.SH 中微半导体设备(上海)股份有限公司 上海市浦东新区金桥出口加工区(南区)泰华路188号 86-21-61001199 IR@amecnsh.com www.amec-inc.com
|
||||
329 688016.SH 上海微创心脉医疗科技(集团)股份有限公司 上海市浦东新区康新公路3399弄1号 86-21-38139300 irm@endovastec.com www.endovastec.com
|
||||
330 688018.SH 乐鑫信息科技(上海)股份有限公司 上海市浦东新区御北路235弄3号楼1-7层 86-21-61065218 ir@espressif.com www.espressif.com
|
||||
331 688019.SH 安集微电子科技(上海)股份有限公司 上海市浦东新区华东路5001号金桥出口加工区(南区)T6-9幢底层 86-21-20693346 IR@anjimicro.com www.anjimicro.com
|
||||
332 688031.SH 星环信息科技(上海)股份有限公司 上海市徐汇区虹漕路88号3楼,B栋11楼 86-21-61761338 ir@transwarp.io www.transwarp.cn
|
||||
333 688061.SH 上海灿瑞科技股份有限公司 上海市静安区延长路149号科技楼308室 86-21-56387201,86-21-36399007 ocsir@orient-chip.com www.orient-chip.com
|
||||
334 688062.SH 迈威(上海)生物科技股份有限公司 上海市浦东新区自由贸易试验区蔡伦路230号2幢105室 86-21-58332260 ir@mabwell.com www.mabwell.com
|
||||
335 688063.SH 上海派能能源科技股份有限公司 上海市浦东新区康桥镇苗桥路300号 86-21-31590029 ir@pylontech.com.cn www.pylontech.com.cn
|
||||
336 688065.SH 上海凯赛生物技术股份有限公司 上海市浦东新区蔡伦路1690号5幢4楼 86-21-50801916 cathaybiotech_info@cathaybiotech.com www.cathaybiotech.com
|
||||
337 688071.SH 上海华依科技集团股份有限公司 上海市浦东新区张东路1388号13幢101室 86-21-61051366 investor@w-ibeda.com www.w-ibeda.com
|
||||
338 688073.SH 上海毕得医药科技股份有限公司 上海市杨浦区翔殷路128号11号楼A座101室 86-21-61601560 ir@bidepharmatech.com www.bidepharmatech.com
|
||||
339 688082.SH 盛美半导体设备(上海)股份有限公司 上海市浦东新区自由贸易试验区丹桂路999弄5,6,7,8号全幢 86-21-50276506 ir@acmrcsh.com www.acmrcsh.com.cn
|
||||
340 688085.SH 上海三友医疗器械股份有限公司 上海市嘉定区嘉定工业区汇荣路385号 86-21-58266088 ir@sanyou-medical.com www.sanyoumed.com
|
||||
341 688091.SH 上海谊众药业股份有限公司 上海市奉贤区仁齐路79号 86-21-37190005 info@yizhongpharma.com www.yizhongpharma.com
|
||||
342 688098.SH 申联生物医药(上海)股份有限公司 上海市闵行区江川东路48号 86-21-61255101 slsw@slbio.com.cn www.slbio.com.cn
|
||||
343 688099.SH 晶晨半导体(上海)股份有限公司 上海市浦东新区自由贸易试验区春晓路350号南楼406室 86-21-38165066 IR@amlogic.com www.amlogic.com;www.Amlogic.cn
|
||||
344 688107.SH 上海安路信息科技股份有限公司 上海市虹口区纪念路500号5幢202室 86-21-61633787 public@anlogic.com www.anlogic.com
|
||||
345 688110.SH 东芯半导体股份有限公司 上海市青浦区赵巷镇沪青平公路2875号3幢13层B区1336室 86-21-61369022 contact@dosilicon.com www.dosilicon.com
|
||||
346 688118.SH 普元信息技术股份有限公司 上海市浦东新区自由贸易试验区学林路36弄26号 86-21-58331900 info@primeton.com www.primeton.com
|
||||
347 688121.SH 上海卓然工程技术股份有限公司 上海市闵行区闵北路88弄1-30号104幢4楼D座 86-21-68815818 supezet@supezet.com www.supezet.com
|
||||
348 688123.SH 聚辰半导体股份有限公司 上海市浦东新区张东路1761号10幢 86-21-50802035 investors@giantec-semi.com www.giantec-semi.com
|
||||
349 688126.SH 上海硅产业集团股份有限公司 上海市嘉定区兴邦路755号3幢 86-21-52589038 pr@sh-nsig.com www.nsig.com
|
||||
350 688129.SH 东来涂料技术(上海)股份有限公司 上海市嘉定区工业区新和路1221号 86-21-39538548 IR@onwings.com.cn www.onwings.com.cn
|
||||
351 688131.SH 上海皓元医药股份有限公司 上海市浦东新区中国(上海)自由贸易试验区蔡伦路720弄2号501室 86-21-58338205 hy@chemexpress.com.cn www.chemexpress.com.cn
|
||||
352 688133.SH 上海泰坦科技股份有限公司 上海市徐汇区钦州路100号一号楼1110室 86-21-60878330 contact@titansci.com www.titansci.com
|
||||
353 688155.SH 上海先惠自动化技术股份有限公司 上海市松江区小昆山镇思贤路4800号 86-21-57858808 info@sk1.net.cn www.sk1.net.cn
|
||||
354 688158.SH 优刻得科技股份有限公司 上海市杨浦区隆昌路619号10#B号楼201室 86-21-55509888*8188 ir@ucloud.cn www.ucloud.cn
|
||||
355 688160.SH 上海步科自动化股份有限公司 上海市浦东新区自由贸易试验区申江路5709号,秋月路26号3幢北侧三楼 86-755-86336477 sec@kinco.cn www.kinco.cn
|
||||
356 688163.SH 上海赛伦生物技术股份有限公司 上海市青浦区华青路1288号 86-21-64959122 dmb@serum-china.com www.serum-china.com.cn
|
||||
357 688179.SH 上海阿拉丁生化科技股份有限公司 上海市奉贤区楚华支路809号 86-21-50560989 aladdindmb@163.com www.aladdin-e.com
|
||||
358 688180.SH 上海君实生物医药科技股份有限公司 上海市浦东新区中国(上海)自由贸易试验区蔡伦路987号4层 86-21-61058800*1153 info@junshipharma.com www.junshipharma.com
|
||||
359 688188.SH 上海柏楚电子科技股份有限公司 上海市闵行区兰香湖南路1000号 86-21-64306968 bochu@fscut.com;bochu@bochu.com www.fscut.com,www.bochu.com
|
||||
360 688193.SH 上海仁度生物科技股份有限公司 上海市浦东新区张江高科技园区东区瑞庆路528号15幢乙号 86-21-50720069 ir@rdbio.com www.rdbio.com
|
||||
361 688202.SH 上海美迪西生物医药股份有限公司 上海市浦东新区自由贸易试验区李冰路67弄5号楼 86-21-58591500 IR@medicilon.com.cn www.medicilon.com.cn
|
||||
362 688206.SH 上海概伦电子股份有限公司 上海市浦东新区自由贸易试验区临港新片区环湖西二路888号C楼 86-21-61640095 IR@primarius-tech.com www.primarius-tech.com
|
||||
363 688212.SH 上海澳华内镜股份有限公司 上海市闵行区光中路133弄66号 86-21-54303731 ir@aohua.com www.aohua.com
|
||||
364 688213.SH 思特威(上海)电子科技股份有限公司 上海市浦东新区中国(上海)自由贸易试验区祥科路111号3号楼6楼612室 86-21-64853572 ir@smartsenstech.com www.smartsenstech.com
|
||||
365 688217.SH 上海睿昂基因科技股份有限公司 上海市奉贤区金海公路6055号3幢 86-21-33282601 zqswb@rightongene.com www.rightongene.com
|
||||
366 688220.SH 翱捷科技股份有限公司 上海市浦东新区自由贸易试验区科苑路399号10幢8层(名义楼层9层) 86-21-60336588*1188 ir@asrmicro.com www.asrmicro.com
|
||||
367 688230.SH 上海芯导电子科技股份有限公司 上海市浦东新区自由贸易试验区祖冲之路2277弄7号 86-21-60753051 investor@prisemi.com www.prisemi.com
|
||||
368 688238.SH 和元生物技术(上海)股份有限公司 上海市浦东新区国际医学园区紫萍路908弄19号楼 86-21-58180909 zhengquanbu@obiosh.com www.obiosh.com
|
||||
369 688247.SH 上海宣泰医药科技股份有限公司 上海市浦东新区中国(上海)自由贸易试验区蔡伦路780号7层709室 86-21-68819009*657 info@sinotph.com www.sinotph.com
|
||||
370 688265.SH 上海南方模式生物科技股份有限公司 上海市浦东新区琥珀路63弄1号6层 86-21-58120591 ir@modelorg.com www.modelorg.com
|
||||
371 688271.SH 上海联影医疗科技股份有限公司 上海市嘉定区城北路2258号 86-21-67076658 IR@united-imaging.com www.united-imaging.com
|
||||
372 688293.SH 上海奥浦迈生物科技股份有限公司 上海市浦东新区紫萍路908弄28号 86-21-20780178 ir@opmbiosciences.com;IR@opmbiosciences.com www.opmbiosciences.com
|
||||
373 688301.SH 奕瑞电子科技集团股份有限公司 上海市浦东新区环桥路999号 86-21-50720560,86-21-50720560*8311 ir@iraygroup.com www.iraygroup.com
|
||||
374 688317.SH 上海之江生物科技股份有限公司 上海市浦东新区张江高科技产业东区瑞庆路528号20幢乙号1层,21幢甲号1层 86-21-34635507 info@liferiver.com.cn www.liferiver.com.cn
|
||||
375 688330.SH 上海宏力达信息技术股份有限公司 上海市松江区九亭中心路1158号11幢101,401室(一照多址企业) 86-21-64180758 hld.mail@holystar.com.cn www.holystar.com.cn
|
||||
376 688335.SH 上海复洁科技股份有限公司 上海市杨浦区国权北路1688弄A7幢801室 86-21-55081682 ir@ceo.sh.cn www.ceo.sh.cn
|
||||
377 688336.SH 三生国健药业(上海)股份有限公司 上海市浦东新区中国(上海)自由贸易试验区李冰路399号 86-21-80297676 ir@3s-guojian.com www.3s-guojian.com
|
||||
378 688351.SH 上海微创电生理医疗科技股份有限公司 上海市浦东新区周浦镇天雄路588弄1-28号第28幢 86-21-60969600*53608 investors@everpace.com www.everpace.com
|
||||
379 688366.SH 上海昊海生物科技股份有限公司 上海市松江区工业区洞泾路5号 86-21-52293555 info@3healthcare.com www.3healthcare.com
|
||||
380 688368.SH 上海晶丰明源半导体股份有限公司 上海市浦东新区中国(上海)自由贸易试验区申江路5005弄3号9-11层,2号102单元 86-21-50278297 IR@bpsemi.com www.bpsemi.com
|
||||
381 688370.SH 上海丛麟环保科技股份有限公司 上海市闵行区闵虹路166弄3号2808室 86-21-60713846 ir@cn-conglin.com www.cn-conglin.com
|
||||
382 688372.SH 上海伟测半导体科技股份有限公司 上海市浦东新区东胜路38号A区2栋2F 86-21-58958216 ir@v-test.com.cn www.v-test.com.cn
|
||||
383 688373.SH 上海盟科药业股份有限公司 上海市浦东新区中国(上海)自由贸易试验区爱迪生路53号1幢1-4层101,2幢 86-21-50900550,86-21-50900503 info@micurxchina.com;688373@micurxchina.com micurxchina.com
|
||||
384 688382.SH 益方生物科技(上海)股份有限公司 上海市浦东新区自由贸易试验区李冰路67弄4号210室 86-21-50778527 ir@inventisbio.com www.inventisbio.com
|
||||
385 688385.SH 上海复旦微电子集团股份有限公司 上海市杨浦区邯郸路220号 86-21-65659109 IR@fmsh.com.cn www.fmsh.com
|
||||
386 688391.SH 钜泉光电科技(上海)股份有限公司 上海市浦东新区中国(上海)自由贸易试验区张东路1388号16幢101室 86-21-51035886,86-21-50277832 shareholders@hitrendtech.com www.hitrendtech.com
|
||||
387 688392.SH 上海骄成超声波技术股份有限公司 上海市闵行区沧源路1488号2幢三层 86-21-34668757 ir@sbt-sh.com www.sbt-sh.com
|
||||
388 688435.SH 上海英方软件股份有限公司 上海市黄浦区制造局路787号二幢151A室 86-21-61735888 investor@info2soft.com www.info2soft.com;www.info2soft.cn
|
||||
389 688505.SH 上海复旦张江生物医药股份有限公司 上海市浦东新区张江高科技园区蔡伦路308号 86-21-58953355,86-21-58553583 ir@fd-zj.com;fd-zj@fd-zj.com www.fd-zj.com
|
||||
390 688519.SH 南亚新材料科技股份有限公司 上海市嘉定区南翔镇昌翔路158号 86-21-69178431 nanya@ccl-china.com www.ccl-china.com
|
||||
391 688521.SH 芯原微电子(上海)股份有限公司 上海市浦东新区自由贸易试验区春晓路289号张江大厦20A 86-21-68608521 IR@verisilicon.com www.verisilicon.com
|
||||
392 688538.SH 上海和辉光电股份有限公司 上海市金山区九工路1568号 86-21-60892866 ir@everdisplay.com www.everdisplay.com
|
||||
393 688578.SH 上海艾力斯医药科技股份有限公司 上海市浦东新区周浦镇凌霄花路268号 86-21-80423292 IR@allist.com.cn www.allist.com.cn
|
||||
394 688585.SH 上纬新材料科技股份有限公司 上海市松江区松胜路618号 86-21-57746183 ir@swancor.com.cn www.swancor.com.cn
|
||||
395 688590.SH 上海新致软件股份有限公司 上海市浦东新区康杉路308号 86-21-51105633 investor@newtouch.com www.newtouch.com
|
||||
396 688596.SH 上海正帆科技股份有限公司 上海市闵行区春永路55号2幢 86-21-54428800 ir@gentech-online.com www.gentechindustries.com
|
||||
397 688608.SH 恒玄科技(上海)股份有限公司 上海市浦东新区中国(上海)自由贸易试验区临港新片区环湖西二路800号904室 86-21-68771788*6666 ir@bestechnic.com www.bestechnic.com
|
||||
398 688660.SH 上海电气风电集团股份有限公司 上海市闵行区东川路555号己号楼8楼 86-21-54961895 sewc_ir@shanghai-electric.com www.sewpg.com
|
||||
399 688680.SH 上海海优威新材料股份有限公司 上海市中国(上海)自由贸易试验区龙东大道3000号1幢A楼909 86-21-58964210 hiuv@hiuv.com www.hiuv.com
|
||||
400 688682.SH 上海霍莱沃电子系统技术股份有限公司 上海市浦东新区自由贸易试验区郭守敬路498号15幢1层16102室 86-21-50809715 ir@holly-wave.com www.holly-wave.com
|
||||
401 688718.SH 上海唯赛勃新材料股份有限公司 上海市青浦区崧盈路899号 86-21-69758436 investor@wave-cyber.com www.wave-cyber.com
|
||||
402 688728.SH 格科微有限公司 Harneys Fiduciary (Cayman) Limited, 4th Floor, Harbour Place; 103 South Church Street; P.O. Box 10240; Grand Cayman KY1-1002; George Town; Cayman Islands 86-21-60126212 ir@gcoreinc.com www.gcoreinc.com
|
||||
403 688766.SH 普冉半导体(上海)股份有限公司 中国(上海)自由贸易试验区申江路5005弄1号9层整层(实际楼层8楼) 86-21-60791797 ir@puyasemi.com www.puyasemi.com
|
||||
404 688798.SH 上海艾为电子技术股份有限公司 上海市闵行区秀文路908弄2号1201室 86-21-52968068 securities@awinic.com www.awinic.com
|
||||
405 688981.SH 中芯国际集成电路制造有限公司 Cricket Square, Hutchins Drive, P.O. Box 2681, Grand Cayman, KY1-1111 Cayman Islands 86-21-20812800 ir@smics.com www.smics.com
|
||||
406 900929.SH 上海锦江国际旅游股份有限公司 上海市黄浦区延安东路100号联谊大厦27楼 86-21-32128021,86-21-32128781 wuxh@jjtravel.com;qiansj@jjtravel.com www.jjtravel.com
|
||||
407 900939.SH 上海汇丽建材股份有限公司 上海市浦东新区周浦镇横桥路406号1幢213室 86-21-58138717 stock@huili.com www.huili.com
|
||||
408 920139.BJ 上海华岭集成电路技术股份有限公司 上海市浦东新区张江高科技园区郭守敬路351号2号楼1楼 86-21-50278218 investor@sinoictest.com.cn www.sinoictest.com.cn
|
||||
409 920300.BJ 上海辰光医疗科技股份有限公司 上海市青浦区华青路1269号 86-21-60161688 SHCG@shanghaicg.net www.shanghaicg.net
|
||||
410 920346.BJ 上海威贸电子股份有限公司 上海市青浦区练东路28,38号 86-21-54252988 contact@shwmdz.com;lucas.zhou@shwmdz.com www.shwmdz.com
|
||||
411 920405.BJ 上海海希工业通讯股份有限公司 上海市松江区新桥镇新格路901号1幢3层A区 86-21-54902525 lichunyou@hysea.com.cn;IR@hysea.com.cn www.hysea.com.cn
|
||||
412 920414.BJ 上海欧普泰科技创业股份有限公司 上海市普陀区中江路879弄27号楼208室 86-21-52659337 cathygxh@optjt.cn;investor@opt.jt.cn www.optjt.cn
|
||||
413 920541.BJ 上海铁大电信科技股份有限公司 上海市嘉定区南翔镇蕰北公路1755弄6号 86-21-51235800 956470768@qq.com;tiedadianxin@tiedate.ltd www.tddx.com.cn
|
||||
414 920799.BJ 上海艾融软件股份有限公司 上海市崇明区城桥镇西门路799号306室 86-21-68816718 wang_tao@i2finance.net;public@i2finance.net www.i2finance.net
|
||||
415 920961.BJ 创远信科(上海)技术股份有限公司 上海市松江区泗泾镇高技路205弄7号1层110室,6层,7层,8层,9层 86-21-64326888 ir@transcom.net.cn;info@transcom.net.cn www.transcom.net.cn
|
||||
416 002027.SZ 分众传媒信息技术股份有限公司 上海市长宁区江苏路369号27H 86-21-22165288 FM002027@focusmedia.cn;ln002027@focusmedia.cn www.focusmedia.cn
|
||||
417 920693.BJ 上海阿为特精密机械股份有限公司 上海市宝山区宝安公路917号1幢一楼 86-21-65191708 securities@ahwit.com www.ahwit.com
|
||||
418 920504.BJ 上海博迅医疗生物仪器股份有限公司 上海市松江区泖港镇中强路599号 86-21-66052732 yingyun@boxun.com.cn;boxun@boxun.com.cn www.boxun.com.cn
|
||||
419 920112.BJ 上海巴兰仕汽车检测设备股份有限公司 上海市嘉定区安亭镇新源路58号701室J 86-21-39508868 zhengquanbu@balancer-sh.com www.balancer-sh.com
|
||||
420 688710.SH 上海益诺思生物技术股份有限公司 上海市中国(上海)自由贸易试验区郭守敬路199号106室 86-21-50801259 bo@innostarbio.com www.innostarbio.com
|
||||
421 688691.SH 灿芯半导体(上海)股份有限公司 上海市中国(上海)自由贸易试验区张东路1158号礼德国际2号楼6楼 86-21-50376585,86-21-50376566 IR@britesemi.com www.britesemi.com
|
||||
422 688653.SH 格兰康希通信科技(上海)股份有限公司 上海市中国(上海)自由贸易试验区科苑路399号10幢4层(名义层5层)502室 86-21-50479130 kctzqb@kxcomtech.com www.kxcomtech.com
|
||||
423 688648.SH 中邮科技股份有限公司 上海市普陀区中山北路3185号 86-21-62605607 ir@cpte.com www.cpte.com
|
||||
424 688615.SH 上海合合信息科技股份有限公司 上海市静安区万荣路1256,1258号1105-1123室 86-21-63061283 ir@intsig.net www.intsig.com
|
||||
425 688603.SH 上海天承科技股份有限公司 上海市浦东新区中国(上海)自由贸易试验区张江路665号3F306室 86-21-59766069 public@skychemcn.com;wei.fei@skychemcn.com;zhiqin.su@skychemcn.com www.skychemcn.com
|
||||
426 688602.SH 上海康鹏科技股份有限公司 上海市普陀区祁连山南路2891弄200号1幢 86-21-63638712 ir@chemspec.com.cn www.chemspec.com.cn
|
||||
427 688593.SH 上海新相微电子股份有限公司 上海市徐汇区苍梧路10号3层 86-21-51097181 office@newvisionu.com www.newvisionu.com.cn
|
||||
428 688592.SH 上海司南导航技术股份有限公司 上海市嘉定区马陆镇澄浏中路618号2幢3楼 86-21-39907000,86-21-64302208 IR@sinognss.com www.sinognss.com
|
||||
429 688591.SH 泰凌微电子(上海)股份有限公司 上海市浦东新区中国(上海)自由贸易试验区盛夏路61弄1号电梯楼层10层,11层(实际楼层9层,10层) 86-21-50653177 investors_relation@telink-semi.com www.telink-semi.cn
|
||||
430 688584.SH 上海合晶硅材料股份有限公司 上海市松江区石湖荡镇长塔路558号 86-21-57843535,86-21-57843535*5829 ir@wwxs.waferworks.com www.waferworks.com.cn
|
||||
431 688507.SH 上海索辰信息科技股份有限公司 上海市浦东新区中国(上海)自由贸易试验区新金桥路27号13号楼2层 86-21-50307121 Info@demxs.com www.demxs.com
|
||||
432 688484.SH 上海南芯半导体科技股份有限公司 上海市浦东新区中国(上海)自由贸易试验区盛夏路565弄54号(4幢)1601 86-21-50182236 investors@southchip.com www.southchip.com
|
||||
433 688479.SH 用友汽车信息科技(上海)股份有限公司 上海市普陀区泸定路276弄1号201室 86-21-52353603 zqb@yonyou.com www.yonyouqiche.com
|
||||
434 688347.SH 华虹半导体有限公司 香港中环夏悫道12号美国银行中心2212室 86-21-38829909,86-21-50809908 IR@hhgrace.com www.huahonggrace.com
|
||||
435 603418.SH 上海友升铝业股份有限公司 上海市青浦区沪青平公路2058号 86-21-59761698 yszq@unisonal.com www.unisonal.com
|
||||
436 603350.SH 安乃达驱动技术(上海)股份有限公司 上海市闵行区光中路133弄19号A座1-2层 86-21-31027576,86-21-31027576*868 security@ananda-drive.com www.ananda-drive.com
|
||||
437 603341.SH 上海龙旗科技股份有限公司 上海市徐汇区漕宝路401号1号楼一层 86-21-61890866 ir@longcheer.com www.longcheer.com
|
||||
438 603325.SH 上海博隆装备技术股份有限公司 上海市青浦区华新镇新协路1356号 86-21-69792579 IR@bloom-powder.com www.bloom-powder.com
|
||||
439 603296.SH 华勤技术股份有限公司 上海市中国(上海)自由贸易试验区科苑路399号1幢 86-21-80221108 ir@huaqin.com www.huaqin.com
|
||||
440 603275.SH 上海众辰电子科技股份有限公司 上海市松江区泖港镇叶新公路3768号 86-21-57860561*8155,86-21-57860560 xuwenjun@zoncn.cn www.zoncn.cn
|
||||
441 603207.SH 上海小方制药股份有限公司 上海市奉贤区洪朱路777号 86-21-58207999,86-21-50818259 info@xf-pharma.com www.xf-pharma.com
|
||||
442 603107.SH 上海汽车空调配件股份有限公司 上海市浦东新区莲溪路1188号 86-21-58442000 zqb@saaa.com.cn www.saaa.com.cn
|
||||
443 603062.SH 麦加芯彩新材料科技(上海)股份有限公司 上海市嘉定区马陆镇思诚路1515号 86-21-39907772 ir@megacoatings.com www.megacoatings.com
|
||||
444 601083.SH 上海锦江航运(集团)股份有限公司 上海市浦东新区龙居路180弄13号2楼 86-21-53866646 ir@jjshipping.cn www.jjshipping.cn
|
||||
445 601026.SH 道生天合材料科技(上海)股份有限公司 上海市中国(上海)自由贸易试验区临港新片区平达路308号1-3幢 86-21-53065580 investor@techstorm.com www.techstorm.com
|
||||
446 301584.SZ 上海建发致新医疗科技集团股份有限公司 上海市杨浦区杨树浦路288号9层 86-21-60430629 jfzx@innostic.com www.innostic.com
|
||||
447 301563.SZ 云汉芯城(上海)互联网科技股份有限公司 上海市松江区漕河泾开发区松江高科技园莘砖公路258号32幢1101室 86-21-31029123 ad@ickey.cn www.ickey.cn
|
||||
448 301555.SZ 惠柏新材料科技(上海)股份有限公司 上海市嘉定区江桥镇博园路558号第2幢 86-21-59970621,86-21-69116380 board-office@wellsepoxy.com;guojuhan@wellsepoxy.com;board-office@wellswam.com www.wellswam.com
|
||||
449 301525.SZ 上海儒竞科技股份有限公司 上海市杨浦区国权北路1688弄75号1204A室 86-21-61811998 juan.li@ruking.com;ir@ruking.com;weiwei.ma@ruking.com;haochao.li@ruking.com www.ruking.com
|
||||
450 301499.SZ 上海维科精密模塑股份有限公司 上海市闵行区北横沙河路598号 86-21-64960228 IR@vico.com.cn www.vico.com.cn
|
||||
451 301315.SZ 上海威士顿信息技术股份有限公司 上海市长宁区长宁路999号643室 86-21-65757700 DBO@wsdinfo.com www.wsdinfo.com
|
||||
452 301173.SZ 上海毓恬冠佳科技股份有限公司 上海市青浦工业园区崧煌路580号 86-21-59219238 mobitech@mobitech.com.cn www.mobitech.com.cn
|
||||
0
_doc/指令列表.md
Normal file
0
_doc/指令列表.md
Normal file
@@ -197,6 +197,15 @@ class PlaAccountServer {
|
||||
updateAuthorization(param) {
|
||||
return window.framework.http.post('/account/update-authorization', param)
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析账号的在线简历
|
||||
* @param {Number|String} accountId - 账号ID
|
||||
* @returns {Promise}
|
||||
*/
|
||||
parseResume(accountId) {
|
||||
return window.framework.http.post('/pla_account/parse-resume', { id: accountId })
|
||||
}
|
||||
}
|
||||
|
||||
export default new PlaAccountServer()
|
||||
|
||||
@@ -39,6 +39,15 @@ class ResumeInfoServer {
|
||||
del(row) {
|
||||
return window.framework.http.post('/resume/delete', { resumeId: row.resumeId || row.id })
|
||||
}
|
||||
|
||||
/**
|
||||
* AI 分析简历
|
||||
* @param {String} resumeId - 简历ID
|
||||
* @returns {Promise}
|
||||
*/
|
||||
analyzeWithAI(resumeId) {
|
||||
return window.framework.http.post('/resume/analyze-with-ai', { resumeId })
|
||||
}
|
||||
}
|
||||
|
||||
export default new ResumeInfoServer()
|
||||
|
||||
@@ -99,8 +99,11 @@
|
||||
</Form>
|
||||
</Modal>
|
||||
|
||||
<!-- 简历详情弹窗 -->
|
||||
<Modal v-model="resumeModal.visible" :title="resumeModal.title" width="900" :footer-hide="true">
|
||||
<!-- 简历详情弹窗 - 使用 ResumeInfoDetail 组件 -->
|
||||
<ResumeInfoDetail ref="resumeDetail" @on-close="handleResumeDetailClose" />
|
||||
|
||||
<!-- 原简历详情弹窗(备份,暂时保留) -->
|
||||
<Modal v-model="resumeModal.visible" :title="resumeModal.title" width="900" :footer-hide="true" v-if="false">
|
||||
<div v-if="resumeModal.loading" style="text-align: center; padding: 40px;">
|
||||
<Spin size="large"></Spin>
|
||||
<p style="margin-top: 20px;">加载简历数据中...</p>
|
||||
@@ -276,9 +279,11 @@
|
||||
import plaAccountServer from '@/api/profile/pla_account_server.js'
|
||||
import jobTypesServer from '@/api/work/job_types_server.js'
|
||||
import PlaAccountEdit from './pla_account_edit.vue'
|
||||
import ResumeInfoDetail from './resume_info_detail.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
ResumeInfoDetail,
|
||||
PlaAccountEdit
|
||||
},
|
||||
data() {
|
||||
@@ -344,13 +349,12 @@ export default {
|
||||
{ title: '密码', key: 'pwd', com: 'Password', required: true },
|
||||
],
|
||||
listColumns: [
|
||||
{ title: 'ID', key: 'id', minWidth: 80 },
|
||||
{ title: '账户名', key: 'name', minWidth: 150 },
|
||||
{ title: '设备SN码', key: 'sn_code', minWidth: 120 },
|
||||
{ title: 'ID', key: 'id' },
|
||||
{ title: '账户名', key: 'name' },
|
||||
{ title: '设备SN码', key: 'sn_code'},
|
||||
{
|
||||
title: '平台',
|
||||
key: 'platform_type',
|
||||
minWidth: 100,
|
||||
render: (h, params) => {
|
||||
const platformMap = {
|
||||
'boss': { text: 'Boss直聘', color: 'blue' },
|
||||
@@ -360,13 +364,13 @@ export default {
|
||||
return h('Tag', { props: { color: platform.color } }, platform.text)
|
||||
}
|
||||
},
|
||||
{ title: '登录名', key: 'login_name', minWidth: 150 },
|
||||
{ title: '搜索关键词', key: 'keyword', minWidth: 150 },
|
||||
{ title: '用户地址', key: 'user_address', minWidth: 150 },
|
||||
{ title: '登录名', key: 'login_name'},
|
||||
{ title: '搜索关键词', key: 'keyword' },
|
||||
{ title: '用户地址', key: 'user_address' },
|
||||
{
|
||||
title: '经纬度',
|
||||
key: 'location',
|
||||
minWidth: 150,
|
||||
|
||||
render: (h, params) => {
|
||||
const lon = params.row.user_longitude;
|
||||
const lat = params.row.user_latitude;
|
||||
@@ -379,7 +383,7 @@ export default {
|
||||
{
|
||||
title: '在线状态',
|
||||
key: 'is_online',
|
||||
minWidth: 100,
|
||||
|
||||
render: (h, params) => {
|
||||
return h('Tag', {
|
||||
props: { color: params.row.is_online ? 'success' : 'default' }
|
||||
@@ -390,7 +394,7 @@ export default {
|
||||
title: '自动投递',
|
||||
key: 'auto_deliver',
|
||||
com: "Radio",
|
||||
minWidth: 100,
|
||||
|
||||
options: [
|
||||
{ value: 1, label: '开启' },
|
||||
{ value: 0, label: '关闭' }
|
||||
@@ -409,7 +413,6 @@ export default {
|
||||
{ value: 1, label: '开启' },
|
||||
{ value: 0, label: '关闭' }
|
||||
],
|
||||
minWidth: 100,
|
||||
render: (h, params) => {
|
||||
return h('Tag', {
|
||||
props: { color: params.row.auto_chat ? 'success' : 'default' }
|
||||
@@ -419,7 +422,7 @@ export default {
|
||||
{
|
||||
title: '剩余天数',
|
||||
key: 'remaining_days',
|
||||
minWidth: 100,
|
||||
|
||||
render: (h, params) => {
|
||||
const remainingDays = params.row.remaining_days || 0
|
||||
let color = 'success'
|
||||
@@ -436,7 +439,7 @@ export default {
|
||||
{
|
||||
title: '授权日期',
|
||||
key: 'authorization_date',
|
||||
minWidth: 150,
|
||||
|
||||
render: (h, params) => {
|
||||
if (!params.row.authorization_date) {
|
||||
return h('span', { style: { color: '#999' } }, '未授权')
|
||||
@@ -448,7 +451,7 @@ export default {
|
||||
{
|
||||
title: '过期时间',
|
||||
key: 'expire_date',
|
||||
minWidth: 150,
|
||||
|
||||
render: (h, params) => {
|
||||
if (!params.row.authorization_date || !params.row.authorization_days) {
|
||||
return h('span', { style: { color: '#999' } }, '未授权')
|
||||
@@ -469,7 +472,7 @@ export default {
|
||||
{ value: 1, label: '开启' },
|
||||
{ value: 0, label: '关闭' }
|
||||
],
|
||||
minWidth: 100,
|
||||
|
||||
render: (h, params) => {
|
||||
return h('Tag', {
|
||||
props: { color: params.row.auto_active ? 'success' : 'default' }
|
||||
@@ -479,7 +482,6 @@ export default {
|
||||
{
|
||||
title: '启用状态',
|
||||
key: 'is_enabled',
|
||||
minWidth: 100,
|
||||
render: (h, params) => {
|
||||
return h('i-switch', {
|
||||
props: {
|
||||
@@ -494,11 +496,11 @@ export default {
|
||||
})
|
||||
}
|
||||
},
|
||||
{ title: '创建时间', key: 'create_time', minWidth: 150 },
|
||||
{ title: '创建时间', key: 'create_time', },
|
||||
{
|
||||
title: '操作',
|
||||
key: 'action',
|
||||
width: 450,
|
||||
width: 500,
|
||||
type: 'template',
|
||||
render: (h, params) => {
|
||||
let btns = [
|
||||
@@ -661,10 +663,11 @@ export default {
|
||||
},
|
||||
// 查看简历
|
||||
async showResume(row) {
|
||||
this.resumeModal.visible = true
|
||||
this.resumeModal.loading = true
|
||||
this.resumeModal.data = null
|
||||
this.resumeModal.title = `${row.name} - 在线简历`
|
||||
// 显示加载提示
|
||||
const loadingMsg = this.$Message.loading({
|
||||
content: '正在加载简历数据...',
|
||||
duration: 0
|
||||
})
|
||||
|
||||
try {
|
||||
// 根据 sn_code 和 platform 获取简历
|
||||
@@ -677,18 +680,24 @@ export default {
|
||||
// admin 会自动加 /admin_api 前缀
|
||||
const res = await window.framework.http.get(`/resume/get-by-device?sn_code=${row.sn_code}&platform=${platform}`)
|
||||
|
||||
if (res.code === 0) {
|
||||
this.resumeModal.data = res.data
|
||||
loadingMsg()
|
||||
|
||||
if (res.code === 0 && res.data && res.data.resumeId) {
|
||||
// 使用 ResumeInfoDetail 组件显示简历
|
||||
this.$refs.resumeDetail.show(res.data.resumeId)
|
||||
} else {
|
||||
this.$Message.warning(res.message || '未找到简历数据')
|
||||
}
|
||||
} catch (error) {
|
||||
loadingMsg()
|
||||
console.error('获取简历失败:', error)
|
||||
this.$Message.error('获取简历失败:' + (error.message || '请稍后重试'))
|
||||
} finally {
|
||||
this.resumeModal.loading = false
|
||||
}
|
||||
},
|
||||
// 关闭简历详情
|
||||
handleResumeDetailClose() {
|
||||
// 可以在这里添加关闭后的逻辑
|
||||
},
|
||||
// 解析技能标签
|
||||
parseSkills(skills) {
|
||||
if (!skills) return []
|
||||
|
||||
@@ -534,6 +534,9 @@
|
||||
<Button type="primary" @click="refreshQrCode" :loading="qrCodeLoading">刷新二维码</Button>
|
||||
</div>
|
||||
</Modal>
|
||||
|
||||
<!-- 简历详情弹窗 -->
|
||||
<ResumeInfoDetail ref="resumeDetail" @on-close="handleResumeDetailClose" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -541,9 +544,13 @@
|
||||
import plaAccountServer from '@/api/profile/pla_account_server.js'
|
||||
import taskStatusServer from '@/api/task/task_status_server.js'
|
||||
import jobTypesServer from '@/api/work/job_types_server.js'
|
||||
import ResumeInfoDetail from './resume_info_detail.vue'
|
||||
|
||||
export default {
|
||||
name: 'PlaAccountDetail',
|
||||
components: {
|
||||
ResumeInfoDetail
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
accountInfo: {},
|
||||
@@ -608,6 +615,12 @@ export default {
|
||||
commandType: 'get_online_resume',
|
||||
commandName: '获取在线简历'
|
||||
},
|
||||
{
|
||||
value: 'parse_and_view_resume',
|
||||
label: '解析简历',
|
||||
icon: 'ios-paper',
|
||||
isCustomAction: true
|
||||
},
|
||||
{
|
||||
value: 'search_jobs',
|
||||
label: '搜索岗位',
|
||||
@@ -1168,6 +1181,12 @@ export default {
|
||||
return
|
||||
}
|
||||
|
||||
// 如果是解析简历的自定义操作
|
||||
if (action === 'parse_and_view_resume') {
|
||||
this.handleParseAndViewResume()
|
||||
return
|
||||
}
|
||||
|
||||
// 从菜单列表中查找对应的配置
|
||||
const actionItem = this.actionMenuList.find(item => item.value === action)
|
||||
if (!actionItem) {
|
||||
@@ -1204,6 +1223,42 @@ export default {
|
||||
})
|
||||
},
|
||||
|
||||
// 处理解析并查看简历
|
||||
async handleParseAndViewResume() {
|
||||
this.$Modal.confirm({
|
||||
title: '确认解析简历',
|
||||
content: '确定要解析该账号的在线简历吗?系统会自动获取简历并进行AI分析。',
|
||||
onOk: async () => {
|
||||
const loadingMsg = this.$Message.loading({
|
||||
content: '正在解析简历,请稍候...',
|
||||
duration: 0
|
||||
})
|
||||
|
||||
try {
|
||||
// 调用后端接口解析简历
|
||||
const res = await plaAccountServer.parseResume(this.accountId)
|
||||
|
||||
loadingMsg()
|
||||
this.$Message.success('简历解析成功')
|
||||
|
||||
// 打开简历详情弹窗
|
||||
if (res.data && res.data.resumeId) {
|
||||
this.$refs.resumeDetail.show(res.data.resumeId)
|
||||
}
|
||||
} catch (error) {
|
||||
loadingMsg()
|
||||
console.error('解析简历失败:', error)
|
||||
this.$Message.error('解析简历失败: ' + (error.message || '请稍后重试'))
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 关闭简历详情弹窗
|
||||
handleResumeDetailClose() {
|
||||
// 可以在这里添加关闭后的逻辑
|
||||
},
|
||||
|
||||
// 显示二维码
|
||||
async showQrCode() {
|
||||
this.qrCodeVisible = true
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<template>
|
||||
<div class="content-view">
|
||||
<div class="table-head-tool">
|
||||
<Button type="primary" @click="showAddWarp">新增简历</Button>
|
||||
<Form ref="formInline" :model="gridOption.param.seachOption" inline :label-width="80">
|
||||
<FormItem :label-width="20" class="flex">
|
||||
<Select v-model="gridOption.param.seachOption.key" style="width: 120px"
|
||||
@@ -29,13 +28,20 @@
|
||||
@changePage="query"></tables>
|
||||
</div>
|
||||
<editModal ref="editModal" :columns="editColumns" :rules="gridOption.rules"></editModal>
|
||||
|
||||
<!-- 详情组件 -->
|
||||
<ResumeInfoDetail ref="resumeDetail" @on-close="handleDetailClose" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import resumeInfoServer from '@/api/profile/resume_info_server.js'
|
||||
import ResumeInfoDetail from './resume_info_detail.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
ResumeInfoDetail
|
||||
},
|
||||
data() {
|
||||
let rules = {}
|
||||
rules["sn_code"] = [{ required: true, message: '请填写设备SN码', trigger: 'blur' }]
|
||||
@@ -90,10 +96,17 @@ export default {
|
||||
{
|
||||
title: '操作',
|
||||
key: 'action',
|
||||
width: 200,
|
||||
width: 250,
|
||||
type: 'template',
|
||||
render: (h, params) => {
|
||||
let btns = [
|
||||
{
|
||||
title: '查看',
|
||||
type: 'info',
|
||||
click: () => {
|
||||
this.showDetail(params.row)
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '编辑',
|
||||
type: 'primary',
|
||||
@@ -168,6 +181,19 @@ export default {
|
||||
platform: null
|
||||
}
|
||||
this.query(1)
|
||||
},
|
||||
showDetail(row) {
|
||||
// 优先使用 resumeId,如果没有则使用 id
|
||||
const resumeId = row.resumeId || row.id
|
||||
if (resumeId) {
|
||||
this.$refs.resumeDetail.show(resumeId)
|
||||
} else {
|
||||
this.$Message.warning('简历ID不存在')
|
||||
}
|
||||
},
|
||||
handleDetailClose() {
|
||||
// 详情关闭后的回调,可以在这里刷新列表
|
||||
// this.query(this.gridOption.param.pageOption.page)
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
||||
488
admin/src/views/account/resume_info_detail.vue
Normal file
488
admin/src/views/account/resume_info_detail.vue
Normal file
@@ -0,0 +1,488 @@
|
||||
<template>
|
||||
<FloatPanel
|
||||
ref="floatPanel"
|
||||
title="简历详情"
|
||||
position="right"
|
||||
:show-back="true"
|
||||
back-text="返回"
|
||||
@back="handleBack"
|
||||
>
|
||||
<template #header-right>
|
||||
<Button type="primary" @click="handleAnalyzeAI" :loading="analyzing">AI 分析</Button>
|
||||
</template>
|
||||
|
||||
<div class="resume-detail-content" v-if="resumeData">
|
||||
<Spin fix v-if="loading">
|
||||
<Icon type="ios-loading" size="18" class="spin-icon-load"></Icon>
|
||||
<div>加载中...</div>
|
||||
</Spin>
|
||||
|
||||
<!-- 基本信息 -->
|
||||
<Card title="基本信息" style="margin-bottom: 16px;">
|
||||
<Row :gutter="16">
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">姓名:</span>
|
||||
<span class="value">{{ resumeData.fullName || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">性别:</span>
|
||||
<span class="value">{{ resumeData.gender || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">年龄:</span>
|
||||
<span class="value">{{ resumeData.age || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">电话:</span>
|
||||
<span class="value">{{ resumeData.phone || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">邮箱:</span>
|
||||
<span class="value">{{ resumeData.email || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">所在地:</span>
|
||||
<span class="value">{{ resumeData.location || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">工作年限:</span>
|
||||
<span class="value">{{ resumeData.workYears || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">当前职位:</span>
|
||||
<span class="value">{{ resumeData.currentPosition || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">当前公司:</span>
|
||||
<span class="value">{{ resumeData.currentCompany || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
</Row>
|
||||
</Card>
|
||||
|
||||
<!-- 教育背景 -->
|
||||
<Card title="教育背景" style="margin-bottom: 16px;">
|
||||
<Row :gutter="16">
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">学历:</span>
|
||||
<span class="value">{{ resumeData.education || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">专业:</span>
|
||||
<span class="value">{{ resumeData.major || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">毕业院校:</span>
|
||||
<span class="value">{{ resumeData.school || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">毕业年份:</span>
|
||||
<span class="value">{{ resumeData.graduationYear || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
</Row>
|
||||
</Card>
|
||||
|
||||
<!-- 期望信息 -->
|
||||
<Card title="期望信息" style="margin-bottom: 16px;">
|
||||
<Row :gutter="16">
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">期望职位:</span>
|
||||
<span class="value">{{ resumeData.expectedPosition || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">期望薪资:</span>
|
||||
<span class="value">{{ resumeData.expectedSalary || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">期望地点:</span>
|
||||
<span class="value">{{ resumeData.expectedLocation || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="12">
|
||||
<div class="info-item">
|
||||
<span class="label">期望行业:</span>
|
||||
<span class="value">{{ resumeData.expectedIndustry || '-' }}</span>
|
||||
</div>
|
||||
</Col>
|
||||
</Row>
|
||||
</Card>
|
||||
|
||||
<!-- 技能标签 -->
|
||||
<Card title="技能标签" style="margin-bottom: 16px;">
|
||||
<div v-if="skillTags && skillTags.length > 0">
|
||||
<Tag v-for="(skill, index) in skillTags" :key="index" color="blue" style="margin: 4px;">{{ skill }}</Tag>
|
||||
</div>
|
||||
<div v-else class="no-data">暂无技能标签</div>
|
||||
</Card>
|
||||
|
||||
<!-- 技能描述 -->
|
||||
<Card title="技能描述" style="margin-bottom: 16px;" v-if="resumeData.skillDescription">
|
||||
<div class="text-content">{{ resumeData.skillDescription }}</div>
|
||||
</Card>
|
||||
|
||||
<!-- 工作经历 -->
|
||||
<Card title="工作经历" style="margin-bottom: 16px;" v-if="workExperience && workExperience.length > 0">
|
||||
<Timeline>
|
||||
<TimelineItem v-for="(work, index) in workExperience" :key="index">
|
||||
<p class="work-title">
|
||||
<strong>{{ work.position }}</strong>
|
||||
<span class="work-company"> - {{ work.company }}</span>
|
||||
</p>
|
||||
<p class="work-time" v-if="work.startDate || work.endDate">
|
||||
{{ work.startDate }} - {{ work.endDate || '至今' }}
|
||||
</p>
|
||||
<p class="work-content" v-if="work.content">{{ work.content }}</p>
|
||||
</TimelineItem>
|
||||
</Timeline>
|
||||
</Card>
|
||||
|
||||
<!-- 项目经验 -->
|
||||
<Card title="项目经验" style="margin-bottom: 16px;" v-if="projectExperience && projectExperience.length > 0">
|
||||
<div v-for="(project, index) in projectExperience" :key="index" class="project-item" style="margin-bottom: 20px;">
|
||||
<p class="project-title">
|
||||
<strong>{{ project.name }}</strong>
|
||||
<span class="project-role" v-if="project.role"> - {{ project.role }}</span>
|
||||
</p>
|
||||
<p class="project-time" v-if="project.startDate || project.endDate">
|
||||
{{ project.startDate }} - {{ project.endDate || '至今' }}
|
||||
</p>
|
||||
<p class="project-desc" v-if="project.description">{{ project.description }}</p>
|
||||
<p class="project-performance" v-if="project.performance">
|
||||
<strong>项目成果:</strong>{{ project.performance }}
|
||||
</p>
|
||||
</div>
|
||||
</Card>
|
||||
|
||||
<!-- 简历内容 -->
|
||||
<Card title="简历完整内容" style="margin-bottom: 16px;" v-if="resumeData.resumeContent">
|
||||
<div class="text-content" style="white-space: pre-wrap;">{{ resumeData.resumeContent }}</div>
|
||||
</Card>
|
||||
|
||||
<!-- AI 分析结果 -->
|
||||
<Card title="AI 分析结果" style="margin-bottom: 16px;">
|
||||
<Row :gutter="16">
|
||||
<Col span="24">
|
||||
<div class="info-item">
|
||||
<span class="label">竞争力评分:</span>
|
||||
<span class="value" :style="{ color: getCompetitivenessColor(resumeData.aiCompetitiveness), fontSize: '18px', fontWeight: 'bold' }">
|
||||
{{ resumeData.aiCompetitiveness || 0 }} 分
|
||||
</span>
|
||||
<Progress
|
||||
:percent="resumeData.aiCompetitiveness || 0"
|
||||
:stroke-color="getCompetitivenessColor(resumeData.aiCompetitiveness)"
|
||||
style="margin-top: 8px; width: 300px;"
|
||||
/>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="24" v-if="resumeData.aiStrengths">
|
||||
<div class="info-item ai-section">
|
||||
<div class="ai-section-header">
|
||||
<Icon type="ios-thumbs-up" color="#19be6b" size="18" />
|
||||
<span class="label">优势分析</span>
|
||||
</div>
|
||||
<div class="text-content ai-content">{{ resumeData.aiStrengths }}</div>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="24" v-if="resumeData.aiWeaknesses">
|
||||
<div class="info-item ai-section">
|
||||
<div class="ai-section-header">
|
||||
<Icon type="ios-warning" color="#ff9900" size="18" />
|
||||
<span class="label">劣势分析</span>
|
||||
</div>
|
||||
<div class="text-content ai-content">{{ resumeData.aiWeaknesses }}</div>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="24" v-if="resumeData.aiCareerSuggestion">
|
||||
<div class="info-item ai-section">
|
||||
<div class="ai-section-header">
|
||||
<Icon type="ios-bulb" color="#2d8cf0" size="18" />
|
||||
<span class="label">职业建议</span>
|
||||
</div>
|
||||
<div class="text-content ai-content">{{ resumeData.aiCareerSuggestion }}</div>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="24" v-if="aiSkillTags && aiSkillTags.length > 0">
|
||||
<div class="info-item">
|
||||
<span class="label">AI 提取的技能标签:</span>
|
||||
<div style="margin-top: 8px;">
|
||||
<Tag v-for="(skill, index) in aiSkillTags" :key="index" color="green" style="margin: 4px;">{{ skill }}</Tag>
|
||||
</div>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span="24" v-if="!resumeData.aiCompetitiveness && !resumeData.aiStrengths">
|
||||
<div class="no-data">
|
||||
<Icon type="ios-information-circle" size="24" color="#c5c8ce" />
|
||||
<p>暂无 AI 分析结果,请点击上方"AI 分析"按钮进行分析</p>
|
||||
</div>
|
||||
</Col>
|
||||
</Row>
|
||||
</Card>
|
||||
|
||||
<!-- 原始数据(可展开) -->
|
||||
<Card title="原始数据" style="margin-bottom: 16px;">
|
||||
<Collapse>
|
||||
<Panel name="originalData">
|
||||
查看原始 JSON 数据
|
||||
<template slot="content">
|
||||
<pre class="json-preview">{{ JSON.stringify(originalDataObj, null, 2) }}</pre>
|
||||
</template>
|
||||
</Panel>
|
||||
</Collapse>
|
||||
</Card>
|
||||
</div>
|
||||
</FloatPanel>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import resumeInfoServer from '@/api/profile/resume_info_server.js'
|
||||
|
||||
export default {
|
||||
name: 'ResumeInfoDetail',
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
analyzing: false,
|
||||
resumeData: null,
|
||||
skillTags: [],
|
||||
workExperience: [],
|
||||
projectExperience: [],
|
||||
aiSkillTags: [],
|
||||
originalDataObj: {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async show(resumeId) {
|
||||
this.$refs.floatPanel.show()
|
||||
await this.loadResumeData(resumeId)
|
||||
},
|
||||
async loadResumeData(resumeId) {
|
||||
this.loading = true
|
||||
try {
|
||||
const res = await resumeInfoServer.getById(resumeId)
|
||||
this.resumeData = res.data || {}
|
||||
|
||||
// 解析 JSON 字段
|
||||
this.skillTags = this.parseJsonField(this.resumeData.skills) || []
|
||||
this.workExperience = this.parseJsonField(this.resumeData.workExperience) || []
|
||||
this.projectExperience = this.parseJsonField(this.resumeData.projectExperience) || []
|
||||
this.aiSkillTags = this.parseJsonField(this.resumeData.aiSkillTags) || []
|
||||
|
||||
// 解析原始数据
|
||||
this.originalDataObj = this.parseJsonField(this.resumeData.originalData) || {}
|
||||
} catch (error) {
|
||||
console.error('加载简历详情失败:', error)
|
||||
this.$Message.error('加载简历详情失败')
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
parseJsonField(field) {
|
||||
if (!field) return null
|
||||
if (typeof field === 'string') {
|
||||
try {
|
||||
return JSON.parse(field)
|
||||
} catch (e) {
|
||||
return field
|
||||
}
|
||||
}
|
||||
return field
|
||||
},
|
||||
async handleAnalyzeAI() {
|
||||
if (!this.resumeData || !this.resumeData.resumeId) {
|
||||
this.$Message.warning('简历ID不存在')
|
||||
return
|
||||
}
|
||||
|
||||
this.analyzing = true
|
||||
try {
|
||||
await resumeInfoServer.analyzeWithAI(this.resumeData.resumeId)
|
||||
this.$Message.success('AI 分析完成')
|
||||
// 重新加载数据
|
||||
await this.loadResumeData(this.resumeData.resumeId)
|
||||
} catch (error) {
|
||||
console.error('AI 分析失败:', error)
|
||||
this.$Message.error('AI 分析失败: ' + (error.message || '请稍后重试'))
|
||||
} finally {
|
||||
this.analyzing = false
|
||||
}
|
||||
},
|
||||
handleBack() {
|
||||
this.$refs.floatPanel.hide()
|
||||
this.$emit('on-close')
|
||||
},
|
||||
getCompetitivenessColor(score) {
|
||||
if (!score) return '#666'
|
||||
if (score >= 80) return '#19be6b'
|
||||
if (score >= 60) return '#2d8cf0'
|
||||
return '#ed4014'
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.resume-detail-content {
|
||||
padding: 0;
|
||||
position: relative;
|
||||
min-height: 400px;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.info-item .label {
|
||||
font-weight: 600;
|
||||
color: #515a6e;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.info-item .value {
|
||||
color: #2d8cf0;
|
||||
}
|
||||
|
||||
.text-content {
|
||||
color: #515a6e;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.work-title {
|
||||
font-size: 14px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.work-company {
|
||||
color: #808695;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.work-time {
|
||||
color: #808695;
|
||||
font-size: 12px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.work-content {
|
||||
color: #515a6e;
|
||||
line-height: 1.6;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.project-item {
|
||||
padding-bottom: 16px;
|
||||
border-bottom: 1px solid #e8eaec;
|
||||
}
|
||||
|
||||
.project-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.project-title {
|
||||
font-size: 14px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.project-role {
|
||||
color: #808695;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.project-time {
|
||||
color: #808695;
|
||||
font-size: 12px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.project-desc {
|
||||
color: #515a6e;
|
||||
line-height: 1.6;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.project-performance {
|
||||
color: #19be6b;
|
||||
line-height: 1.6;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.no-data {
|
||||
color: #c5c8ce;
|
||||
text-align: center;
|
||||
padding: 40px 20px;
|
||||
}
|
||||
|
||||
.no-data p {
|
||||
margin-top: 12px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
/* AI 分析区域样式 */
|
||||
.ai-section {
|
||||
margin-bottom: 20px;
|
||||
padding: 16px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 6px;
|
||||
border-left: 3px solid #2d8cf0;
|
||||
}
|
||||
|
||||
.ai-section-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 12px;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.ai-section-header .label {
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
color: #17233d;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.ai-content {
|
||||
padding-left: 26px;
|
||||
line-height: 1.8;
|
||||
color: #515a6e;
|
||||
}
|
||||
|
||||
.json-preview {
|
||||
background: #f8f8f9;
|
||||
padding: 16px;
|
||||
border-radius: 4px;
|
||||
max-height: 500px;
|
||||
overflow-y: auto;
|
||||
font-size: 12px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -167,7 +167,7 @@ export default {
|
||||
return h('Tag', { props: { color: color } }, `${score}%`)
|
||||
}
|
||||
},
|
||||
{ title: '投递时间', key: 'applyTime', minWidth: 250 },
|
||||
{ title: '创建时间', key: 'create_time', minWidth: 250 },
|
||||
{
|
||||
title: '操作',
|
||||
key: 'action',
|
||||
|
||||
@@ -126,7 +126,7 @@ export default {
|
||||
return h('Tag', { props: { color: status.color } }, status.text)
|
||||
}
|
||||
},
|
||||
{ title: '发布时间', key: 'publishTime', minWidth: 150 },
|
||||
{ title: '创建时间', key: 'create_time', minWidth: 220 },
|
||||
{
|
||||
title: '操作',
|
||||
key: 'action',
|
||||
|
||||
@@ -104,10 +104,8 @@ module.exports = {
|
||||
});
|
||||
|
||||
return ctx.success({
|
||||
count: result.count,
|
||||
total: result.count,
|
||||
rows: result.rows,
|
||||
list: result.rows
|
||||
count: result.count
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
@@ -150,8 +150,8 @@ module.exports = {
|
||||
});
|
||||
|
||||
return ctx.success({
|
||||
total: result.count,
|
||||
list: list
|
||||
rows: list,
|
||||
count: result.count
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
@@ -686,6 +686,86 @@ module.exports = {
|
||||
end_date: end_date
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* @swagger
|
||||
* /admin_api/pla_account/parse-resume:
|
||||
* post:
|
||||
* summary: 解析账号在线简历
|
||||
* description: 获取指定账号的在线简历并进行AI分析,返回简历详情
|
||||
* tags: [后台-账号管理]
|
||||
* requestBody:
|
||||
* required: true
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* required:
|
||||
* - id
|
||||
* properties:
|
||||
* id:
|
||||
* type: integer
|
||||
* description: 账号ID
|
||||
* responses:
|
||||
* 200:
|
||||
* description: 解析成功,返回简历ID
|
||||
*/
|
||||
'POST /pla_account/parse-resume': async (ctx) => {
|
||||
const { id } = ctx.getBody();
|
||||
const models = await Framework.getModels();
|
||||
const { pla_account } = models;
|
||||
const mqttClient = require('../middleware/mqtt/mqttClient');
|
||||
const resumeManager = require('../middleware/job/resumeManager');
|
||||
|
||||
if (!id) {
|
||||
return ctx.fail('账号ID不能为空');
|
||||
}
|
||||
|
||||
// 获取账号信息
|
||||
const account = await pla_account.findOne({ where: { id } });
|
||||
|
||||
if (!account) {
|
||||
return ctx.fail('账号不存在');
|
||||
}
|
||||
|
||||
const { sn_code, platform_type } = account;
|
||||
|
||||
if (!sn_code) {
|
||||
return ctx.fail('该账号未绑定设备');
|
||||
}
|
||||
|
||||
try {
|
||||
// 调用简历管理器获取并保存简历
|
||||
const resumeData = await resumeManager.get_online_resume(sn_code, mqttClient, {
|
||||
platform: platform_type || 'boss'
|
||||
});
|
||||
|
||||
// 从返回数据中获取 resumeId
|
||||
// resumeManager 已经保存了简历到数据库,我们需要查询获取 resumeId
|
||||
const resume_info = models.resume_info;
|
||||
const savedResume = await resume_info.findOne({
|
||||
where: {
|
||||
sn_code,
|
||||
platform: platform_type || 'boss',
|
||||
isActive: true
|
||||
},
|
||||
order: [['syncTime', 'DESC']]
|
||||
});
|
||||
|
||||
if (!savedResume) {
|
||||
return ctx.fail('简历解析失败:未找到保存的简历记录');
|
||||
}
|
||||
|
||||
return ctx.success({
|
||||
message: '简历解析成功',
|
||||
resumeId: savedResume.resumeId,
|
||||
data: resumeData
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('[解析简历] 失败:', error);
|
||||
return ctx.fail('解析简历失败: ' + (error.message || '未知错误'));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -69,8 +69,8 @@ const result = await resume_info.findAndCountAll({
|
||||
});
|
||||
|
||||
return ctx.success({
|
||||
total: result.count,
|
||||
list: result.rows
|
||||
rows: result.rows,
|
||||
count: result.count
|
||||
});
|
||||
|
||||
},
|
||||
@@ -153,24 +153,45 @@ return ctx.success({
|
||||
* 200:
|
||||
* description: 获取成功
|
||||
*/
|
||||
'GET /resume/detail': async (ctx) => {
|
||||
'POST /resume/detail': async (ctx) => {
|
||||
const models = Framework.getModels();
|
||||
const { resume_info } = models;
|
||||
const { resumeId } = ctx.query;
|
||||
const { resumeId } = ctx.getBody();
|
||||
|
||||
if (!resumeId) {
|
||||
return ctx.fail('简历ID不能为空');
|
||||
}
|
||||
|
||||
const resume = await resume_info.findOne({ where: { resumeId } });
|
||||
|
||||
const resume = await resume_info.findOne({ where: { resumeId } });
|
||||
|
||||
if (!resume) {
|
||||
if (!resume) {
|
||||
return ctx.fail('简历不存在');
|
||||
}
|
||||
}
|
||||
|
||||
return ctx.success(resume);
|
||||
// 解析 JSON 字段
|
||||
const resumeDetail = resume.toJSON();
|
||||
const jsonFields = ['skills', 'certifications', 'projectExperience', 'workExperience', 'aiSkillTags'];
|
||||
|
||||
jsonFields.forEach(field => {
|
||||
if (resumeDetail[field]) {
|
||||
try {
|
||||
resumeDetail[field] = JSON.parse(resumeDetail[field]);
|
||||
} catch (e) {
|
||||
console.error(`解析字段 ${field} 失败:`, e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 解析原始数据(如果存在)
|
||||
if (resumeDetail.originalData) {
|
||||
try {
|
||||
resumeDetail.originalData = JSON.parse(resumeDetail.originalData);
|
||||
} catch (e) {
|
||||
console.error('解析原始数据失败:', e);
|
||||
}
|
||||
}
|
||||
|
||||
return ctx.success(resumeDetail);
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -269,6 +290,74 @@ return ctx.success({ message: '简历删除成功' });
|
||||
});
|
||||
|
||||
return ctx.success(resumeDetail);
|
||||
},
|
||||
|
||||
/**
|
||||
* @swagger
|
||||
* /admin_api/resume/analyze-with-ai:
|
||||
* post:
|
||||
* summary: AI 分析简历
|
||||
* description: 使用 AI 分析简历并更新 AI 字段
|
||||
* tags: [后台-简历管理]
|
||||
* requestBody:
|
||||
* required: true
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* required:
|
||||
* - resumeId
|
||||
* properties:
|
||||
* resumeId:
|
||||
* type: string
|
||||
* description: 简历ID
|
||||
* responses:
|
||||
* 200:
|
||||
* description: 分析成功
|
||||
*/
|
||||
'POST /resume/analyze-with-ai': async (ctx) => {
|
||||
const models = Framework.getModels();
|
||||
const { resume_info } = models;
|
||||
const { resumeId } = ctx.getBody();
|
||||
|
||||
if (!resumeId) {
|
||||
return ctx.fail('简历ID不能为空');
|
||||
}
|
||||
|
||||
const resume = await resume_info.findOne({ where: { resumeId } });
|
||||
|
||||
if (!resume) {
|
||||
return ctx.fail('简历不存在');
|
||||
}
|
||||
|
||||
try {
|
||||
const resumeManager = require('../middleware/job/resumeManager');
|
||||
const resumeData = resume.toJSON();
|
||||
|
||||
// 调用 AI 分析
|
||||
await resumeManager.analyze_resume_with_ai(resumeId, resumeData);
|
||||
|
||||
// 重新获取更新后的数据
|
||||
const updatedResume = await resume_info.findOne({ where: { resumeId } });
|
||||
const resumeDetail = updatedResume.toJSON();
|
||||
|
||||
// 解析 JSON 字段
|
||||
const jsonFields = ['skills', 'certifications', 'projectExperience', 'workExperience', 'aiSkillTags'];
|
||||
jsonFields.forEach(field => {
|
||||
if (resumeDetail[field]) {
|
||||
try {
|
||||
resumeDetail[field] = JSON.parse(resumeDetail[field]);
|
||||
} catch (e) {
|
||||
console.error(`解析字段 ${field} 失败:`, e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return ctx.success(resumeDetail);
|
||||
} catch (error) {
|
||||
console.error('AI 分析失败:', error);
|
||||
return ctx.fail('AI 分析失败: ' + error.message);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -180,34 +180,50 @@ class aiService {
|
||||
*/
|
||||
async analyzeResume(resumeText) {
|
||||
const prompt = `
|
||||
请分析以下简历内容,提取核心要素:
|
||||
请分析以下简历内容,并返回 JSON 格式的分析结果:
|
||||
|
||||
简历内容:
|
||||
${resumeText}
|
||||
|
||||
请提取以下信息:
|
||||
1. 技能标签(编程语言、框架、工具等)
|
||||
2. 工作经验(年限、行业、项目等)
|
||||
3. 教育背景(学历、专业、证书等)
|
||||
4. 期望薪资范围
|
||||
5. 期望工作地点
|
||||
6. 核心优势
|
||||
7. 职业发展方向
|
||||
请按以下格式返回 JSON 结果:
|
||||
{
|
||||
"skillTags": ["技能1", "技能2", "技能3"], // 技能标签数组(编程语言、框架、工具等)
|
||||
"strengths": "核心优势描述", // 简历的优势和亮点
|
||||
"weaknesses": "不足之处描述", // 简历的不足或需要改进的地方
|
||||
"careerSuggestion": "职业发展建议", // 针对该简历的职业发展方向和建议
|
||||
"competitiveness": 75 // 竞争力评分(0-100的整数),综合考虑工作年限、技能、经验等因素
|
||||
}
|
||||
|
||||
请以JSON格式返回结果。
|
||||
要求:
|
||||
1. skillTags 必须是字符串数组
|
||||
2. strengths、weaknesses、careerSuggestion 是字符串描述
|
||||
3. competitiveness 必须是 0-100 之间的整数
|
||||
4. 所有字段都必须返回,如果没有相关信息,使用空数组或空字符串
|
||||
`;
|
||||
|
||||
const result = await this.callAPI(prompt, {
|
||||
systemPrompt: '你是一个专业的简历分析师,擅长提取简历的核心要素和关键信息。',
|
||||
temperature: 0.2
|
||||
systemPrompt: '你是一个专业的简历分析师,擅长分析简历的核心要素、优势劣势、竞争力评分和职业发展建议。请以 JSON 格式返回分析结果,确保格式正确。',
|
||||
temperature: 0.3,
|
||||
maxTokens: 1500
|
||||
});
|
||||
|
||||
try {
|
||||
const analysis = JSON.parse(result.content);
|
||||
// 尝试从返回内容中提取 JSON
|
||||
let content = result.content.trim();
|
||||
|
||||
// 如果返回内容被代码块包裹,提取其中的 JSON
|
||||
const jsonMatch = content.match(/```(?:json)?\s*(\{[\s\S]*\})\s*```/) || content.match(/(\{[\s\S]*\})/);
|
||||
if (jsonMatch) {
|
||||
content = jsonMatch[1];
|
||||
}
|
||||
|
||||
const analysis = JSON.parse(content);
|
||||
return {
|
||||
analysis: analysis
|
||||
};
|
||||
} catch (parseError) {
|
||||
console.error(`[AI服务] 简历分析结果解析失败:`, parseError);
|
||||
console.error(`[AI服务] 原始内容:`, result.content);
|
||||
return {
|
||||
analysis: {
|
||||
content: result.content,
|
||||
|
||||
@@ -181,12 +181,103 @@ class ResumeManager {
|
||||
console.log(`[简历管理] 简历已创建 - ID: ${resumeId}`);
|
||||
}
|
||||
|
||||
// 二期规划:AI 分析暂时禁用,使用简单的文本匹配
|
||||
console.log(`[简历管理] AI分析已禁用(二期规划),使用文本匹配过滤`);
|
||||
// 调用 AI 分析简历并更新 AI 字段
|
||||
|
||||
try {
|
||||
await this.analyze_resume_with_ai(resumeId, resumeInfo);
|
||||
console.log(`[简历管理] AI 分析完成并已更新到数据库`);
|
||||
} catch (error) {
|
||||
console.error(`[简历管理] AI 分析失败:`, error);
|
||||
// AI 分析失败不影响主流程,继续返回成功
|
||||
}
|
||||
|
||||
return { resumeId, message: existingResume ? '简历更新成功' : '简历创建成功' };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 构建用于 AI 分析的简历文本
|
||||
* @param {object} resumeInfo - 简历信息对象
|
||||
* @returns {string} 简历文本内容
|
||||
*/
|
||||
build_resume_text_for_ai(resumeInfo) {
|
||||
const parts = [];
|
||||
|
||||
// 基本信息
|
||||
if (resumeInfo.fullName) parts.push(`姓名:${resumeInfo.fullName}`);
|
||||
if (resumeInfo.gender) parts.push(`性别:${resumeInfo.gender}`);
|
||||
if (resumeInfo.age) parts.push(`年龄:${resumeInfo.age}`);
|
||||
if (resumeInfo.location) parts.push(`所在地:${resumeInfo.location}`);
|
||||
|
||||
// 教育背景
|
||||
if (resumeInfo.education) parts.push(`学历:${resumeInfo.education}`);
|
||||
if (resumeInfo.school) parts.push(`毕业院校:${resumeInfo.school}`);
|
||||
if (resumeInfo.major) parts.push(`专业:${resumeInfo.major}`);
|
||||
if (resumeInfo.graduationYear) parts.push(`毕业年份:${resumeInfo.graduationYear}`);
|
||||
|
||||
// 工作经验
|
||||
if (resumeInfo.workYears) parts.push(`工作年限:${resumeInfo.workYears}`);
|
||||
if (resumeInfo.currentPosition) parts.push(`当前职位:${resumeInfo.currentPosition}`);
|
||||
if (resumeInfo.currentCompany) parts.push(`当前公司:${resumeInfo.currentCompany}`);
|
||||
|
||||
// 期望信息
|
||||
if (resumeInfo.expectedPosition) parts.push(`期望职位:${resumeInfo.expectedPosition}`);
|
||||
if (resumeInfo.expectedSalary) parts.push(`期望薪资:${resumeInfo.expectedSalary}`);
|
||||
if (resumeInfo.expectedLocation) parts.push(`期望地点:${resumeInfo.expectedLocation}`);
|
||||
|
||||
// 技能描述
|
||||
if (resumeInfo.skillDescription) parts.push(`技能描述:${resumeInfo.skillDescription}`);
|
||||
|
||||
// 工作经历
|
||||
if (resumeInfo.workExperience) {
|
||||
try {
|
||||
const workExp = JSON.parse(resumeInfo.workExperience);
|
||||
if (Array.isArray(workExp) && workExp.length > 0) {
|
||||
parts.push('\n工作经历:');
|
||||
workExp.forEach(work => {
|
||||
const workText = [
|
||||
work.company && `公司:${work.company}`,
|
||||
work.position && `职位:${work.position}`,
|
||||
work.startDate && work.endDate && `时间:${work.startDate} - ${work.endDate}`,
|
||||
work.content && `工作内容:${work.content}`
|
||||
].filter(Boolean).join(',');
|
||||
if (workText) parts.push(workText);
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
// 解析失败,忽略
|
||||
}
|
||||
}
|
||||
|
||||
// 项目经验
|
||||
if (resumeInfo.projectExperience) {
|
||||
try {
|
||||
const projectExp = JSON.parse(resumeInfo.projectExperience);
|
||||
if (Array.isArray(projectExp) && projectExp.length > 0) {
|
||||
parts.push('\n项目经验:');
|
||||
projectExp.forEach(project => {
|
||||
const projectText = [
|
||||
project.name && `项目名称:${project.name}`,
|
||||
project.role && `角色:${project.role}`,
|
||||
project.description && `描述:${project.description}`
|
||||
].filter(Boolean).join(',');
|
||||
if (projectText) parts.push(projectText);
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
// 解析失败,忽略
|
||||
}
|
||||
}
|
||||
|
||||
// 简历完整内容
|
||||
if (resumeInfo.resumeContent) {
|
||||
parts.push('\n简历详细内容:');
|
||||
parts.push(resumeInfo.resumeContent);
|
||||
}
|
||||
|
||||
return parts.join('\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* 从描述中提取技能标签
|
||||
* @param {string} description - 描述文本
|
||||
@@ -253,16 +344,23 @@ ${resumeInfo.skillDescription}
|
||||
// 解析AI返回的结果
|
||||
const analysis = this.parse_ai_analysis(aiAnalysis, resumeInfo);
|
||||
|
||||
// 更新简历的AI分析字段
|
||||
await resume_info.update({
|
||||
aiSkillTags: JSON.stringify(analysis.skillTags),
|
||||
aiStrengths: analysis.strengths,
|
||||
aiWeaknesses: analysis.weaknesses,
|
||||
aiCareerSuggestion: analysis.careerSuggestion,
|
||||
aiCompetitiveness: analysis.competitiveness
|
||||
}, { where: { id: resumeId } });
|
||||
// 确保所有字段都有值
|
||||
const updateData = {
|
||||
aiSkillTags: JSON.stringify(analysis.skillTags || []),
|
||||
aiStrengths: analysis.strengths || '',
|
||||
aiWeaknesses: analysis.weaknesses || '',
|
||||
aiCareerSuggestion: analysis.careerSuggestion || '',
|
||||
aiCompetitiveness: parseInt(analysis.competitiveness || 70, 10)
|
||||
};
|
||||
|
||||
console.log(`[简历管理] AI分析完成 - 竞争力评分: ${analysis.competitiveness}`);
|
||||
// 确保竞争力评分在 0-100 范围内
|
||||
if (updateData.aiCompetitiveness < 0) updateData.aiCompetitiveness = 0;
|
||||
if (updateData.aiCompetitiveness > 100) updateData.aiCompetitiveness = 100;
|
||||
|
||||
// 更新简历的AI分析字段
|
||||
await resume_info.update(updateData, { where: { resumeId: resumeId } });
|
||||
|
||||
console.log(`[简历管理] AI分析完成 - 竞争力评分: ${updateData.aiCompetitiveness}, 技能标签: ${updateData.aiSkillTags}`);
|
||||
|
||||
return analysis;
|
||||
} catch (error) {
|
||||
@@ -271,9 +369,26 @@ ${resumeInfo.skillDescription}
|
||||
fullName: resumeInfo.fullName
|
||||
});
|
||||
|
||||
// 如果AI分析失败,使用基于规则的默认分析
|
||||
// 如果AI分析失败,使用基于规则的默认分析,并保存到数据库
|
||||
const defaultAnalysis = this.get_default_analysis(resumeInfo);
|
||||
|
||||
// 保存默认分析结果到数据库
|
||||
const updateData = {
|
||||
aiSkillTags: JSON.stringify(defaultAnalysis.skillTags || []),
|
||||
aiStrengths: defaultAnalysis.strengths || '',
|
||||
aiWeaknesses: defaultAnalysis.weaknesses || '',
|
||||
aiCareerSuggestion: defaultAnalysis.careerSuggestion || '',
|
||||
aiCompetitiveness: parseInt(defaultAnalysis.competitiveness || 70, 10)
|
||||
};
|
||||
|
||||
// 确保竞争力评分在 0-100 范围内
|
||||
if (updateData.aiCompetitiveness < 0) updateData.aiCompetitiveness = 0;
|
||||
if (updateData.aiCompetitiveness > 100) updateData.aiCompetitiveness = 100;
|
||||
|
||||
await resume_info.update(updateData, { where: { resumeId: resumeId } });
|
||||
|
||||
console.log(`[简历管理] 使用默认分析结果 - 竞争力评分: ${updateData.aiCompetitiveness}`);
|
||||
|
||||
return defaultAnalysis;
|
||||
}
|
||||
}
|
||||
@@ -286,26 +401,44 @@ ${resumeInfo.skillDescription}
|
||||
*/
|
||||
parse_ai_analysis(aiResponse, resumeInfo) {
|
||||
try {
|
||||
// 尝试从AI响应中解析JSON
|
||||
const content = aiResponse.content || aiResponse.analysis?.content || '';
|
||||
// aiService.analyzeResume 返回格式: { analysis: {...} } 或 { analysis: { content: "...", parseError: true } }
|
||||
const analysis = aiResponse.analysis;
|
||||
|
||||
// 如果AI返回的是JSON格式
|
||||
if (content.includes('{') && content.includes('}')) {
|
||||
// 如果解析失败,analysis 会有 parseError 标记
|
||||
if (analysis && analysis.parseError) {
|
||||
console.warn(`[简历管理] AI分析结果解析失败,使用默认分析`);
|
||||
return this.get_default_analysis(resumeInfo);
|
||||
}
|
||||
|
||||
// 如果解析成功,analysis 直接是解析后的对象
|
||||
if (analysis && typeof analysis === 'object' && !analysis.parseError) {
|
||||
return {
|
||||
skillTags: analysis.skillTags || analysis.技能标签 || [],
|
||||
strengths: analysis.strengths || analysis.优势 || analysis.优势分析 || '',
|
||||
weaknesses: analysis.weaknesses || analysis.劣势 || analysis.劣势分析 || '',
|
||||
careerSuggestion: analysis.careerSuggestion || analysis.职业建议 || '',
|
||||
competitiveness: parseInt(analysis.competitiveness || analysis.竞争力评分 || 70, 10)
|
||||
};
|
||||
}
|
||||
|
||||
// 如果 analysis 是字符串,尝试解析
|
||||
const content = analysis?.content || analysis || '';
|
||||
if (typeof content === 'string' && content.includes('{') && content.includes('}')) {
|
||||
const jsonMatch = content.match(/\{[\s\S]*\}/);
|
||||
if (jsonMatch) {
|
||||
const parsed = JSON.parse(jsonMatch[0]);
|
||||
|
||||
return {
|
||||
skillTags: parsed.skillTags || parsed.技能标签 || [],
|
||||
strengths: parsed.strengths || parsed.优势 || parsed.优势分析 || '',
|
||||
weaknesses: parsed.weaknesses || parsed.劣势 || parsed.劣势分析 || '',
|
||||
careerSuggestion: parsed.careerSuggestion || parsed.职业建议 || '',
|
||||
competitiveness: parsed.competitiveness || parsed.竞争力评分 || 70
|
||||
competitiveness: parseInt(parsed.competitiveness || parsed.竞争力评分 || 70, 10)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// 如果无法解析JSON,尝试从文本中提取信息
|
||||
if (typeof content === 'string') {
|
||||
const skillTagsMatch = content.match(/技能标签[::](.*?)(?:\n|$)/);
|
||||
const strengthsMatch = content.match(/优势[分析]*[::](.*?)(?:\n|劣势)/s);
|
||||
const weaknessesMatch = content.match(/劣势[分析]*[::](.*?)(?:\n|职业)/s);
|
||||
@@ -317,8 +450,13 @@ ${resumeInfo.skillDescription}
|
||||
strengths: strengthsMatch ? strengthsMatch[1].trim() : '',
|
||||
weaknesses: weaknessesMatch ? weaknessesMatch[1].trim() : '',
|
||||
careerSuggestion: suggestionMatch ? suggestionMatch[1].trim() : '',
|
||||
competitiveness: scoreMatch ? parseInt(scoreMatch[1]) : 70
|
||||
competitiveness: scoreMatch ? parseInt(scoreMatch[1], 10) : 70
|
||||
};
|
||||
}
|
||||
|
||||
// 如果所有解析都失败,使用默认分析
|
||||
console.warn(`[简历管理] 无法解析AI分析结果,使用默认分析`);
|
||||
return this.get_default_analysis(resumeInfo);
|
||||
} catch (error) {
|
||||
console.error(`[简历管理] 解析AI分析结果失败:`, error);
|
||||
// 解析失败时使用默认分析
|
||||
|
||||
@@ -296,7 +296,7 @@ class MqttDispatcher {
|
||||
isLoggedIn: updateData.isLoggedIn || false,
|
||||
...heartbeatData
|
||||
};
|
||||
console.log(`[MQTT心跳] 传递给 deviceManager 的数据:`, { sn_code, isLoggedIn: heartbeatPayload.isLoggedIn });
|
||||
|
||||
await deviceManager.recordHeartbeat(sn_code, heartbeatPayload);
|
||||
} catch (error) {
|
||||
console.error('[MQTT心跳] 处理心跳消息失败:', error);
|
||||
|
||||
@@ -54,8 +54,8 @@ class ScheduleManager {
|
||||
console.log('[调度管理器] 心跳监听已启动');
|
||||
|
||||
// 5. 启动定时任务
|
||||
this.scheduledJobs.start();
|
||||
console.log('[调度管理器] 定时任务已启动');
|
||||
// this.scheduledJobs.start();
|
||||
// console.log('[调度管理器] 定时任务已启动');
|
||||
|
||||
this.isInitialized = true;
|
||||
|
||||
|
||||
@@ -264,5 +264,5 @@ module.exports = (db) => {
|
||||
|
||||
return job_postings
|
||||
|
||||
// job_postings.sync({ force: true
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user