|
|
@@ -335,31 +335,60 @@
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="内容">
|
|
|
- <el-input :disabled="formType == 3 || !roles.includes('edit_sop_temp_content')" v-if="setList.contentType == 1 || setList.contentType == 15"
|
|
|
- v-model="setList.value"
|
|
|
- type="textarea" :rows="3" placeholder="内容"
|
|
|
- style="width: 90%;margin-top: 10px;"
|
|
|
- @keydown.native="handleKeydown($event, index, contentIndex, setIndex)"
|
|
|
- :ref="`textarea-${index}-${contentIndex}-${setIndex}`"
|
|
|
- />
|
|
|
-
|
|
|
- <!-- 修改按钮部分 -->
|
|
|
- <el-link
|
|
|
- v-if="(setList.contentType == 1 || setList.contentType == 15) && roles.includes('edit_sop_temp_content')"
|
|
|
- type="primary"
|
|
|
- @click="toggleSalesCall(index, contentIndex, setIndex)"
|
|
|
- style="margin-top: 10px;"
|
|
|
- >
|
|
|
- {{ setList.isSalesCallAdded ? '移除#销售称呼#' : '添加#销售称呼#' }}
|
|
|
- </el-link>
|
|
|
- <el-link
|
|
|
- v-if="(setList.contentType == 1 || setList.contentType == 15) && roles.includes('edit_sop_temp_content')"
|
|
|
- type="primary"
|
|
|
- @click="toggleUserNameCall(index, contentIndex, setIndex)"
|
|
|
- style="margin-top: 10px; margin-left: 20px"
|
|
|
- >
|
|
|
- {{ setList.isUserNameCallAdded ? '移除#客户称呼#' : '添加#客户称呼#' }}
|
|
|
- </el-link>
|
|
|
+ <div v-if="setList.contentType == 1 || setList.contentType == 15">
|
|
|
+ <div style="display: flex; align-items: center; margin-bottom: 10px;">
|
|
|
+ <span style="margin-right: 10px;">随机发送</span>
|
|
|
+ <el-switch
|
|
|
+ v-model="setList.isRandomSend"
|
|
|
+ :disabled="formType == 3 || !roles.includes('edit_sop_temp_content')"
|
|
|
+ active-color="#13ce66"
|
|
|
+ inactive-color="#DCDFE6"
|
|
|
+ :active-value="1"
|
|
|
+ :inactive-value="0"
|
|
|
+ @change="handleRandomSendChange(setList)"
|
|
|
+ />
|
|
|
+ <span style="color: #999; font-size: 12px; margin-left: 10px;">
|
|
|
+ 开启后可为同一内容配置多条文案,每个客户随机发送其中一条
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <RandomTextListEditor
|
|
|
+ v-if="setList.isRandomSend == 1"
|
|
|
+ :item="setList"
|
|
|
+ :disabled="formType == 3 || !roles.includes('edit_sop_temp_content')"
|
|
|
+ :ref-id="`temp-${index}-${contentIndex}-${setIndex}`"
|
|
|
+ sales-call-tag="#销售称呼#"
|
|
|
+ user-call-tag="#客户称呼#"
|
|
|
+ />
|
|
|
+
|
|
|
+ <template v-else>
|
|
|
+ <el-input :disabled="formType == 3 || !roles.includes('edit_sop_temp_content')"
|
|
|
+ v-model="setList.value"
|
|
|
+ type="textarea" :rows="3" placeholder="内容"
|
|
|
+ style="width: 90%;margin-top: 10px;"
|
|
|
+ @keydown.native="handleKeydown($event, index, contentIndex, setIndex)"
|
|
|
+ :ref="`textarea-${index}-${contentIndex}-${setIndex}`"
|
|
|
+ />
|
|
|
+
|
|
|
+ <!-- 修改按钮部分 -->
|
|
|
+ <el-link
|
|
|
+ v-if="roles.includes('edit_sop_temp_content')"
|
|
|
+ type="primary"
|
|
|
+ @click="toggleSalesCall(index, contentIndex, setIndex)"
|
|
|
+ style="margin-top: 10px;"
|
|
|
+ >
|
|
|
+ {{ setList.isSalesCallAdded ? '移除#销售称呼#' : '添加#销售称呼#' }}
|
|
|
+ </el-link>
|
|
|
+ <el-link
|
|
|
+ v-if="roles.includes('edit_sop_temp_content')"
|
|
|
+ type="primary"
|
|
|
+ @click="toggleUserNameCall(index, contentIndex, setIndex)"
|
|
|
+ style="margin-top: 10px; margin-left: 20px"
|
|
|
+ >
|
|
|
+ {{ setList.isUserNameCallAdded ? '移除#客户称呼#' : '添加#客户称呼#' }}
|
|
|
+ </el-link>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
|
|
|
<ImageUpload :disabled="formType == 3 || !roles.includes('edit_sop_temp_content')" v-if="setList.contentType == 2 "
|
|
|
v-model="setList.imgUrl"
|
|
|
@@ -922,13 +951,14 @@ import {listToLiveNoEnd} from "@/api/live/live";
|
|
|
import ImageUpload from "@/views/qw/sop/ImageUpload";
|
|
|
import userVideo from "@/views/qw/userVideo/userVideo.vue";
|
|
|
import {listReward} from "@/api/qw/luckyBag";
|
|
|
+import RandomTextListEditor from "@/components/RandomTextListEditor/index.vue";
|
|
|
import {
|
|
|
getRoles,
|
|
|
} from "@/api/qw/sop";
|
|
|
|
|
|
export default {
|
|
|
name: "updateSopTemp",
|
|
|
- components: {ImageUpload, userVideo, draggable},
|
|
|
+ components: {ImageUpload, userVideo, draggable, RandomTextListEditor},
|
|
|
data() {
|
|
|
return {
|
|
|
queryParams1: {
|
|
|
@@ -1324,6 +1354,9 @@ export default {
|
|
|
this.courseChange(this.setting[index].content[j], index, j);
|
|
|
}
|
|
|
}
|
|
|
+ if (this.setting[index].content[j].setting) {
|
|
|
+ this.setting[index].content[j].setting.forEach(setList => this.normalizeSettingRandomFields(setList));
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
@@ -1360,6 +1393,9 @@ export default {
|
|
|
this.courseChange(this.setting[index].content[j], index, j);
|
|
|
}
|
|
|
}
|
|
|
+ if (this.setting[index].content[j].setting) {
|
|
|
+ this.setting[index].content[j].setting.forEach(setList => this.normalizeSettingRandomFields(setList));
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
@@ -1432,6 +1468,7 @@ export default {
|
|
|
e.settingList = e.setting;
|
|
|
// 在序列化之前,清理 null 值,避免后端接收到字符串 "null"
|
|
|
e.settingList.forEach(setting => {
|
|
|
+ this.prepareSettingForSave(setting);
|
|
|
// 将所有值为 null 的字段删除或设置为 undefined
|
|
|
Object.keys(setting).forEach(key => {
|
|
|
if (setting[key] === null) {
|
|
|
@@ -1521,9 +1558,18 @@ export default {
|
|
|
|
|
|
if (data.content[j].type != 4 && data.content[j].type != 5) {
|
|
|
for (let k = 0; k < data.content[j].setting.length; k++) {
|
|
|
- if (data.content[j].setting[k].contentType == 1 && (data.content[j].setting[k].value == null || data.content[j].setting[k].value == "")) {
|
|
|
- this.$message.error("内容不能为空")
|
|
|
- return false;
|
|
|
+ if (data.content[j].setting[k].contentType == 1) {
|
|
|
+ const settingItem = data.content[j].setting[k];
|
|
|
+ if (settingItem.isRandomSend == 1) {
|
|
|
+ const validRandomValues = (settingItem.randomValueList || []).filter(item => item != null && item.trim() !== '');
|
|
|
+ if (validRandomValues.length < 2) {
|
|
|
+ this.$message.error("开启随机发送后,至少需要填写2条文案")
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ } else if (settingItem.value == null || settingItem.value == "") {
|
|
|
+ this.$message.error("内容不能为空")
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
if (data.content[j].setting[k].contentType == 2 && (data.content[j].setting[k].imgUrl == null || data.content[j].setting[k].imgUrl == "")) {
|
|
|
this.$message.error("图片不能为空")
|
|
|
@@ -1592,9 +1638,17 @@ export default {
|
|
|
this.$message.error("客服时间不能为空");
|
|
|
return false;
|
|
|
}
|
|
|
- if (set.contentType == 1 && (set.value == null || set.value == "")) {
|
|
|
- this.$message.error("内容不能为空")
|
|
|
- return false;
|
|
|
+ if (set.contentType == 1) {
|
|
|
+ if (set.isRandomSend == 1) {
|
|
|
+ const validRandomValues = (set.randomValueList || []).filter(item => item != null && item.trim() !== '');
|
|
|
+ if (validRandomValues.length < 2) {
|
|
|
+ this.$message.error("开启随机发送后,至少需要填写2条文案")
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ } else if (set.value == null || set.value == "") {
|
|
|
+ this.$message.error("内容不能为空")
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
if (set.contentType == 2 && (set.imgUrl == null || set.imgUrl == "")) {
|
|
|
this.$message.error("图片不能为空")
|
|
|
@@ -1975,6 +2029,73 @@ export default {
|
|
|
textarea.setSelectionRange(newCursorPos, newCursorPos);
|
|
|
});
|
|
|
},
|
|
|
+ initRandomSendFields(setList) {
|
|
|
+ if (!setList) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (setList.isRandomSend === undefined || setList.isRandomSend === null) {
|
|
|
+ this.$set(setList, 'isRandomSend', 0);
|
|
|
+ }
|
|
|
+ if (!Array.isArray(setList.randomValueList)) {
|
|
|
+ const initialValue = setList.value || '';
|
|
|
+ this.$set(setList, 'randomValueList', initialValue ? [initialValue] : ['', '']);
|
|
|
+ }
|
|
|
+ if (!Array.isArray(setList.randomSalesCallAdded)) {
|
|
|
+ this.$set(setList, 'randomSalesCallAdded', setList.randomValueList.map(() => false));
|
|
|
+ }
|
|
|
+ if (!Array.isArray(setList.randomUserNameCallAdded)) {
|
|
|
+ this.$set(setList, 'randomUserNameCallAdded', setList.randomValueList.map(() => false));
|
|
|
+ }
|
|
|
+ },
|
|
|
+ handleRandomSendChange(setList) {
|
|
|
+ this.initRandomSendFields(setList);
|
|
|
+ if (setList.isRandomSend == 1) {
|
|
|
+ if (!setList.value && setList.randomValueList.every(item => !item)) {
|
|
|
+ this.$set(setList, 'randomValueList', ['', '']);
|
|
|
+ this.$set(setList, 'randomSalesCallAdded', [false, false]);
|
|
|
+ this.$set(setList, 'randomUserNameCallAdded', [false, false]);
|
|
|
+ } else if (setList.value && setList.randomValueList.every(item => !item)) {
|
|
|
+ this.$set(setList, 'randomValueList', [setList.value, '']);
|
|
|
+ this.$set(setList, 'randomSalesCallAdded', [false, false]);
|
|
|
+ this.$set(setList, 'randomUserNameCallAdded', [false, false]);
|
|
|
+ } else if (setList.randomValueList.length < 2) {
|
|
|
+ setList.randomValueList.push('');
|
|
|
+ setList.randomSalesCallAdded.push(false);
|
|
|
+ setList.randomUserNameCallAdded.push(false);
|
|
|
+ }
|
|
|
+ } else if (setList.randomValueList && setList.randomValueList.length > 0) {
|
|
|
+ const firstValue = setList.randomValueList.find(item => item && item.trim()) || setList.randomValueList[0] || '';
|
|
|
+ this.$set(setList, 'value', firstValue);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ normalizeSettingRandomFields(setting) {
|
|
|
+ if (!setting || (setting.contentType != 1 && setting.contentType != '1' && setting.contentType != 15 && setting.contentType != '15')) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.initRandomSendFields(setting);
|
|
|
+ if (setting.isRandomSend == 1 && setting.randomValueList.length < 2) {
|
|
|
+ while (setting.randomValueList.length < 2) {
|
|
|
+ setting.randomValueList.push('');
|
|
|
+ setting.randomSalesCallAdded.push(false);
|
|
|
+ setting.randomUserNameCallAdded.push(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ prepareSettingForSave(setting) {
|
|
|
+ if (!setting) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (setting.isRandomSend == 1 && Array.isArray(setting.randomValueList)) {
|
|
|
+ setting.randomValueList = setting.randomValueList
|
|
|
+ .map(item => (item == null ? '' : item.trim()))
|
|
|
+ .filter(item => item !== '');
|
|
|
+ if (setting.randomValueList.length > 0) {
|
|
|
+ setting.value = setting.randomValueList[0];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ delete setting.randomSalesCallAdded;
|
|
|
+ delete setting.randomUserNameCallAdded;
|
|
|
+ },
|
|
|
handleKeydown(event, itemIndex, contentIndex, setIndex) {
|
|
|
|
|
|
const setItem = this.setting[itemIndex].content[contentIndex].setting[setIndex];
|
|
|
@@ -2308,6 +2429,7 @@ export default {
|
|
|
}
|
|
|
if (content && Array.isArray(content.setting)) {
|
|
|
content.setting.forEach(setList => {
|
|
|
+ this.normalizeSettingRandomFields(setList);
|
|
|
if (setList && !Object.hasOwn(setList, 'isSalesCallAdded')) {
|
|
|
this.$set(setList, 'isSalesCallAdded', false);
|
|
|
}
|