Commit Graph

50 Commits

Author SHA1 Message Date
weicw 808881d80b refactor(gxmu): 名册页面移除手动认领与解除认领入口 2026-10-27 22:31:58 +08:00
weicw 2c0460ddc1 fix(ai): 产物地址兼容字符串元素,创意助手与助手页链接可复制
video_result/photo_files 的元素可能直接是地址字符串,原实现按对象取 url,
字符串元素一律取空——视频有文件却不播放、复制链接永远为空。
2026-10-25 15:55:49 +08:00
weicw 1cbf996a41 fix(ai): 修复大文本消息溢出用户气泡
999px 圆角在盒子尺寸不足时会被按比例夹到短边一半;单行气泡仍是胶囊,多行大文本则变成巨大椭圆,矩形文字区漏出白底。用户气泡改为 24px 圆角,并给气泡补 overflow-wrap: anywhere,保证长 URL 也能在气泡内换行。
2026-10-24 19:27:03 +08:00
weicw 6f35844fa4 fix(ai): 窄屏下保证「进入后台」入口与对话区可见
测试反馈学生在 admin 侧看不到后台管理入口。桌面端入口正常;窄屏/手机上侧栏被历史列表的固定高度撑满(接近 100vh),底部按钮落到地址栏之后,对话区也被顶出视口。窄屏改为 dvh + 侧栏限高,历史列表自适应,固定 800px 的对话块改为 100%,并清掉调试日志。
2026-10-24 18:10:08 +08:00
weicw 77378a2791 feat(ai): 助手页支持写作/生图等记录的历史列表与按类型筛选
- 三模式各自独立工作区:切模式不丢消息、草稿与当前记录
- 历史面板加类型徽标与筛选(全部/聊天/写作/图片/创意/活动策划),文案改「历史记录」
- 生成成功认领末帧 chatId 并刷新列表;聊天 __END__ 帧的 chatId 同样接受
- 生图回复支持多张 ![](url) 渲染
- 写作/图片记录支持「按原参数再来一次」(只回填、不自动发送)
- 三个独立页(文稿/创意/活动策划)加历史入口,/ai?type= 预置筛选
- 后台 aiChatList 加类型列与筛选;历史列表提示仅展示最近 30 条
2026-10-24 17:37:46 +08:00
weicw-dshsa 73155d0bd2 fix(manuscript): 稿件类型收敛到上游 doc_type 枚举
「公众号推文」「发言稿提纲」这几个模板点下去必定失败:前端把界面
标签原样当成 doc_type 下发,而上游工作流只认
新闻稿 / 活动总结 / 微信推文 / 通知公告,多给一个值就是一次
`doc_type in input form must be one of the following` 的报错,
学生侧只看到「生成失败,请稍后重试」。

- docTypeOptions 只保留上游有的四种(外加「自由创作」),
  「宣传稿」「发言稿」「短视频脚本」一并删掉
- 「公众号推文」保留这个叫法,下发值改成「微信推文」
- 快捷模板「发言稿提纲」换成「通知公告」,并补对应示例内容
2026-10-23 14:20:48 +08:00
weicw-dshsa cdf87197fb fix(ai): 生成收尾不再只依赖 __END__,并清掉 WS 死代码
- handleGenerate 收尾改 try/catch/finally:loading 一定复位。原先只在收到
  __END__ 帧时由 finishStream 复位,网关返回空流或上游中途报错时按钮会永久
  停在加载态(issue 20)
- 提示按结果区分:没有正文 → 提示重试;正文是失败文案 → 报错;否则才是成功
- 删掉已不会调用的 WebSocket 栈:connectWebSocket / disconnectWebSocket /
  wsConnected / webSocketRef / wsConnectPromiseRef / activeConversationId,
  以及随之失效的 attachHeartbeat、buildWebSocketUrl、useUserStore 与
  StreamResolver.reject
- 大纲页删掉早已无调用点的 parseOutline(SSE 改造后遗留)及其 import
2026-10-23 12:57:11 +08:00
weicw-dshsa 5073b2969a refactor(ai): 稿件与大纲页文案去掉接口术语与多余提示
面向学生的页面不再暴露实现细节:

- 删除两页底部「提交说明」整块(含 `docType`/`inputs`、接口路径、
  WebSocket 流式说明及对应样式)
- 稿件页删除 `user_content`、`files` 字段说明;大纲页不再把
  conversationId/messageId 拼成「接口摘要」展示,随之删除
  buildSummary、resultSummary 及摘要渲染
