ParameterSettingComponent.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. <template>
  2. <div class="page_item end_item">
  3. <div class="page_search">
  4. <div class="search_content">
  5. <div class="content_left">
  6. <div class="grade_title">参数设置</div>
  7. </div>
  8. <div class="content_right">
  9. <el-button class="button_border" @click="StartOrSaveEdit">{{!isEdit ? '开始编辑' : '保存编辑'}}</el-button>
  10. <el-button class="button_background" @click="FinishParamaterSetting">设置完成</el-button>
  11. </div>
  12. </div>
  13. </div>
  14. <div class="page_jg_20"></div>
  15. <Form :inlineLayout="false"
  16. v-model:formRef="paramsSettingFormDom"
  17. :formItemList="paramsConfigFormItemList"
  18. :defaultFormData="defaultParamsConfigFormData"
  19. :formDisabled="!isEdit"
  20. >
  21. <template #lowScoreDeleteRatio="{}">
  22. <div class="low_score_delete_ratio">
  23. <el-radio-group :disabled="!isEdit"
  24. v-model="defaultParamsConfigFormData.lowScoreDeleteRatio">
  25. <el-radio v-for="radioItem in lowScoreDeleteRatioList" :key="radioItem.value"
  26. :value="radioItem.value">
  27. {{ radioItem.label }}
  28. </el-radio>
  29. </el-radio-group>
  30. <el-input v-if="defaultParamsConfigFormData.lowScoreDeleteRatio == 'custom'"
  31. type="number" :disabled="!isEdit" :step="0.01" :min="0" :max="100"
  32. v-model="defaultParamsConfigFormData.customLowScoreDeleteRatio"
  33. @change="HandleInputNumberChange"
  34. placeholder="请输入"/>
  35. </div>
  36. </template>
  37. </Form>
  38. <Table :tableColumns="tableColumns"
  39. :tableData="tableData"
  40. :hidePagination="true">
  41. <template #subjectData="{row}">
  42. <div class="subject_tag">
  43. <el-tag
  44. v-for="item in row.subjectData"
  45. :key="item"
  46. :disable-transitions="true"
  47. type="info"
  48. effect="plain"
  49. >
  50. {{ item.name }}
  51. </el-tag>
  52. </div>
  53. </template>
  54. <template #operation="{row}">
  55. <div class="table_row_option">
  56. <span :class="[isEdit ? 'el_button_editor' : 'editor_disable']" @click="isEdit ? OpenSubjectCompositionForm(row) : ''">编辑</span>
  57. <span :class="[isEdit ? 'el_button_delete' : 'editor_disable']" @click="isEdit ? OpenDeleteDialog(row) : ''">删除</span>
  58. </div>
  59. </template>
  60. </Table>
  61. <div class="page_jg_20"></div>
  62. <div v-if="isEdit" class="add_subject_option" @click="OpenSubjectCompositionForm">
  63. <img :src="addIcon" alt="">
  64. 增加科目组合
  65. </div>
  66. </div>
  67. <FormDialog
  68. width="640px"
  69. :visible="compositionSubjectFormVisible"
  70. :defaultFormData="defaultCompositionSubjectFormData"
  71. :title="compositionSubjectFormTitle"
  72. :submitLoading="compositionSubjectFormLoading"
  73. :formItemList="formItemList"
  74. @close="CloseSubjectCompositionForm"
  75. @confirm="HandleAddCompositionSubject">
  76. </FormDialog>
  77. <Dialog :visible="deleteDialogVisible"
  78. :submitLoading="deleteSubmitLoading"
  79. @close="CloseDeleteDialog" @confirm="HandleDeleteConfirm"></Dialog>
  80. </template>
  81. <script setup lang="ts">
  82. import { onMounted, ref } from 'vue';
  83. import { useRoute,useRouter } from 'vue-router';
  84. import { useStore } from 'vuex';
  85. import Table from '@/baseComponents/Table.vue';
  86. import Form from '@/baseComponents/Form.vue';
  87. import FormDialog from '@/baseComponents/FormDialog.vue';
  88. import {paramsConfigFormItemList} from './form'
  89. import { tableColumns } from './table';
  90. import {formItemList} from './formDialog'
  91. import {
  92. getParameterSettingListApi,getSubjectDataListApi,deleteCompositionSubjectApi,
  93. addOrUpdateCompositionSubjectApi,finishParamaterSettingApi,saveParamaterSettingApi
  94. } from '@/api/parameterSettingComponent'
  95. import { ElMessage } from 'element-plus';
  96. import Dialog from '@/baseComponents/Dialog.vue';
  97. import addIcon from '@/assets/icon/add.svg'
  98. const route = useRoute()
  99. const router = useRouter()
  100. const store = useStore()
  101. // 1. 参数设置 表单
  102. const defaultParamsConfigFormData = ref({})
  103. const lowScoreDeleteRatioList = ref([
  104. {
  105. label:'3%',
  106. value:'3'
  107. },
  108. {
  109. label:'5%',
  110. value:'5'
  111. },
  112. {
  113. label:'10%',
  114. value:'10'
  115. },
  116. {
  117. label:'自定义',
  118. value:'custom'
  119. },
  120. ])
  121. interface TableData {
  122. id:string,
  123. groupSubjectName:string,
  124. subjectData:{
  125. name:string
  126. }[]
  127. }
  128. const tableData = ref<TableData[]>([])
  129. // 获取参数设置 的信息
  130. const GetParamaterSetting = async ()=>{
  131. let res = await getParameterSettingListApi(route.query.id)
  132. if(res?.code == 200){
  133. tableData.value = res.data.groupSubjects
  134. defaultParamsConfigFormData.value.id = res.data.id
  135. defaultParamsConfigFormData.value.isDeleteFullScore = res.data.fullScoreStatus
  136. defaultParamsConfigFormData.value.lowScoreDeleteRatio = res.data.lowScoreCustom ? 'custom' : res.data.lowScoreRadio
  137. defaultParamsConfigFormData.value.customLowScoreDeleteRatio = res.data.lowScoreCustom ? res.data.lowScoreRadio : ''
  138. }
  139. }
  140. // 2. 参数设置 操作
  141. const isEdit = ref(false)
  142. const paramsSettingFormDom = ref() // 参数设置表单dom
  143. // 开始/保存 编辑
  144. const StartOrSaveEdit = async ()=>{
  145. if(isEdit.value){
  146. console.log('点击 了')
  147. console.log('参数设置表单的值__',defaultParamsConfigFormData.value)
  148. let params = {
  149. id: defaultParamsConfigFormData.value.id,
  150. evaluationId: route.query.id,
  151. fullScoreStatus: defaultParamsConfigFormData.value.isDeleteFullScore,
  152. lowScoreRadio: defaultParamsConfigFormData.value.lowScoreDeleteRatio == 'custom' ? defaultParamsConfigFormData.value.customLowScoreDeleteRatio : defaultParamsConfigFormData.value.lowScoreDeleteRatio,
  153. lowScoreCustom: defaultParamsConfigFormData.value.lowScoreDeleteRatio == 'custom' ? 1 : 0
  154. }
  155. let res = await saveParamaterSettingApi(params)
  156. if(res?.code == 200){
  157. ElMessage.success(res?.msg)
  158. await GetParamaterSetting()
  159. }
  160. }
  161. isEdit.value = !isEdit.value
  162. }
  163. // 自定义删除比例的数字矫正
  164. const HandleInputNumberChange = (val)=>{
  165. console.log('输入的值---',val)
  166. if(Number(val) > 100){
  167. defaultParamsConfigFormData.value.customLowScoreDeleteRatio = 100
  168. }else if(Number(val) < 0){
  169. defaultParamsConfigFormData.value.customLowScoreDeleteRatio = 0
  170. }else if(String(val).split('.')[1]?.length > 2){
  171. let splitArray = String(val).split('.')
  172. defaultParamsConfigFormData.value.customLowScoreDeleteRatio = Number(splitArray[0] +'.' + splitArray[1].slice(0,2))
  173. }
  174. }
  175. // 3. 新增科目组合弹窗 及 操作
  176. const compositionSubjectFormVisible = ref(false)
  177. const compositionSubjectFormLoading = ref(false)
  178. const compositionSubjectFormTitle = ref('')
  179. const defaultCompositionSubjectFormData = ref({})
  180. // 打开 新增/修改 弹窗
  181. const OpenSubjectCompositionForm = async (row)=>{
  182. if(row?.id){
  183. compositionSubjectFormTitle.value = '修改科目组合'
  184. // 默认表单赋值
  185. defaultCompositionSubjectFormData.value = {
  186. groupSubjectName:row.groupSubjectName,
  187. subjectList:row.subjectData.map(item=>{
  188. return item.code
  189. }),
  190. id:row.id
  191. }
  192. }else{
  193. compositionSubjectFormTitle.value = '新增科目组合'
  194. }
  195. compositionSubjectFormVisible.value = true
  196. await GetSubjectDataList()
  197. }
  198. // 关闭弹窗
  199. const CloseSubjectCompositionForm = ()=>{
  200. compositionSubjectFormVisible.value = false
  201. compositionSubjectFormLoading.value = false
  202. defaultCompositionSubjectFormData.value = {}
  203. }
  204. // 新增科目弹窗确认
  205. const HandleAddCompositionSubject = async (params)=>{
  206. compositionSubjectFormLoading.value = true
  207. const {formData,formRef} = params
  208. console.log('表单弹窗信息',formData)
  209. let subjectData = formData.subjectList.map(item=>{
  210. return {
  211. code:item
  212. }
  213. })
  214. let transferParams = {
  215. id: formData.id,
  216. evaluationId: route.query.id,
  217. // "evaluationGroupSubjectId": 0,
  218. groupSubjectName: formData.groupSubjectName,
  219. subjectData: subjectData
  220. }
  221. let res = undefined
  222. res = await addOrUpdateCompositionSubjectApi(transferParams)
  223. if(res?.code == 200){
  224. ElMessage.success(res?.msg)
  225. CloseSubjectCompositionForm()
  226. // 重查数据
  227. await GetParamaterSetting()
  228. }else{
  229. compositionSubjectFormLoading.value = false
  230. }
  231. }
  232. // 查询科目下拉数据
  233. const GetSubjectDataList = async ()=>{
  234. let res = await getSubjectDataListApi(route.query.id)
  235. if(res?.code == 200){
  236. let subjectOptions = res?.data.map(item=>{
  237. return {
  238. label:item.name,
  239. value:item.code
  240. }
  241. })
  242. formItemList.value = formItemList.value.map(item=>{
  243. if(item.key == 'subjectList'){
  244. item.selectList = subjectOptions
  245. }
  246. return item
  247. })
  248. }
  249. }
  250. // 4. 删除科目组合
  251. //
  252. const deleteDialogVisible = ref(false)
  253. const deleteSubmitLoading = ref(false)
  254. const currentDeleteRow = ref()
  255. // 关闭删除弹窗
  256. const CloseDeleteDialog = ()=>{
  257. deleteDialogVisible.value = false
  258. deleteSubmitLoading.value = false
  259. }
  260. // 打开删除弹窗
  261. const OpenDeleteDialog = (row)=>{
  262. currentDeleteRow.value = row
  263. deleteDialogVisible.value = true
  264. }
  265. const HandleDeleteConfirm = async ()=>{
  266. deleteSubmitLoading.value = true
  267. let row = currentDeleteRow.value
  268. let res = undefined
  269. try{
  270. res= await deleteCompositionSubjectApi(row.id)
  271. }catch{}
  272. if(res?.code == 200){
  273. ElMessage.success(res?.msg)
  274. CloseDeleteDialog()
  275. // 重新查询
  276. await GetParamaterSetting()
  277. }
  278. deleteSubmitLoading.value = false
  279. }
  280. // 5. 完成参数设置
  281. const FinishParamaterSetting = async ()=>{
  282. let params = {
  283. id: defaultParamsConfigFormData.value.id,
  284. evaluationId: route.query.id,
  285. fullScoreStatus: defaultParamsConfigFormData.value.isDeleteFullScore,
  286. lowScoreRadio: defaultParamsConfigFormData.value.lowScoreDeleteRatio == 'custom' ? defaultParamsConfigFormData.value.customLowScoreDeleteRatio : defaultParamsConfigFormData.value.lowScoreDeleteRatio,
  287. lowScoreCustom: defaultParamsConfigFormData.value.lowScoreDeleteRatio == 'custom' ? 1 : 0
  288. }
  289. let res = await finishParamaterSettingApi(params)
  290. if(res?.code == 200){
  291. isEdit.value = false
  292. // 更新全局状态
  293. await store.dispatch('updateEvaluationManageStepData',route.query.id)
  294. // 并 跳转到下一步
  295. // 线上匿名
  296. // store.state.evaluationManageStepData.evaluationType // 评价方式 0-线上匿名,1-线下答卷,2-线上导入,3-线上实名
  297. if(store.state.evaluationManageStepData.evaluationType === 0){
  298. store.commit('updateEvaluationManageStepData',{currentActiveStepName:'evaluationProgress'}) //更新全局活跃路由
  299. router.push(`evaluationProgress?id=${route.query.id}`)
  300. // 线下答卷
  301. }else if(store.state.evaluationManageStepData.evaluationType === 1){
  302. store.commit('updateEvaluationManageStepData',{currentActiveStepName:'generateAnalysis'}) //更新全局活跃路由
  303. router.push(`generateAnalysis?id=${route.query.id}`)
  304. }
  305. }
  306. }
  307. onMounted(async ()=>{
  308. await GetParamaterSetting()
  309. })
  310. </script>
  311. <style lang="scss" scoped>
  312. .questionnaire_cell{
  313. gap:16px;
  314. word-break: keep-all;
  315. }
  316. .subject_tag{
  317. display: flex;
  318. gap:10px;
  319. }
  320. .add_subject_option{
  321. flex-grow: 0 !important;
  322. display: flex;
  323. justify-content: center;
  324. align-items: center;
  325. gap:8px;
  326. background: rgba(46,100,250,0.1);
  327. border-radius: 6px 6px 6px 6px;
  328. text-align: center;
  329. padding:4px 0;
  330. color:#2e64fa;
  331. font-size: 14px;
  332. cursor: pointer;
  333. }
  334. .low_score_delete_ratio{
  335. display: flex;
  336. width: 100%;
  337. :deep(.el-input){
  338. width: 80px;
  339. margin-left: 8px;
  340. }
  341. }
  342. </style>