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 |  491 +++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 338 insertions(+), 153 deletions(-)

diff --git a/src/views/followvisit/tasklist/index.vue b/src/views/followvisit/tasklist/index.vue
index 0d4f58b..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"
@@ -23,7 +22,7 @@
             @keyup.enter.native="handleQuery"
           ></el-input>
         </el-form-item>
-        <el-form-item label="鍒涘彂閫佹椂闂�">
+        <el-form-item label="鍙戦�佹椂闂�">
           <el-date-picker
             v-model="dateRange"
             style="width: 240px"
@@ -34,7 +33,6 @@
             end-placeholder="缁撴潫鏃ユ湡"
           ></el-date-picker>
         </el-form-item>
-
         <el-form-item label="浠诲姟妯℃澘" prop="status">
           <el-input
             v-model="topqueryParams.templatename"
@@ -69,9 +67,9 @@
       <el-row :gutter="10" class="mb8">
         <el-col :span="1.5">
           <el-select
-            @change="handleQuery"
+            @change="handleQuerytask"
             v-model="tasktopic"
-            placeholder="璇烽�夋嫨鏂板绫诲瀷"
+            placeholder="璇烽�夋嫨鏈嶅姟绫诲瀷"
           >
             <el-option
               v-for="item in taskoptions"
@@ -82,10 +80,11 @@
             </el-option>
           </el-select>
         </el-col>
-        <!-- <el-col :span="1.5">
+        <el-col :span="1.5">
           <el-select
-            v-model="longTask"
-            placeholder="璇烽�夋嫨浠诲姟绫诲瀷"
+            @change="handleQuery"
+            v-model="topqueryParams.type"
+            placeholder="璇烽�夋嫨鎵ц绫诲瀷"
           >
             <el-option
               v-for="item in longtermlist"
@@ -95,7 +94,7 @@
             >
             </el-option>
           </el-select>
-        </el-col> -->
+        </el-col>
         <el-col :span="1.5">
           <el-button
             type="primary"
@@ -106,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="120"
           align="center"
           key="taskName"
           prop="taskName"
@@ -149,7 +117,6 @@
         />
         <el-table-column
           label="浠诲姟鎻忚堪"
-          width="280"
           align="center"
           key="taskDesc"
           prop="taskDesc"
@@ -157,20 +124,26 @@
         />
         <el-table-column
           label="鏈嶅姟椤圭洰"
-          width="120"
           align="center"
           key="templatename"
           prop="templatename"
           :show-overflow-tooltip="true"
         />
         <el-table-column
-          label="寰呮墽琛�/鎬讳换鍔�"
+          label="鎬讳换鍔�/宸查殢璁�"
           align="center"
           key="nickName"
+          width="120"
           prop="nickName"
         >
           <template slot-scope="scope">
-            <span>{{ scope.row.wfs }}/{{ scope.row.yfs }}</span>
+            <span
+              >{{
+                scope.row.wfs || scope.row.wfs == 0
+                  ? scope.row.wfs + scope.row.yfs
+                  : ""
+              }}/{{ scope.row.yfs }}</span
+            >
           </template>
         </el-table-column>
         <el-table-column
@@ -178,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
@@ -199,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
@@ -213,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="180"
+          width="320"
           class-name="small-padding fixed-width"
         >
           <template slot-scope="scope">
@@ -240,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
@@ -258,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>
@@ -268,7 +258,7 @@
           label="浠诲姟璇︽儏"
           fixed="right"
           align="center"
-          width="200"
+          width="180"
           class-name="small-padding fixed-width"
         >
           <template slot-scope="scope">
@@ -280,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
@@ -289,7 +278,6 @@
           </template>
         </el-table-column>
       </el-table>
-
       <pagination
         v-show="total > 0"
         :total="total"
@@ -298,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="浠诲姟鍙戣捣纭"
@@ -372,6 +385,13 @@
         >
       </div>
     </el-dialog>
+    <!-- 閫夋嫨鎮h�呭脊妗� -->
+    <Patient-Selection
+      ref="Patient"
+      :dialogVisiblepatient="dialogVisiblepatient"
+      @addoption="addoption"
+      @kkoption="dialogVisiblepatient = true"
+    />
   </div>
 </template>
 
