CompanyCreate.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <script lang="ts" setup>
  2. /**
  3. * @Name: CompanyCreate.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, Finished, Plus, RefreshLeft } from '@element-plus/icons-vue';
  11. const isOpen = defineModel({ default: false });
  12. const emit = defineEmits([ 'refresh' ]);
  13. const createLoading = ref(false);
  14. interface ContactItem {
  15. phone: string;
  16. email: string;
  17. }
  18. interface RuleForm {
  19. company: string;
  20. address: string;
  21. companyEnglishName: string;
  22. juridicalPerson: string;
  23. vatNumber: string;
  24. vatCompany: string;
  25. ipaddress: string;
  26. juridicalPersonCreditCard: string;
  27. juridicalPersonCreditCardAddress: string;
  28. shopPhone: string;
  29. shopEmail: string;
  30. receivablesAccount:string;
  31. contacts: ContactItem[];
  32. }
  33. const ruleFormRef = ref<FormInstance>();
  34. const form = reactive<RuleForm>({
  35. company: '',
  36. address: '',
  37. companyEnglishName: '',
  38. juridicalPerson: '',
  39. vatNumber: '',
  40. vatCompany: '',
  41. ipaddress:'',
  42. juridicalPersonCreditCard:'',
  43. juridicalPersonCreditCardAddress:'',
  44. shopPhone:'',
  45. shopEmail:'',
  46. receivablesAccount:'',
  47. contacts: [
  48. {
  49. phone: '',
  50. email: ''
  51. }
  52. ]
  53. });
  54. const rules = reactive<FormRules<RuleForm>>({
  55. company: [ { required: true, message: '请输入公司名称', trigger: 'blur' } ],
  56. companyEnglishName: [ { required: true, message: '请输入公司英文名称', trigger: 'blur' } ],
  57. address: [ { required: true, message: '请输入公司地址', trigger: 'blur' } ],
  58. juridicalPerson: [ { required: true, message: '请输入公司法人', trigger: 'blur' } ],
  59. juridicalPersonCreditCard: [ { required: true, message: '请输入法人信用卡号', trigger: 'blur' } ],
  60. juridicalPersonCreditCardAddress: [ { required: true, message: '请输入法人信用卡地址', trigger: 'blur' } ],
  61. ipaddress: [ { required: true, message: '请输入IP地址', trigger: 'blur' } ],
  62. receivablesAccount: [ { required: false, message: '请输入收款账户', trigger: 'blur' } ],
  63. shopEmail:[
  64. { required: true, message: '请输入主账号邮箱', trigger: 'blur' },
  65. { type: 'email', message: '请输入有效的邮箱地址', trigger: 'blur' }
  66. ],
  67. shopPhone: [ { required: true, message: '请输入主账号电话', trigger: 'blur' } ],
  68. vatNumber: [ { required: false, message: '请输入VAT税号', trigger: 'blur' } ],
  69. vatCompany: [ { required: false, message: '请输入VAT税号公司', trigger: 'blur' } ],
  70. contacts: {
  71. phone: [ { required: false, message: '请输入电话号码', trigger: 'blur' } ],
  72. email: [
  73. { required: false, message: '请输入邮箱地址', trigger: 'blur' },
  74. { type: 'email', message: '请输入有效的邮箱地址', trigger: 'blur' }
  75. ]
  76. }
  77. });
  78. const addContact = () => {
  79. form.contacts.push({
  80. phone: '',
  81. email: ''
  82. });
  83. };
  84. const removeContact = (item: ContactItem) => {
  85. const index = form.contacts.indexOf(item);
  86. if (index !== -1) {
  87. form.contacts.splice(index, 1);
  88. }
  89. };
  90. async function create() {
  91. const body = {
  92. company: form.company,
  93. companyEnglishName: form.companyEnglishName,
  94. address: form.address,
  95. juridicalPerson: form.juridicalPerson,
  96. vatNumber: form.vatNumber,
  97. vatCompany: form.vatCompany,
  98. companyPhoneEmail: form.contacts,
  99. juridicalPersonCreditCard: form.juridicalPersonCreditCard,
  100. juridicalPersonCreditCardAddress: form.juridicalPersonCreditCardAddress,
  101. ipaddress: form.ipaddress,
  102. shopEmail: form.shopEmail,
  103. receivablesAccount: form.receivablesAccount,
  104. shopPhone: form.shopPhone
  105. };
  106. const res =await useResponse(body, api.createCompany, createLoading);
  107. if (res.code === 2000) {
  108. ElMessage.success('创建成功');
  109. }
  110. }
  111. const submitForm = async (formEl: FormInstance | undefined) => {
  112. if (!formEl) return;
  113. await formEl.validate(async (valid, fields) => {
  114. if (valid) {
  115. await create();
  116. isOpen.value = false;
  117. emit('refresh');
  118. } else {
  119. console.log('error submit!', fields);
  120. ElMessage.error('请检查表单');
  121. }
  122. });
  123. };
  124. const resetForm = (formEl: FormInstance | undefined) => {
  125. if (!formEl) return;
  126. formEl.resetFields();
  127. };
  128. </script>
  129. <template>
  130. <el-dialog v-model="isOpen" :close-on-click-modal="false" title="新增公司" width="35%">
  131. <el-form
  132. ref="ruleFormRef"
  133. :model="form"
  134. :rules="rules"
  135. label-width="auto"
  136. status-icon
  137. >
  138. <el-form-item label="公司名称" prop="company">
  139. <el-input v-model="form.company" placeholder="请输入公司名称"></el-input>
  140. </el-form-item>
  141. <el-form-item label="公司英文名称" prop="companyEnglishName">
  142. <el-input v-model="form.companyEnglishName" placeholder="请输入公司英文名称"></el-input>
  143. </el-form-item>
  144. <el-form-item label="公司注册地址" prop="address">
  145. <el-input v-model="form.address" placeholder="请输入公司地址"></el-input>
  146. </el-form-item>
  147. <el-form-item label="公司法人" prop="juridicalPerson">
  148. <el-input v-model="form.juridicalPerson" placeholder="请输入公司法人"></el-input>
  149. </el-form-item>
  150. <el-form-item label="法人信用卡号" prop="juridicalPersonCreditCard">
  151. <el-input v-model="form.juridicalPersonCreditCard" placeholder="请输入法人信用卡号"></el-input>
  152. </el-form-item>
  153. <el-form-item label="法人信用卡地址" prop="juridicalPersonCreditCardAddress">
  154. <el-input v-model="form.juridicalPersonCreditCardAddress" placeholder="请输入法人信用卡地址"></el-input>
  155. </el-form-item>
  156. <el-form-item label="IP地址" prop="ipaddress" style="margin-bottom: 14px;">
  157. <el-input v-model="form.ipaddress" placeholder="请输入IP地址"></el-input>
  158. <div style="font-size: 12px; color: #999; margin: 2px 0 -4px 0;">如果有多个IP地址,请用","相隔</div>
  159. </el-form-item>
  160. <el-form-item label="VAT税号" prop="vatNumber">
  161. <el-input v-model="form.vatNumber" placeholder="请输入VAT税号"></el-input>
  162. </el-form-item>
  163. <el-form-item label="VAT税号公司" prop="vatCompany">
  164. <el-input v-model="form.vatCompany" placeholder="请输入VAT税号公司"></el-input>
  165. </el-form-item>
  166. <el-form-item label="收款账户" prop="receivablesAccount">
  167. <el-input v-model="form.receivablesAccount" placeholder="请输入收款账户"></el-input>
  168. </el-form-item>
  169. <el-form-item label="主账号邮箱" prop="shopEmail">
  170. <el-input v-model="form.shopEmail" placeholder="请输入主账号邮箱"></el-input>
  171. </el-form-item>
  172. <el-form-item label="主账号电话" prop="shopPhone">
  173. <el-input v-model="form.shopPhone" placeholder="请输入主账号电话"></el-input>
  174. </el-form-item>
  175. <el-form-item
  176. v-for="(contact, index) in form.contacts"
  177. :key="index"
  178. :label="'子账号联系方式' + (index + 1)"
  179. >
  180. <div class="flex gap-2.5 items-start">
  181. <el-form-item
  182. :prop="'contacts.' + index + '.phone'"
  183. >
  184. <el-input
  185. v-model="contact.phone"
  186. placeholder="请输入电话"
  187. />
  188. </el-form-item>
  189. <el-form-item
  190. :prop="'contacts.' + index + '.email'"
  191. :rules="rules.contacts.email"
  192. >
  193. <el-input
  194. v-model="contact.email"
  195. placeholder="请输入邮箱"
  196. />
  197. </el-form-item>
  198. <el-button :icon="Delete" type="danger" @click.prevent="removeContact(contact)">
  199. 删 除
  200. </el-button>
  201. </div>
  202. </el-form-item>
  203. <el-form-item>
  204. <div class="flex flex-1 justify-end">
  205. <el-button :icon="Plus" type="warning" @click="addContact">新增联系方式</el-button>
  206. <el-button :icon="Finished" :loading="createLoading" type="primary" @click="submitForm(ruleFormRef)">创 建
  207. </el-button>
  208. <el-button :icon="RefreshLeft" @click="resetForm(ruleFormRef)">重 置</el-button>
  209. </div>
  210. </el-form-item>
  211. </el-form>
  212. </el-dialog>
  213. </template>
  214. <style scoped>
  215. </style>