From 4b221581b1d7b6c22e86af4e12c363ef482898c8 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期三, 20 八月 2025 17:37:38 +0800
Subject: [PATCH] 随访详情及控制台错误优化

---
 src/views/followvisit/record/detailpage/index.vue |  195 ++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 161 insertions(+), 34 deletions(-)

diff --git a/src/views/followvisit/record/detailpage/index.vue b/src/views/followvisit/record/detailpage/index.vue
index ee5da01..0e292ce 100644
--- a/src/views/followvisit/record/detailpage/index.vue
+++ b/src/views/followvisit/record/detailpage/index.vue
@@ -260,13 +260,37 @@
                   ></el-input> </el-form-item
               ></el-col>
             </el-row>
+
             <div style="margin-left: 30px">
               <el-button type="primary" plain @click="Editsingletasksonyic('')"
                 >淇濆瓨鏈嶅姟</el-button
               >
             </div>
           </div>
+          <el-row :gutter="20" v-if="callStatus !== 'idle'">
+            <el-col :span="24">
+              <el-alert
+                :title="callStatusText"
+                :type="callStatusType"
+                :closable="false"
+                show-icon
+              />
+            </el-col>
+          </el-row>
 
+          <!-- 鎸傛柇鎸夐挳锛堜粎鍦ㄩ�氳瘽涓樉绀猴級 -->
+          <el-row :gutter="20" v-if="callStatus === 'connected'">
+            <el-col :span="24" style="text-align: center; margin-top: 10px">
+              <el-button
+                type="danger"
+                icon="el-icon-phone"
+                @click="endCurrentCall"
+                :loading="isEndingCall"
+              >
+                鎸傛柇鐢佃瘽
+              </el-button>
+            </el-col>
+          </el-row>
           <el-form-item label="闅忚璁板綍">
             <el-input type="textarea" v-model="form.remark"></el-input>
           </el-form-item>
@@ -563,7 +587,7 @@
               瀹屾暣璇煶锛�
               <mini-audio
                 :audio-source="
-                  voice ? voice : 'https://example.com/example.mp3'
+                  voice ? voice : '@assets/order/example.mp3'
                 "
               ></mini-audio>
             </div>
@@ -587,7 +611,7 @@
                         :audio-source="
                           item.questionvoice
                             ? item.questionvoice
-                            : 'https://example.com/example.mp3'
+                            : '@assets/order/example.mp3'
                         "
                       ></mini-audio>
                     </div>
@@ -727,6 +751,7 @@
                 :picker-options="pickerOptions"
                 align="right"
                 v-model="form.date1"
+                class="custom-disabled"
               ></el-date-picker>
             </el-form-item>
           </el-col>
@@ -795,6 +820,10 @@
       userid: "",
       currentPhoneNumber: "",
       callType: "", // 鐢ㄤ簬鍖哄垎鏄摢涓數璇�
+      // 宸叉湁鏁版嵁...
+      callStatus: "idle", // idle, calling, connected, ended, failed
+      isEndingCall: false,
+      currentCall: null, // 褰撳墠閫氳瘽瀵硅薄
       input: "浠婂ぉ韬綋杩樹笉閿�",
       radio: "2",
       taskname: "",