@@ -386,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 {
       // 閬僵灞�
@@ -420,13 +439,17 @@
       // 鐢ㄦ埛琛ㄦ牸鏁版嵁
       userList: null,
       // 寮瑰嚭灞傛爣棰�
-      title: "鏂板闂ㄨ瘖闅忚",
+      title: "鏂板褰卞儚闅忚",
       // 鏄惁鏄剧ず淇敼銆佹坊鍔犲脊鍑哄眰
       addalteropen: false,
       // 閮ㄩ棬鍚嶇О
       deptName: undefined,
       // 榛樿瀵嗙爜
       initPassword: undefined,
+      // 浜岀淮鐮佺浉鍏�
+      qrDialogVisible: false,
+      qrCodeUrl: "", // 涓棿椤甸摼鎺�
+      qrCodeCanvas: null, // 瀛樺偍canvas寮曠敤
       // 鏃ユ湡鑼冨洿
       dateRange: [],
       // 宀椾綅閫夐」
@@ -440,67 +463,44 @@
         showTimeNight: [],
         showTimeNoon: [],
       },
+      dialogVisiblepatient: false,
+      Patientlist: [],
       taskformVisible: false,
       dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
       inputVisible: false,
       inputValue: "",
-      previewVisible: false, //闂ㄨ瘖闅忚棰勮寮规
+      previewVisible: false, //褰卞儚闅忚棰勮寮规
       TaskOperation: {},
       radio: "",
       radios: [],
-      previewtype: 2, //棰勮闂ㄨ瘖闅忚绫诲瀷
+      previewtype: 2, //棰勮褰卞儚闅忚绫诲瀷
       total: 0, // 鎬绘潯鏁�
-      ImportQuantity: 999, //瀵奸棬璇婇殢璁挎暟閲�
-      //棰勮闂ㄨ瘖闅忚淇℃伅
+      ImportQuantity: 999, //瀵煎奖鍍忛殢璁挎暟閲�
+      orgname: null,
+      //棰勮褰卞儚闅忚淇℃伅
       previewvalue: {
         username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
       },
       longtermlist: [
         {
-          value: "1",
-          label: "闀挎湡浠诲姟",
+          value: 1,
+          label: "璇煶闅忚",
         },
         {
-          value: "0",
-          label: "鏅�氫换鍔�",
-        },
-      ],
-      taskoptions: [
-        {
-          value: "1",
-          label: "鐩戞祴璇勪及",
+          value: 2,
+          label: "闂嵎闅忚",
         },
         {
-          value: "2",
-          label: "鍑洪櫌闅忚",
-        },
-        {
-          value: "3",
-          label: "闂ㄨ瘖闅忚",
-        },
-        {
-          value: "4",
+          value: 3,
           label: "瀹f暀鍏虫��",
         },
         {
-          value: "5",
-          label: "澶嶈瘖绠$悊",
-        },
-        {
-          value: "6",
-          label: "婊℃剰搴﹁皟鏌�",
-        },
-        {
-          value: "7",
-          label: "鎮h�呮姤鍛�",
-        },
-
-        {
-          value: "8",
-          label: "鍏朵粬閫氱煡",
+          value: 4,
+          label: "娑堟伅閫氱煡",
         },
       ],
-      tasktopic: "2", //鏂板绫诲瀷
+      taskoptions: store.getters.tasktypes,
+      tasktopic: 2, //鏂板绫诲瀷
       activname: "",
       value: [],
       list: [],
@@ -599,14 +599,16 @@
       topqueryParams: {
         pageNum: 1,
         pageSize: 10,
-        type: 3,
+        type: 2,
+        leaveldeptcodes: [],
+        leavehospitaldistrictcodes: [],
         userName: undefined,
         tagid: undefined,
         topic: undefined,
       },
       propss: { multiple: true },
       options: [],
-
+      checkboxlist: [],
       // 琛ㄥ崟鏍¢獙
       rules: {
         userName: [
@@ -657,19 +659,23 @@
   },
   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;
     });
