Template-edit.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <template>
  2. <el-dialog title="编辑质检模板" v-model="state.dialogVisible" width="769px" draggable @close="close">
  3. <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="100px">
  4. <el-row :gutter="10">
  5. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  6. <el-form-item label="模板名称" prop="name" :rules="[{ required: true, message: '请输入模板名称', trigger: 'blur' }]">
  7. <el-input v-model="state.ruleForm.name" placeholder="请输入模板名称" clearable></el-input>
  8. </el-form-item>
  9. </el-col>
  10. <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
  11. <el-form-item label="质检分类" prop="grouping" :rules="[{ required: true, message: '请选择质检分类', trigger: 'change' }]">
  12. <el-select v-model="state.ruleForm.grouping" placeholder="请选择质检分类" class="w100">
  13. <el-option v-for="item in props.templateGrouping" :value="item.key" :key="item.key" :label="item.value" />
  14. </el-select>
  15. </el-form-item>
  16. </el-col>
  17. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  18. <el-form-item label="模板说明" prop="content" :rules="[{ required: false, message: '请输入模板说明', trigger: 'blur' }]">
  19. <el-input v-model="state.ruleForm.content" placeholder="请输入模板说明" type="textarea"></el-input>
  20. </el-form-item>
  21. </el-col>
  22. <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  23. <el-form-item label="是否启用" prop="isEnable" :rules="[{ required: false, message: '请选择是否启用', trigger: 'change' }]">
  24. <el-switch
  25. v-model="state.ruleForm.isEnable"
  26. inline-prompt
  27. active-text="启用"
  28. inactive-text="禁用"
  29. :active-value="1"
  30. :inactive-value="0"
  31. />
  32. </el-form-item>
  33. </el-col>
  34. </el-row>
  35. <el-divider content-position="left">
  36. <span class="font-bold font16 mr20">模板内容</span>
  37. <el-button link type="primary" @click="addItems"><SvgIcon name="ele-CirclePlus" size="18px" class="mr3" /> 质检项</el-button>
  38. </el-divider>
  39. <el-row v-for="(item, index) in state.ruleForm.templateDetails" :key="item.id" :gutter="10">
  40. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  41. <el-form-item
  42. label="质检项"
  43. :prop="`templateDetails.${index}.obj`"
  44. :rules="[{ required: true, message: '请选择质检项', trigger: 'change' }]"
  45. >
  46. <el-select v-model="item.obj" placeholder="请选择质检项" class="w100" value-key="name" @change="changeProject($event, index)">
  47. <el-option v-for="items in projectArray" :key="items.id" :label="items.name" :value="items" :disabled="items.disabled" />
  48. </el-select>
  49. </el-form-item>
  50. </el-col>
  51. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  52. <el-form-item label="AI质检">
  53. {{ item.isIntelligent === 1 ? '是' : '否' }}
  54. </el-form-item>
  55. </el-col>
  56. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
  57. <el-form-item label="扣分值"> {{ item.grade }} <span class="ml5">分</span> </el-form-item>
  58. </el-col>
  59. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="index != 0">
  60. <el-form-item label="">
  61. <el-button link type="primary" @click="deleteProject(index)"> <SvgIcon name="ele-Delete" /> </el-button>
  62. </el-form-item>
  63. </el-col>
  64. </el-row>
  65. </el-form>
  66. <template #footer>
  67. <span class="dialog-footer">
  68. <el-button @click="closeDialog" class="default-button">取 消</el-button>
  69. <el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确 定 </el-button>
  70. </span>
  71. </template>
  72. </el-dialog>
  73. </template>
  74. <script setup lang="ts" name="qualityLexiconEdit">
  75. import { reactive, ref } from 'vue';
  76. import { ElInput, ElMessage, ElMessageBox, FormInstance } from 'element-plus';
  77. import { templateDetail, templateUpdate } from '/@/api/quality/template';
  78. import { projectList } from '/@/api/quality/project';
  79. // 定义子组件向父组件传值/事件
  80. const emit = defineEmits(['updateList']);
  81. const props = defineProps({
  82. templateGrouping: {
  83. type: Array,
  84. default: () => [],
  85. },
  86. });
  87. // 定义变量内容
  88. const ruleFormRef = ref<FormInstance>();
  89. const state = reactive<any>({
  90. dialogVisible: false, // 弹窗显示隐藏
  91. ruleForm: {
  92. name: '', // 模板名称
  93. grouping: '', // 质检分类
  94. content: '', // 模板说明
  95. isEnable: 1, // 是否启用
  96. templateDetails: [
  97. {
  98. name: '',
  99. content: '',
  100. grade: 0,
  101. isIntelligent: 0,
  102. },
  103. ],
  104. },
  105. loading: false, // 确定按钮loading
  106. });
  107. const projectArray = ref<EmptyArrayType>([]); // 质检项
  108. // 打开弹窗
  109. const openDialog = async (row: any) => {
  110. try {
  111. const res = await templateDetail(row.id);
  112. state.ruleForm = res.result ?? {};
  113. if (state.ruleForm.templateDetails && state.ruleForm.templateDetails.length) {
  114. for (let i of state.ruleForm.templateDetails) {
  115. i.obj = { ...i };
  116. }
  117. }
  118. const response = await projectList({ IsEnable: 1 });
  119. projectArray.value = response.result?.items ?? [];
  120. state.dialogVisible = true;
  121. } catch (e) {
  122. console.log(e);
  123. }
  124. };
  125. // 关闭弹窗
  126. const closeDialog = () => {
  127. state.dialogVisible = false;
  128. };
  129. const close = () => {
  130. state.ruleForm.templateDetails = [];
  131. ruleFormRef.value?.clearValidate();
  132. ruleFormRef.value?.resetFields();
  133. state.ruleForm.templateDetails = [
  134. {
  135. name: '',
  136. content: '',
  137. grade: 0,
  138. isIntelligent: 0,
  139. }
  140. ]
  141. };
  142. // 新增质检项
  143. const addItems = () => {
  144. state.ruleForm.templateDetails.push({
  145. name: '',
  146. content: '',
  147. grade: 0,
  148. isIntelligent: 0,
  149. });
  150. getEnableAcceptType();
  151. };
  152. // 选择质检项
  153. const changeProject = (item: any, index: number | string) => {
  154. state.ruleForm.templateDetails[index].name = item.name;
  155. state.ruleForm.templateDetails[index].content = item.describe;
  156. state.ruleForm.templateDetails[index].grade = item.grade;
  157. state.ruleForm.templateDetails[index].isIntelligent = item.isIntelligent;
  158. getEnableAcceptType();
  159. };
  160. // 获取可用的数组
  161. const getEnableAcceptType = () => {
  162. if (state.ruleForm.templateDetails.length) {
  163. const array = state.ruleForm.templateDetails.map((v: any) => v.name);
  164. projectArray.value.forEach((v: any) => {
  165. v.disabled = array.includes(v.name);
  166. });
  167. }
  168. };
  169. // 删除质检项
  170. const deleteProject = (index: number | string) => {
  171. ElMessageBox.confirm(`您确定要删除此质检项,是否继续?`, '提示', {
  172. confirmButtonText: '确认',
  173. cancelButtonText: '取消',
  174. type: 'warning',
  175. draggable: true,
  176. cancelButtonClass: 'default-button',
  177. autofocus: false,
  178. })
  179. .then(() => {
  180. state.ruleForm.templateDetails.splice(index, 1);
  181. getEnableAcceptType();
  182. })
  183. .catch(() => {});
  184. };
  185. // 新增
  186. const onSubmit = (formEl: FormInstance | undefined) => {
  187. if (!formEl) return;
  188. formEl.validate((valid: boolean) => {
  189. if (!valid) return;
  190. state.loading = true;
  191. const request = {
  192. ...state.ruleForm,
  193. };
  194. templateUpdate(request)
  195. .then(() => {
  196. emit('updateList');
  197. closeDialog(); // 关闭弹窗
  198. ElMessage.success('操作成功');
  199. state.loading = false;
  200. })
  201. .catch(() => {
  202. emit('updateList');
  203. state.loading = false;
  204. });
  205. });
  206. };
  207. // 暴露变量
  208. defineExpose({
  209. openDialog,
  210. closeDialog,
  211. });
  212. </script>