根因: - Bug #请修复 Bug #591 存在的问题 修复: - ### 变更摘要 - 全链路数据流分析**:录取(弹窗输入)→ 保存(API传入)→ 查询(Mapper返回)→ 修改(Service记录)→ 删除/停止(状态变更)→ 关联(列表展示) - ### 后端变更(4个文件) - 1. `AdviceBatchOpParam.java`** — 停嘱参数添加 `stopTime` 字段 - 新增 `@JsonFormat Date stopTime`,支持前端传入停嘱时间 - 2. `RequestBaseDto.java`** — 查询DTO添加 `stopUserName`、`stopTime` 字段 - 新增 `String stopUserName`(停嘱医生姓名) - 新增 `Date stopTime`(停嘱时间) - 3. `AdviceManageAppServiceImpl.java`** — 停嘱Service增强 - 优先使用前端传入的 `stopTime`,兜底用当前时间 - 通过 `SecurityUtils.getNickName()` 获取当前操作用户昵称,记录到 `updateBy` - 药品和诊疗两个更新入口均已同步修改 - 4. `AdviceManageAppMapper.xml`** — 三个UNION ALL子查询添加字段 - 药品子查询:`T1.effective_dose_end AS stop_time` + `T1.update_by AS stop_user_name` - 耗材子查询:`NULL AS stop_time` + `'' AS stop_user_name` - 诊疗子查询:`T1.occurrence_end_time AS stop_time` + `T1.update_by AS stop_user_name` - ### 前端变更(1个文件) - `order/index.vue`**: - 1. **停嘱时间弹窗** — 点击「停嘱」后弹出 `el-dialog`,内含 `el-date-picker`(datetime类型,默认当前时间),确定后才调用API - 2. **表格列** — 在「皮试」列后面、「诊断」列前面新增两列: - 「停嘱医生」`prop="stopUserName"`,宽度120px - 「停嘱时间」`prop="stopTime"`,宽度170px - 3. **`handleStopAdvice`** — 保留原有校验(未保存/未签发/已停止检查),校验通过后弹出时间选择弹窗而非直接调API - 4. **`confirmStopAdvice`** — 新增确认函数,将 `stopTime` 拼入请求参数后调用 `stopAdvice` API - ### 验证结果 - ✅ 前端 Lint 检查通过(仅1个预存的 `vue/no-dupe-keys` 警告) - ✅ 后端 Maven 编译通过(BUILD SUCCESS)
141 lines
4.6 KiB
JavaScript
Executable File
141 lines
4.6 KiB
JavaScript
Executable File
import {createApp} from 'vue';
|
||
|
||
import Cookies from 'js-cookie';
|
||
|
||
// 导入 hiprint 并挂载到全局 window 对象
|
||
import {hiprint, defaultElementTypeProvider} from 'vue-plugin-hiprint';
|
||
|
||
import ElementPlus, {ElDialog, ElMessage} from 'element-plus';
|
||
import zhCn from 'element-plus/es/locale/lang/zh-cn';
|
||
import 'element-plus/dist/index.css';
|
||
|
||
import '@/assets/styles/index.scss'; // global css
|
||
import App from './App';
|
||
import store from './store';
|
||
import router from './router';
|
||
import directive from './directive'; // directive
|
||
// 注册指令
|
||
import plugins from './plugins'; // plugins
|
||
import {download, downloadGet} from '@/utils/request';
|
||
|
||
// svg图标
|
||
import 'virtual:svg-icons-register';
|
||
import SvgIcon from '@/components/SvgIcon';
|
||
import elementIcons from '@/components/SvgIcon/svgicon';
|
||
|
||
import './permission'; // permission control
|
||
import {useDict} from '@/utils/dict';
|
||
import {addDateRange, handleTree, parseTime, resetForm, selectDictLabel, selectDictLabels,} from '@/utils/openhis';
|
||
|
||
import {formatDateStr} from '@/utils/index';
|
||
|
||
// 分页组件
|
||
import Pagination from '@/components/Pagination';
|
||
// 自定义表格工具组件
|
||
import RightToolbar from '@/components/RightToolbar';
|
||
// 富文本组件
|
||
import Editor from '@/components/Editor';
|
||
// 文件上传组件
|
||
import FileUpload from '@/components/FileUpload';
|
||
// 图片上传组件
|
||
import ImageUpload from '@/components/ImageUpload';
|
||
// 图片预览组件
|
||
import ImagePreview from '@/components/ImagePreview';
|
||
// 自定义树选择组件
|
||
import TreeSelect from '@/components/TreeSelect';
|
||
// 字典标签组件
|
||
import DictTag from '@/components/DictTag';
|
||
|
||
// 导入请求工具
|
||
|
||
import {registerComponents} from './template';
|
||
|
||
window.hiprint = hiprint;
|
||
|
||
// 初始化 hiprint,使用默认元素类型提供器(支持 table、text、image 等元素)
|
||
hiprint.init({
|
||
providers: [new defaultElementTypeProvider()]
|
||
});
|
||
|
||
// 延迟连接,确保 hiwebSocket 已初始化
|
||
setTimeout(() => {
|
||
if (hiprint.hiwebSocket) {
|
||
// 设置连接地址和 token
|
||
hiprint.hiwebSocket.setHost('http://localhost:17521', 'hiprint-test');
|
||
console.log('hiprint 连接地址:', hiprint.hiwebSocket.host);
|
||
|
||
// 等待连接建立
|
||
setTimeout(() => {
|
||
console.log('hiprint 连接状态:', hiprint.hiwebSocket.connected);
|
||
if (hiprint.hiwebSocket.connected) {
|
||
console.log('hiprint 客户端连接成功');
|
||
} else {
|
||
console.warn('hiprint 客户端未连接,请检查客户端是否运行');
|
||
}
|
||
}, 2000);
|
||
} else {
|
||
console.warn('hiprint.hiwebSocket 未初始化');
|
||
}
|
||
}, 500);
|
||
|
||
const app = createApp(App);
|
||
|
||
// 检查是否在 WebView 环境中(使用可选链避免 ReferenceError)
|
||
if (typeof window !== 'undefined' && window.chrome?.webview !== undefined) {
|
||
// 如果是 webview 环境,挂载 CSharpAccessor 对象到 vue 实例上
|
||
try {
|
||
const csAccessor = window.chrome.webview.hostObjects.CSharpAccessor;
|
||
app.config.globalProperties.csAccessor = csAccessor;
|
||
} catch (e) {
|
||
console.warn('WebView CSharpAccessor 不可用:', e);
|
||
}
|
||
}
|
||
|
||
// 全局方法挂载
|
||
app.config.globalProperties.useDict = useDict;
|
||
app.config.globalProperties.download = download;
|
||
app.config.globalProperties.downloadGet = downloadGet;
|
||
app.config.globalProperties.parseTime = parseTime;
|
||
app.config.globalProperties.resetForm = resetForm;
|
||
app.config.globalProperties.handleTree = handleTree;
|
||
app.config.globalProperties.addDateRange = addDateRange;
|
||
app.config.globalProperties.selectDictLabel = selectDictLabel;
|
||
app.config.globalProperties.selectDictLabels = selectDictLabels;
|
||
app.config.globalProperties.formatDateStr = formatDateStr;
|
||
// 全局组件挂载
|
||
app.component('DictTag', DictTag);
|
||
app.component('Pagination', Pagination);
|
||
app.component('TreeSelect', TreeSelect);
|
||
app.component('FileUpload', FileUpload);
|
||
app.component('ImageUpload', ImageUpload);
|
||
app.component('ImagePreview', ImagePreview);
|
||
app.component('RightToolbar', RightToolbar);
|
||
app.component('Editor', Editor);
|
||
app.use(registerComponents);
|
||
app.use(ElMessage);
|
||
app.use(router);
|
||
app.use(store);
|
||
app.use(plugins);
|
||
app.use(elementIcons);
|
||
app.component('SvgIcon', SvgIcon);
|
||
directive(app);
|
||
// 全局禁止点击遮罩层关闭弹窗
|
||
ElDialog.props.closeOnClickModal.default = false;
|
||
// 使用element-plus 并且设置全局的大小
|
||
app.use(ElementPlus, {
|
||
locale: zhCn,
|
||
// 支持 large、default、small
|
||
size: Cookies.get('size') || 'default',
|
||
});
|
||
|
||
// 导入公告帮助工具
|
||
import { initNoticePopupAfterLogin } from '@/utils/noticeHelper'
|
||
|
||
app.mount('#app');
|
||
|
||
// 应用启动后初始化公告弹窗功能
|
||
import { nextTick } from 'vue'
|
||
nextTick(() => {
|
||
initNoticePopupAfterLogin()
|
||
})
|