From 55f9876e876c7ddfcc2a7a2b870dfc224c9467a6 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期三, 01 四月 2026 17:28:43 +0800
Subject: [PATCH] 测试完成
---
src/views/Satisfaction/configurationmyd/index.vue | 1061 ++++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 834 insertions(+), 227 deletions(-)
diff --git a/src/views/Satisfaction/configurationmyd/index.vue b/src/views/Satisfaction/configurationmyd/index.vue
index 8aa3dc9..b35f056 100644
--- a/src/views/Satisfaction/configurationmyd/index.vue
+++ b/src/views/Satisfaction/configurationmyd/index.vue
@@ -5,13 +5,149 @@
<div class="header-content">
<h2 class="page-title">婊℃剰搴﹂鐩紓甯稿鐞嗛厤缃�</h2>
<p class="page-description">
- 涓烘弧鎰忓害棰樼洰閰嶇疆璐d换绉戝鍜屾姤澶囩瀹わ紝浼樺寲寮傚父鍙嶉娴佺▼
+ 鍩轰簬妯℃澘閰嶇疆婊℃剰搴﹂鐩殑璐d换绉戝鍜屾姤澶囩瀹�
</p>
</div>
</div>
- <!-- 鎼滅储鍖哄煙 -->
- <div class="search-card">
+ <!-- 妯℃澘閫夋嫨鍖哄煙 -->
+ <div class="template-section">
+ <el-card shadow="never">
+ <div class="template-header">
+ <h3 class="template-title">妯℃澘閫夋嫨</h3>
+ <p class="template-tip">璇峰厛閫夋嫨妯℃澘绫诲瀷鍜屽叿浣撴ā鏉�</p>
+ </div>
+
+ <el-form
+ :model="templateForm"
+ :rules="templateRules"
+ ref="templateForm"
+ label-width="120px"
+ size="medium"
+ >
+ <el-row :gutter="20">
+ <el-col :span="8">
+ <el-form-item label="妯℃澘绫诲瀷" prop="templateType">
+ <el-select
+ v-model="templateForm.templateType"
+ placeholder="璇烽�夋嫨妯℃澘绫诲瀷"
+ clearable
+ @change="handleTemplateTypeChange"
+ style="width: 100%"
+ >
+ <el-option label="闂嵎妯℃澘" :value="1" />
+ <el-option label="璇煶妯℃澘" :value="2" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="8">
+ <el-form-item
+ label="閫夋嫨妯℃澘"
+ prop="templateId"
+ :rules="
+ templateForm.templateType
+ ? [
+ {
+ required: true,
+ message: '璇烽�夋嫨妯℃澘',
+ trigger: 'change',
+ },
+ ]
+ : []
+ "
+ >
+ <el-select
+ v-model="templateForm.templateId"
+ placeholder="璇烽�夋嫨妯℃澘"
+ clearable
+ filterable
+ :disabled="
+ !templateForm.templateType || templateOptionsLoading
+ "
+ @change="handleTemplateChange"
+ style="width: 100%"
+ >
+ <el-option
+ v-for="template in filteredTemplateOptions"
+ :key="template.id"
+ :label="template.templateName"
+ :value="template.id"
+ />
+ <div
+ v-if="templateOptionsLoading"
+ slot="empty"
+ class="select-loading"
+ >
+ <i class="el-icon-loading"></i>
+ <span>鍔犺浇涓�...</span>
+ </div>
+ </el-select>
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="8">
+ <el-form-item>
+ <el-button
+ type="primary"
+ icon="el-icon-search"
+ @click="handleLoadTemplate"
+ :loading="templateLoading"
+ :disabled="!templateForm.templateId"
+ >
+ 鍔犺浇妯℃澘棰樼洰
+ </el-button>
+ <el-button icon="el-icon-refresh" @click="handleResetTemplate">
+ 閲嶇疆
+ </el-button>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ </el-card>
+ </div>
+
+ <!-- 妯℃澘淇℃伅 -->
+ <div v-if="currentTemplateInfo" class="template-info-section">
+ <el-card shadow="never">
+ <div class="template-info">
+ <div class="info-left">
+ <h3 class="template-name">
+ {{ currentTemplateInfo.templateName }}
+ </h3>
+ <div class="template-meta">
+ <span class="meta-item">
+ <i class="el-icon-s-order"></i>
+ 妯℃澘绫诲瀷锛歿{
+ templateForm.templateType === 1 ? "闂嵎妯℃澘" : "璇煶妯℃澘"
+ }}
+ </span>
+ <span class="meta-item">
+ <i class="el-icon-s-management"></i>
+ 棰樼洰鎬绘暟锛歿{ currentTemplateInfo.questionCount || 0 }}
+ </span>
+ <span class="meta-item">
+ <i class="el-icon-star-on"></i>
+ 婊℃剰搴﹂鐩細{{ satisfactionQuestionsCount }}
+ </span>
+ </div>
+ </div>
+ <div class="info-right">
+ <el-tag
+ :type="
+ currentTemplateInfo.templateStatus === 1 ? 'success' : 'info'
+ "
+ size="medium"
+ >
+ {{ currentTemplateInfo.templateStatus === 1 ? "鍚敤" : "鍋滅敤" }}
+ </el-tag>
+ </div>
+ </div>
+ </el-card>
+ </div>
+
+ <!-- 鎼滅储鍖哄煙锛堥鐩瓫閫夛級 -->
+ <div v-if="questionList.length > 0" class="search-section">
<el-card shadow="never" class="search-container">
<el-form :model="queryParams" :inline="true" size="medium">
<el-form-item label="闂涓婚">
@@ -30,30 +166,16 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
- <el-form-item label="鏄惁鍙敤">
- <el-select
- v-model="queryParams.isavailable"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option
- v-for="item in qyoptions"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
@click="handleQuery"
>
- 鎼滅储
+ 绛涢�夐鐩�
</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">
- 閲嶇疆
+ 閲嶇疆绛涢��
</el-button>
</el-form-item>
</el-form>
@@ -79,7 +201,9 @@
<span v-if="changedCount > 0" class="change-count">
鏈� {{ changedCount }} 椤归厤缃渶瑕佷繚瀛�
</span>
- <div class="total-count">鍏� {{ total }} 鏉¤褰�</div>
+ <div class="total-count">
+ 鍏� {{ filteredQuestionList.length }} 鏉¤褰�
+ </div>
</div>
</el-card>
</div>
@@ -91,18 +215,22 @@
</div>
</div>
- <div v-else-if="questionList.length === 0" class="empty-wrapper">
- <el-empty description="鏆傛棤婊℃剰搴﹂鐩暟鎹�">
- <el-button type="primary" @click="getQuestionList"
- >鍒锋柊鏁版嵁</el-button
- >
+ <div
+ v-else-if="questionList.length === 0 && templateForm.templateId"
+ class="empty-wrapper"
+ >
+ <el-empty description="璇ユā鏉夸腑鏆傛棤婊℃剰搴﹂鐩�">
+ <p class="empty-tip">
+ 璇烽�夋嫨鍏朵粬妯℃澘鎴栨鏌ユā鏉夸腑鏄惁鍖呭惈婊℃剰搴︾被鍨嬮鐩紙鍒嗙被ID:
+ 404,405,406锛�
+ </p>
</el-empty>
</div>
<!-- 涓�琛屼竴琛岀殑鍗$墖鍒楄〃 -->
- <div v-else class="question-list">
+ <div v-else-if="filteredQuestionList.length > 0" class="question-list">
<div
- v-for="(question, index) in questionList"
+ v-for="(question, index) in filteredQuestionList"
:key="question.id"
class="question-item"
>
@@ -124,12 +252,6 @@
{{ question.scriptTopic || "鏃犱富棰�" }}
</h3>
<div class="question-tags">
- <el-tag
- :type="question.isavailable == 1 ? 'danger' : 'success'"
- size="small"
- >
- {{ question.isavailable == 1 ? "涓嶅彲鐢�" : "鍙敤" }}
- </el-tag>
<dict-tag
:options="askvaluetype"
:value="question.scriptType"
@@ -180,7 +302,7 @@
class="config-form"
>
<div class="config-fields">
- <!-- 璐d换绉戝 -->
+ <!-- 璐d换绉戝锛堝閫夛級 -->
<div class="config-field">
<el-form-item
label="璐d换绉戝"
@@ -192,21 +314,25 @@
placeholder="璇烽�夋嫨璐d换绉戝"
filterable
clearable
+ multiple
+ collapse-tags
style="width: 100%"
@change="handleConfigChange(question)"
>
<el-option
v-for="dept in deptOptions"
:key="dept.id"
- :label="dept.name"
- :value="dept.id"
+ :label="dept.label"
+ :value="dept.deptCode"
/>
</el-select>
- <div class="config-tip">璐熻矗澶勭悊璇ラ鐩弽棣堢殑绉戝</div>
+ <div class="config-tip">
+ 璐熻矗澶勭悊璇ラ鐩弽棣堢殑绉戝锛屽彲澶氶��
+ </div>
</el-form-item>
</div>
- <!-- 鎶ュ绉戝 -->
+ <!-- 鎶ュ绉戝锛堝閫夛級 -->
<div class="config-field">
<el-form-item
label="鎶ュ绉戝"
@@ -219,15 +345,14 @@
filterable
clearable
multiple
- collapse-tags
style="width: 100%"
@change="handleConfigChange(question)"
>
<el-option
v-for="dept in deptOptions"
:key="dept.id"
- :label="dept.name"
- :value="dept.id"
+ :label="dept.label"
+ :value="dept.deptCode"
/>
</el-select>
<div class="config-tip">
@@ -235,24 +360,31 @@
</div>
</el-form-item>
</div>
+ </div>
- <!-- 閫氱煡鏂瑰紡 -->
- <div class="config-field">
- <el-form-item
- label="閫氱煡鏂瑰紡"
- prop="notifyTypes"
- class="config-item"
- >
- <el-checkbox-group
- v-model="question.exceptionConfig.notifyTypes"
- @change="handleConfigChange(question)"
- >
- <el-checkbox label="system">绯荤粺娑堟伅</el-checkbox>
- <el-checkbox label="sms">鐭俊</el-checkbox>
- <el-checkbox label="email">閭欢</el-checkbox>
- <el-checkbox label="wechat">浼佷笟寰俊</el-checkbox>
- </el-checkbox-group>
- </el-form-item>
+ <!-- 褰撳墠閰嶇疆淇℃伅 -->
+ <div v-if="question.hasChanges" class="current-config">
+ <div class="config-preview">
+ <div class="preview-item">
+ <span class="preview-label">璐d换绉戝锛�</span>
+ <span class="preview-value">
+ {{
+ getDeptNames(
+ question.exceptionConfig.responsibilityDept || []
+ ).join(", ")
+ }}
+ </span>
+ </div>
+ <div class="preview-item">
+ <span class="preview-label">鎶ュ绉戝锛�</span>
+ <span class="preview-value">
+ {{
+ getDeptNames(
+ question.exceptionConfig.reportDept || []
+ ).join(", ")
+ }}
+ </span>
+ </div>
</div>
</div>
@@ -299,17 +431,6 @@
</el-card>
</div>
</div>
-
- <!-- 鍒嗛〉 -->
- <div v-if="questionList.length > 0" class="pagination-wrapper">
- <pagination
- v-show="total > 0"
- :total="total"
- :page.sync="queryParams.pageNum"
- :limit.sync="queryParams.pageSize"
- @pagination="getQuestionList"
- />
- </div>
</div>
<!-- 棰樼洰棰勮瀵硅瘽妗� -->
@@ -328,19 +449,14 @@
:value="currentPreview.scriptType"
size="small"
/>
- <el-tag
- :type="currentPreview.isavailable === 1 ? 'success' : 'danger'"
- size="small"
- >
- {{ currentPreview.isavailable === 1 ? "鍙敤" : "涓嶅彲鐢�" }}
- </el-tag>
<el-tag v-if="currentPreview.targetname" size="small" type="info">
{{ currentPreview.targetname }}
</el-tag>
</div>
</div>
+ <!-- 妯℃澘棰樼洰灞曠ず -->
- <div class="preview-content">
+ <div class="preview-content" v-if="templateForm.templateType == 1">
<p class="preview-question">{{ currentPreview.scriptContent }}</p>
<div
@@ -351,13 +467,47 @@
>
<el-radio-group v-model="previewAnswer">
<el-radio
- v-for="(option, idx) in currentPreview.svyLibScriptOptions ||
- []"
+ v-for="(
+ option, idx
+ ) in currentPreview.svyLibTemplateTargetoptions || []"
:key="idx"
:label="option.optioncontent"
class="option-item"
>
{{ option.optioncontent }}
+ </el-radio>
+ </el-radio-group>
+ </div>
+
+ <div v-else class="preview-textarea">
+ <el-input
+ type="textarea"
+ placeholder="璇疯緭鍏ュ洖绛�"
+ v-model="previewAnswer"
+ :rows="4"
+ />
+ </div>
+ </div>
+ <!-- 璇煶棰樼洰灞曠ず -->
+ <div class="preview-content" v-else>
+ <p class="preview-question">{{ currentPreview.scriptContent }}</p>
+
+ <div
+ v-if="
+ currentPreview.scriptType != 3 && currentPreview.scriptType != 4
+ "
+ class="preview-options"
+ >
+ <el-radio-group v-model="previewAnswer">
+ <el-radio
+ v-for="(
+ option, idx
+ ) in currentPreview.ivrLibaScriptTargetoptionList || []"
+ :key="idx"
+ :label="option.targetvalue"
+ class="option-item"
+ >
+ {{ option.targetvalue }}
</el-radio>
</el-radio-group>
</div>
@@ -399,10 +549,16 @@
<script>
import {
- getissuelist,
compileissue,
- getissueclassify,
+ compileQtemplate,
+ compileFollowup,
+ getQtemplatelist,
+ getFollowuplist,
+ getvFollowup,
+ getQtemplateobj,
+ selectInfoByConditiony,
} from "@/api/AiCentre/index";
+import { deptTreeSelect } from "@/api/system/user";
import store from "@/store";
import Pagination from "@/components/Pagination";
@@ -411,28 +567,40 @@
components: { Pagination },
data() {
return {
+ // 妯℃澘琛ㄥ崟
+ templateForm: {
+ templateType: "",
+ templateId: "",
+ },
+ templateRules: {
+ templateType: [
+ { required: true, message: "璇烽�夋嫨妯℃澘绫诲瀷", trigger: "change" },
+ ],
+ },
+
+ // 妯℃澘閫夐」
+ questionnaireTemplates: [], // 闂嵎妯℃澘鍒楄〃
+ followupTemplates: [], // 璇煶妯℃澘鍒楄〃
+ templateOptionsLoading: false,
+
+ // 褰撳墠妯℃澘淇℃伅
+ currentTemplateInfo: null,
+ templateLoading: false,
+
// 鏌ヨ鍙傛暟
queryParams: {
- pageNum: 1,
- pageSize: 10,
scriptTopic: "",
scriptContent: "",
- targetname: "",
- isavailable: "",
- categoryids: "404,405,406", // 鍥哄畾鏌ヨ婊℃剰搴︾被鍨�
},
// 鏁版嵁鍒楄〃
questionList: [],
- total: 0,
loading: false,
batchSaving: false,
// 瀛楀吀鏁版嵁
askvaluetype: store.getters.askvaluetype || [],
qyoptions: store.getters.usable || [],
- mode: store.getters.mode || [],
- languagelist: store.getters.languagelist || [],
// 绉戝閫夐」
deptOptions: [],
@@ -447,21 +615,21 @@
hasChanges: false,
changedCount: 0,
+ // 婊℃剰搴﹀垎绫籌D
+ satisfactionCategoryIds: ["404", "405", "406"],
+
// 琛ㄥ崟楠岃瘉瑙勫垯
configRules: {
responsibilityDept: [
- { required: true, message: "璇烽�夋嫨璐d换绉戝", trigger: "change" },
- ],
- reportDept: [
{
required: true,
- message: "璇烽�夋嫨鑷冲皯涓�涓姤澶囩瀹�",
+ message: "璇疯嚦灏戦�夋嫨涓�涓矗浠荤瀹�",
trigger: "change",
},
{
validator: (rule, value, callback) => {
if (!value || value.length === 0) {
- callback(new Error("璇烽�夋嫨鑷冲皯涓�涓姤澶囩瀹�"));
+ callback(new Error("璇疯嚦灏戦�夋嫨涓�涓矗浠荤瀹�"));
} else {
callback();
}
@@ -469,11 +637,16 @@
trigger: "change",
},
],
- notifyTypes: [
+ reportDept: [
+ {
+ required: true,
+ message: "璇疯嚦灏戦�夋嫨涓�涓姤澶囩瀹�",
+ trigger: "change",
+ },
{
validator: (rule, value, callback) => {
if (!value || value.length === 0) {
- callback(new Error("璇疯嚦灏戦�夋嫨涓�绉嶉�氱煡鏂瑰紡"));
+ callback(new Error("璇疯嚦灏戦�夋嫨涓�涓姤澶囩瀹�"));
} else {
callback();
}
@@ -484,17 +657,76 @@
},
};
},
+ computed: {
+ // 鏍规嵁妯℃澘绫诲瀷杩囨护妯℃澘閫夐」
+ filteredTemplateOptions() {
+ if (this.templateForm.templateType === 1) {
+ return this.questionnaireTemplates;
+ } else if (this.templateForm.templateType === 2) {
+ return this.followupTemplates;
+ }
+ return [];
+ },
+
+ // 婊℃剰搴﹂鐩暟閲�
+ satisfactionQuestionsCount() {
+ return this.questionList.filter((q) =>
+ this.satisfactionCategoryIds.includes(q.categoryid?.toString())
+ ).length;
+ },
+
+ // 绛涢�夊悗鐨勯鐩垪琛�
+ filteredQuestionList() {
+ let filtered = this.questionList;
+
+ // 绛涢�夋弧鎰忓害棰樼洰
+ filtered = filtered.filter((q) =>
+ this.satisfactionCategoryIds.includes(q.categoryid?.toString())
+ );
+
+ // 搴旂敤鎼滅储鏉′欢
+ if (this.queryParams.scriptTopic) {
+ const keyword = this.queryParams.scriptTopic.toLowerCase();
+ filtered = filtered.filter(
+ (q) => q.scriptTopic && q.scriptTopic.toLowerCase().includes(keyword)
+ );
+ }
+
+ if (this.queryParams.scriptContent) {
+ const keyword = this.queryParams.scriptContent.toLowerCase();
+ filtered = filtered.filter(
+ (q) =>
+ q.scriptContent && q.scriptContent.toLowerCase().includes(keyword)
+ );
+ }
+
+ return filtered;
+ },
+ },
created() {
this.getDeptOptions();
- this.getQuestionList();
+ this.loadAllTemplates();
},
methods: {
+ /** 鍔犺浇鎵�鏈夋ā鏉垮垪琛� */
+ loadAllTemplates() {
+ this.templateOptionsLoading = true;
+
+ // 骞惰鍔犺浇闂嵎妯℃澘鍜岃闊虫ā鏉�
+ Promise.all([
+ this.loadQuestionnaireTemplates(),
+ this.loadFollowupTemplates(),
+ ]).finally(() => {
+ this.templateOptionsLoading = false;
+ });
+ },
+
/** 鏌ヨ绉戝鍒楄〃 */
getDeptOptions() {
- getissueclassify({})
+ deptTreeSelect()
.then((res) => {
- if (res.code === 200) {
- this.deptOptions = res.rows || [];
+ if (res.code == 200) {
+ this.deptOptions = this.flattenArray(res.data) || [];
}
})
.catch((error) => {
@@ -503,58 +735,258 @@
});
},
- /** 鏌ヨ婊℃剰搴﹂鐩垪琛� */
- getQuestionList() {
- this.loading = true;
+ flattenArray(multiArray) {
+ let result = [];
+
+ function flatten(element) {
+ if (element.children && element.children.length > 0) {
+ element.children.forEach((child) => flatten(child));
+ } else {
+ let item = JSON.parse(JSON.stringify(element));
+ result.push(item);
+ }
+ }
+
+ multiArray.forEach((element) => flatten(element));
+ return result;
+ },
+
+ /** 鏍规嵁绉戝缂栫爜鑾峰彇绉戝鍚嶇О */
+ getDeptName(deptCode) {
+ if (!deptCode) return "";
+ const dept = this.deptOptions.find((d) => d.deptCode === deptCode);
+ return dept ? dept.label : deptCode;
+ },
+
+ /** 鏍规嵁绉戝缂栫爜鏁扮粍鑾峰彇绉戝鍚嶇О鏁扮粍 */
+ getDeptNames(deptCodes) {
+ if (!Array.isArray(deptCodes) || deptCodes.length === 0) return [];
+ return deptCodes
+ .map((code) => this.getDeptName(code))
+ .filter((name) => name && name.trim());
+ },
+
+ /** 妯℃澘绫诲瀷鍙樻洿 */
+ handleTemplateTypeChange() {
+ this.templateForm.templateId = "";
+ this.currentTemplateInfo = null;
this.questionList = [];
+ },
- getissuelist(this.queryParams)
+ /** 鍔犺浇闂嵎妯℃澘鍒楄〃 */
+ loadQuestionnaireTemplates() {
+ return new Promise((resolve) => {
+ getQtemplatelist({ pageSize: 1000 })
+ .then((res) => {
+ if (res.code === 200) {
+ this.questionnaireTemplates = (res.rows || []).map((item) => ({
+ id: item.svyid,
+ templateName: item.svyname,
+ isavailable: item.isavailable,
+ }));
+ } else {
+ this.$message.error(res.msg || "鍔犺浇闂嵎妯℃澘澶辫触");
+ }
+ resolve();
+ })
+ .catch((error) => {
+ console.error("鍔犺浇闂嵎妯℃澘澶辫触:", error);
+ this.$message.error("鍔犺浇闂嵎妯℃澘澶辫触");
+ resolve();
+ });
+ });
+ },
+
+ /** 鍔犺浇璇煶妯℃澘鍒楄〃 */
+ loadFollowupTemplates() {
+ return new Promise((resolve) => {
+ getFollowuplist({ pageSize: 1000 })
+ .then((res) => {
+ if (res.code === 200) {
+ this.followupTemplates = (res.rows || []).map((item) => ({
+ id: item.id,
+ templateName: item.templateName,
+ isavailable: item.isavailable,
+ }));
+ } else {
+ this.$message.error(res.msg || "鍔犺浇璇煶妯℃澘澶辫触");
+ }
+ resolve();
+ })
+ .catch((error) => {
+ console.error("鍔犺浇璇煶妯℃澘澶辫触:", error);
+ this.$message.error("鍔犺浇璇煶妯℃澘澶辫触");
+ resolve();
+ });
+ });
+ },
+
+ /** 妯℃澘閫夋嫨鍙樻洿 */
+ handleTemplateChange(templateId) {
+ if (templateId) {
+ const selectedTemplate = this.filteredTemplateOptions.find(
+ (t) => t.id === templateId
+ );
+ if (selectedTemplate) {
+ this.currentTemplateInfo = {
+ templateName: selectedTemplate.templateName,
+ templateStatus: selectedTemplate.isavailable,
+ questionCount: 0,
+ };
+ }
+ } else {
+ this.currentTemplateInfo = null;
+ this.questionList = [];
+ }
+ },
+
+ /** 鍔犺浇妯℃澘璇︽儏鍜岄鐩� */
+ handleLoadTemplate() {
+ this.$refs.templateForm.validate((valid) => {
+ if (!valid) {
+ this.$message.warning("璇峰厛閫夋嫨妯℃澘");
+ return;
+ }
+
+ this.templateLoading = true;
+ this.loading = true;
+ this.questionList = [];
+
+ if (this.templateForm.templateType === 1) {
+ this.loadQuestionnaireTemplateDetail();
+ } else if (this.templateForm.templateType === 2) {
+ this.loadFollowupTemplateDetail();
+ }
+ });
+ },
+
+ /** 鍔犺浇闂嵎妯℃澘璇︽儏 */
+ loadQuestionnaireTemplateDetail() {
+ getQtemplateobj({ svyid: this.templateForm.templateId })
.then((res) => {
+ this.templateLoading = false;
this.loading = false;
- if (res.code === 200) {
- this.questionList = (res.rows || []).map((item) => {
- // 瑙f瀽寮傚父澶勭悊閰嶇疆
- let exceptionConfig = {
- responsibilityDept: "",
- reportDept: [],
- notifyTypes: ["system"],
- };
- try {
- if (item.otherdata) {
- const otherData = JSON.parse(item.otherdata);
- if (otherData.exceptionConfig) {
- exceptionConfig = {
- ...exceptionConfig,
- ...otherData.exceptionConfig,
- };
- }
- }
- } catch (error) {
- console.warn("瑙f瀽寮傚父閰嶇疆澶辫触:", error);
- }
+ if (res.code === 200 && res.rows && res.rows.length > 0) {
+ const templateDetail = res.rows[0];
- return {
- ...item,
- originalConfig: JSON.parse(JSON.stringify(exceptionConfig)),
- exceptionConfig: exceptionConfig,
- hasChanges: false,
- saving: false,
- saveStatus: null,
- };
- });
+ // 鏇存柊妯℃澘淇℃伅
+ this.currentTemplateInfo = {
+ ...templateDetail,
+ templateName: templateDetail.svyname,
+ templateStatus: templateDetail.isavailable,
+ questionCount: templateDetail.svyTemplateLibScripts?.length || 0,
+ };
- this.total = res.total || 0;
- this.updateChangedStatus();
+ // 鎻愬彇棰樼洰鍒楄〃
+ const questions = templateDetail.svyTemplateLibScripts || [];
+ this.processQuestions(questions);
+
+ this.$message.success(`鎴愬姛鍔犺浇 ${questions.length} 涓鐩甡);
} else {
- this.$message.error(res.msg || "鑾峰彇鏁版嵁澶辫触");
+ this.$message.error(res.msg || "鍔犺浇妯℃澘璇︽儏澶辫触");
}
})
.catch((error) => {
+ this.templateLoading = false;
this.loading = false;
- console.error("鏌ヨ澶辫触:", error);
- this.$message.error("鑾峰彇鏁版嵁澶辫触");
+ console.error("鍔犺浇闂嵎妯℃澘璇︽儏澶辫触:", error);
+ this.$message.error("鍔犺浇妯℃澘璇︽儏澶辫触");
});
+ },
+
+ /** 鍔犺浇璇煶妯℃澘璇︽儏 */
+ loadFollowupTemplateDetail() {
+ getvFollowup({ id: this.templateForm.templateId })
+ .then((res) => {
+ this.templateLoading = false;
+ this.loading = false;
+
+ if (res.code === 200) {
+ const templateDetail = res.data;
+
+ // 鏇存柊妯℃澘淇℃伅
+ this.currentTemplateInfo = {
+ ...this.currentTemplateInfo,
+ templateName: templateDetail.templateName,
+ templateStatus: templateDetail.isavailable,
+ questionCount:
+ templateDetail.ivrLibaTemplateScriptVOList?.length || 0,
+ };
+
+ // 鎻愬彇棰樼洰鍒楄〃
+ const questions = templateDetail.ivrLibaTemplateScriptVOList || [];
+ this.processQuestions(questions);
+
+ this.$message.success(`鎴愬姛鍔犺浇 ${questions.length} 涓鐩甡);
+ } else {
+ this.$message.error(res.msg || "鍔犺浇妯℃澘璇︽儏澶辫触");
+ }
+ })
+ .catch((error) => {
+ this.templateLoading = false;
+ this.loading = false;
+ console.error("鍔犺浇璇煶妯℃澘璇︽儏澶辫触:", error);
+ this.$message.error("鍔犺浇妯℃澘璇︽儏澶辫触");
+ });
+ },
+
+ /** 澶勭悊棰樼洰鏁版嵁 */
+ processQuestions(questions) {
+ this.questionList = questions.map((question) => {
+ // 瑙f瀽璐d换绉戝鍜屾姤澶囩瀹�
+ let exceptionConfig = {
+ responsibilityDept: [], // 璐d换绉戝缂栫爜鏁扮粍
+ reportDept: [], // 鎶ュ绉戝缂栫爜鏁扮粍
+ };
+
+ // 浠庨鐩《灞傚瓧娈佃鍙栨暟鎹�
+ if (question.dutyDeptCode) {
+ // 浠庨�楀彿鍒嗛殧鐨勫瓧绗︿覆杞负鏁扮粍
+ exceptionConfig.responsibilityDept = question.dutyDeptCode
+ .split(",")
+ .map((code) => code.trim())
+ .filter((code) => code);
+ }
+
+ if (question.reportDeptCode) {
+ exceptionConfig.reportDept = question.reportDeptCode
+ .split(",")
+ .map((code) => code.trim())
+ .filter((code) => code);
+ }
+
+ return {
+ ...question,
+ // 缁熶竴瀛楁鍚�
+ id: question.id || question.scriptId,
+ scriptTopic: question.scriptTopic || question.scriptTopic,
+ scriptContent: question.scriptContent || question.scriptContent,
+ scriptType: question.scriptType,
+ isavailable: question.isavailable,
+ targetname: question.targetname,
+ categoryid: question.categoryid || question.categoryid,
+ originalConfig: JSON.parse(JSON.stringify(exceptionConfig)),
+ exceptionConfig: exceptionConfig,
+ hasChanges: false,
+ saving: false,
+ saveStatus: null,
+ };
+ });
+
+ this.updateChangedStatus();
+ },
+
+ /** 閲嶇疆妯℃澘閫夋嫨 */
+ handleResetTemplate() {
+ this.templateForm = {
+ templateType: "",
+ templateId: "",
+ };
+ this.currentTemplateInfo = null;
+ this.questionList = [];
+ this.resetQuery();
+ this.$refs.templateForm?.clearValidate();
},
/** 閰嶇疆鍙樻洿澶勭悊 */
@@ -582,16 +1014,24 @@
isConfigEqual(config1, config2) {
if (!config1 || !config2) return false;
- const report1 = [...(config1.reportDept || [])].sort().join(",");
- const report2 = [...(config2.reportDept || [])].sort().join(",");
- const notify1 = [...(config1.notifyTypes || [])].sort().join(",");
- const notify2 = [...(config2.notifyTypes || [])].sort().join(",");
+ const responsibility1 = [...(config1.responsibilityDept || [])]
+ .sort()
+ .join(",")
+ .toLowerCase();
+ const responsibility2 = [...(config2.responsibilityDept || [])]
+ .sort()
+ .join(",")
+ .toLowerCase();
+ const report1 = [...(config1.reportDept || [])]
+ .sort()
+ .join(",")
+ .toLowerCase();
+ const report2 = [...(config2.reportDept || [])]
+ .sort()
+ .join(",")
+ .toLowerCase();
- return (
- config1.responsibilityDept === config2.responsibilityDept &&
- report1 === report2 &&
- notify1 === notify2
- );
+ return responsibility1 === responsibility2 && report1 === report2;
},
/** 鏇存柊鍙樻洿鐘舵�� */
@@ -621,64 +1061,132 @@
question.saveStatus = null;
try {
- // 鏋勫缓淇濆瓨鏁版嵁
- const saveData = {
- id: question.id,
- isoperation: 2, // 淇敼鎿嶄綔
- ...question,
+ // 鑾峰彇褰撳墠妯℃澘璇︽儏
+ let templateDetail;
+ if (this.templateForm.templateType === 1) {
+ // 闂嵎妯℃澘
+ const res = await getQtemplateobj({
+ svyid: this.templateForm.templateId,
+ });
+ if (res.code !== 200 || !res.rows || res.rows.length === 0) {
+ throw new Error(res.msg || "鑾峰彇妯℃澘璇︽儏澶辫触");
+ }
+ templateDetail = res.rows[0];
+ } else if (this.templateForm.templateType === 2) {
+ // 璇煶妯℃澘
+ const res = await getvFollowup({ id: this.templateForm.templateId });
+ if (res.code !== 200) {
+ throw new Error(res.msg || "鑾峰彇妯℃澘璇︽儏澶辫触");
+ }
+ templateDetail = res.data;
+ }
+
+ // 鏇存柊棰樼洰閰嶇疆
+ let updatedTemplateDetail = { ...templateDetail };
+ let questionsField =
+ this.templateForm.templateType === 1
+ ? "svyTemplateLibScripts"
+ : "ivrLibaTemplateScriptVOList";
+
+ const questions = updatedTemplateDetail[questionsField] || [];
+ const questionIndex = questions.findIndex((q) => q.id === question.id);
+
+ if (questionIndex === -1) {
+ throw new Error("鏈壘鍒伴鐩�");
+ }
+
+ // 鑾峰彇绉戝鍚嶇О
+ const responsibilityDeptNames = this.getDeptNames(
+ question.exceptionConfig.responsibilityDept
+ );
+ const reportDeptNames = this.getDeptNames(
+ question.exceptionConfig.reportDept
+ );
+
+ // 鐩存帴鏇存柊棰樼洰椤跺眰瀛楁
+ questions[questionIndex] = {
+ ...questions[questionIndex],
+ // 璁剧疆Excel瑕佹眰鐨勫瓧娈�
+ dutyDeptCode: question.exceptionConfig.responsibilityDept.join(","),
+ dutyDeptName: responsibilityDeptNames.join(","),
+ reportDeptCode: question.exceptionConfig.reportDept.join(","),
+ reportDeptName: reportDeptNames.join(","),
};
- // 灏嗗紓甯搁厤缃繚瀛樺埌 otherdata
- const otherData = JSON.parse(question.otherdata || "{}");
- otherData.exceptionConfig = question.exceptionConfig;
- saveData.otherdata = JSON.stringify(otherData);
+ // 鏇存柊妯℃澘
+ updatedTemplateDetail[questionsField] = questions;
- // 绉婚櫎涓嶉渶瑕佺殑瀛楁
- delete saveData.originalConfig;
- delete saveData.hasChanges;
- delete saveData.saving;
- delete saveData.saveStatus;
- delete saveData.exceptionConfig;
-
- const response = await compileissue(saveData);
+ // 淇濆瓨妯℃澘
+ let response;
+ if (this.templateForm.templateType === 1) {
+ response = await compileQtemplate({
+ ...updatedTemplateDetail,
+ id: this.templateForm.templateId,
+ isoperation: 2,
+ });
+ } else {
+ response = await compileFollowup({
+ ...updatedTemplateDetail,
+ id: this.templateForm.templateId,
+ isoperation: 2,
+ });
+ }
if (response.code === 200) {
- // 鏇存柊鍘熷閰嶇疆
- question.originalConfig = JSON.parse(
- JSON.stringify(question.exceptionConfig)
- );
- question.hasChanges = false;
- question.saveStatus = {
- type: "success",
- message: "閰嶇疆淇濆瓨鎴愬姛",
- };
-
- this.updateChangedStatus();
- this.$message.success("閰嶇疆淇濆瓨鎴愬姛");
-
- // 5绉掑悗娓呴櫎鎴愬姛鎻愮ず
- setTimeout(() => {
- question.saveStatus = null;
- }, 5000);
+ this.handleSaveSuccess(question);
} else {
- question.saveStatus = {
- type: "error",
- message: response.msg || "淇濆瓨澶辫触",
- };
- this.$message.error(response.msg || "淇濆瓨澶辫触");
+ throw new Error(response.msg || "淇濆瓨澶辫触");
}
} catch (error) {
console.error("淇濆瓨澶辫触:", error);
question.saveStatus = {
type: "error",
- message: "淇濆瓨澶辫触锛岃绋嶅悗閲嶈瘯",
+ message: error.message || "淇濆瓨澶辫触锛岃绋嶅悗閲嶈瘯",
};
- this.$message.error("淇濆瓨澶辫触锛岃绋嶅悗閲嶈瘯");
+ this.$message.error(error.message || "淇濆瓨澶辫触锛岃绋嶅悗閲嶈瘯");
} finally {
question.saving = false;
}
},
+ /** 澶勭悊淇濆瓨鎴愬姛 */
+ /** 澶勭悊淇濆瓨鎴愬姛 */
+ handleSaveSuccess(question) {
+ // 鍚屾椂鏇存柊棰樼洰椤跺眰瀛楁
+ const responsibilityDeptNames = this.getDeptNames(
+ question.exceptionConfig.responsibilityDept
+ );
+ const reportDeptNames = this.getDeptNames(
+ question.exceptionConfig.reportDept
+ );
+
+ // 鏇存柊棰樼洰鏈韩鐨勫瓧娈�
+ question.dutyDeptCode =
+ question.exceptionConfig.responsibilityDept.join(",");
+ question.dutyDeptName = responsibilityDeptNames.join(",");
+ question.reportDeptCode = question.exceptionConfig.reportDept.join(",");
+ question.reportDeptName = reportDeptNames.join(",");
+
+ // 鏇存柊鍘熷閰嶇疆
+ question.originalConfig = JSON.parse(
+ JSON.stringify(question.exceptionConfig)
+ );
+ question.hasChanges = false;
+ question.saveStatus = {
+ type: "success",
+ message: "閰嶇疆淇濆瓨鎴愬姛",
+ };
+
+ this.updateChangedStatus();
+ this.$message.success("閰嶇疆淇濆瓨鎴愬姛");
+
+ // 5绉掑悗娓呴櫎鎴愬姛鎻愮ず
+ setTimeout(() => {
+ question.saveStatus = null;
+ }, 5000);
+ },
+
+ /** 閲嶇疆鍗曚釜棰樼洰閰嶇疆 */
/** 閲嶇疆鍗曚釜棰樼洰閰嶇疆 */
resetSingleConfig(question) {
this.$confirm("纭畾瑕侀噸缃綋鍓嶉鐩殑閰嶇疆鍚楋紵", "鎻愮ず", {
@@ -690,6 +1198,21 @@
question.exceptionConfig = JSON.parse(
JSON.stringify(question.originalConfig)
);
+ // 鍚屾椂閲嶇疆棰樼洰椤跺眰瀛楁
+ const responsibilityDeptNames = this.getDeptNames(
+ question.exceptionConfig.responsibilityDept
+ );
+ const reportDeptNames = this.getDeptNames(
+ question.exceptionConfig.reportDept
+ );
+
+ question.dutyDeptCode =
+ question.exceptionConfig.responsibilityDept.join(",");
+ question.dutyDeptName = responsibilityDeptNames.join(",");
+ question.reportDeptCode =
+ question.exceptionConfig.reportDept.join(",");
+ question.reportDeptName = reportDeptNames.join(",");
+
question.hasChanges = false;
question.saveStatus = null;
this.updateChangedStatus();
@@ -760,22 +1283,15 @@
/** 鎼滅储 */
handleQuery() {
- this.queryParams.pageNum = 1;
- this.getQuestionList();
+ // 浠呯瓫閫夋樉绀猴紝涓嶉渶瑕侀噸鏂板姞杞�
},
/** 閲嶇疆鎼滅储 */
resetQuery() {
this.queryParams = {
- pageNum: 1,
- pageSize: 10,
scriptTopic: "",
scriptContent: "",
- targetname: "",
- isavailable: "",
- categoryids: "404,405,406",
};
- this.getQuestionList();
},
},
};
@@ -809,7 +1325,76 @@
}
}
- .search-card {
+ .template-section {
+ margin-bottom: 20px;
+
+ .template-header {
+ margin-bottom: 20px;
+
+ .template-title {
+ margin: 0 0 8px 0;
+ font-size: 16px;
+ font-weight: 600;
+ color: #303133;
+ }
+
+ .template-tip {
+ margin: 0;
+ color: #909399;
+ font-size: 13px;
+ }
+ }
+
+ .select-loading {
+ text-align: center;
+ padding: 10px;
+ color: #909399;
+
+ i {
+ margin-right: 8px;
+ }
+ }
+ }
+
+ .template-info-section {
+ margin-bottom: 20px;
+
+ .template-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 5px 0;
+
+ .info-left {
+ .template-name {
+ margin: 0 0 10px 0;
+ font-size: 18px;
+ font-weight: 600;
+ color: #303133;
+ }
+
+ .template-meta {
+ display: flex;
+ gap: 20px;
+ flex-wrap: wrap;
+
+ .meta-item {
+ display: flex;
+ align-items: center;
+ gap: 5px;
+ font-size: 13px;
+ color: #606266;
+
+ i {
+ font-size: 14px;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .search-section {
margin-bottom: 20px;
.search-container {
@@ -872,8 +1457,16 @@
.empty-wrapper {
min-height: 400px;
display: flex;
+ flex-direction: column;
align-items: center;
justify-content: center;
+
+ .empty-tip {
+ margin-top: 10px;
+ color: #909399;
+ font-size: 13px;
+ text-align: center;
+ }
}
.question-list {
@@ -1035,6 +1628,40 @@
}
}
+ .current-config {
+ margin-bottom: 20px;
+ padding: 15px;
+ background: #f0f9ff;
+ border-radius: 6px;
+ border: 1px solid #d0ebff;
+
+ .config-preview {
+ .preview-item {
+ display: flex;
+ align-items: flex-start;
+ margin-bottom: 8px;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ .preview-label {
+ font-size: 13px;
+ color: #606266;
+ font-weight: 500;
+ min-width: 80px;
+ }
+
+ .preview-value {
+ font-size: 13px;
+ color: #303133;
+ line-height: 1.5;
+ flex: 1;
+ }
+ }
+ }
+ }
+
.config-footer {
display: flex;
justify-content: space-between;
@@ -1066,15 +1693,6 @@
}
}
}
- }
-
- .pagination-wrapper {
- margin-top: 20px;
- padding: 20px;
- background: white;
- border-radius: 8px;
- display: flex;
- justify-content: center;
}
}
@@ -1161,6 +1779,12 @@
margin-bottom: 16px;
}
+ .template-info {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 10px;
+ }
+
.search-card {
margin-bottom: 16px;
}
@@ -1205,6 +1829,10 @@
gap: 16px;
}
+ .current-config {
+ padding: 12px;
+ }
+
.config-footer {
flex-direction: column;
align-items: stretch;
@@ -1220,27 +1848,6 @@
}
}
}
- }
-}
-</style>
-
-<style lang="scss">
-.config-form {
- .el-checkbox-group {
- display: flex;
- flex-wrap: wrap;
- gap: 12px;
- }
-
- .el-checkbox {
- margin: 0;
- }
-}
-
-.option-item {
- .el-radio__label {
- display: block;
- padding-left: 8px;
}
}
</style>
--
Gitblit v1.9.3