- 加载态由三段式压成一行,空态与附件说明各留一句人话
2026-10-23 12:23:32 +08:00
weicw-dshsa e210a9b4b7 feat(manuscript): 后台按正文格式标记渲染与保存
- 新增 utils/manuscript-content.ts:格式判定、bytemd 转 HTML、纯文本转段落
- 编辑弹窗打开时把 markdown / 纯文本转成富文本,否则 wangEditor 会把 # 和 ** 当成正文,
  保存一次就把原稿改坏
- 保存统一写 contentFormat: 'html'
- 列表加「正文格式」列,非 HTML 的行显式标出来
2026-10-22 14:37:47 +08:00
weicw-dshsa baf6fe2ca8 feat(ai): 取消 AI 团宝页对纯学生隐藏「进入后台」入口 2026-10-21 23:23:54 +08:00
weicw-dshsa 6f7f2f0d9a feat(ai): 后台 AI 链路改走 HTTP 流式,WS 地址与心跳收敛到 utils
写作 / 图片 / 大纲 / 稿件四条链路用普通 POST 时,生成期间链路上零字节,
会被 60s 空闲超时掐成 504(出图实测 58s 断开)。后端已给每条链路开
/stream(SSE,每 15s 一帧心跳),这里改成消费它。

- 新增 utils/ai-stream.ts:SSE 帧解析 + 末帧 {type:'final', result} 拆包;
  runCreativeAssistantStream / runManuscriptGenStream 对外仍返回原来的 data,
  页面渲染逻辑不动
- 新增 utils/chat-socket.ts:buildWebSocketUrl 统一拼 /api/chat/{userId}
  (网关只放行 /api 前缀),attachHeartbeat 每 25s 发 ping 顶住代理空闲超时
- chatgpt 对话先试 WebSocket,握手失败落 /ai/chat/message/stream,
  帧内容与 WS 完全一致,处理函数直接复用
- 四个页面删掉各自重复的 buildWebSocketUrl,统一从 utils 引入
2026-10-21 19:18:08 +08:00
weicw-dshsa 038e789cb0 feat(ai): 创意助手各页下线参考素材上传,图片模式改传 mode(issue 19)
- 聊天页「图片」模式与独立创意助手页都删掉上传入口、上传状态与相关样式;
  上游出图工具只做文生图,开始节点的 file-list 变量没有任何节点消费(issue 16)。
- 图片模式请求体改为 { user_content, mode: 'image' },由后端包装意图声明;
  独立页不传 mode(通用入口,视频/脚本/图片靠用户文字说明)。
- CreativeAssistantRequest 增加 mode 字段,user_files 保留待上游补齐后回退。
2026-10-21 15:42:58 +08:00
weicw-dshsa 00e0e70e85 fix(config): 生产 API 改用 https,避免后台 https 部署时被 mixed-content 拦截
线上后台登录请求被浏览器判为「(已屏蔽: mixed-content)」,因为 .env.production 里
VITE_API_URL 写的是明文 http://twai-api.gxmu.edu.cn/api,而后台以 https 部署。

改为 https://twai-api.gxmu.edu.cn/api(实测 /api/login 返回 200,证书有效)。
顺带说明:聊天用的 WebSocket 由该地址推导成 wss://<同 host>/chat/{userId},
协议会自动跟随,不需要额外配置。
2026-10-21 13:46:47 +08:00
weicw-dshsa 98262f013b feat(ai): 写作模式加「写作参数」面板,可选填活动信息
选了文体(走「内容创作与宣传助手」)后,输入框上方出现可折叠的「写作参数」:
活动类型 chip(含「不限」= 不下发 event_type)、活动主题/时间/地点/参与人员四格,
字数并入同一块。自由创作(走「AI 创意助手」)时整块不出现。

- 只有实际填了参数才下发,空格子不带;活动类型默认空串,不替用户猜类型。
- 只填参数、不写正文也能发送,气泡上用一句「(按写作参数生成:…)」占位,
  避免出现空消息。
- 面板默认收起。
2026-10-21 13:31:39 +08:00
weicw-dshsa d8ef29afe7 feat(ai): 写作模式拆成自由创作与模板两条路(issue 18)
自由创作不再解析自然语言:原话整段作为 userContent 下发,docType 留空,由后端转
「AI 创意助手」。选了文体才提交 docType 等结构化条件,走「内容创作与宣传助手」。

