AiQuestionnaireScenes.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <template>
  2. <div class="ai-q-scenes">
  3. <div class="toolbar">
  4. <el-button type="primary" size="small" @click="openEdit()">新增场景</el-button>
  5. </div>
  6. <el-table :data="scenes" border stripe size="small">
  7. <el-table-column prop="sceneKey" label="场景标识" width="140" />
  8. <el-table-column prop="sceneName" label="场景名称" width="160" />
  9. <el-table-column prop="description" label="描述" show-overflow-tooltip />
  10. <el-table-column prop="kbScope" label="知识库范围" width="160" />
  11. <el-table-column prop="maxQuestions" label="题数上限" width="90" />
  12. <el-table-column label="启用" width="80">
  13. <template slot-scope="{ row }">
  14. <el-tag :type="row.enabled === 1 ? 'success' : 'info'" size="mini">{{ row.enabled === 1 ? '是' : '否' }}</el-tag>
  15. </template>
  16. </el-table-column>
  17. <el-table-column label="操作" width="180">
  18. <template slot-scope="{ row }">
  19. <el-button size="mini" type="primary" @click="openEdit(row)">编辑</el-button>
  20. <el-button size="mini" type="danger" @click="onDelete(row)">删除</el-button>
  21. </template>
  22. </el-table-column>
  23. </el-table>
  24. <el-dialog :title="form.id ? '编辑场景' : '新增场景'" :visible.sync="dialogVisible" width="640px" append-to-body>
  25. <el-form :model="form" label-width="110px" size="small">
  26. <el-form-item label="场景标识" required>
  27. <el-input v-model="form.sceneKey" placeholder="如 microbiome" :disabled="!!form.id" />
  28. </el-form-item>
  29. <el-form-item label="场景名称" required>
  30. <el-input v-model="form.sceneName" placeholder="如 菌群健康评估" />
  31. </el-form-item>
  32. <el-form-item label="描述">
  33. <el-input v-model="form.description" type="textarea" :rows="2" />
  34. </el-form-item>
  35. <el-form-item label="开场引导">
  36. <el-input v-model="form.openingPrompt" type="textarea" :rows="3" placeholder="AI 出第一题前的引导语" />
  37. </el-form-item>
  38. <el-form-item label="画像维度定义">
  39. <el-input v-model="form.dimensionsJson" type="textarea" :rows="5" placeholder='{"user":["肠道菌群状态"],"need":["营养需求"]}' />
  40. </el-form-item>
  41. <el-form-item label="知识库范围">
  42. <el-select v-model="kbScopeArr" multiple placeholder="选择知识库源" style="width:100%">
  43. <el-option label="菌群知识库" value="microbiome" />
  44. <el-option label="统一知识库" value="dan_knowledge" />
  45. <el-option label="文章" value="article" />
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item label="题数上限">
  49. <el-input-number v-model="form.maxQuestions" :min="5" :max="30" style="width:120px" />
  50. </el-form-item>
  51. <el-form-item label="系统提示词">
  52. <el-input v-model="form.systemPrompt" type="textarea" :rows="3" />
  53. </el-form-item>
  54. <el-form-item label="启用">
  55. <el-switch v-model="form.enabled" :active-value="1" :inactive-value="0" />
  56. </el-form-item>
  57. </el-form>
  58. <div slot="footer">
  59. <el-button size="small" @click="dialogVisible = false">取消</el-button>
  60. <el-button type="primary" size="small" @click="onSave">保存</el-button>
  61. </div>
  62. </el-dialog>
  63. </div>
  64. </template>
  65. <script>
  66. import { listScenes, saveScene, deleteScene } from '@/api/aiQuestionnaire'
  67. export default {
  68. name: 'AiQuestionnaireScenes',
  69. data() {
  70. return {
  71. scenes: [],
  72. dialogVisible: false,
  73. kbScopeArr: [],
  74. form: {
  75. id: null,
  76. sceneKey: '',
  77. sceneName: '',
  78. description: '',
  79. openingPrompt: '',
  80. dimensionsJson: '',
  81. kbScope: '',
  82. maxQuestions: 12,
  83. systemPrompt: '',
  84. enabled: 1
  85. }
  86. }
  87. },
  88. created() {
  89. this.load()
  90. },
  91. methods: {
  92. async load() {
  93. try {
  94. var res = await listScenes({})
  95. if (res.code === 200) {
  96. this.scenes = res.data || []
  97. } else {
  98. this.$message.error(res.message || '加载失败')
  99. }
  100. } catch (e) {
  101. this.$message.error('加载失败')
  102. }
  103. },
  104. openEdit(row) {
  105. if (row) {
  106. this.form = {
  107. id: row.id,
  108. sceneKey: row.sceneKey || '',
  109. sceneName: row.sceneName || '',
  110. description: row.description || '',
  111. openingPrompt: row.openingPrompt || '',
  112. dimensionsJson: row.dimensionsJson || '',
  113. kbScope: row.kbScope || '',
  114. maxQuestions: row.maxQuestions || 12,
  115. systemPrompt: row.systemPrompt || '',
  116. enabled: row.enabled === 1 ? 1 : 0
  117. }
  118. } else {
  119. this.form = {
  120. id: null,
  121. sceneKey: '',
  122. sceneName: '',
  123. description: '',
  124. openingPrompt: '',
  125. dimensionsJson: '',
  126. kbScope: '',
  127. maxQuestions: 12,
  128. systemPrompt: '',
  129. enabled: 1
  130. }
  131. }
  132. this.kbScopeArr = this.form.kbScope ? this.form.kbScope.split(',').filter(function(s) { return s }) : []
  133. this.dialogVisible = true
  134. },
  135. async onSave() {
  136. if (!this.form.sceneKey || !this.form.sceneName) {
  137. this.$message.warning('请填写场景标识与名称')
  138. return
  139. }
  140. this.form.kbScope = (this.kbScopeArr || []).join(',')
  141. try {
  142. var res = await saveScene(this.form)
  143. if (res.code === 200) {
  144. this.$message.success('保存成功')
  145. this.dialogVisible = false
  146. this.load()
  147. } else {
  148. this.$message.error(res.message || '保存失败')
  149. }
  150. } catch (e) {
  151. this.$message.error('保存失败')
  152. }
  153. },
  154. onDelete(row) {
  155. this.$confirm('删除后不可恢复(已有问卷记录将被拒绝),确认删除?', '提示', { type: 'warning' })
  156. .then(async () => {
  157. try {
  158. var res = await deleteScene(row.id)
  159. if (res.code === 200) {
  160. this.$message.success('已删除')
  161. this.load()
  162. } else {
  163. this.$message.error(res.message || '删除失败')
  164. }
  165. } catch (e) {
  166. this.$message.error('删除失败')
  167. }
  168. })
  169. .catch(function() {})
  170. }
  171. }
  172. }
  173. </script>
  174. <style scoped>
  175. .ai-q-scenes {
  176. padding: 16px;
  177. }
  178. .toolbar {
  179. margin-bottom: 16px;
  180. }
  181. </style>