gradingRuleDetail.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. <template>
  2. <div>
  3. <el-form ref="form" :model="form" :rules="rules" label-width="108px">
  4. <el-form-item label="规则名称:" prop="ruleName">
  5. <el-input
  6. :disabled="ruleTypeDisabled"
  7. placeholder="请输入"
  8. maxlength="50"
  9. v-autoTrim="{ obj: form, key: 'ruleName' }"
  10. v-model="form.ruleName"
  11. >
  12. </el-input>
  13. </el-form-item>
  14. <el-form-item label="规则描述:" prop="ruleDescription">
  15. <el-input
  16. placeholder="请输入"
  17. maxlength="300"
  18. v-autoTrim="{ obj: form, key: 'ruleDescription' }"
  19. v-model="form.ruleDescription"
  20. >
  21. </el-input>
  22. </el-form-item>
  23. <el-form-item label="规则详情:" prop="ruleDetails" v-if="!isScore">
  24. <editor
  25. :content="content"
  26. ref="editor"
  27. :isEdit="!!$route.query.rulesId"
  28. ></editor>
  29. </el-form-item>
  30. <el-form-item v-else label="规则类型:" prop="ruleType">
  31. <el-select
  32. :disabled="ruleTypeDisabled"
  33. v-model="form.ruleType"
  34. size="small"
  35. clearable
  36. placeholder="请选择规则类型"
  37. >
  38. <el-option
  39. v-for="item in ruleTypeOpts"
  40. :label="item.label"
  41. :value="item.value"
  42. :key="item.value"
  43. ></el-option>
  44. </el-select>
  45. </el-form-item>
  46. <!-- <el-form-item
  47. v-if="isScore && form.rulesId"
  48. label="脚本名称:"
  49. prop="scriptName"
  50. >
  51. <el-input
  52. style="width: 400px"
  53. disabled
  54. placeholder=""
  55. v-model="form.scriptName"
  56. >
  57. </el-input>
  58. </el-form-item> -->
  59. <!-- 文件上传 -->
  60. <el-form-item label="脚本上传地址" v-if="isScore">
  61. <!-- <el-upload
  62. :multiple="false"
  63. action=""
  64. class="upload-demo"
  65. list-type="card"
  66. :file-list="fileList"
  67. :http-request="uploadHandle"
  68. :on-remove="fileRemove"
  69. >
  70. <el-button size="small" type="primary">点击上传</el-button>
  71. </el-upload> -->
  72. <el-input
  73. style="width: 400px"
  74. placeholder="请填写脚本地址"
  75. v-model="form.localPath"
  76. >
  77. </el-input>
  78. </el-form-item>
  79. <div class="btns">
  80. <!-- 公有列表进,另存为+取消 另存为为新增一条数据 新增数据均为私有 1 -->
  81. <!-- 私有列表进,保存+另存为+取消 0 -->
  82. <!-- 新增进,保存+取消 -1 -->
  83. <el-button
  84. type="primary"
  85. v-if="share === '0' || share === '-1'"
  86. @click="save(false)"
  87. >保存</el-button
  88. >
  89. <el-button
  90. type="primary"
  91. v-if="share === '0' || share === '1'"
  92. @click="save(true)"
  93. >另存为</el-button
  94. >
  95. <el-button type="primary" plain @click="cancel">取消</el-button>
  96. </div>
  97. </el-form>
  98. </div>
  99. </template>
  100. <script>
  101. import editor from './components/editor'
  102. import { ruleTypeOpts } from './common'
  103. export default {
  104. name: 'gradingRuleDetail', // 评分规则
  105. components: { editor },
  106. data() {
  107. return {
  108. share: '-1', //控制显示按钮
  109. scriptUpdate: false, // 脚本是否更新
  110. form: {
  111. rulesId: '',
  112. ruleName: '',
  113. share: '-1',
  114. ruleDescription: '',
  115. ruleDetails: '',
  116. ruleType: '',
  117. // scriptName: '',
  118. localPath:'',
  119. },
  120. ruleTypeDisabled: false,
  121. fileList: [], // 文件上传列表
  122. content: '',
  123. rules: {
  124. ruleName: [{ required: true, message: '请输入', trigger: 'blur' }],
  125. ruleDescription: [
  126. { required: true, message: '请输入', trigger: 'blur' },
  127. ],
  128. ruleDetails: [{ required: true, message: '请输入', trigger: 'blur' }],
  129. },
  130. isScore: false, // 评分规则新增类型
  131. ruleTypeOpts, // 规则类型
  132. }
  133. },
  134. computed: {},
  135. methods: {
  136. fileRemove() {
  137. this.fileList = []
  138. },
  139. uploadHandle(f) {
  140. this.fileList = [f.file]
  141. this.scriptUpdate = true
  142. },
  143. save(isAdd) {
  144. let ruleDetails = null
  145. if (!this.isScore) {
  146. ruleDetails = this.$refs.editor.editor.getText().trim()
  147. this.form.ruleDetails = ruleDetails
  148. }
  149. // 调用save时,应写成save(),给不给参数均可,不写小括号的话,isAdd会是事件源,则为true
  150. this.$refs.form.validate((valid) => {
  151. if (valid) {
  152. if (!this.isScore && ruleDetails && ruleDetails.length > 1000000) {
  153. this.$message.error('规则详情长度不得超过100万!')
  154. return
  155. }
  156. if (isAdd || !this.$route.query.rulesId) {
  157. // 另存为或新增页面
  158. this.form.rulesId = ''
  159. this.form.share = '0'
  160. }
  161. if (this.form.rulesId) {
  162. this.$axios({
  163. method: 'post',
  164. url: this.$api.sceneLibrary.queryCsbById,
  165. data: {
  166. rulesId: this.form.rulesId,
  167. },
  168. }).then((res) => {
  169. if (res.code === 200) {
  170. if (res.info === 0) {
  171. this.saveFn()
  172. return
  173. }
  174. this.$confirm(
  175. '该评分规则已经被场景测试包引用,保存后同步更新场景测试包中的评分规则,是否确认保存?',
  176. '提示',
  177. {
  178. confirmButtonText: '确定',
  179. cancelButtonText: '取消',
  180. type: 'warning',
  181. }
  182. ).then(() => {
  183. this.saveFn()
  184. })
  185. } else {
  186. this.$message.error(
  187. res.message || '获取该评分规则是否被场景测试包引用失败'
  188. )
  189. }
  190. })
  191. return
  192. }
  193. this.saveFn()
  194. }
  195. })
  196. },
  197. saveFn() {
  198. if (this.isScore) {
  199. // let formData = new FormData()
  200. // let source = { ...this.form }
  201. // source['ruleId'] = source.rulesId
  202. // delete source.rulesId
  203. // const json = JSON.stringify({
  204. // ...source,
  205. // uploadNewFile: this.scriptUpdate,
  206. // })
  207. // const blob = new Blob([json], {
  208. // type: 'application/json',
  209. // })
  210. // formData.append('content', blob)
  211. // this.scriptUpdate && formData.append('file', this.fileList[0])
  212. this.$axios({
  213. method: 'post',
  214. url: this.$api.sceneLibrary.queryScoringRulesInfo,
  215. data: {...this.form,scriptUpdate:true},
  216. withCredentials: true,
  217. headers: {
  218. 'Content-type': 'multipart/form-data',
  219. },
  220. }).then((res) => {
  221. if (res.code === 200) {
  222. this.$message.success('保存成功')
  223. this.cancel()
  224. } else {
  225. this.$message.error(res.message || '保存失败')
  226. }
  227. })
  228. } else {
  229. this.$axios({
  230. method: 'post',
  231. url: this.$api.sceneLibrary.saveScoringRules,
  232. data: {
  233. ...this.form,
  234. },
  235. }).then((res) => {
  236. if (res.code === 200) {
  237. this.$message.success('保存成功')
  238. this.cancel()
  239. } else {
  240. this.$message.error(res.message || '保存失败')
  241. }
  242. })
  243. }
  244. },
  245. cancel() {
  246. this.$router.replace({ path: '/gradingRulesList' })
  247. },
  248. },
  249. mounted() {
  250. this.isScore = this.$route.query.isScore ? true : false // 判断是否评分规则新增
  251. if (this.$route.query.rulesId) {
  252. let rulesId = ''
  253. this.form.rulesId = rulesId = this.$route.query.rulesId
  254. this.form.share = this.share = this.$route.query.share
  255. // 场景评价
  256. if (this.isScore) {
  257. const { ruleName, ruleDescription, ruleType, scriptName } =
  258. this.$store.state.evaluationInfo
  259. this.form = Object.assign(this.form, {
  260. ruleName,
  261. ruleDescription,
  262. ruleType,
  263. scriptName,
  264. })
  265. this.ruleTypeDisabled = true
  266. } else {
  267. this.$axios({
  268. method: 'post',
  269. url: this.isScore
  270. ? this.$api.sceneLibrary.queryScoringRulesInfo
  271. : this.$api.sceneLibrary.queryScoringRules,
  272. data: {
  273. rulesId,
  274. },
  275. }).then((res) => {
  276. if (res.code == 200 && res.info) {
  277. this.form = res.info
  278. this.content = res.info.ruleDetails
  279. } else {
  280. this.$message.error(res.message || '获取信息失败')
  281. }
  282. })
  283. }
  284. }
  285. },
  286. }
  287. </script>
  288. <style lang='less' scoped>
  289. .el-form {
  290. width: 60%;
  291. padding-top: 60px;
  292. margin: 0 auto;
  293. .el-input {
  294. width: 100%;
  295. }
  296. }
  297. .btns {
  298. padding-top: 30px;
  299. text-align: center;
  300. }
  301. </style>