@@ -852,6 +881,10 @@
         },
       },
       pickerOptions: {
+        disabledDate(time) {
+          // 绂佺敤浠婂ぉ鍙婁箣鍓嶇殑鏃ユ湡
+          return time.getTime() < Date.now() - 24 * 60 * 60 * 1000;
+        },
         shortcuts: [
           {
             text: "涓冨ぉ鍚�",
@@ -943,7 +976,28 @@
       patid: null,
     };
   },
-
+  computed: {
+    callStatusText() {
+      const statusMap = {
+        idle: "鍑嗗鍛煎彨",
+        calling: `姝e湪鍛煎彨 ${this.currentPhoneNumber}...`,
+        connected: `宸叉帴閫� ${this.currentPhoneNumber}`,
+        ended: "閫氳瘽宸茬粨鏉�",
+        failed: "鍛煎彨澶辫触",
+      };
+      return statusMap[this.callStatus];
+    },
+    callStatusType() {
+      const typeMap = {
+        idle: "info",
+        calling: "warning",
+        connected: "success",
+        ended: "info",
+        failed: "error",
+      };
+      return typeMap[this.callStatus];
+    },
+  },
   created() {
     this.taskid = this.$route.query.taskid;
     this.id = this.$route.query.id;
@@ -1185,7 +1239,7 @@
             })
             .catch(() => {
               if (this.form.serviceType == 13) {
-                if (this.visitCount) {
+                if (this.visitCount!=1) {
                   this.$router.push({
                     path: "/logisticsservice/zbAgain",
                   });
@@ -1194,10 +1248,10 @@
                     path: "/logisticsservice/record",
                   });
                 }
-              } else if (form.serviceType == 2) {
-                if (this.visitCount) {
+              } else if (this.form.serviceType == 2) {
+                if (this.visitCount!=1) {
                   this.$router.push({
-                    path: "/followvisit/again",
+                    path: "/logisticsservice/again",
                   });
                 } else {
                   this.$router.push({
@@ -1212,28 +1266,95 @@
           console.error("鍙戠敓閿欒锛�", error);
         });
     },
-    // 楠岃瘉鎵嬫満鍙锋牸寮�
-    isValidPhone(phone) {
-      return /^1[3-9]\d{9}$/.test(phone);
-    },
-    // 鍛煎彨澶勭悊
-    handleCall(phone, type) {
-      if (this.isValidPhone(phone)) {
-        this.currentPhoneNumber = phone;
-        this.callType = type;
-
-        // 绛夊緟涓嬩竴涓猼ick纭繚鍊煎凡鏇存柊
-        this.$nextTick(() => {
-          this.$refs.callButton.startCall();
-
-          // 鍙�夛細鏍规嵁涓嶅悓绫诲瀷鍋氫笉鍚屽鐞�
-          if (type === "tel") {
-            console.log("姝e湪鍛煎彨鎮h�呮湰浜�:", phone);
-          } else {
-            console.log("姝e湪鍛煎彨鑱旂郴浜�:", phone);
-          }
-        });
+    // 楠岃瘉鐢佃瘽鍙风爜鏍煎紡骞惰繑鍥為敊璇俊鎭�
+    validatePhoneNumber(phone) {
+      if (!phone) {
+        return { isValid: false, message: "璇疯緭鍏ョ數璇濆彿鐮�" };
       }
+
+      // 鎵嬫満鍙锋鍒�
+      const mobileRegex = /^1[3-9]\d{9}$/;
+
+      // 甯﹀尯鍙风殑鍥哄畾鐢佃瘽锛堝畬鏁存牸寮忥級
+      const landlineFullRegex = /^0\d{2,3}-?\d{7,8}$/;
+
+      // 涓嶅甫鍖哄彿鐨勫浐瀹氱數璇濓紙浠呮湰鍦板彿鐮侊級
+      const landlineLocalRegex = /^\d{7,8}$/;
+
+      if (mobileRegex.test(phone)) {
+        return { isValid: true, type: "mobile" };
+      } else if (landlineFullRegex.test(phone)) {
+        return { isValid: true, type: "landline" };
+      } else if (landlineLocalRegex.test(phone)) {
+        return {
+          isValid: false,
+          message: "鏈湴鍙风爜璇锋坊鍔犲尯鍙凤紙濡�028-1234567锛�",
+        };
+      } else {
+        return {
+          isValid: false,
+          message: "璇疯緭鍏ユ纭殑鐢佃瘽鍙风爜锛堟墜鏈哄彿鎴栧甫鍖哄彿鐨勫浐瀹氱數璇濓級",
+        };
+      }
+    },
+
+    // 浣跨敤绀轰緥
+    isValidPhone(phone) {
+      return this.validatePhoneNumber(phone).isValid;
+    },
+    handleCall(phone, type) {
+      if (!this.isValidPhone(phone)) {
+        this.$message.error("璇疯緭鍏ユ纭殑鎵嬫満鍙风爜");
+        return;
+      }
+
+      this.currentPhoneNumber = phone;
+      this.callType = type;
+      this.callStatus = "calling";
+
+      this.$nextTick(() => {
+        this.$refs.callButton.startCall();
+
+        // 鐩戝惉閫氳瘽鐘舵�佸彉鍖�
+        this.$refs.callButton.$on("call-status-change", (status) => {
+          this.handleCallStatusChange(status);
+        });
+      });
+    },
+
+    // 澶勭悊閫氳瘽鐘舵�佸彉鍖�
+    handleCallStatusChange(status) {
+      console.log(status, "status");
+
+      this.callStatus = status.type;
+
+      if (status.type === "connected") {
+        this.currentCall = {
+          phone: this.currentPhoneNumber,
+          type: this.callType,
+          startTime: new Date(),
+        };
+      } else if (status.type === "ended" || status.type === "failed") {
+        this.currentCall = null;
+      }
+
+      // 鍙互鏍规嵁鐘舵�佹墽琛屽叾浠栨搷浣�
+      if (status.type === "failed") {
+        this.$message.error(`鍛煎彨澶辫触: ${status.text}`);
+      }
+    },
+
+    // 缁撴潫褰撳墠閫氳瘽
+    endCurrentCall() {
+      if (!this.currentCall) return;
+
+      this.isEndingCall = true;
+      this.$refs.callButton.endCall();
+
+      // 3绉掑悗閲嶇疆鐘舵��
+      setTimeout(() => {
+        this.isEndingCall = false;
+      }, 3000);
     },
     yuyingetdetail() {
       this.tableDatatop.forEach((item, index) => {
@@ -1280,7 +1401,7 @@
             })
             .catch(() => {
               if (this.form.serviceType == 13) {
-                if (this.visitCount!=1) {
+                if (this.visitCount != 1) {
                   this.$router.push({
                     path: "/logisticsservice/zbAgain",
                   });
@@ -1290,7 +1411,7 @@
                   });
                 }
               } else if (form.serviceType == 2) {
-                if (this.visitCount!=1) {
+                if (this.visitCount != 1) {
                   this.$router.push({
                     path: "/followvisit/again",
                   });
@@ -1326,11 +1447,12 @@
           this.form = res.rows[0].serviceSubtaskList.find(
             (item) => item.id == this.id
           );
+          console.log(this.form.serviceType, "serviceType");
+
           this.logsheetlist = res.rows[0].serviceSubtaskList;
           this.templateid = this.logsheetlist[0].templateid;
           const targetDate = new Date(this.form.longSendTime); // 鐩爣鏃ユ湡
           const now = new Date(); // 褰撳墠鏃堕棿
-          this.form.endtime = this.formatTime(this.form.endtime);
           if (now < targetDate && this.form.sendstate == 2) {
             this.$confirm("褰撳墠鏈嶅姟鏈埌鍙戦�佹椂闂磋璋ㄦ厧淇敼", "鎻愮ず", {
               confirmButtonText: "纭畾",
@@ -1475,6 +1597,10 @@
     setupsubtask() {
       this.$refs["zcform"].validate((valid) => {
         if (valid) {
+          if (this.form.date1 && new Date(this.form.date1) < new Date()) {
+            this.$message.error("闅忚鏃堕棿涓嶈兘灏忎簬褰撳墠鏃堕棿");
+            return false;
+          }
           this.form.remark =
             this.form.remark + "銆�" + this.getCurrentTime() + "銆�";
           let form = structuredClone(this.form);
@@ -1482,7 +1608,6 @@
           form.finishtime = "";
           if (form.resource) {
             if (form.resource == 2) {
-              form.serviceType = 13;
               form.visitDeptCode = localStorage.getItem("deptCode");
               form.visitDeptName = "闅忚涓績";
             } else {
@@ -1495,16 +1620,18 @@
           }
           // form.id = null;
           form.sendstate = 2;
+          console.log(form.serviceType, "form.serviceType");
+
           addserviceSubtask(form).then((res) => {
             if (res.code == 200) {
               this.$modal.msgSuccess("鍒涘缓鎴愬姛");
               if (form.serviceType == 13) {
                 this.$router.push({
-                  path: "/logisticsservice/again",
+                  path: "/logisticsservice/zbAgain",
                 });
               } else if (form.serviceType == 2) {
                 this.$router.push({
-                  path: "/logisticsservice/zbAgain",
+                  path: "/logisticsservice/again",
                 });
               }
             } else {

--
Gitblit v1.9.3