This commit is contained in:
2025-07-22 13:40:00 +08:00
parent 9ba542465b
commit dca1353e99
7 changed files with 2832 additions and 16 deletions

View File

@@ -23,7 +23,7 @@ module.exports = {
}, },
// Various Dev Server settings // Various Dev Server settings
host: '192.168.110.160', // can be overwritten by process.env.HOST host: '192.168.110.159', // can be overwritten by process.env.HOST
port: 8001, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined port: 8001, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: true, autoOpenBrowser: true,
errorOverlay: true, errorOverlay: true,

View File

@@ -82,6 +82,9 @@ const mainRoutes = {
{ path: '/course-taihumedList', component: _import('modules/course/taihumedList'), name: 'course-taihumedList', meta: { title: '太湖标签', isTab: true } }, { path: '/course-taihumedList', component: _import('modules/course/taihumedList'), name: 'course-taihumedList', meta: { title: '太湖标签', isTab: true } },
{ path: '/courses-list', component: _import('modules/talents/courses-list'), name: 'courses-list', meta: { title: '查看课程', isTab: true } }, { path: '/courses-list', component: _import('modules/talents/courses-list'), name: 'courses-list', meta: { title: '查看课程', isTab: true } },
{ path: '/mergeList', component: _import('modules/certificate/mergeList'), name: 'mergeList', meta: { title: '小班、自考证书', isTab: true } }, { path: '/mergeList', component: _import('modules/certificate/mergeList'), name: 'mergeList', meta: { title: '小班、自考证书', isTab: true } },
{ path: '/medicalrecords-medicalList', component: _import('modules/medicalrecords/medicalList'), name: 'medicalrecords-medicalList', meta: { title: '医案列表', isTab: true } },
], ],
beforeEnter (to, from, next) { beforeEnter (to, from, next) {
let token = Vue.cookie.get('token') let token = Vue.cookie.get('token')

View File

@@ -31,6 +31,7 @@
</div> </div>
<div class="shop_box" v-loading="dataListLoading"> <div class="shop_box" v-loading="dataListLoading">
<!-- @selection-change="handleSelectionChange" --> <!-- @selection-change="handleSelectionChange" -->
<el-table <el-table
v-if="!dataListLoading" v-if="!dataListLoading"
@@ -55,23 +56,25 @@
<!-- --> <!-- -->
<el-table-column <el-table-column
v-if="!disableOperate" v-if="!disableOperate1"
header-align="center" header-align="center"
align="center" align="center"
label="操作" label="操作"
width="120" :width="operationWidth?operationWidth:'120'"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<slot name="operation" :row="scope.row"></slot> <slot name="operation" :row="scope.row"></slot>
<el-button <el-button
type="text" type="text"
v-if="urlList.editCourse" v-if="urlList.editCourse&&!isShowNewOperation"
@click="editCourse(scope.row)" @click="editCourse(scope.row)"
>编辑</el-button >编辑</el-button
> >
<el-button <el-button
type="text" type="text"
style="color: red;" style="color: red;"
v-if="!isShowNewOperation"
@click="shopDelete(scope.row)" @click="shopDelete(scope.row)"
size="mini" size="mini"
>删除</el-button >删除</el-button
@@ -143,6 +146,8 @@ import axios from "axios";
// import AddOrUpdate from './shopproduct-add-or-update' // import AddOrUpdate from './shopproduct-add-or-update'
export default { export default {
props: [ props: [
"operationWidth",
"isShowNewOperation",
"defaultForm", "defaultForm",
"getAssociatedGoodsListKey", "getAssociatedGoodsListKey",
"urlList", "urlList",
@@ -160,6 +165,8 @@ export default {
], ],
data() { data() {
return { return {
disableOperate1:this.disableOperate,
loading:false,
multipleSelectionAll: [], // 所有选中的数据包含跨页数据 multipleSelectionAll: [], // 所有选中的数据包含跨页数据
goodsTypeList: [], // goodsTypeList goodsTypeList: [], // goodsTypeList
multipleSelection: [], // 当前页选中的数据 multipleSelection: [], // 当前页选中的数据
@@ -458,10 +465,11 @@ export default {
// 获取关联数据列表 // 获取关联数据列表
async getAssociatedGoodsList() { async getAssociatedGoodsList() {
this.$emit("changeStatisticsQuery"); this.$emit("changeStatisticsQuery");
this.disableOperate = false; this.disableOperate1 = false;
console.log("🚀 ~ getAssociatedGoodsList ~ form:11111", form); console.log("🚀 ~ getAssociatedGoodsList ~ form:11111", form);
var form = { ...this.defaultForm, ...this.dataForm }; var form = { ...this.defaultForm, ...this.dataForm };
console.log('...this.defaultForm at line 467:', this.defaultForm)
this.dataListLoading = true; this.dataListLoading = true;
if (this.otherInfo.httpType == "raw" && this.isShowPagination) { if (this.otherInfo.httpType == "raw" && this.isShowPagination) {
@@ -480,6 +488,7 @@ export default {
console.log("data at line 359:", data); console.log("data at line 359:", data);
if (this.otherInfo.resultValueName) { if (this.otherInfo.resultValueName) {
this.associatedGoodsList = [ this.associatedGoodsList = [
...data[this.otherInfo.resultValueName].records ...data[this.otherInfo.resultValueName].records
]; ];
this.total = data[this.otherInfo.resultValueName].total; this.total = data[this.otherInfo.resultValueName].total;
@@ -489,7 +498,7 @@ export default {
this.associatedGoodsList = [...data.result.records]; this.associatedGoodsList = [...data.result.records];
this.total = data[result].total; this.total = data[result].total;
} }
console.log('this.associatedGoodsList at line 482:', this.associatedGoodsList)
this.dataListLoading = false; this.dataListLoading = false;
} }
}); });
@@ -564,7 +573,7 @@ export default {
} }
}, },
async statisticsQuery() { async statisticsQuery() {
this.disableOperate = true; this.disableOperate1 = true;
var form = { ...this.defaultForm, ...this.dataForm }; var form = { ...this.defaultForm, ...this.dataForm };
this.dataListLoading = true; this.dataListLoading = true;

View File

@@ -5,11 +5,13 @@
class="info_bg" class="info_bg"
style="overflow: hidden; white-space: nowrap; text-overflow: ellipsis" style="overflow: hidden; white-space: nowrap; text-overflow: ellipsis"
> >
当前标签<span style="color: #17b3a3; font-weight: 600">{{ 当前{{currentNode&&['wait','false','all','success'].includes(currentNode.data.id)?'状态':'标签' }}<span style="color: #17b3a3; font-weight: 600"
:style="`${currentNode&&currentNode.data.color?`color: ${currentNode.data.color}`:''}`"
>{{
currentNode ? currentNode.data.title : "" currentNode ? currentNode.data.title : ""
}}</span> }}</span>
</p> </p>
<el-button <el-button v-if="currentNode&&!['wait','false','all'].includes(currentNode.data.id)"
type="primary" type="primary"
@click="addOrUpdateHandle()" @click="addOrUpdateHandle()"
style="float: right" style="float: right"
@@ -36,7 +38,7 @@
<div class="custom-tree-container"> <div class="custom-tree-container">
<el-tree <el-tree
:draggable="false" :draggable="false"
:allow-drop="false" :allow-drop="() => false"
:highlight-current="true" :highlight-current="true"
class="filter-tree" class="filter-tree"
node-key="id" node-key="id"
@@ -55,8 +57,9 @@
slot-scope="{ node, data }" slot-scope="{ node, data }"
@click="source == 'tags' ? handleClickNodes(node, data, 'edit') : ''" @click="source == 'tags' ? handleClickNodes(node, data, 'edit') : ''"
:class=" :class="
`${currentNode && currentNode.data.id == data.id ? 'isSelect' : ''}` `${currentNode && currentNode.data.id == data.id ? `isSelect` : ''}`
" "
:style="`${currentNode && currentNode.data.id == data.id&&data.bgcolor ? `background-image: linear-gradient(-45deg, #fff, ${data.bgcolor});` : ''}`"
style=" padding-left: 5px; style=" padding-left: 5px;
box-sizing: border-box;" box-sizing: border-box;"
> >
@@ -68,7 +71,7 @@
v-if="data.isLast == 1 && source == 'shop'" v-if="data.isLast == 1 && source == 'shop'"
style="margin-right: 10px" style="margin-right: 10px"
></el-checkbox ></el-checkbox
>{{ node.label }}</span ><span :style="`${data.color?`color:${data.color};font-weight:bold`:''}`">{{ node.label }}</span></span
> >
<span v-if="source == 'tags'"> <span v-if="source == 'tags'">
<!-- v-if="node.level <= 1" --> <!-- v-if="node.level <= 1" -->
@@ -76,7 +79,7 @@
type="text" type="text"
size="mini" size="mini"
@click.stop="handleClickNodes(node, data, 'addChildren')" @click.stop="handleClickNodes(node, data, 'addChildren')"
v-if="data.isLast != 1&&!disableAddChild" v-if="data.isLast != 1&&!disableAddChild&&!data.isDisableAddChild"
> >
添加下级 添加下级
</el-button> </el-button>

View File

@@ -0,0 +1,937 @@
<template>
<div class="mod-config">
<el-drawer
:title="
`${
type == 'edit' ? '编辑医案' : type == 'add' ? '新增医案' : `医案详情${addCertificateForm.state==1?' ( 待审核 ) ':' ( 已拒绝 ) '}`
}`
"
:visible.sync="dialogVisible"
:close-on-click-modal="false"
custom-class="yianDrawer"
size="60%"
>
<div
v-if="dialogVisible"
style="padding: 0 20px;box-sizing: border-box;height: calc(100% - 40px);overflow-y: auto;"
:style="addCertificateForm.state==2?'height:100%':''"
>
<div v-if="addCertificateForm.mark" style="padding:4px 10px;border-radius: 4px;white-space: wrap;"
:style="`color:${currentNode.data.color?currentNode.data.color:''};
`">审核备注{{ addCertificateForm.mark }}</div>
<el-form
:rules="dataRule"
:model="addCertificateForm"
ref="addCertificateForm"
label-width="110px"
>
<!-- <div style="background-color: #f0f0f0;padding:0 10px;box-sizing: border-box;color: #000;">
<p>绑定用户</p>
</div> -->
<div
v-if="pageType == 'label'"
style="display:flex;align-items:center;justify-content:space-between"
>
<el-form-item
style="width: 50%;"
label="手机号/邮箱:"
prop="userKey"
class="form_item"
>
<div style="display: flex;align-items: center;">
<el-autocomplete
size="small"
v-if="isEdit"
style="width: 100%;"
v-model="addCertificateForm.userKey"
:fetch-suggestions="loadAll"
placeholder="请输入手机号/邮箱"
@select="handleSelect"
>
<template #default="{ item }">
<div class="custom-item">
<span>{{ item.tel ? item.tel : item.email }}</span>
<span
style="color: gray; margin-left: 10px;"
v-if="item.name"
>({{ item.name }})</span
>
</div>
</template>
</el-autocomplete>
<span v-if="!isEdit">{{ addCertificateForm.userKey }}</span>
</div>
</el-form-item>
<el-form-item
label="用户姓名:"
style="width: 50%;"
v-if="addCertificateForm.userId"
prop="user"
class="form_item"
>
<div>
<!-- <span
style="width: 110px;display: inline-block;text-align: right;"
>用户姓名</span
> -->
{{
addCertificateForm.userName
? addCertificateForm.userName
: "-"
}}
</div></el-form-item
>
</div>
<template
v-if="pageType == 'user'"
style="display:flex;align-items:center;justify-content:space-between"
>
<el-form-item label="手机号/邮箱:" prop="user" class="form_item">
<div style="display: flex;align-items: center;">
{{ addCertificateForm.userKey }}
</div>
</el-form-item>
<el-form-item
label="用户姓名:"
style="width: 50%;"
prop="user"
class="form_item"
>
<div>
{{
addCertificateForm.userName
? addCertificateForm.userName
: "-"
}}
</div></el-form-item
>
<el-form-item label="医案分类" prop="user" class="form_item">
<div>
<el-cascader
size="mini"
:disabled="isEdit"
style="width: 100%;"
:show-all-levels="false"
v-model="addCertificateForm.labelId"
:props="{
value: 'id',
label: 'title'
}"
:options="cateOptions"
placeholder="医案分类"
@change="handleChange"
></el-cascader></div
></el-form-item>
</template>
<div
class="flexbox width100"
style="display: flex;align-items: center;"
>
<el-form-item
label="标题:"
label-width="90px"
prop="title"
style="width: 100%;"
>
<el-input
v-if="type != 'detail'"
clearable
size="small"
v-model="addCertificateForm.title"
placeholder="请输入医案标题"
style="width: 100%;"
></el-input>
<div v-else>
{{ addCertificateForm.title }}
</div>
</el-form-item>
</div>
<!-- <el-form-item label="课程名称:" prop="course" class="form_item">
<el-button plain type="primary" @click="selectCourse('addCertificateForm')"
size="mini">选择</el-button>
<span style="margin-left: 20px"></span>
<br/>
<div v-if="addCertificateForm.courseId" style="font-weight: bold;margin-top: 20px;display: flex;align-items: center;justify-content: space-between;"><p><img v-if="addCertificateForm.courseImg" :src="addCertificateForm.courseImg" alt=""style="width: 30px;height: 40px;margin-right: 20px;">{{ addCertificateForm.courseName }}</p><span @click="clearCourse" style="color: red;cursor: pointer;"><i class="el-icon-delete" style="margin-right: 4px;"></i> 删除</span></div>
</el-form-item> -->
<!-- <el-form-item label="医案编号" prop="certificateNo" class="form_item">
<el-input
v-model="addCertificateForm.certificateNo"
placeholder="请输入医案编号"
style="width: 400px;"
></el-input>
</el-form-item> -->
<el-form-item
label="医案详情:"
label-width="90px"
prop="title"
class="form_item"
>
<div style="padding-top: 15px;">
<div
v-for="(html, key) in record"
:key="key"
style="padding: 2px; margin-bottom: 4px;box-sizing: border-box;"
>
<!-- 显示字段标题 -->
<div
class="h1_box"
:class="type == 'detail' ? 'h1_box_detail' : ''"
v-html="`${getTitleHtml(html, key)}`"
style="margin-top: 0;margin-bottom: 10px; font-weight: bold;display: flex;align-items: center;"
></div>
<!-- 编辑区域 -->
<quill-editor
v-model="editableMap[key]"
ref="myQuillEditor"
:options="editorOption"
class="shangpin_editor"
v-if="type != 'detail'"
>
</quill-editor>
<div
class="detail_info_medical"
v-else
v-html="editableMap[key]"
></div>
</div>
<!-- <h3 style="margin-top: 40px;"> 保存后的结果JSON 格式预览</h3> -->
</div>
<!-- <quill-editor
v-model="detailContent"
ref="myQuillEditor2"
:options="editorOption"
class="shangpin_editor"
>
</quill-editor> -->
</el-form-item>
<el-form-item
label="上传图片:"
prop="title"
label-width="90px"
class="form_item custom-upload-box"
v-if="dialogVisible"
>
<template v-for="(file, i) in fileList" v-if="type == 'detail'">
<img
style="width: 60px;height: 60px;border-radius: 6px;margin: 0 8px 8px 0;"
class="el-upload-list__item-thumbnail"
:src="file.url"
alt=""
/>
</template>
<div v-if="fileList.length==0&&type == 'detail'" style="line-height: 60px;">暂无图片</div>
<el-upload
v-if="type != 'detail'"
class="custom-upload"
action="https://api.nuttyreading.com/oss/fileoss"
list-type="picture-card"
accept="image/png, image/jpeg"
:file-list="fileList"
:on-success="onSuccessImg"
:before-upload="beforeUpload"
:on-progress="onProgress"
>
<i slot="default" class="el-icon-plus"></i>
<div slot="file" slot-scope="{ file }">
<img
class="el-upload-list__item-thumbnail"
:src="file.url"
alt=""
/>
<span class="el-upload-list__item-actions">
<!-- <span
class="el-upload-list__item-preview"
@click="handlePictureCardPreview(file)"
>
<i class="el-icon-zoom-in"></i>
</span> -->
<span
v-if="!disabled"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete"></i>
</span>
</span>
<!-- 上传中的加载动画 -->
<div v-if="file.uploading" class="loading-spinner">
<i class="el-icon-loading"></i>
</div>
</div>
</el-upload>
<!-- <div class="flexBox" style="width:100%;justify-content: space-between;">
<div class="" style="display:flex">
<div
style="display:flex; align-items:center; width:100%;justify-content:center">
<div style="margin-right:15px">封面图</div>
<div>
<el-upload class="avatar-uploader" :action="baseUrl + '/oss/fileoss'"
:show-file-list="false" :on-success="handlePicSuccess">
<img v-if="fimages" :src="fimages" class="avatar" />
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</div>
<div>
<div v-if="fimages != ''">
<el-tag class="delImgBtn" @click="delImg()"
type="danger">清空图片</el-tag>
</div>
</div>
</div>
</div>
</div> -->
</el-form-item>
</el-form>
</div>
<div class="demo-drawer__footer" v-if="type == 'edit' || type == 'add'">
<el-button
style="float: right;margin:0 10px;"
type="primary"
size="mini"
@click="handleSubmit('addCertificateForm')"
:loading="loading"
>{{ loading ? "提交中 ..." : "确 定" }}</el-button
>
<el-button
size="mini"
@click="dialogVisible = false"
style="float: right;"
> </el-button
>
</div>
<div class="demo-drawer__footer" v-if="type == 'detail'&&addCertificateForm.state==1">
<!-- <el-checkbox v-model="addCertificateForm.train" true-label="1" false-label="0">是否加入Ai训练库</el-checkbox> -->
<el-button
style="float: right;margin:0 10px;"
type="primary"
size="mini"
@click="handleReview('approved', 1)"
:loading="loading"
>审核通过</el-button
>
<el-button
size="mini"
type="danger"
@click="handleReview('rejected', 0)"
style="float: right;"
>审核拒绝</el-button
>
</div>
</el-drawer>
<el-dialog
:title="`审核${reviewType == 'approved' ? '通过' : '拒绝'}备注`"
:visible.sync="dialogMarkVisible"
width="400px"
:beforeClose="beforeClose"
>
<el-input
v-model="addCertificateForm.mark"
:placeholder="
`请输入审核${reviewType == 'approved' ? '通过' : '拒绝'}备注`
"
:clearable="true"
></el-input>
<el-checkbox
:true-label="1" :false-label="0"
v-model="addCertificateForm.train"
style="margin-top: 20px;"
v-if="reviewType == 'approved'"
>是否加入 Ai 训练库</el-checkbox
>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogMarkVisible = false" size="mini"
>取消审核</el-button
>
<el-button type="primary" @click="handleReviewSave" size="mini"
>保存</el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
import { quillEditor } from "vue-quill-editor";
import global from "../../common/common.vue"; //引入共用组间
import debounce from "lodash/debounce"; //导入lodash中的debounce
import AddOrUpdate from "@/views/components/commonBookTags/bookTagsForm.vue";
import commonShop from "@/views/components/commonBookTags/shopproduct.vue";
import commonShopTable from "@/views/components/commonBookTags/shopproductTable.vue";
import commonTree from "@/views/components/commonBookTags/tags.vue";
import "quill/dist/quill.core.css";
import "quill/dist/quill.snow.css";
import "quill/dist/quill.bubble.css";
const toolbarOptions = [
["bold", "italic", "underline", "strike"], // 加粗,斜体,下划线,删除线
["blockquote", "code-block"], //引用,代码块
[{ header: 1 }, { header: 2 }], // 几级标题
[{ list: "ordered" }, { list: "bullet" }], // 有序列表,无序列表
[{ script: "sub" }, { script: "super" }], // 下角标,上角标
[{ indent: "-1" }, { indent: "+1" }], // 缩进
[{ direction: "rtl" }], // 文字输入方向
[{ size: ["small", false, "large", "huge"] }], // 字体大小
[{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
[{ color: [] }, { background: [] }], // 颜色选择
[
{
font: [
"SimSun",
"SimHei",
"Microsoft-YaHei",
"KaiTi",
"FangSong",
"Arial"
]
}
], // 字体
[{ align: [] }], // 居中
["clean"], // 清除样式,
["link", "image"] // 上传图片、上传视频
];
// import dialogComponent from './seckillprodrelation'
export default {
props: ["data", "pageType", "dataInfo", "labelId",'currentNode'],
data() {
return {
record: {},
editableMap: {}, // 存储每个字段的内部可编辑内容
editorOption: {
modules: {
toolbar: false
// history: {
// delay: 1000,
// maxStack: 50,
// userOnly: false
// },
// toolbar: {
// container: toolbarOptions,
// handlers: {
// image: function (value) {
// if (value) {
// // 调用element的图片上传组件
// document.querySelector('.avatar-uploader input').click()
// } else {
// this.quill.format('image', false)
// }
// }
// }
// },
},
placeholder: "请输入.."
},
dataRule: {
userKey: [
{
required: true,
message: "请输入手机号/邮箱"
// trigger: "change",
}
]
},
isUploading: false, // 上传过程中是否显示加载动画
isEdit: false, // 上传过程中是否显示加载动画
dialogImageUrl: "",
dialogVisibleImg: false,
disabled: false,
restaurants: [],
fileList: [],
options: [],
cateOptions: [],
state: "",
timeout: null,
addCertificateForm: {},
baseUrl: global.baseUrl,
isEdit: false,
checkAll: false,
isIndeterminate: true,
dialogVisible: false,
dialogMarkVisible: false,
urlList: {},
activeName: "first",
reviewType: "",
addForm: {},
audioFileList: [],
isFresh: false,
type: "",
detailContent: ""
};
},
components: {
AddOrUpdate,
commonShop,
commonTree,
commonShopTable,
quillEditor
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
}
},
activated() {
const quill = this.$refs.myQuillEditor.quill;
// 禁用编辑器
quill.disable(); // 这会禁用编辑器的所有功能,包括输入和修改
this.isEdit = false;
// this.getDataList();
},
methods: {
beforeClose() {
this.dialogMarkVisible = false;
},
remoteMethod(query) {
console.log(query, "query", this.addCertificateForm.key);
// return false
if (this.addCertificateForm.key !== "") {
let data = {
title: query //关键字
};
this.totalLaoding = true;
this.$http({
url: this.$http.adornUrl("/master/userManage/courseAndChildrenList"),
method: "post",
data: this.$http.adornData(data)
}).then(({ data }) => {
if (data && data.code === 0) {
this.options = data.list;
} else {
this.options = [];
}
this.totalLaoding = false;
if (data.code !== 0) return this.$message.error(data.msg);
});
} else {
this.options = [];
this.totalLaoding = false;
}
},
getCateList() {
this.$http({
url: this.$http.adornUrl(
"/master/userCertificate/userCertificateLabelList"
),
method: "post",
data: this.$http.adornData({})
}).then(({ data }) => {
if (data && data.code === 0) {
this.cateOptions = data.labelList;
} else {
this.cateOptions = [];
}
this.totalLaoding = false;
if (data.code !== 0) return this.$message.error(data.msg);
});
},
loadAll(queryString, cb) {
this.addCertificateForm.userId = "";
this.addCertificateForm.userName = "";
if (queryString == "") {
return false;
}
this.$http({
// url: this.$http.adornUrl('/book/user/list'),
url: this.$http.adornUrl("/book/user/getUserList"),
method: "post",
data: this.$http.adornData({
page: 1,
limit: 9999,
key: queryString
})
}).then(({ data }) => {
if (data && data.code === 0) {
var arr = data.user.records;
console.log("arr at line 467:", arr);
cb(arr);
} else {
cb([]);
}
});
},
createStateFilter(queryString) {
return state => {
return (
state.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
);
};
},
handleSelect(item) {
console.log(item);
this.addCertificateForm.userKey = item.tel ? item.tel : item.email;
this.addCertificateForm.userName = item.name;
this.addCertificateForm.userId = item.id;
},
getInnerHtml(html) {
const div = document.createElement("div");
div.innerHTML = html;
const children = Array.from(div.children).slice(1); // 跳过 h1
return children.map(e => e.outerHTML).join("");
},
getTitleHtml(html, key) {
const div = document.createElement("div");
div.innerHTML = html;
var str = [
"chiefComplaint",
"historyOfPresentIllness",
"physicaExamination",
"treatmentPlan"
].includes(key)
? `<span style="color:#F56C6C;margin-right:4px">*</span>`
: "";
return div.querySelector("h1")
? str + (div.querySelector("h1").outerHTML || "<h1></h1>")
: "";
},
saveAll() {
for (const key in this.record) {
const titleHtml = this.getTitleHtml(this.record[key]);
this.record[key] = titleHtml + this.editableMap[key];
}
alert("保存成功!");
},
init(type, data) {
this.getCateList();
this.type = type;
console.log("data at line 372:", data);
this.addCertificateForm = {};
this.fileList = [];
this.isEdit = type == "edit" ||type == "add" ? true : false;
if (type == "add") {
this.record = {
information: "<h1>1. 一般信息</h1>",
chiefComplaint: "<h1>2. 主诉</h1>",
historyOfPresentIllness: "<h1>3. 现病史</h1>",
pastHistory: "<h1>4. 既往史</h1>",
personalAndFamilyHistory: "<h1>5. 家族史</h1>",
physicaExamination: "<h1>6. 体格检查</h1>",
diagnosis: "<h1>7. 诊断</h1>",
treatmentPlan: "<h1>8. 治疗和后续治疗</h1>"
};
}
if (data) {
if (type == "edit" || type == "detail") {
this.record = {
information: data.information,
chiefComplaint: data.chiefComplaint,
historyOfPresentIllness: data.historyOfPresentIllness,
pastHistory: data.pastHistory,
personalAndFamilyHistory: data.personalAndFamilyHistory,
physicaExamination: data.physicaExamination,
diagnosis: data.diagnosis,
treatmentPlan: data.treatmentPlan
};
}
this.addCertificateForm = {
...data
};
if (this.addCertificateForm.img) {
this.fileList = this.addCertificateForm.img
.split(",")
.map((image, i) => ({
uid: i, // 假设 id 是唯一标识符
name: i, // 文件名
status: "done", // 状态
url: image // 文件 URL
}));
console.log("this.fileList at line 308:", this.fileList);
this.addCertificateForm.imageList = this.addCertificateForm.img.split(
","
);
}
} else {
this.addCertificateForm = {};
}
if (this.pageType == "label") {
if (data.userId) {
this.addCertificateForm.userKey = data.user.tel
? data.user.tel
: data.user.email;
this.addCertificateForm.userName = data.user.name;
this.addCertificateForm.userId = data.user.id;
}
} else {
this.addCertificateForm.userKey = this.dataInfo.tel
? this.dataInfo.tel
: this.dataInfo.email;
this.addCertificateForm.userName = this.dataInfo.name;
this.addCertificateForm.userId = this.dataInfo.id;
}
console.log(
"this.addCertificateForm at line 465:",
this.addCertificateForm
);
for (const key in this.record) {
this.$set(this.editableMap, key, this.getInnerHtml(this.record[key]));
}
this.dialogVisible = true;
},
handleReviewSave() {
var recordData = { ...this.record };
// for (const key in recordData) {
// const titleHtml = this.getTitleHtml(recordData[key]);
// recordData[key] = titleHtml + this.editableMap[key];
// }
var data = {
// labelId: this.labelId,
// img:
// this.fileList.length > 0
// ? this.addCertificateForm.imageList.toString()
// : "",
// title: this.addCertificateForm.title,
// userId: this.addCertificateForm.userId,
train: this.addCertificateForm.train, //是否加入ai训练库0否1是
mark: this.addCertificateForm.mark, //备注
state: this.reviewType=='approved'?3:2, //备注
// ...recordData
};
// if(this.record.)
this.$http({
url: this.$http.adornUrl("/master/medicalRecords/editMedicalRecords"),
method: "post",
data: this.$http.adornData({
...data,
id: this.addCertificateForm.id
})
}).then(({ data }) => {
if (data && data.code === 0) {
this.$message({
message: "操作成功",
type: "success"
});
this.dialogVisible = false;
this.dialogMarkVisible = false;
this.$nextTick(() => {
this.$emit("refresh");
});
} else {
this.$message.error(data.msg);
}
});
},
handleReview(type, typeValue) {
// approved 通过
// rejected 拒绝
this.reviewType = type;
this.dialogMarkVisible = true;
},
handleSubmit: debounce(async function() {
// this.addCertificateForm
console.log("this.addCertificateForm at line 479:", this.editableMap);
this.$refs["addCertificateForm"].validate(valid => {
if (valid) {
if (!this.addCertificateForm.userId && this.pageType == "label") {
this.$message.error("请选择用户");
return false;
}
if (this.editableMap.chiefComplaint == "") {
const titleHtml = this.getTitleHtml(
this.record["chiefComplaint"]
).replace(/<[^>]*>/g, "");
this.$message.error("请输入 " + titleHtml);
return false;
}
if (this.editableMap.historyOfPresentIllness == "") {
const titleHtml = this.getTitleHtml(
this.record["historyOfPresentIllness"]
).replace(/<[^>]*>/g, "");
this.$message.error("请输入 " + titleHtml);
return false;
}
if (this.editableMap.physicaExamination == "") {
const titleHtml = this.getTitleHtml(
this.record["physicaExamination"]
).replace(/<[^>]*>/g, "");
this.$message.error("请输入 " + titleHtml);
return false;
}
if (this.editableMap.treatmentPlan == "") {
const titleHtml = this.getTitleHtml(
this.record["treatmentPlan"]
).replace(/<[^>]*>/g, "");
this.$message.error("请输入 " + titleHtml);
return false;
}
var recordData = { ...this.record };
for (const key in recordData) {
const titleHtml = this.getTitleHtml(recordData[key]);
recordData[key] = titleHtml + this.editableMap[key];
}
var data = {
img:
this.fileList.length > 0
? this.addCertificateForm.imageList.toString()
: "",
title: this.addCertificateForm.title,
userId: this.addCertificateForm.userId,
...recordData
};
// if(this.record.)
this.$http({
url: this.$http.adornUrl(
this.type=='edit'
? "/master/medicalRecords/editMedicalRecords"
: "/master/medicalRecords/addMedicalRecords"
),
method: "post",
data: this.$http.adornData(
this.type=='edit'
? {
...data,
id: this.addCertificateForm.id
}
: {
...data,
labelId: this.labelId,
}
)
}).then(({ data }) => {
if (data && data.code === 0) {
this.$message({
message: "操作成功",
type: "success"
});
this.dialogVisible = false;
this.$nextTick(() => {
this.$emit("refresh");
});
} else {
this.$message.error(data.msg);
}
});
}
});
}, 200),
onSuccessImg(response, file, fileList) {
// 上传成功后,直接将返回的 URL 放到 file 对象中
file.uploading = false;
file.url = response.url; // 假设返回的数据包含文件的 url 地址
this.fileList = fileList; // 更新 fileList
this.addCertificateForm.imageList = fileList.map(e => e.url);
console.log(
"this.addCertificateForm.imageList at line 713:",
this.addCertificateForm.imageList
);
},
beforeUpload(file) {
// 在文件上传之前,设置文件的上传状态
file.uploading = true;
},
onProgress(event, file, fileList) {
// 进度更新时,文件状态可以继续保持上传中
file.uploading = true;
},
handleRemove(file) {
this.fileList = this.fileList.filter(f => f.uid !== file.uid); // 删除文件
this.addCertificateForm.imageList = this.fileList.map(e => e.url);
console.log(
"this.addCertificateForm.imageList at line 727:",
this.addCertificateForm.imageList
);
},
handleDownload(file) {
const link = document.createElement("a");
link.href = file.url;
link.download = file.name;
link.click();
},
selectChange(val) {
console.log("options", this.options);
// this.getCate(val)
},
handlePictureCardPreview(file) {
// 图片预览逻辑
}
}
};
</script>
<style lang="less" scoped>
.yianDrawer {
.width100 {
width: 100% !important;
}
.el-drawer__header {
margin-bottom: 0 !important;
}
.el-form-item {
margin-bottom: 8px;
}
/deep/.el-upload-list--picture-card .el-upload-list__item {
width: 80px !important;
height: 80px !important;
line-height: 80px !important;
}
/deep/.el-upload--picture-card {
width: 80px !important;
height: 80px !important;
line-height: 80px !important;
}
}
/deep/.yianDrawer header {
margin-bottom: 10px !important;
}
/deep/.custom-upload {
min-height: 60px !important;
}
/deep/.custom-upload .el-upload--picture-card {
width: 60px !important;
height: 60px !important;
line-height: 70px !important;
}
/deep/.custom-upload .el-upload-list--picture-card .el-upload-list__item {
width: 60px !important;
height: 60px !important;
line-height: 60px !important;
}
/deep/.custom-upload-box .el-form-item__label {
line-height: 60px !important;
}
/deep/.h1_box {
height: 24px;
h1 {
margin: 0 !important;
font-size: 16px;
line-height: 24px;
}
}
/deep/ .detail_info_medical {
li {
line-height: 24px !important;
}
ul {
margin: 0 !important;
list-style-type: disc !important; /* 强制使用实心圆点 */
}
p {
margin: 0 !important;
}
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -5,8 +5,8 @@
window.SITE_CONFIG = {}; window.SITE_CONFIG = {};
// api接口请求地址 // api接口请求地址
window.SITE_CONFIG['baseUrl'] = 'https://api.nuttyreading.com'; // 线上正式环境 // window.SITE_CONFIG['baseUrl'] = 'https://api.nuttyreading.com'; // 线上正式环境
// window.SITE_CONFIG['baseUrl'] = 'http://192.168.110.100:9200/pb'; //川 window.SITE_CONFIG['baseUrl'] = 'http://192.168.110.100:9200/pb'; //川
// cdn地址 = 域名 + 版本号 // cdn地址 = 域名 + 版本号
window.SITE_CONFIG['domain'] = './'; // 域名 window.SITE_CONFIG['domain'] = './'; // 域名