edit.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <template>
  2. <el-form ref="formRef" :model="formData" :rules="ruleForm" :label-width="store.state.themeConfig.themeConfig.globalI18n === 'en' ? '170px' : '100px'">
  3. <el-form-item :label="$t('message.projects.list.addOrEdit.form.name')" prop="name">
  4. <el-input v-model.trim="formData.name" :placeholder="$t('message.projects.list.addOrEdit.placeholders.name')" />
  5. </el-form-item>
  6. <el-form-item :label="$t('message.projects.list.addOrEdit.form.addressCode')" prop="addressCode">
  7. <el-cascader :options="data" :props="{ emitPath: true, value: 'code', label: 'name' }" :placeholder="$t('message.projects.list.addOrEdit.placeholders.select')" clearable class="w100" v-model="formData.addressCode"> </el-cascader>
  8. </el-form-item>
  9. <el-form-item :label="$t('message.projects.list.addOrEdit.form.addressDetail')" prop="addressDetail">
  10. <el-input v-model.trim="formData.addressDetail" :placeholder="$t('message.projects.list.addOrEdit.placeholders.addressDetail')" />
  11. </el-form-item>
  12. <el-form-item :label="$t('message.projects.list.addOrEdit.form.channelMerchants')" prop="channelMerchants">
  13. <el-input v-model.trim="formData.channelMerchants" :placeholder="$t('message.projects.list.addOrEdit.placeholders.channelMerchants')" />
  14. </el-form-item>
  15. <el-form-item :label="$t('message.projects.list.addOrEdit.form.customName')" prop="customName">
  16. <el-input v-model.trim="formData.customName" :placeholder="$t('message.projects.list.addOrEdit.placeholders.customName')" />
  17. </el-form-item>
  18. <el-form-item :label="$t('message.projects.list.addOrEdit.form.repairCompany')" prop="repairCompany">
  19. <el-input v-model.trim="formData.repairCompany" :placeholder="$t('message.projects.list.addOrEdit.placeholders.repairCompany')" />
  20. </el-form-item>
  21. <el-form-item :label="$t('message.projects.list.addOrEdit.form.repairMobile')" prop="repairMobile">
  22. <el-input v-model.trim="formData.repairMobile" :placeholder="$t('message.projects.list.addOrEdit.placeholders.repairMobile')" />
  23. </el-form-item>
  24. <el-form-item label="" prop="">
  25. <el-button @click="cancel">{{ $t("message.projects.list.addOrEdit.buttons.cancel") }}</el-button>
  26. <el-button type="primary" @click="onSubmit">{{ $t("message.projects.list.addOrEdit.buttons.confirm") }}</el-button>
  27. </el-form-item>
  28. </el-form>
  29. </template>
  30. <script lang="ts" setup>
  31. import { ref, reactive, nextTick, computed } from "vue";
  32. import api from "/@/api/projects";
  33. import { ruleRequired } from "/@/utils/validator";
  34. import { ElMessage } from "element-plus";
  35. import data from "province-city-china/dist/level.json";
  36. import { useI18n } from "vue-i18n";
  37. import { useStore } from "/@/store/index";
  38. const store = useStore();
  39. const emit = defineEmits(["getList", "cancel"]);
  40. const showDialog = ref(false);
  41. const formRef = ref();
  42. const { t } = useI18n();
  43. // 从省市区的的树形结构中获取省市区名称
  44. function getNames(code: string) {
  45. const provinceItem = data.find((item: any) => item.province === code.substring(0, 2));
  46. const provinceName = provinceItem.name;
  47. const cityItem = provinceItem.children.find((item: any) => item.city === code.substring(2, 4));
  48. const cityName = cityItem.name;
  49. if (!cityItem.children) {
  50. const areaItem = provinceItem.children.find((item: any) => item.area === code.substring(4, 6));
  51. const areaName = areaItem.name;
  52. return `${provinceName}/${areaName}`;
  53. } else {
  54. const areaItem = cityItem.children.find((item: any) => item.area === code.substring(4, 6));
  55. const areaName = areaItem.name;
  56. return `${provinceName}/${cityName}/${areaName}`;
  57. }
  58. }
  59. const baseForm = {
  60. id: undefined,
  61. address: "",
  62. addressCode: [],
  63. name: "",
  64. addressDetail: "",
  65. channelMerchants: "",
  66. customName: "",
  67. repairCompany: "",
  68. repairMobile: "",
  69. };
  70. const formData = reactive({
  71. ...baseForm,
  72. });
  73. const ruleForm = computed(() => {
  74. return {
  75. name: [ruleRequired(t("message.projects.list.addOrEdit.validation.name"))],
  76. addressCode: [ruleRequired(t("message.projects.list.addOrEdit.validation.addressCode"))],
  77. addressDetail: [ruleRequired(t("message.projects.list.addOrEdit.validation.addressDetail"))],
  78. channelMerchants: [ruleRequired(t("message.projects.list.addOrEdit.validation.channelMerchants"))],
  79. customName: [ruleRequired(t("message.projects.list.addOrEdit.validation.customName"))],
  80. repairCompany: [ruleRequired(t("message.projects.list.addOrEdit.validation.repairCompany"))],
  81. repairMobile: [ruleRequired(t("message.projects.list.addOrEdit.validation.repairMobile"))],
  82. };
  83. });
  84. const onSubmit = async () => {
  85. await formRef.value.validate();
  86. const { addressCode } = formData;
  87. formData.address = JSON.stringify({
  88. name: getNames(addressCode[2] || addressCode[1]),
  89. code: addressCode,
  90. });
  91. const theApi = formData.id ? api.edit : api.add;
  92. await theApi(formData);
  93. ElMessage.success(t(`message.projects.list.addOrEdit.messages.${formData.id ? "editSuccess" : "addSuccess"}`));
  94. // resetForm();
  95. showDialog.value = false;
  96. emit("getList");
  97. };
  98. const resetForm = async () => {
  99. Object.assign(formData, { ...baseForm });
  100. formRef.value && formRef.value.resetFields();
  101. };
  102. const cancel = () => {
  103. emit("cancel");
  104. };
  105. const open = async (row?: any) => {
  106. resetForm();
  107. showDialog.value = true;
  108. nextTick(() => {
  109. Object.assign(formData, { ...row, addressCode: JSON.parse(row.address)?.code });
  110. });
  111. };
  112. defineExpose({ open });
  113. </script>