From a5cba9ab040f6f97558046885dce3017f9bab7e9 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期二, 11 八月 2026 14:12:29 +0800
Subject: [PATCH] 提交
---
src/views/followvisit/tasklist/index.vue | 409 ++++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 267 insertions(+), 142 deletions(-)
diff --git a/src/views/followvisit/tasklist/index.vue b/src/views/followvisit/tasklist/index.vue
index fbcca62..0d7ef85 100644
--- a/src/views/followvisit/tasklist/index.vue
+++ b/src/views/followvisit/tasklist/index.vue
@@ -2,7 +2,6 @@
<div class="app-container">
<el-row :gutter="20">
<!--鐢ㄦ埛鏁版嵁-->
-
<el-form
:model="topqueryParams"
ref="queryForm"
@@ -34,7 +33,6 @@
end-placeholder="缁撴潫鏃ユ湡"
></el-date-picker>
</el-form-item>
-
<el-form-item label="浠诲姟妯℃澘" prop="status">
<el-input
v-model="topqueryParams.templatename"
@@ -107,42 +105,11 @@
>鏂板缓浠诲姟</el-button
>
</el-col>
-
- <!-- <el-col :span="19">
- <div class="documentf">
- <div class="document">
- <el-button
- type="warning"
- plain
- icon="el-icon-download"
- size="medium"
- @click="handleExport"
- v-hasPermi="['system:user:export']"
- >瀵煎嚭</el-button
- >
- </div>
- </div>
- </el-col> -->
- <!-- <el-col :span="1.5"> </el-col> -->
</el-row>
- <!-- <right-toolbar
- :showSearch.sync="showSearch"
- @queryTable="getList"
- :columns="columns"
- ></right-toolbar> -->
<el-table v-loading="loading" :data="userList">
- <!-- <el-table-column
- label="搴忓彿"
- fixed
- align="center"
- key="taskid"
- prop="taskid"
- /> -->
-
<el-table-column
label="浠诲姟鍚嶇О"
fixed
- width="200"
align="center"
key="taskName"
prop="taskName"
@@ -150,7 +117,6 @@
/>
<el-table-column
label="浠诲姟鎻忚堪"
- width="280"
align="center"
key="taskDesc"
prop="taskDesc"
@@ -158,7 +124,6 @@
/>
<el-table-column
label="鏈嶅姟椤圭洰"
- width="120"
align="center"
key="templatename"
prop="templatename"
@@ -173,9 +138,11 @@
>
<template slot-scope="scope">
<span
- >{{ scope.row.wfs ? scope.row.wfs + scope.row.yfs : "" }}/{{
- scope.row.yfs
- }}</span
+ >{{
+ scope.row.wfs || scope.row.wfs == 0
+ ? scope.row.wfs + scope.row.yfs
+ : ""
+ }}/{{ scope.row.yfs }}</span
>
</template>
</el-table-column>
@@ -184,19 +151,30 @@
align="center"
key="longTask"
prop="longTask"
- width="120"
>
<template slot-scope="scope">
- <span>{{ scope.row.longTask ? "闀挎湡浠诲姟" : "闈為暱鏈�" }}</span>
+ <div v-if="scope.row.longTask == 0">
+ <el-tag type="primary" :disable-transitions="false"
+ >鑷畾涔夊懆鏈熶换鍔�</el-tag
+ >
+ </div>
+ <div v-if="scope.row.longTask == 1">
+ <el-tag type="success" :disable-transitions="false"
+ >闀挎湡浠诲姟</el-tag
+ >
+ </div>
+ <div v-if="scope.row.longTask == 2">
+ <el-tag type="success" :disable-transitions="false"
+ >鍥哄畾浠诲姟</el-tag
+ >
+ </div>
</template>
</el-table-column>
-
<el-table-column
label="鐘舵��"
align="center"
key="sendState"
prop="sendState"
- width="120"
>
<template slot-scope="scope">
<dict-tag
@@ -205,13 +183,11 @@
/>
</template>
</el-table-column>
-
<el-table-column
label="鍒涘缓浜�"
align="center"
key="createBy"
prop="createBy"
- width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
@@ -219,18 +195,16 @@
sortable
align="center"
prop="createTime"
- width="160"
>
<template slot-scope="scope">
<span>{{ formatTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
-
<el-table-column
label="鎿嶄綔"
fixed="right"
align="center"
- width="240"
+ width="320"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
@@ -246,17 +220,19 @@
><i class="el-icon-s-promotion"></i>鍙戣捣</span
></el-button
>
- <!-- <el-button size="medium" type="text" @click="newAdd(scope.row)"
- ><span class="button-xj"
- ><i class="el-icon-circle-plus-outline"></i>缁堟</span
- ></el-button
- > -->
<el-button
size="medium"
type="text"
@click="handleUpdate(scope.row, 1)"
- ><span class="button-xj"
- ><i class="el-icon-circle-plus-outline"></i>渚濈収鏂板</span
+ ><span class="button-xj">渚濈収鏂板</span></el-button
+ >
+ <el-button
+ v-if="scope.row.sendState != 5"
+ size="medium"
+ type="text"
+ @click="handleAddpatient(scope.row.taskid, scope.row.type)"
+ ><span class="button-hz"
+ ><i class="el-icon-circle-plus-outline"></i>鏂板鎮h��</span
></el-button
>
<el-button
@@ -264,8 +240,16 @@
size="medium"
type="text"
@click="stop(scope.row)"
- ><span class="button-zt"
- ><i class="el-icon-circle-plus-outline"></i>鏆傚仠</span
+ ><span class="button-zt">鏆傚仠</span></el-button
+ >
+ <!-- 鏂板浜岀淮鐮佹寜閽� -->
+ <el-button
+ v-if="orgname == '鐪佺珛鍚屽痉缈犺嫅闄㈠尯'"
+ size="medium"
+ type="text"
+ @click="handleQrCode(scope.row)"
+ ><span class="button-qr"
+ ><i class="el-icon-s-grid"></i>浜岀淮鐮�</span
></el-button
>
</template>
@@ -274,7 +258,7 @@
label="浠诲姟璇︽儏"
fixed="right"
align="center"
- width="240"
+ width="180"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
@@ -286,7 +270,6 @@
><i class="el-icon-s-data"></i>璇︽儏</span
></el-button
>
-
<el-button size="medium" type="text" @click="deletefn(scope.row)"
><span class="button-sc"
><i class="el-icon-delete"></i>鍒犻櫎</span
@@ -295,7 +278,6 @@
</template>
</el-table-column>
</el-table>
-
<pagination
v-show="total > 0"
:total="total"
@@ -304,6 +286,31 @@
@pagination="getList"
/>
</el-row>
+
+ <!-- 浜岀淮鐮佸脊绐� -->
+ <el-dialog
+ title="浠诲姟浜岀淮鐮�"
+ :visible.sync="qrDialogVisible"
+ width="400px"
+ center
+ :before-close="handleQrClose"
+ >
+ <div style="text-align: center; padding: 20px 0">
+ <div
+ id="qrCodeContainer"
+ ref="qrCodeContainer"
+ style="display: inline-block"
+ ></div>
+ <div style="margin-top: 15px; color: #606266; font-size: 14px">
+ 璇蜂娇鐢ㄥ井淇�/娴忚鍣ㄦ壂鐮佽闂�
+ </div>
+ </div>
+ <span slot="footer" class="dialog-footer">
+ <el-button @click="downloadQrCode">涓嬭浇浜岀淮鐮�</el-button>
+ <el-button type="primary" @click="printQrCode">鎵撳嵃</el-button>
+ <el-button @click="qrDialogVisible = false">鍏抽棴</el-button>
+ </span>
+ </el-dialog>
<!-- 纭鍙戣捣瀵硅瘽妗� -->
<el-dialog
title="浠诲姟鍙戣捣纭"
@@ -378,6 +385,13 @@
>
</div>
</el-dialog>
+ <!-- 閫夋嫨鎮h�呭脊妗� -->
+ <Patient-Selection
+ ref="Patient"
+ :dialogVisiblepatient="dialogVisiblepatient"
+ @addoption="addoption"
+ @kkoption="dialogVisiblepatient = true"
+ />
</div>
</template>
@@ -392,23 +406,22 @@
} from "@/api/system/user";
import {
getTasklist,
- getTaskInfo,
- Editsingletask,
delTaskInfo,
- Questionnairetasklist,
- Questionnairetaskget,
- Questionnairetasksponsor,
TaskTemplateSendExecution,
+ scanGenerateSubtask,
+ goSfRelay,
} from "@/api/AiCentre/index";
import store from "@/store";
-
+import PatientSelection from "@/components/PatientSelection"; //姝e垯缁勪欢
+import SFtable from "@/components/SFtable"; //琛ㄦ牸缁勪欢
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
-
+// 寮曞叆浜岀淮鐮佸簱
+import QRCode from "qrcode";
export default {
name: "Tasklist",
dicts: ["sys_normal_disable", "sys_user_sex", "task_status"],
- components: { Treeselect },
+ components: { Treeselect, PatientSelection },
data() {
return {
// 閬僵灞�
@@ -433,6 +446,10 @@
deptName: undefined,
// 榛樿瀵嗙爜
initPassword: undefined,
+ // 浜岀淮鐮佺浉鍏�
+ qrDialogVisible: false,
+ qrCodeUrl: "", // 涓棿椤甸摼鎺�
+ qrCodeCanvas: null, // 瀛樺偍canvas寮曠敤
// 鏃ユ湡鑼冨洿
dateRange: [],
// 宀椾綅閫夐」
@@ -446,6 +463,8 @@
showTimeNight: [],
showTimeNoon: [],
},
+ dialogVisiblepatient: false,
+ Patientlist: [],
taskformVisible: false,
dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
inputVisible: false,
@@ -457,6 +476,7 @@
previewtype: 2, //棰勮褰卞儚闅忚绫诲瀷
total: 0, // 鎬绘潯鏁�
ImportQuantity: 999, //瀵煎奖鍍忛殢璁挎暟閲�
+ orgname: null,
//棰勮褰卞儚闅忚淇℃伅
previewvalue: {
username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
@@ -479,61 +499,8 @@
label: "娑堟伅閫氱煡",
},
],
- taskoptions: [
- {
- value: "1",
- label: "鐩戞祴璇勪及",
- },
- {
- value: "2",
- label: "鍑洪櫌闅忚",
- },
- {
- value: "3",
- label: "闂ㄨ瘖闅忚",
- },
- {
- value: "4",
- label: "瀹f暀鍏虫��",
- },
- {
- value: "5",
- label: "澶嶈瘖绠$悊",
- },
- // {
- // value: "5",
- // label: "婊℃剰搴﹁皟鏌�",
- // },
- {
- value: "7",
- label: "鎮h�呮姤鍛�",
- },
- // {
- // value: "8",
- // label: "鍏朵粬閫氱煡",
- // },
- {
- value: "9",
- label: "浣撴闅忚",
- },
- // {
- // value: "10",
- // label: "鍖绘妧闅忚",
- // },
- {
- value: "11",
- label: "褰卞儚闅忚",
- },
- {
- value: "12",
- label: "蹇冪數闅忚",
- },
- {
- value: "13",
- label: "涓撶闅忚",
- },
- ],
- tasktopic: "2", //鏂板绫诲瀷
+ taskoptions: store.getters.tasktypes,
+ tasktopic: 2, //鏂板绫诲瀷
activname: "",
value: [],
list: [],
@@ -633,6 +600,8 @@
pageNum: 1,
pageSize: 10,
type: 2,
+ leaveldeptcodes: [],
+ leavehospitaldistrictcodes: [],
userName: undefined,
tagid: undefined,
topic: undefined,
@@ -690,14 +659,18 @@
},
watch: {},
created() {
- // this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
- // (obj) => obj.deptCode
- // );
- // this.topqueryParams.leavehospitaldistrictcodes =
- // store.getters.belongWards.map((obj) => obj.districtCode);
+ this.orgname = localStorage.getItem("orgname");
+ if (this.orgname == "鍗楀崕澶у闄勫睘绗竴鍖婚櫌") {
+ this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+ (obj) => obj.deptCode
+ );
+ this.topqueryParams.leavehospitaldistrictcodes =
+ store.getters.belongWards.map((obj) => obj.districtCode);
+ }
this.tasktopic = this.$route.query.tasktopic
? this.$route.query.tasktopic
: this.tasktopic;
+ this.tasktopic = Number(this.tasktopic);
this.getList();
this.getConfigKey("sys.user.initPassword").then((response) => {
this.initPassword = response.msg;
@@ -724,6 +697,9 @@
this.tasktopic == 3 ||
this.tasktopic == 1 ||
this.tasktopic == 7 ||
+ this.tasktopic == 5 ||
+ this.tasktopic == 18 ||
+ this.tasktopic == 19 ||
this.tasktopic == 6
) {
if (!this.topqueryParams.type) this.topqueryParams.type = "2";
@@ -737,7 +713,12 @@
label: "闂嵎闅忚",
},
];
- } else if (this.tasktopic == 4 || this.tasktopic == 8) {
+ // this.topqueryParams.type = 2;
+ } else if (
+ this.tasktopic == 4 ||
+ this.tasktopic == 8 ||
+ this.tasktopic == 17
+ ) {
if (!this.topqueryParams.type) this.topqueryParams.type = "3";
this.longtermlist = [
{
@@ -745,8 +726,9 @@
label: "瀹f暀鍏虫��",
},
];
- } else if (this.tasktopic == 5) {
- if (!this.topqueryParams.type) this.topqueryParams.type = "1";
+ this.topqueryParams.type = 3;
+ } else if (this.tasktopic == 16) {
+ if (!this.topqueryParams.type) this.topqueryParams.type = "2";
this.longtermlist = [
{
value: 1,
@@ -756,12 +738,13 @@
value: 2,
label: "闂嵎闅忚",
},
+ {
+ value: 3,
+ label: "瀹f暀鍏虫��",
+ },
];
+ // this.topqueryParams.type = 2;
}
- // this.topqueryParams.typename = this.findLabelByValue(
- // this.taskoptions,
- // this.tasktopic
- // );
this.topqueryParams.beginTime = this.dateRange[0];
this.topqueryParams.endTime = this.dateRange[1];
getTasklist(this.topqueryParams).then((response) => {
@@ -822,8 +805,15 @@
resetQuery() {
this.dateRange = [];
this.resetForm("queryForm");
- this.topqueryParams.deptId = undefined;
- this.$refs.tree.setCurrentKey(null);
+ this.topqueryParams = {
+ pageNum: 1,
+ pageSize: 10,
+ type: 2,
+ userName: undefined,
+ tagid: undefined,
+ topic: undefined,
+ };
+ // this.$refs.tree.setCurrentKey(null);
this.handleQuery();
},
// 澶氶�夋閫変腑鏁版嵁
@@ -1027,16 +1017,24 @@
// 鏆傚仠
stop(row) {
- console.log(row);
if (row.sendState == 2) {
this.TaskOperation.taskId = row.taskid;
+ console.log(11);
+
this.TaskOperation.sendState = 3;
this.TaskOperation.sendType = "";
this.TaskOperation.taskType = row.type;
- TaskTemplateSendExecution(this.TaskOperation).then((res) => {
- this.$modal.msgSuccess("浠诲姟宸叉殏鍋�");
- this.getList();
- });
+
+ this.$modal
+ .confirm('鏄惁纭鏆傚仠"' + row.taskName + '"锛�')
+ .then(() => {
+ TaskTemplateSendExecution(this.TaskOperation).then((res) => {
+ this.$modal.msgSuccess("浠诲姟宸叉殏鍋�");
+ this.getList();
+ });
+ })
+
+ .catch(() => {});
}
},
@@ -1088,6 +1086,115 @@
const item = data.find((item) => item.value === value);
return item ? item.label : null;
},
+ handleAddpatient(taskid) {
+ this.$refs.Patient.handleAddpatient(taskid);
+ this.dialogVisiblepatient = true; // 鎵嬪姩鎺у埗寮圭獥鏄剧ず
+ },
+ addoption() {
+ this.dialogVisiblepatient = false; // 鎵嬪姩鎺у埗寮圭獥鏄剧ず
+ this.handleQuery();
+ },
+ // ============浜岀淮鐮佺浉鍏�
+ /**
+ * 鐢熸垚浜岀淮鐮�
+ */
+ handleQrCode(row) {
+ // 1. 鏋勯�犺姹傚弬鏁�
+ const params = {
+ taskId: row.taskid,
+ deptcode: row.deptcode || "", // 褰撳墠鐢ㄦ埛閮ㄩ棬缂栫爜锛岃纭繚 store 涓湁璇� getter
+ leavehospitaldistrictcode: row.leavehospitaldistrictcode || "", // 杞负閫楀彿鍒嗛殧瀛楃涓诧紝瑙嗘帴鍙i渶姹�
+ // 濡傛灉鏈夊叾浠栧弬鏁板 hospitalDistrictCode 涔熷彲琛ュ厖
+ };
+ // 2. 璋冪敤 goSfRelay 鑾峰彇涓棿椤甸摼鎺�
+ goSfRelay(params)
+ .then((res) => {
+ if (res.code == 200) {
+ this.qrCodeUrl = res.msg; // 鍋囪杩斿洖 data 涓哄畬鏁� URL
+ this.qrDialogVisible = true;
+ this.$nextTick(() => {
+ this.generateQrCode(this.qrCodeUrl);
+ });
+ } else {
+ this.$modal.msgError("鑾峰彇浜岀淮鐮侀摼鎺ュけ璐�");
+ }
+ })
+ .catch(() => {
+ this.$modal.msgError("鑾峰彇浜岀淮鐮侀摼鎺ュ紓甯�");
+ });
+ },
+
+ /**
+ * 鐢熸垚浜岀淮鐮佸浘鐗�
+ */
+ generateQrCode(url) {
+ const container = this.$refs.qrCodeContainer;
+ if (!container) return;
+ // 娓呯┖瀹瑰櫒
+ container.innerHTML = "";
+ // 浣跨敤 QRCode 搴撶粯鍒� canvas
+ QRCode.toCanvas(url, { width: 200, margin: 2 }, (err, canvas) => {
+ if (err) {
+ console.error(err);
+ this.$modal.msgError("鐢熸垚浜岀淮鐮佸け璐�");
+ return;
+ }
+ container.appendChild(canvas);
+ this.qrCodeCanvas = canvas; // 淇濆瓨寮曠敤渚夸簬涓嬭浇
+ });
+ },
+
+ /**
+ * 涓嬭浇浜岀淮鐮侊紙淇濆瓨涓哄浘鐗囷級
+ */
+ downloadQrCode() {
+ if (!this.qrCodeCanvas) {
+ this.$modal.msgWarning("璇峰厛鐢熸垚浜岀淮鐮�");
+ return;
+ }
+ const link = document.createElement("a");
+ link.download = `task_qrcode_${Date.now()}.png`;
+ link.href = this.qrCodeCanvas.toDataURL("image/png");
+ link.click();
+ },
+
+ /**
+ * 鎵撳嵃浜岀淮鐮侊紙璋冪敤娴忚鍣ㄦ墦鍗帮紝鍙墦鍗颁簩缁寸爜鍖哄煙锛�
+ */
+ printQrCode() {
+ if (!this.qrCodeCanvas) {
+ this.$modal.msgWarning("璇峰厛鐢熸垚浜岀淮鐮�");
+ return;
+ }
+ // 鏋勯�犳墦鍗板唴瀹�
+ const printWindow = window.open("", "_blank", "width=400,height=400");
+ const doc = printWindow.document;
+ doc.write(`
+ <html>
+ <head><title>鎵撳嵃浜岀淮鐮�</title></head>
+ <body style="text-align:center;padding-top:50px;">
+ <img src="${this.qrCodeCanvas.toDataURL(
+ "image/png"
+ )}" style="width:300px;height:300px;" />
+ <p style="font-size:14px;color:#666;">璇蜂娇鐢ㄥ井淇�/娴忚鍣ㄦ壂鐮�</p>
+ </body>
+ </html>
+ `);
+ doc.close();
+ printWindow.focus();
+ printWindow.print();
+ },
+
+ /**
+ * 鍏抽棴浜岀淮鐮佸脊绐�
+ */
+ handleQrClose() {
+ this.qrDialogVisible = false;
+ this.qrCodeUrl = "";
+ this.qrCodeCanvas = null;
+ const container = this.$refs.qrCodeContainer;
+ if (container) container.innerHTML = "";
+ },
},
};
</script>
@@ -1120,7 +1227,10 @@
font-size: 23px;
}
}
-
+.button-qr {
+ font-weight: 500;
+ color: #e6a23c;
+}
.uploading {
margin-top: 20px;
margin: 20px;
@@ -1181,38 +1291,52 @@
}
}
}
+
.button-bb {
font-weight: 500;
color: #2ba05c;
}
+
.button-xq {
font-weight: 500;
color: #409eff;
}
+
.button-sc {
font-weight: 500;
color: #dd302a;
}
+
.button-zx {
background: #4fabe9;
padding: 5px;
border-radius: 1px;
color: #ffffff;
}
+
.button-lj {
background: #e9614f;
padding: 5px;
border-radius: 1px;
color: #ffffff;
}
+
.button-xj {
background: #815c94;
padding: 5px;
border-radius: 1px;
color: #ffffff;
}
+
.button-zt {
background: #f9c116;
+ padding: 5px;
+ border-radius: 1px;
+ color: #ffffff;
+}
+
+.button-hz {
+ background: #63d37b;
padding: 5px;
border-radius: 1px;
color: #ffffff;
@@ -1227,6 +1351,7 @@
::v-deep.el-button + .el-button {
margin-left: 0;
}
+
::v-deep.el-checkbox-group {
span {
font-size: 24px;
--
Gitblit v1.9.3