- writing-params.ts 删掉 parseWritingRequest、字段别名表与字数兜底表,只留选项常量。
- chatgpt/index.vue:字数选择器只在选中文体后出现;撤掉图片比例选择器(上游开始
  节点无比例变量,只能拼进 user_content,等于替上游写 prompt);结果不再用入参补标题。
- gxmu/manuscriptGen:新增「自由创作」入口与 freeContent 文本域,模板模式才展开活动
  信息等可选项。
- 顺带删除 chatgpt/index.bak.vue 旧备份。
2026-10-21 12:39:54 +08:00
weicw-dshsa 4e725c7840 chore(config): 生产环境 API 指向 twai-api.gxmu.edu.cn 2026-10-21 12:39:54 +08:00
weicw-dshsa da14a1b45c fix(cms): 分类树防环——上级候选剔除自身子树,列表跳过自指向脏数据
与后端 checkParentValid 配套的前端侧防御(分类是自关联结构,成环会让分类树整个渲染不出来):

- category-edit:新增 parentOptions 计算属性,修改分类时把「自己及自己的整棵子树」
  从上级候选中剔除,避免在界面上就能选出环。
- index:parseData 先过滤掉 categoryId === parentId 的记录(toTreeData 遇到这类数据
  会直接 throw,拖垮整个列表),并把被跳过的分类 id 提示给用户,让其去库里修正。
2026-10-13 20:00:37 +08:00
weicw-dshsa 8ca7a00afb feat(ai): 图片模式接入 file-list 参考素材上传(issue 14)
上游「AI 创意助手」开始节点有 file-list 变量 user_files(最多 5 个,允许
image/video/document/audio),但 web 端图片模式此前完全没有附件入口 —— 发送键左侧
那两个图标按钮没有绑定任何事件,是纯装饰。

- 聊天页图片模式新增「参考素材」区:添加附件(隐藏 input[type=file])、已选列表可
  逐个移除、上限 5 个(对齐上游 max_length),按 MIME/扩展名判定
  image/video/audio/document,发送时组装 file-list 契约
  {transfer_method:"local_file", type, upload_file_id, url:""};上传中禁止发送
- uploadAiFile(file, app?) 支持应用代号;gxmu/creativeAssistant 表单页改传
  creativeAssistant —— 该页用同一个接口上传却不指定应用,附件必然报
  Invalid upload file(既有缺陷,本次一并修掉)
- CreativeAssistantUploadFile.upload_file_id 由 number 改为 string | number:
  它实际是 Dify /files/upload 返回的 uuid 字符串,原声明与实现不符
- formatCreativeResult 清洗 video_message / photo_message:剥离  thinking 思维链、
  丢弃 {"cover_prompt":…,"width":…} 中间产物 JSON,不再把上游 LLM 的原始输出
  当正文展示(截图实测过:气泡里出现整段英文思考过程或裸 JSON)
- 删除发送键左侧两个无事件的装饰性图标按钮(.icon-btn 样式仍被消息操作按钮使用,保留)
2026-10-13 19:57:57 +08:00
weicw-dshsa bc398bb652 fix(ai): 写作入口采集上游主控字段,用户诉求不再被默认值覆盖(issue 13)
聊天页「写作」模式没有表单,只按「键:值」解析输入,普通自然语言解析为空后一律回落
doc_type=新闻稿 / Number=800。上游「AI内容创作与宣传助手」的 prompt 把这两项当主控指令,
实测模型会主动忽略用户原话里的冲突要求,思维链原文:

  I will ignore the conflicting "300字推文" instruction inside the bullet points
  because the main task says "文稿类型为:新闻稿" and "篇幅要求(字数限制):800"

这就是用户报的「写作模块听不懂要求」——不是模型听不懂,是把「新闻稿/800字」当硬指令发给了它。

- 新增 src/views/oa/chatgpt/writing-params.ts:从自然语言抽取文体/字数/主题/时间/地点/
  人员/活动类型,保留既有「键:值」入参,界面显式选择优先于自动识别;纯函数零依赖,
  可直接用 node 运行测试
- 文体识别对齐上游真实存在的 4 个模板(新闻稿/活动总结/微信推文/通知公告);认不出的文体
  (发言稿、短视频脚本等)原样下发交给模型发挥,强行映射成新闻稿会更糟
- 用户没提字数时按文体给常规篇幅,而不是不下发——上游对空字数的处理会在正文里留一行
  「(未设定有效字数限制)」
- 写作模式输入框上方新增「文体 / 字数」两组按钮,复用既有 ratio-panel 样式

