From 8dfc9189443d7baf2e73d99a73e1b20eefba366e Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期二, 06 一月 2026 17:38:49 +0800
Subject: [PATCH] 测试完成
---
/dev/null | 0
dist.zip | 0
src/utils/sipService.js | 182 +++++++++++++++++++++++++++++++++---
lishui (2).zip | 0
src/views/sfstatistics/percentage/satisfaction.vue | 105 ++++++++++++++++++--
5 files changed, 260 insertions(+), 27 deletions(-)
diff --git "a/dist \0502\051.zip" "b/dist \0502\051.zip"
deleted file mode 100644
index 07e29f2..0000000
--- "a/dist \0502\051.zip"
+++ /dev/null
Binary files differ
diff --git a/dist.zip b/dist.zip
index d9e6eb7..4483f1d 100644
--- a/dist.zip
+++ b/dist.zip
Binary files differ
diff --git a/lishui.zip "b/lishui \0502\051.zip"
similarity index 83%
rename from lishui.zip
rename to "lishui \0502\051.zip"
index 3b8c4f7..e5b5c98 100644
--- a/lishui.zip
+++ "b/lishui \0502\051.zip"
Binary files differ
diff --git a/src/utils/sipService.js b/src/utils/sipService.js
index 35ba077..5ce3b1a 100644
--- a/src/utils/sipService.js
+++ b/src/utils/sipService.js
@@ -29,7 +29,7 @@
}
// 鑾峰彇鍖婚櫌閰嶇疆鏂规硶
getHospitalConfig() {
- const orgName=localStorage.getItem("orgname");
+ const orgName = localStorage.getItem("orgname");
return HOSPITAL_CONFIG[orgName] || HOSPITAL_CONFIG.default;
}
init(baseConfig) {
@@ -39,7 +39,7 @@
// 鏍规嵁鏈烘瀯鍚嶇О鑾峰彇瀵瑰簲鐨勬湇鍔″櫒閰嶇疆
const hospitalConfig = this.getHospitalConfig(orgName);
-console.log(hospitalConfig,'88');
+ console.log(hospitalConfig, "88");
// 鍚堝苟閰嶇疆
this.currentConfig = {
@@ -52,7 +52,7 @@
);
this.updateStatus("connecting", "杩炴帴涓�...");
-console.log(baseConfig.sipUri,'baseConfig.sipUri');
+ console.log(baseConfig.sipUri, "baseConfig.sipUri");
this.ua = new JsSIP.UA({
sockets: [new JsSIP.WebSocketInterface(this.currentConfig.wsUrl)],
@@ -190,31 +190,181 @@
});
}
+ // normalizeSDP(offer) {
+ // let sdp = offer.sdp;
+ // console.log("鍘熷SDP:", sdp); // 璋冭瘯鐢紝鎹曡幏鍘熷SDP
+ // // 鏍囧噯鍖朣DP
+ // sdp = sdp.replace(/c=IN IP4.*\r\n/, "c=IN IP4 0.0.0.0\r\n");
+ // sdp = sdp.replace(
+ // /m=audio \d+.*\r\n/,
+ // "m=audio 9 UDP/TLS/RTP/SAVPF 0 8\r\n"
+ // );
+
+ // // 纭繚鍖呭惈鍩烘湰缂栬В鐮佸櫒
+ // if (!sdp.includes("PCMU/8000")) sdp += "a=rtpmap:0 PCMU/8000\r\n";
+ // if (!sdp.includes("PCMA/8000")) sdp += "a=rtpmap:8 PCMA/8000\r\n";
+
+ // // 娣诲姞蹇呰灞炴��
+ // sdp += "a=rtcp-mux\r\n";
+ // sdp += "a=sendrecv\r\n";
+
+ // console.log("鏍囧噯鍖栧悗鐨凷DP:", sdp);
+ // return new RTCSessionDescription({
+ // type: offer.type,
+ // sdp: sdp,
+ // });
+ // }
+ // 鍦� SipService 绫讳腑鏂板鏂规硶锛岀敤浜庤幏鍙栭拡瀵圭壒瀹氭湇鍔″櫒鐨凷DP澶勭悊绛栫暐
+ getSDPNormalizationStrategy(orgName) {
+ const strategies = {
+ 榫欐硥甯備汉姘戝尰闄�: "conservative", // 淇濆畧绛栫暐锛氭渶灏忓寲淇敼锛屼紭鍏堝吋瀹�
+ 涓芥按甯備腑鍖婚櫌: "aggressive", // 婵�杩涚瓥鐣ワ細淇濇寔鍘熸湁寮烘爣鍑嗗寲閫昏緫
+ // 鍙互涓哄叾浠栨満鏋勬坊鍔犳洿澶氱瓥鐣�
+ };
+ return strategies[orgName] || "moderate"; // 榛樿绛栫暐
+ }
+
+ /**
+ * 鏍囧噯鍖朣DP Offer - 淇榫欐硥甯備汉姘戝尰闄�488閿欒
+ * 鏍稿績鎬濊矾锛氫粠鈥滃己鍒惰鐩栤�濇敼涓衡�滄櫤鑳戒慨琛モ�濓紝閽堝涓嶅悓鏈嶅姟鍣ㄤ娇鐢ㄥ樊寮傚寲绛栫暐
+ */
normalizeSDP(offer) {
+ const orgName = localStorage.getItem("orgname");
+ const strategy = this.getSDPNormalizationStrategy(orgName);
let sdp = offer.sdp;
- // 鏍囧噯鍖朣DP
- sdp = sdp.replace(/c=IN IP4.*\r\n/, "c=IN IP4 0.0.0.0\r\n");
- sdp = sdp.replace(
- /m=audio \d+.*\r\n/,
- "m=audio 9 UDP/TLS/RTP/SAVPF 0 8\r\n"
- );
+ console.log(`[SDP鏍囧噯鍖朷 鏈烘瀯: ${orgName}, 绛栫暐: ${strategy}`);
+ console.log("[SDP鏍囧噯鍖朷 鍘熷SDP:", sdp);
- // 纭繚鍖呭惈鍩烘湰缂栬В鐮佸櫒
- if (!sdp.includes("PCMU/8000")) sdp += "a=rtpmap:0 PCMU/8000\r\n";
- if (!sdp.includes("PCMA/8000")) sdp += "a=rtpmap:8 PCMA/8000\r\n";
+ if (strategy === "conservative") {
+ // ==================== 淇濆畧绛栫暐锛氶拡瀵归緳娉夊競浜烘皯鍖婚櫌绛変弗鏍兼湇鍔″櫒 ====================
+ // 鍘熷垯锛氶櫎闈炲繀瑕侊紝鍚﹀垯涓嶄慨鏀瑰師鏈塖DP缁撴瀯锛屼粎娣诲姞缂哄け鐨勫叧閿睘鎬�
- // 娣诲姞蹇呰灞炴��
- sdp += "a=rtcp-mux\r\n";
- sdp += "a=sendrecv\r\n";
+ // 1. 璋ㄦ厧澶勭悊杩炴帴鍦板潃锛氫粎鍦ㄥ湴鍧�鏄槑鏄惧唴缃戝湴鍧�鏃舵墠淇敼
+ const privateIPRegex =
+ /c=IN IP4 (192\.168|10\.|172\.(1[6-9]|2[0-9]|3[0-1]))/;
+ if (privateIPRegex.test(sdp)) {
+ sdp = sdp.replace(/c=IN IP4.*\r\n/, "c=IN IP4 0.0.0.0\r\n");
+ console.log("[SDP鏍囧噯鍖朷 宸蹭慨鏀硅繛鎺ュ湴鍧�涓� 0.0.0.0");
+ }
- console.log("鏍囧噯鍖栧悗鐨凷DP:", sdp);
+ // 2. 淇濇寔濯掍綋琛屽師鏍凤紝涓嶅己鍒朵慨鏀圭鍙e拰鍗忚
+ // sdp = sdp.replace(/m=audio \d+.*\r\n/, "m=audio 9 UDP/TLS/RTP/SAVPF 0 8\r\n");
+
+ // 3. 鏅鸿兘娣诲姞鍩虹缂栬В鐮佸櫒鏄犲皠锛堜粎鍦ㄧ己澶辨椂娣诲姞锛�
+ const codecMappings = [
+ { pt: 0, name: "PCMU/8000" },
+ { pt: 8, name: "PCMA/8000" },
+ ];
+
+ codecMappings.forEach((codec) => {
+ const rtpmapPattern = `a=rtpmap:${codec.pt} ${codec.name}`;
+ const payloadPattern = ` ${codec.pt} `;
+
+ // 鍙湁褰揝DP涓寘鍚璐熻浇绫诲瀷浣嗙己灏戣缁嗘槧灏勬椂鎵嶆坊鍔�
+ if (sdp.includes(payloadPattern) && !sdp.includes(rtpmapPattern)) {
+ sdp += `${rtpmapPattern}\r\n`;
+ console.log(`[SDP鏍囧噯鍖朷 宸叉坊鍔犵紪瑙g爜鍣ㄦ槧灏�: ${rtpmapPattern}`);
+ }
+ });
+
+ // 4. 鏉′欢鎬ф坊鍔犲繀瑕佸睘鎬э紙閬垮厤閲嶅锛�
+ const essentialAttributes = [
+ { attr: "a=rtcp-mux", desc: "RTCP澶嶇敤" },
+ { attr: "a=sendrecv", desc: "鍙屽悜濯掍綋娴�" },
+ ];
+
+ essentialAttributes.forEach((item) => {
+ if (!sdp.includes(item.attr)) {
+ sdp += `${item.attr}\r\n`;
+ console.log(`[SDP鏍囧噯鍖朷 宸叉坊鍔犲睘鎬�: ${item.desc}`);
+ }
+ });
+ } else if (strategy === "aggressive") {
+ // ==================== 婵�杩涚瓥鐣ワ細淇濇寔鍘熸湁閫昏緫 ====================
+ sdp = sdp.replace(/c=IN IP4.*\r\n/, "c=IN IP4 0.0.0.0\r\n");
+ sdp = sdp.replace(
+ /m=audio \d+.*\r\n/,
+ "m=audio 9 UDP/TLS/RTP/SAVPF 0 8\r\n"
+ );
+
+ // 纭繚鍖呭惈鍩虹缂栬В鐮佸櫒
+ if (!sdp.includes("PCMU/8000")) sdp += "a=rtpmap:0 PCMU/8000\r\n";
+ if (!sdp.includes("PCMA/8000")) sdp += "a=rtpmap:8 PCMA/8000\r\n";
+
+ // 娣诲姞閫氱敤灞炴��
+ sdp += "a=rtcp-mux\r\n";
+ sdp += "a=sendrecv\r\n";
+ } else {
+ // ==================== 榛樿绛栫暐锛氬钩琛℃柟妗� ====================
+ // 閫傚害淇敼锛屽吋椤惧吋瀹规�у拰鍔熻兘鎬�
+ sdp = sdp.replace(/c=IN IP4.*\r\n/, "c=IN IP4 0.0.0.0\r\n");
+
+ // 浠呭湪濯掍綋琛屾牸寮忔槑鏄惧紓甯告椂淇敼
+ if (!sdp.match(/m=audio \d+ RTP\/AVP/)) {
+ sdp = sdp.replace(
+ /m=audio \d+.*\r\n/,
+ "m=audio 9 UDP/TLS/RTP/SAVPF 0 8\r\n"
+ );
+ }
+
+ // 鏅鸿兘娣诲姞缂哄け鐨勫睘鎬�
+ if (!sdp.includes("a=rtcp-mux")) sdp += "a=rtcp-mux\r\n";
+ if (!sdp.includes("a=sendrecv")) sdp += "a=sendrecv\r\n";
+ }
+
+ console.log("[SDP鏍囧噯鍖朷 鏍囧噯鍖栧悗SDP:", sdp);
return new RTCSessionDescription({
type: offer.type,
sdp: sdp,
});
}
+ /**
+ * 澧炲己鐨凷DP璋冭瘯鏂规硶 - 鐢ㄤ簬瀵规瘮鍒嗘瀽
+ */
+ debugSDPComparison(originalOffer, normalizedOffer, context) {
+ console.group(`[SDP璋冭瘯] ${context}`);
+ console.log(
+ "鍘熷SDP濯掍綋琛�:",
+ originalOffer.sdp.match(/m=audio.*\r\n/)?.[0] || "鏈壘鍒�"
+ );
+ console.log(
+ "鏍囧噯鍖栧悗濯掍綋琛�:",
+ normalizedOffer.sdp.match(/m=audio.*\r\n/)?.[0] || "鏈壘鍒�"
+ );
+ console.log(
+ "鍘熷缂栬В鐮佸櫒鍒楄〃:",
+ originalOffer.sdp.match(/a=rtpmap:\d+.*\r\n/g) || []
+ );
+ console.log(
+ "鏍囧噯鍖栧悗缂栬В鐮佸櫒鍒楄〃:",
+ normalizedOffer.sdp.match(/a=rtpmap:\d+.*\r\n/g) || []
+ );
+ console.groupEnd();
+ }
+
+ // 鍦� setupPeerConnection 鏂规硶涓泦鎴愯皟璇曞姛鑳�
+ setupPeerConnection(session) {
+ session.on("peerconnection", (pc) => {
+ const originalCreateOffer = pc.createOffer.bind(pc);
+
+ pc.createOffer = async (offerOptions) => {
+ try {
+ const offer = await originalCreateOffer(offerOptions);
+ const normalizedOffer = this.normalizeSDP(offer);
+
+ // 璋冭瘯淇℃伅杈撳嚭
+ this.debugSDPComparison(offer, normalizedOffer, "Offer鍒涘缓闃舵");
+
+ return normalizedOffer;
+ } catch (error) {
+ console.error("鍒涘缓Offer澶辫触:", error);
+ throw error;
+ }
+ };
+ });
+ }
handleCallFailure(e, reject) {
if (e.response?.status_code === 422) {
const serverMinSE = e.response.headers["Min-SE"]?.[0]?.raw || "鏈煡";
diff --git a/src/views/sfstatistics/percentage/satisfaction.vue b/src/views/sfstatistics/percentage/satisfaction.vue
index 21bf1be..89a83e0 100644
--- a/src/views/sfstatistics/percentage/satisfaction.vue
+++ b/src/views/sfstatistics/percentage/satisfaction.vue
@@ -510,22 +510,33 @@
<!-- 鍗曠瀹ょ粺璁¤鎯� -->
<el-dialog :visible.sync="topicVisible" width="45%">
<div class="topicdia">
- <div class="top-text">{{ topicvalue.name }}</div>
- <div class="top-mintext">闅忚瀹屾垚鏁皗{ topicvalue.number }}</div>
+ <div class="top-text">
+ {{ topicvalue.name }}<span>婊℃剰搴︽寚鏍囪鎯�</span>
+ </div>
<div style="overflow-x: hidden; overflow-y: auto; max-height: 65vh">
- <div class="ttaabbcc" v-for="item in topiclist" :key="item.name">
+ <div
+ class="ttaabbcc"
+ v-for="(item, index) in topiclist"
+ :key="item.name"
+ >
<div class="describe">
- 绗瑊{ item.number }}棰橈細 {{ item.name }}?<span
- >[{{ item.type == 1 ? "鍗曢�夐" : "澶氶�夐" }}]</span
+ 绗瑊{ index }}棰橈細 {{ item.scriptContent }}?<span
+ >[{{ item.scriptType == 1 ? "鍗曢�夐" : "澶氶�夐" }}]</span
>
</div>
<div>
- <el-table :data="tableData" style="width: 100%">
- <el-table-column prop="date" label="闂閫夐」">
+ <el-table :data="item.details" style="width: 100%">
+ <el-table-column prop="optionText" label="闂閫夐」">
</el-table-column>
- <el-table-column prop="name" label="閫夋嫨浜烘暟">
+ <el-table-column prop="completedQuantity" label="閫夋嫨浜烘暟">
</el-table-column>
- <el-table-column prop="address" label="姣斾緥"> </el-table-column>
+ <el-table-column prop="chosenPercentage" label="姣斾緥">
+ <template slot-scope="scope">
+ <span class="button-zx"
+ >{{ (Number(scope.row.chosenPercentage) * 100).toFixed(2) }}%</span
+ >
+ </template>
+ </el-table-column>
</el-table>
</div>
</div>
@@ -892,8 +903,12 @@
...this.queryParams,
};
if (this.queryParams.statisticaltype == 1) {
+ this.topicvalue.name = row.leavehospitaldistrictname;
+
params.leavehospitaldistrictcodes = [row.leavehospitaldistrictcode];
} else {
+ this.topicvalue.name = row.deptname;
+
params.deptcodes = [row.deptcode];
}
@@ -902,8 +917,7 @@
delete params.deptcodes.all;
getSfStatisticsJoyInfo(params).then((response) => {
console.log(response);
- this.total = response.total;
- this.userList = response.data;
+ this.topiclist = response.data;
});
},
// 娣诲姞/淇敼鏍囩
@@ -1446,6 +1460,75 @@
height: 400px;
}
}
+.topicdia {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+ color: #333; /* 涓绘枃瀛楄壊 */
+}
+
+/* 澶撮儴鏍囬鏍峰紡 */
+.top-text {
+ font-size: 18px;
+ font-weight: 600;
+ padding-bottom: 16px;
+ margin-bottom: 20px;
+ border-bottom: 1px solid #e8e8e8; /* 绾ょ粏鐨勫垎闅旂嚎 */
+ color: #1f2d3d; /* 娣辫壊鏍囬 */
+}
+.top-text span {
+ font-size: 14px;
+ font-weight: normal;
+ color: #666; /* 鍓爣棰橀鑹茬◢娴� */
+ margin-left: 10px;
+}
+
+/* 棰樼洰瀹瑰櫒鏍峰紡 */
+.ttaabbcc {
+ background: #fafafa; /* 闈炲父娴呯殑鐏拌壊鑳屾櫙 */
+ border-radius: 6px;
+ padding: 16px;
+ margin-bottom: 20px;
+ border-left: 4px solid #4794c5; /* 宸︿晶瑁呴グ鑹叉潯锛屽鍔犲眰娆℃劅 */
+}
+
+/* 棰樼洰鎻忚堪鏍峰紡 */
+.describe {
+ font-size: 15px;
+ line-height: 1.6;
+ margin-bottom: 12px;
+ color: #1f2d3d;
+}
+.describe span {
+ font-size: 13px;
+ color: #999; /* 棰樺瀷鎻愮ず淇℃伅棰滆壊鏇存祬 */
+ font-style: italic;
+ margin-left: 8px;
+}
+
+/* 琛ㄦ牸鏁翠綋鏍峰紡璋冩暣 */
+.ttaabbcc .el-table {
+ border-radius: 4px;
+ overflow: hidden;
+ font-size: 14px;
+}
+
+/* 琛ㄥご鏍峰紡 */
+.ttaabbcc .el-table th {
+ background-color: #f1f5f9; /* 娴呰摑鑹茶〃澶磋儗鏅� */
+ color: #333;
+ font-weight: 600;
+}
+
+/* 鍗曞厓鏍兼牱寮� */
+.ttaabbcc .el-table td {
+ border-bottom: 1px solid #f0f0f0; /* 绾ょ粏鐨勮鍒嗛殧绾� */
+ padding: 12px 0;
+}
+
+/* 姣斾緥鏁版嵁鏍峰紡 */
+.button-zx {
+ color: #4794c5; /* 浣跨敤涓庝富棰樺懠搴旂殑钃濊壊 */
+ font-weight: 500;
+}
::v-deep.el-tabs--left,
.el-tabs--right {
overflow: hidden;
--
Gitblit v1.9.3