EditDrawer.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <script lang="ts" setup>
  2. /**
  3. * @Name: EditDrawer.vue
  4. * @Description: 公司编辑
  5. * @Author: Cheney
  6. */
  7. import { ElMessage, FormInstance, FormRules } from 'element-plus';
  8. import { useResponse } from '/@/utils/useResponse';
  9. import * as api from '../api';
  10. import { Delete, Plus } from '@element-plus/icons-vue';
  11. import { cloneDeep } from 'lodash';
  12. const loading = ref(false);
  13. const isOpen = defineModel({ default: false });
  14. const { companyOverview, company } = defineProps<{
  15. companyOverview: any;
  16. company: any;
  17. }>();
  18. const emit = defineEmits([ 'refresh' ]);
  19. onBeforeMount(() => {
  20. replaceCol();
  21. });
  22. interface ContactItem {
  23. phone: string;
  24. email: string;
  25. }
  26. interface RuleForm {
  27. company: string;
  28. companyEnglishName: string;
  29. address: string;
  30. juridicalPerson: string;
  31. vatNumber: string;
  32. vatCompany: string;
  33. contacts: ContactItem[];
  34. }
  35. const ruleFormRef = ref<FormInstance>();
  36. const ruleForm = reactive<RuleForm>({
  37. company: '',
  38. companyEnglishName: '',
  39. address: '',
  40. juridicalPerson: '',
  41. vatNumber: '',
  42. vatCompany: '',
  43. contacts: [
  44. {
  45. phone: '',
  46. email: ''
  47. }
  48. ]
  49. });
  50. const rules = reactive<FormRules<RuleForm>>({
  51. company: [
  52. { required: true, message: 'Please input platform name', trigger: 'blur' }
  53. ],
  54. companyEnglishName: [
  55. { required: true, message: 'Please input platform name', trigger: 'blur' }
  56. ],
  57. address: [
  58. { required: true, message: 'Please input country name', trigger: 'blur' }
  59. ],
  60. juridicalPerson: [
  61. { required: true, message: 'Please input platform name', trigger: 'blur' }
  62. ],
  63. vatNumber: [
  64. { required: true, message: 'Please select line', trigger: 'change' }
  65. ],
  66. vatCompany: [
  67. { required: true, message: 'Please select line', trigger: 'change' }
  68. ],
  69. contacts: {
  70. phone: [ { required: true, message: '请输入电话号码', trigger: 'blur' } ],
  71. email: [
  72. { required: true, message: '请输入邮箱地址', trigger: 'blur' },
  73. { type: 'email', message: '请输入有效的邮箱地址', trigger: 'blur' }
  74. ]
  75. }
  76. });
  77. const addContact = () => {
  78. ruleForm.contacts.push({
  79. phone: '',
  80. email: ''
  81. });
  82. };
  83. const removeContact = (item: ContactItem) => {
  84. const index = ruleForm.contacts.indexOf(item);
  85. if (index !== -1) {
  86. ruleForm.contacts.splice(index, 1);
  87. }
  88. };
  89. const submitForm = async (formEl: FormInstance | undefined) => {
  90. if (!formEl) return;
  91. await formEl.validate(async (valid, fields) => {
  92. if (valid) {
  93. const formData = {
  94. ...ruleForm,
  95. companyPhoneEmail: ruleForm.contacts.map(contact => ({
  96. email: contact.email,
  97. phone: contact.phone
  98. }))
  99. };
  100. await useResponse({ id: companyOverview.id, partial: 1, formData }, api.updateShopDetail, loading);
  101. isOpen.value = false;
  102. ElMessage.success('编辑成功');
  103. emit('refresh');
  104. } else {
  105. console.log('error submit!', fields);
  106. }
  107. });
  108. };
  109. const resetForm = (formEl: FormInstance | undefined) => {
  110. if (!formEl) return;
  111. formEl.resetFields();
  112. };
  113. function replaceCol() {
  114. const result = Object.keys(ruleForm).reduce((acc, key) => {
  115. if (key in companyOverview) {
  116. acc[key] = companyOverview[key];
  117. }
  118. return acc;
  119. }, {} as { [key: string]: any });
  120. // 处理 contacts 字段
  121. if (companyOverview.companyPhoneEmail) {
  122. result.contacts = cloneDeep(companyOverview.companyPhoneEmail); // 深拷贝
  123. }
  124. Object.assign(ruleForm, result);
  125. }
  126. </script>
  127. <template>
  128. <el-drawer v-model="isOpen" :title="`公司编辑 - ${company}`" size="30%">
  129. <el-form
  130. ref="ruleFormRef"
  131. :model="ruleForm"
  132. :rules="rules"
  133. class="mx-2.5 mt-2.5"
  134. label-width="auto"
  135. status-icon>
  136. <el-form-item label="公司名称" prop="platformNumber">
  137. <el-input v-model="ruleForm.company"/>
  138. </el-form-item>
  139. <el-form-item label="公司英文名" prop="platformName">
  140. <el-input v-model="ruleForm.companyEnglishName"/>
  141. </el-form-item>
  142. <el-form-item label="公司地址" prop="country">
  143. <el-input v-model="ruleForm.address"/>
  144. </el-form-item>
  145. <el-form-item label="公司法人" prop="brandName">
  146. <el-input v-model="ruleForm.juridicalPerson"/>
  147. </el-form-item>
  148. <el-form-item label="VAT税号" prop="status">
  149. <el-input v-model="ruleForm.vatNumber"/>
  150. </el-form-item>
  151. <el-form-item label="VAT税号公司" prop="platform">
  152. <el-input v-model="ruleForm.vatCompany"/>
  153. </el-form-item>
  154. <el-form-item
  155. v-for="(contact, index) in ruleForm.contacts"
  156. :key="index"
  157. :label="'联系方式' + (index + 1)"
  158. >
  159. <div class="flex gap-2.5 items-start">
  160. <el-form-item
  161. :prop="'contacts.' + index + '.phone'"
  162. >
  163. <el-input
  164. v-model="contact.phone"
  165. placeholder="请输入电话"
  166. />
  167. </el-form-item>
  168. <el-form-item
  169. :prop="'contacts.' + index + '.email'"
  170. :rules="rules.contacts.email"
  171. >
  172. <el-input
  173. v-model="contact.email"
  174. placeholder="请输入邮箱"
  175. />
  176. </el-form-item>
  177. <el-button :icon="Delete" type="danger" @click.prevent="removeContact(contact)">
  178. 删 除
  179. </el-button>
  180. </div>
  181. </el-form-item>
  182. <el-form-item>
  183. <div class="flex flex-1 justify-center">
  184. <el-button :icon="Plus" type="warning" @click="addContact">新增联系方式</el-button>
  185. <el-button :loading="loading" type="primary" @click="submitForm(ruleFormRef)">确 定</el-button>
  186. <el-button @click="resetForm(ruleFormRef)">重 置</el-button>
  187. </div>
  188. </el-form-item>
  189. </el-form>
  190. </el-drawer>
  191. </template>
  192. <style scoped>
  193. </style>