验证:解析用例 8/8(.scratch/ai-assistant/probe/test-writing-params.ts);同一句输入做端到端
对照,修复前得 800 字新闻稿,修复后得 281 字微信推文(引用块 + ## 模块小标题 + 【互动时间】)。
2026-10-13 18:53:29 +08:00
weicw-dshsa 623404ce9a fix(ai): 失败态与整包 JSON 不再进 UI,兜底收敛到公共模块(issue 10)
admin 端原本**没有**任何 AI 结果兜底公共实现(src/utils/ 下零命中
pickDisplayable / isFailedPayload / FALLBACK_TEXT / FAILED_TEXT),
四个 AI 页面各写一份,且方向相反——都保留了「JSON.stringify 整包」兜底。
后果是解析不出内容时把内部标识符渲染给用户,实测:

    {"answer":"","conversationId":"c1d2e3f4-…","messageId":"m1"}

改动:
- 新增 src/utils/ai-result.ts,从 tuanwei-uniapp/utils/ai-result.js 移植,
  逐函数对齐语义(getPayloadStatus / isFailedPayload / isDisplayableAnswer /
  pickDisplayable / resolveDisplayText / 两个文案常量)。原始报文只进
  console.error,不进 UI。
- 四处整包 JSON 兜底全部替换为 resolveDisplayText,并删掉各自的
  stringifyUnknown:oa/chatgpt(两处)、gxmu/manuscriptGen、
  gxmu/activityOutlineGen。
- 四页正文候选改用 pickDisplayable(原 pickString 只判非空,
  失败报文里 UUID 形状的 answer 会被当正文)。
- 失败态优先判定:isFailedPayload 为真时直接给 FAILED_TEXT,
  不再走「主题 + 失败文案」的拼接。
- gxmu/creativeAssistant:删掉已无引用的 rawOutputsText(模板引用早被注释,
  留下一个"看似有原始输出视图"的死代码),并给「未识别到输出字段」补可读文案。

评审跟进修掉的两个真缺陷:
- creativeAssistant 的兜底文案**原本不可达**:模板 a-empty 的
  v-if="!loading && !hasAnyResult" 会遮蔽 v-else 里的 status-alert,
  失败时 hasAnyResult 为假 → 用户仍看到「填写文本指令并上传附件后执行工作流」。
  条件补上 && !workflowResponse。
- WS 路径不消费 reset:后端失败时带 reset:"true" 要求覆盖半截内容,
  两个页面都忽略它,于是编辑器变成「半截正文 + 生成失败,请稍后重试」;
  且 streamStarted 为真时会直接丢弃 HTTP 返回体,新加的 status 也就读不到。
  appendOutlineChunk / appendAssistantChunk 增加 reset 参数并在
  handleSocketMessage 里透传。

验证:
- .scratch/ai-assistant/verify-admin-ai-result.js 用项目自带 TypeScript
  编译器转译后求值,并从真实 .vue 抽取 parseOutline / parseResult /
  formatWritingResult 跑断言(验真实代码而非重写副本)→ 41/41 PASS。
- vue-tsc --noEmit 改动前后错误集合完全一致(1365 条全在 .bak 等预存文件),
  本次改动的 4 个文件零错误。
- eslint:ai-result.ts 零问题;creativeAssistant 的未使用变量由 3 个降到 2 个。
2026-10-13 02:12:58 +08:00
weicw-dshsa 930ef760f1 docs(ai): 说明大纲入参 event_funding 为何保持 string
上游该变量是 number,但表单输入框是自由文本(示例值形如
「预算 5000 元,来源为校团委志愿服务专项经费」),故由后端
normalizeEventFunding 抽出数值后再发送。抽不出数值时后端降级为空串 ——
实测上游接受空串,但不接受不可解析的文本(会让整个工作流 failed)。

同时补上 event_member / people_manage / tel_people 三个 Dify 必填变量的
可选声明:当前表单未采集,由后端补空串占位(见 issue 09)。
2026-10-13 00:37:23 +08:00
weicw-dshsa 3a57965349 修改端口号 2026-09-22 20:35:30 +08:00
weicw-dshsa 829c17f1ce AI团宝页面对纯学生隐藏「进入后台」入口 2026-09-19 17:26:48 +08:00
weicw-dshsa 6b967b6b69 修正类型导入写法,补上 pnpm 锁文件
- ItemType / ColumnItem / EleProTableDone 等纯类型改用 import type,
  避免打包器把类型当运行时依赖处理
- 提交 pnpm-lock.yaml 与 pnpm-workspace.yaml

注:仓库里原有的 package-lock.json 与 yarn.lock 未动,三份锁文件并存。
2026-09-18 23:30:55 +08:00
weicw-dshsa add24cfde8 后台登录新增统一身份认证入口
与学生端共用后端 /sso/login 接口,学号 + 统一身份认证密码,
返回结构与账号登录一致,拿到 access_token 后流程无差别。
2026-09-18 23:30:54 +08:00
weicw-dshsa b2b7d4208e 新增后台「教师名册」页
纯只读页面,形态与学生名册一致(#19)。

- src/api/gxmu/teacher:分页查询与导出接口
- src/views/gxmu/teacherRoster:学院/教工号/姓名/状态筛选 + 列表 + CSV 导出
- 导出按钮按 gxmu:teacher:export 权限渲染,与查询权限分开
- 手机号按 spec §5.2 不进任何列表接口,页面与导出均无该列
2026-09-15 17:21:38 +08:00
weicw-dshsa a592e66f78 新增后台「数据同步」与「学生名册」页
数据同步页 /gxmu/dataSync:
- 分段手动同步(部门/教师/班级/学生)+ 全部同步
- 同步为异步:提交后立即返回批次号,每 2 秒轮询 /gxmu/sync/status 展示分段进度
  (待执行/进行中/成功/失败 + 成功/失败/停用计数 + 错误摘要)
- 页面挂载时先查一次状态,可接管定时任务或别处触发的同步
- 同步记录列表,支持按类型筛选

学生名册页 /gxmu/studentRoster:
- 按学院(取组织树 parentId=24)/班级/学号/姓名/培养层次/状态/认领状态筛选
- 手机号与身份证由后端脱敏后返回
- 导出用 gxmu:student:export 单独授权,前端生成 CSV
- 支持手动认领与解除认领

对应 api 模块 src/api/gxmu/sync 与 src/api/gxmu/student。
2026-09-15 15:55:00 +08:00
b2894lxlx 019ed28d37 260720 2026-07-20 11:50:47 +08:00
b2894lxlx 95d43746f6 调整 2025-05-22 10:27:07 +08:00
gxwebsoft 963b239333 新增:配件管理模块 2024-02-27 20:29:45 +08:00
gxwebsoft aa56030cbd 完成:保养记录和厂内维修模块 2024-02-25 19:33:03 +08:00
gxwebsoft 08f83ed015 完成:安全维保管理模块 2024-02-25 16:19:52 +08:00
gxwebsoft 726bb3c163 完成:安全维保管理模块 2024-02-25 15:23:15 +08:00
gxwebsoft e6caabbba8 新增:每月1日自动生成保养计划 2024-02-23 13:57:48 +08:00
gxwebsoft 25864fb449 新增:一机一档的详情页 2024-02-22 13:48:27 +08:00
gxwebsoft 6452b887dc 新增采购入库功能 2024-02-05 21:47:55 +08:00
gxwebsoft aac8dc687d 新增标准节租金等功能 2024-02-05 15:54:26 +08:00
b2894lxlx 494e3ee248 调整 2024-01-31 14:56:48 +08:00
b2894lxlx 14cbb87311 新增历史结算;
新增租单管理
2023-06-13 01:44:18 +08:00
b2894lxlx df95f7d02c 完善合同管理;
新增结算管理
2023-06-12 01:33:08 +08:00
b2894lxlx 7f080a4c54 新增客户管理;
新增合同管理
2023-06-10 01:29:51 +08:00
gxwebsoft 4eca2ea5f5 合并代码 2023-06-09 12:30:46 +08:00
gxwebsoft f5cb3dc489 完成合同管理模块和公共参数模块 2023-06-08 19:33:24 +08:00
weicw 7ee10c16c7 导入 2023-06-06 12:45:50 +08:00
weicw 372843d129 产权公司 2023-06-06 10:26:22 +08:00
weicw 2c11634cfa 防坠器 2023-06-05 22:57:25 +08:00
gxwebsoft 01a57c177e 修复部分问题 2023-06-05 16:50:04 +08:00
gxwebsoft 6fcff7b0e1 11 2023-06-04 00:35:09 +08:00
gxwebsoft 552dde6cb1 11 2023-06-04 00:18:23 +08:00
南宁网宿科技 13bed2bafb Initial commit 2023-06-03 23:57:39 +08:00