-    // this.taskoptions = store.getters.Serviceauthority;
+    this.checkboxlist = store.getters.checkboxlist;
   },
   activated() {
     this.getList();
@@ -684,42 +690,71 @@
     /** 鏌ヨ浠诲姟鍒楄〃 */
     getList() {
       this.loading = true;
-      let type = this.$route.query.type;
 
       this.topqueryParams.serviceType = Number(this.tasktopic);
-      this.topqueryParams.type = Number(this.type);
       if (
         this.tasktopic == 2 ||
         this.tasktopic == 3 ||
         this.tasktopic == 1 ||
         this.tasktopic == 7 ||
+        this.tasktopic == 5 ||
+        this.tasktopic == 18 ||
+        this.tasktopic == 19 ||
         this.tasktopic == 6
       ) {
-        this.topqueryParams.type = 2;
-        this.TaskOperation.taskType = 2;
-      } else if (this.tasktopic == 4 || this.tasktopic == 8) {
+        if (!this.topqueryParams.type) this.topqueryParams.type = "2";
+        this.longtermlist = [
+          {
+            value: 1,
+            label: "璇煶闅忚",
+          },
+          {
+            value: 2,
+            label: "闂嵎闅忚",
+          },
+        ];
+        // 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 = [
+          {
+            value: 3,
+            label: "瀹f暀鍏虫��",
+          },
+        ];
         this.topqueryParams.type = 3;
-        this.TaskOperation.taskType = 3;
-      } else if (this.tasktopic == 5) {
-        this.topqueryParams.type = 1;
-        this.TaskOperation.taskType = 1;
+      } else if (this.tasktopic == 16) {
+        if (!this.topqueryParams.type) this.topqueryParams.type = "2";
+        this.longtermlist = [
+          {
+            value: 1,
+            label: "璇煶闅忚",
+          },
+          {
+            value: 2,
+            label: "闂嵎闅忚",
+          },
+          {
+            value: 3,
+            label: "瀹f暀鍏虫��",
+          },
+        ];
+        // this.topqueryParams.type = 2;
       }
-      // this.topqueryParams.typename = this.findLabelByValue(
-      //   this.taskoptions,
-      //   this.tasktopic
-      // );
-      this.topqueryParams.startOutHospTime = this.dateRange[0];
-      this.topqueryParams.endOutHospTime = this.dateRange[1];
-      getTasklist(this.topqueryParams).then(
-        (response) => {
-          this.userList = response.rows;
-          this.total = response.total;
-          this.$forceUpdate();
-          this.loading = false;
-        }
-      );
+      this.topqueryParams.beginTime = this.dateRange[0];
+      this.topqueryParams.endTime = this.dateRange[1];
+      getTasklist(this.topqueryParams).then((response) => {
+        this.userList = response.rows;
+        this.total = response.total;
+        this.$forceUpdate();
+        this.loading = false;
+      });
     },
-    // 鏌ョ湅闂ㄨ瘖闅忚璇︽儏
+    // 鏌ョ湅褰卞儚闅忚璇︽儏
     Referencequestion(row) {
       this.previewVisible = true;
     },
@@ -757,6 +792,11 @@
       this.resetForm("form");
     },
     /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuerytask() {
+      this.topqueryParams.pageNum = 1;
+      // this.topqueryParams.type = '';
+      this.getList();
+    },
     handleQuery() {
       this.topqueryParams.pageNum = 1;
       this.getList();
@@ -765,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();
     },
     // 澶氶�夋閫変腑鏁版嵁
@@ -901,6 +948,7 @@
         this.taskformVisible = true;
       } else if (this.taskform.sendState != 2 && this.taskform.sendType == 2) {
         this.TaskOperation.taskId = row.taskid;
+        this.TaskOperation.taskType = this.topqueryParams.type;
         this.TaskOperation.sendState = 2;
         this.TaskOperation.sendType = 2;
         this.$modal
@@ -926,6 +974,7 @@
     confirmSponsor(row) {
       if (this.activname == 0) {
         this.TaskOperation.taskId = row.taskid;
+        this.TaskOperation.taskType = this.topqueryParams.type;
         this.TaskOperation.sendState = 2;
         TaskTemplateSendExecution(this.TaskOperation).then((res) => {
           if (res.code == 200) {
@@ -943,6 +992,7 @@
     immediateExecution(row) {
       console.log(row, "浠诲姟淇℃伅");
       if (row.sendState != 2) {
+        this.TaskOperation.taskType = this.topqueryParams.type;
         this.TaskOperation.taskId = row.taskid;
         this.TaskOperation.sendState = 2;
         this.TaskOperation.sendType = 2;
@@ -967,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(() => {});
       }
     },
 
@@ -1028,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>
@@ -1060,7 +1227,10 @@
     font-size: 23px;
   }
 }
-
+.button-qr {
+  font-weight: 500;
+  color: #e6a23c;
+}
 .uploading {
   margin-top: 20px;
   margin: 20px;
@@ -1121,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;
@@ -1167,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