This commit is contained in:
2025-08-08 17:36:09 +08:00
parent 348f6969c1
commit 27909c5231
6 changed files with 347 additions and 161 deletions

View File

@@ -460,7 +460,7 @@ export default {
// 获取关联数据列表
async getAssociatedGoodsList() {
this.$emit("changeStatisticsQuery");
this.isDisableOperate = false;
console.log("🚀 ~ getAssociatedGoodsList ~ form:11111", form);

View File

@@ -7,7 +7,7 @@
>
当前{{
currentNode &&
["wait", "false", "all", "success",'caogao','shengpi'].includes(currentNode.data.id)
["wait", "false", "all", "success",'caogao','shengpi','shengpi1'].includes(currentNode.data.id)
? "状态"
: "标签"
}}<span
@@ -24,7 +24,7 @@
</p>
<el-button
v-if="
currentNode && !['wait', 'false', 'all','caogao','shengpi'].includes(currentNode.data.id)
currentNode && !['wait', 'false', 'all','caogao','shengpi','shengpi1'].includes(currentNode.data.id)
"
type="primary"
@click="addOrUpdateHandle()"

View File

@@ -8,7 +8,11 @@
: type == 'add'
? '新增医案'
: `医案详情${
addCertificateForm.state == 1 ? ' ( 待审核 ) ' : addCertificateForm.state == 3?' ( 审批 ) ':' ( 已拒绝 ) '
addCertificateForm.state == 1
? ' ( 待审核 ) '
: addCertificateForm.state == 3
? ` ( ${currentNode.data.title} ) `
: ' ( 已拒绝 ) '
}`
}`
"
@@ -19,6 +23,8 @@
custom-class="yianDrawer"
size="1200px"
>
<el-button type="primary" @click="copyToWord" style="padding:4px 8px;margin-left: 20px;" v-if="currentNode.data.id=='shengpi1'||currentNode.data.id=='shengpi'">复制医案</el-button>
<div
v-if="dialogVisible"
style="padding: 0 20px;box-sizing: border-box;height: calc(100% - 40px);overflow-y: auto;"
@@ -32,35 +38,46 @@
`
"
>
<div style="width:300px !important;float:right;background:#fafafa" v-if="markList.length>0">
<el-timeline style="padding-left:10px;margin-top:14px" :reverse="true">
<el-timeline-item
v-for="(activity, index) in markList"
:key="index"
:timestamp="activity.time"
<div
style="width:300px !important;float:right;background:#fafafa"
v-if="markList.length > 0"
>
<el-timeline
style="padding-left:10px;margin-top:14px"
:reverse="true"
>
<p style="font-size:12px;color:#f56c6c;margin:0;margin-bottom:4px" v-if="activity.state == 2"
>已拒绝</p
<el-timeline-item
v-for="(activity, index) in markList"
:key="index"
:timestamp="activity.time"
>
<p style="font-size:12px;color:#17b3a3;margin:0;margin-bottom:4px" v-if="activity.state == 3"
>已通过</p
>
{{ activity.mark }}
<p
style="font-size:12px;color:#f56c6c;margin:0;margin-bottom:4px"
v-if="activity.state == 2"
>
已拒绝
</p>
<p
style="font-size:12px;color:#17b3a3;margin:0;margin-bottom:4px"
v-if="activity.state == 3"
>
已通过
</p>
{{ activity.mark }}
</el-timeline-item>
</el-timeline>
</div>
</el-timeline-item>
</el-timeline>
</div>
<div class="medical_box" :style="
`
${
markList.length>0? 'width:calc(100% - 320px);float:left' : ''
}
<div
class="medical_box"
:style="
`
${markList.length > 0 ? 'width:calc(100% - 320px);float:left' : ''}
`
">
"
>
<!-- 触发按钮 -->
<p
style="cursor: pointer;margin: 0;margin-bottom: 10px;"
@@ -396,7 +413,10 @@
label-width="110px"
class="form_item"
>
<div style="padding-top: 15px;">
<div style="padding-top: 15px;" id="copy-box">
<h1 style="position: absolute;top: -200000px;">
{{ addCertificateForm.title }}
</h1>
<div
v-for="(html, key) in record"
:key="key"
@@ -428,7 +448,9 @@
"
></div>
</div>
<div style="position: absolute;top: -200000px;" v-if="addCertificateForm.img">
<p><img :src="v" alt="" v-for="(v,i) in addCertificateForm.img.split(',')" width="250" /></p>
</div>
<!-- <h3 style="margin-top: 40px;">✅ 保存后的结果JSON 格式预览)</h3> -->
</div>
<!-- <quill-editor
@@ -482,11 +504,11 @@
/>
<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>
class="el-upload-list__item-preview"
@click="handlePictureCardPreview(file)"
>
<i class="el-icon-zoom-in"></i>
</span>
<span
v-if="!disabled"
@@ -631,12 +653,8 @@
</span>
</el-dialog>
<el-dialog :visible.sync="dialogVisibleImg" :append-to-body="true">
<img
width="100%"
:src="dataForm.productImages"
alt=""
/>
</el-dialog>
<img width="100%" :src="dataForm.productImages" alt="" />
</el-dialog>
</div>
</template>
@@ -684,7 +702,7 @@ export default {
props: ["data", "pageType", "dataInfo", "labelId", "currentNode"],
data() {
return {
dataForm:{},
dataForm: {},
isShowWord: false,
imagePreviews: false,
record: {},
@@ -791,6 +809,18 @@ export default {
// this.getDataList();
},
methods: {
copyToWord() {
let source = document.getElementById("copy-box"); // 获取样式文本所在的容器元素 或者你可以用$refs
let range = document.createRange(); // 创建一个范围对象
let selection = window.getSelection(); // 获取当前选区
range.selectNodeContents(source); // 将source容器中的所有内容插入范围对象
selection.removeAllRanges(); // 先清除选区内容
selection.addRange(range); // 将范围对象添加到选区
document.execCommand("copy"); // 执行浏览器复制操作
selection.removeAllRanges(); // 清除选区内容
this.$message.success("复制成功");
},
selectLabelId(value) {
// value 是选中的 id 数组
const getTitle = (options, valuePath) => {
@@ -1024,7 +1054,7 @@ export default {
physicaExamination: "<h1>体格检查</h1>",
diagnosis: "<h1>诊断</h1>",
treatmentPlan: "<h1>治疗和后续治疗</h1>",
treatmentPlan: "<h1>其他</h1>"
other: "<h1>其他</h1>"
};
this.isEdit = type == "edit" || type == "add" ? true : false;
if (type == "add") {
@@ -1061,7 +1091,10 @@ export default {
diagnosis: data.diagnosis ? data.diagnosis : recordData.diagnosis,
treatmentPlan: data.treatmentPlan
? data.treatmentPlan
: recordData.treatmentPlan
: recordData.treatmentPlan,
other: data.other
? data.other
: recordData.other
};
}
@@ -1085,7 +1118,7 @@ export default {
}
if (this.addCertificateForm.mark) {
this.markList = JSON.parse(this.addCertificateForm.mark);
this.addCertificateForm.mark=''
this.addCertificateForm.mark = "";
}
} else {
this.addCertificateForm = {};
@@ -1115,7 +1148,6 @@ export default {
this.dialogVisible = true;
},
handleReviewSave() {
var recordData = { ...this.record };
// for (const key in recordData) {
// const titleHtml = this.getTitleHtml(recordData[key]);
@@ -1191,7 +1223,7 @@ export default {
// approved 通过
// rejected 拒绝
this.addCertificateForm.mark=''
this.addCertificateForm.mark = "";
this.reviewType = type;
this.dialogMarkVisible = true;
},
@@ -1617,7 +1649,7 @@ this.addCertificateForm.mark=''
console.log("options", this.options);
// this.getCate(val)
},
handlePictureCardPreview(file) {
handlePictureCardPreview(file) {
this.dataForm.productImages = file.url;
this.dialogVisibleImg = true;
},
@@ -1641,14 +1673,14 @@ this.addCertificateForm.mark=''
margin-bottom: 15px;
}
/deep/.el-upload-list--picture-card .el-upload-list__item {
width:80px !important;
height:80px !important;
line-height:80px !important;
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;
width: 80px !important;
height: 80px !important;
line-height: 80px !important;
}
}
/deep/.yianDrawer header {
@@ -1658,14 +1690,14 @@ this.addCertificateForm.mark=''
min-height: 120px !important;
}
/deep/.custom-upload .el-upload--picture-card {
width:80px !important;
height:80px !important;
line-height:80px !important;
width: 80px !important;
height: 80px !important;
line-height: 80px !important;
}
/deep/.custom-upload .el-upload-list--picture-card .el-upload-list__item {
width:80px !important;
height:80px !important;
line-height:80px !important;
width: 80px !important;
height: 80px !important;
line-height: 80px !important;
}
/deep/.custom-upload-box .el-form-item__label {
line-height: 60px !important;

View File

@@ -19,7 +19,12 @@
prop="userInfo.name"
label="姓名"
width="180"
></el-table-column>
>
<template slot-scope="scope">
{{ scope.row.userInfo.name?scope.row.userInfo.name:'-' }}
</template>
</el-table-column>
<el-table-column prop="address" label="联系方式">
<template slot-scope="scope">
<span v-if="scope.row.userInfo.tel">{{
@@ -49,7 +54,7 @@
style="color: #333333cf;font-weight: 700;font-size: 24px;"
>C</span
>
<span v-if="scope.row.userid == 10172" style="margin-left: 20px;">(其他审批意见)</span>
<span v-if="scope.row.userid == 10175" style="margin-left: 20px;">(其他审批意见)</span>
</template>
</el-table-column>
@@ -81,7 +86,8 @@
<el-radio label="C">C</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
<template v-if="detailType!='disableShowFinal'">
<el-form-item
label="最终审批结果:"
prop="finalRadio"
style="margin-top: -10px;"
@@ -105,6 +111,8 @@
<el-radio :label="4">C</el-radio>
</el-radio-group>
</el-form-item>
</template>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handlereset" size="mini">取消</el-button>
@@ -158,6 +166,7 @@ export default {
data() {
return {
disableEdit: false,
detailType: '',
shengpiData: [],
shengpiList: [],
@@ -257,9 +266,13 @@ export default {
// console.log('发送指令')
this.$bus.$emit("showchooseBook", { bookIds: this.dataForm.Books });
},
async initDetail(data) {
async initDetail(data,type) {
await this.init(data);
this.disableEdit = true;
if(type=='disableShowFinal'){
this.detailType=type
}
},
init(data) {
this.disableEdit = false;
@@ -348,7 +361,7 @@ export default {
...this.dataForm,
stateInfo: this.stringifyWithoutSorting({
...this.shengpiList,
10172: this.dataForm.radio
10175: this.dataForm.radio
}),
state:
this.dataForm.finalRadio == "C"

View File

@@ -19,9 +19,14 @@
<div
class="border_box info_box"
v-if="
!['wait', 'false', 'success', 'caogao', 'shengpi'].includes(
currentNode.data.id
)
![
'wait',
'false',
'success',
'caogao',
'shengpi',
'shengpi1'
].includes(currentNode.data.id)
"
>
<div class="title_box">
@@ -110,7 +115,7 @@
<commonShop
v-if="isFresh"
:CustomEdit="true"
:operationWidth="currentNode.data.id == 'shengpi' ? 100 : 100"
:operationWidth="currentNode.data.id == 'shengpi1' ? 120 : 100"
:otherInfo="{
httpType: 'raw',
resultValueName: 'page'
@@ -119,7 +124,11 @@
state:
currentNode && currentNode.data.state
? currentNode.data.state
: ''
: '',
infoCount:
currentNode && currentNode.data.infoCount
? currentNode.data.infoCount
: '',
}"
:pageSizes="[50, 100, 200, 300, 500, 1000]"
axiosType="raw"
@@ -130,7 +139,8 @@
addForm.id == 'wait' ||
addForm.id == 'false' ||
addForm.id == 'caogao' ||
addForm.id == 'shengpi'
addForm.id == 'shengpi' ||
addForm.id == 'shengpi1'
? true
: false
"
@@ -151,16 +161,21 @@
:style="{
height:
currentNode.data &&
['wait', 'false', 'success', 'caogao', 'shengpi'].includes(
currentNode.data.id
)
[
'wait',
'false',
'success',
'caogao',
'shengpi',
'shengpi1'
].includes(currentNode.data.id)
? 'calc(100vh - 200px) !important'
: 'calc(100vh - 340px)'
}"
>
<template slot="searchFormItem" slot-scope="slotProps">
<div style="width:460px;height: 30px;float: left;"></div>
<!-- <el-form-item
<!-- <el-form-item
label="手机号:"
prop="title"
class="form_item"
@@ -170,12 +185,12 @@
size="small"
placeholder="请输入手机号"
style="width: 100%"
v-model="slotProps.dataForm.tel"
v-model="slotProps.dataForm.infoCount"
clearable
>
</el-input>
</el-form-item>
<el-form-item
<el-form-item
label="标题:"
prop="title"
class="form_item"
@@ -265,6 +280,8 @@
<el-table-column
v-if="currentNode && currentNode.data.id == 'shengpi'"
prop="title"
width="120"
header-align="center"
align="center"
label="审批结果【二审】"
@@ -277,6 +294,27 @@
>
</template>
</el-table-column>
<el-table-column
v-if="currentNode && currentNode.data.id == 'shengpi1'"
prop="title"
header-align="center"
width="120"
align="center"
label="审批状态"
>
<template slot-scope="scope" >
<div v-if="scope.row.stateInfo">
<!-- <div>{{ getshengpi1UserInfo(scope.row) }}</div> -->
<div
v-for="(item,i) in JSON.parse(scope.row.stateInfo)"
style="margin-left: 8px;"
><el-tag style="line-height: 20px;height: 20px;">{{ i }}:{{item}}</el-tag></div
>
</div>
<div v-else style="color:#ff7f50">待审核员审批</div>
</template>
</el-table-column>
<el-table-column
v-if="currentNode && currentNode.data.id == 'caogao'"
prop="title"
@@ -324,6 +362,7 @@
currentNode &&
currentNode.data.id != 'caogao' &&
currentNode.data.id != 'shengpi' &&
currentNode.data.id != 'shengpi1' &&
currentNode.data.id != 'false' &&
currentNode.data.id != 'wait'
"
@@ -362,7 +401,8 @@
addForm.id == 'wait' ||
addForm.id == 'false' ||
addForm.id == 'caogao' ||
addForm.id == 'shengpi'
addForm.id == 'shengpi' ||
addForm.id == 'shengpi1'
"
>
<el-button
@@ -405,8 +445,7 @@
style="color: #5188e5;"
@click="
addOrUpdateHandle({
...slotProps.row,
...slotProps.row
})
"
v-if="slotProps.row.data != ''"
@@ -414,7 +453,7 @@
>
<el-button
type="text"
style="color: #606266;"
style="color: #bbb;"
@click="detailCourse(slotProps.row)"
>详情</el-button
>
@@ -423,6 +462,32 @@
下载
</el-button> -->
</div>
<div v-else-if="currentNode.data.id == 'shengpi1'">
<el-button
type="text"
@click="
detailOrUpdateHandle(
{
...slotProps.row
},
'disableShowFinal'
)
"
v-if="slotProps.row.data != ''"
>审批中</el-button
>
<el-button
type="text"
style="color: #bbb;"
@click="detailCourse(slotProps.row)"
>详情</el-button
>
<!-- <el-button type="text"
style="color: #006699;padding: 0;" @click="generateWord(slotProps.row)">
下载
</el-button> -->
</div>
</template>
</commonShop>
@@ -583,28 +648,29 @@
label="医案等级"
>
<template slot-scope="scope">
<div style="position: relative;width: 100%;height: 100%;cursor: pointer;" @click="
detailOrUpdateHandle({
...scope.row,
})
">
<span
v-if="scope.row.state == 6"
style="color: #2bc669;font-weight: 700;font-size: 24px;"
>A</span
<div
style="position: relative;width: 100%;height: 100%;cursor: pointer;"
@click="
detailOrUpdateHandle({
...scope.row
})
"
>
<span
v-if="scope.row.state == 5"
style="color: #66a3ff;font-weight: 700;font-size: 24px;"
>B</span
>
<span
v-if="scope.row.state == 4"
style="color: #333333cf;font-weight: 700;font-size: 24px;"
>C</span
>
<span
v-if="scope.row.state == 6"
style="color: #2bc669;font-weight: 700;font-size: 24px;"
>A</span
>
<span
v-if="scope.row.state == 5"
style="color: #66a3ff;font-weight: 700;font-size: 24px;"
>B</span
>
<span
v-if="scope.row.state == 4"
style="color: #333333cf;font-weight: 700;font-size: 24px;"
>C</span
>
</div>
<!-- <el-tooltip class="item" effect="dark" :content="scope.row.stateInfo" placement="top"> -->
@@ -631,7 +697,6 @@
</template>
</el-table-column>
<!-- <el-table-column
header-align="center"
align="center"
@@ -989,7 +1054,7 @@ export default {
methods: {
refreshDataList() {
this.$nextTick(() => {
this.getDataList()
this.getDataList();
if (this.$refs.commonShop) {
this.$refs.commonShop.getAssociatedGoodsList();
}
@@ -1015,7 +1080,7 @@ export default {
${data.diagnosis}
${data.treatmentPlan}
${data.other ? `<h1>其他</h1><p>${data.other}</p>` : ""}
${data.other}
@@ -1175,6 +1240,58 @@ export default {
this.$refs.commonShop.handleCheckAllChange(val);
});
},
async getshengpi1UserInfo(row) {
try {
const shengpiList = JSON.parse(row.stateInfo);
const userRequests = Object.keys(shengpiList).map(userid => {
return this.$http({
url: this.$http.adornUrl(`/book/user/info/${userid}`),
method: "get",
params: this.$http.adornParams()
})
.then(response => {
return {
userid: userid,
result: shengpiList[userid],
userInfo: response.data.user
};
})
.catch(error => {
return {
userid: userid,
result: shengpiList[userid],
userInfo: null
};
});
});
// 等待所有请求完成
const userInfoArray = await Promise.all(userRequests);
// 格式化数据为需要展示的格式
const formattedData = userInfoArray.map(item => {
const name = item.userInfo ? item.userInfo.name : '未知';
const id = item.userInfo ? item.userInfo.id : '未知';
const telOrEmail = item.userInfo ? (item.userInfo.tel || item.userInfo.email) : '无';
const result = item.result;
return `${name} (${id}) - 电话/邮箱: ${telOrEmail} - Result: ${result}`;
// return {
// name: name,
// id: id,
// telOrEmail: telOrEmail,
// result: result
// };
}).join('<br>');
console.log('formattedData at line 1286:', formattedData)
return formattedData;
} catch (error) {
console.error("Error in getshengpi1UserInfo:", error);
return []; // 发生错误时返回空数组
}
}
,
clearCourse() {
this.addCertificateForm.courseId = "";
this.addCertificateForm.courseName = "";
@@ -1280,7 +1397,9 @@ export default {
// name: "audio--"
// });
// }
if (!["wait", "false", "caogao", "shengpi"].includes(form.id)) {
if (
!["wait", "false", "caogao", "shengpi", "shengpi1"].includes(form.id)
) {
await this.getDataList();
this.$nextTick(() => {
// this.$refs.commonShop.clear();
@@ -1298,12 +1417,16 @@ export default {
});
} else {
if (this.$refs.commonShop) {
this.$refs.commonShop.dataForm = {
state: form.state
state: form.state,
infoCount: form.infoCount ? form.infoCount : ""
};
this.$refs.commonShop.getAssociatedGoodsList(
"/master/medicalRecords/getMedicalRecordsListCheck"
);
}
}
@@ -1773,7 +1896,8 @@ export default {
color: "#bbb",
bgcolor: "#f0f0f0",
children: [],
state: 0
state: 0,
infoCount: 0
},
{
title: "待审核",
@@ -1783,7 +1907,8 @@ export default {
color: "#dd8f1b",
bgcolor: "#e6a23c47",
children: [],
state: 1
state: 1,
infoCount: 0
},
{
title: "已拒绝",
@@ -1793,17 +1918,32 @@ export default {
color: "#ff0000b3",
bgcolor: "#f003",
children: [],
state: 2
state: 2,
infoCount: 0
},
{
title: "审批列表",
title: "二审处理中",
id: "shengpi1",
disabled: true,
isDisableAddChild: true,
color: "#FF7F50",
bgcolor: "#ff7f5030",
children: [],
state: 3,
infoCount: 0
},
{
title: "三审处理中",
id: "shengpi",
disabled: true,
isDisableAddChild: true,
color: "#5188e5",
bgcolor: "#edf3ff",
children: [],
state: 3
state: 3,
infoCount: 2
},
{
title: "已完成",
@@ -1812,6 +1952,7 @@ export default {
disabled: true,
state: 4,
color: "rgb(23, 179, 163)",
infoCount: 0,
children: [...data.Medicals]
}
];
@@ -1823,49 +1964,39 @@ export default {
);
}
Promise.all([
this.$http({
url: this.$http.adornUrl("/master/medicalRecords/getMedicalRecordsListCheck"),
method: "post",
data: this.$http.adornData({
current: 1,
limit: 999999,
state: 1
})
}),
this.$http({
url: this.$http.adornUrl("/master/medicalRecords/getMedicalRecordsListCheck"),
method: "post",
data: this.$http.adornData({
current: 1,
limit: 999999,
state: 3
})
})
]).then(([res1, res3]) => {
const totalCheck = res1.data.page.total || 0; // 待审核
const totalApprove = res3.data.page.total || 0; // 待审批
this.$http({
url: this.$http.adornUrl(
"/master/medicalRecords/getMedicalRecordsListCheck"
),
method: "post",
data: this.$http.adornData({
current: 1,
limit: 999999,
state: 1
})
}),
this.$http({
url: this.$http.adornUrl(
"/master/medicalRecords/getMedicalRecordsListCheck"
),
method: "post",
data: this.$http.adornData({
current: 1,
limit: 999999,
state: 3
})
})
]).then(([res1, res3]) => {
const totalCheck = res1.data.page.total || 0; // 待审核
const totalApprove = res3.data.page.total || 0; // 待审批
if (totalCheck > 0 ) {
this.$set(this.treeDataList[1],'number',totalCheck);
}
if (totalApprove > 0) {
this.$set(this.treeDataList[3],'number',totalApprove);
}
});
if (totalCheck > 0) {
this.$set(this.treeDataList[1], "number", totalCheck);
}
if (totalApprove > 0) {
this.$set(this.treeDataList[4], "number", totalApprove);
}
});
// this.treeDataList = data.labelList;
// this.totalPage = data.page.totalCount
} else {
@@ -1897,10 +2028,10 @@ export default {
this.$refs.addOrUpdate.init(row);
});
},
detailOrUpdateHandle(row) {
detailOrUpdateHandle(row, type) {
this.addOrUpdateVisible = true;
this.$nextTick(() => {
this.$refs.addOrUpdate.initDetail(row);
this.$refs.addOrUpdate.initDetail(row, type);
});
}
}

View File

@@ -289,6 +289,7 @@ import debounce from "lodash/debounce"; //导入lodash中的debounce
export default {
data() {
return {
selecDepartmentList:[],
baseUrl: global.baseUrl,
dataForm: {
name: "",
@@ -483,6 +484,15 @@ export default {
return;
}
}
if(this.addForm.department.length==0){
this.$message({
message: "请选择科室",
type: "warning"
});
return;
}
if (this.statusType == 0) {
//如果是新增
this.addCate();
@@ -517,7 +527,7 @@ export default {
userId: this.addForm.userId,
name: this.addForm.name,
title: this.addForm.title,
department: department,
deptLabelId: department,
specialty: this.addForm.specialty,
region: region,
reservation: this.addForm.reservation,
@@ -566,7 +576,7 @@ export default {
id: data.id,
name: data.name,
title: data.title,
department: department,
deptLabelId: department,
specialty: data.specialty,
region: region ? region : data.region,
reservation: data.reservation,
@@ -623,7 +633,7 @@ export default {
this.addForm.id = data.id;
this.addForm.name = data.name;
this.addForm.title = data.title;
this.addForm.department = data.department;
this.addForm.department = data.deptLabelId;
this.addForm.specialty = data.specialty;
this.addForm.region = data.region;
this.addForm.reservation = data.reservation;