edit.vue 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. <template>
  2. <div class="card-edit" :visible="bodyLoading">
  3. <a-form :model="formData" autocomplete="off" @finish="onFinish">
  4. <a-divider orientation="left">基础信息</a-divider>
  5. <a-row type="flex">
  6. <a-col :span="7">
  7. <a-form-item label="招聘会名称" name="name" :label-col="{span:8}"
  8. :rules="[{ required: true, message: '请输入招聘会名称!' }]">
  9. <a-input v-model:value="formData.name" placeholder="请输入招聘会名称"/>
  10. </a-form-item>
  11. </a-col>
  12. <a-col :span="8">
  13. <a-form-item label="主办单位" name="zbUnit" :label-col="{span:7}"
  14. :rules="[{ required: true,message:'请输入主办单位!' }]">
  15. <a-input v-model:value="formData.zbUnit" placeholder="请输入主办单位"/>
  16. </a-form-item>
  17. </a-col>
  18. <a-col :span="9">
  19. <a-form-item label="承办单位" name="cbUnit"
  20. :label-col="{span:7}" :rules="[{ required: true,message:'请输入主办单位!' }]">
  21. <a-input v-model:value="formData.cbUnit" placeholder="请输入主办单位"/>
  22. </a-form-item>
  23. </a-col>
  24. </a-row>
  25. <a-row type="flex">
  26. <a-col :span="7">
  27. <a-form-item label="招聘会地址" name="address" :label-col="{span:8}"
  28. :rules="[{ required: true, message: '请输入招聘会地址!' }]">
  29. <a-input v-model:value="formData.address" placeholder="请输入招聘会地址"/>
  30. </a-form-item>
  31. </a-col>
  32. <a-col :span="8">
  33. <a-form-item label="企业数量" name="companyCount" :label-col="{span:7}"
  34. :rules="[{ required: true,message:'请输入企业数量!' }]">
  35. <a-input-number :min="1" v-model:value="formData.companyCount" placeholder="请输入企业数量"
  36. style="width: 100%" :controls="false"/>
  37. </a-form-item>
  38. </a-col>
  39. <a-col :span="9">
  40. <a-form-item label="招聘会时间" name="jobFairDate"
  41. :label-col="{span:7}" :rules="[{ required: true,message:'请选择招聘会时间!' }]">
  42. <a-range-picker v-model:value="formData.jobFairDate" :placeholder="['开始日期', '结束日期']"
  43. format="YYYY-MM-DD"
  44. @change="onJobFairDateChange"/>
  45. </a-form-item>
  46. </a-col>
  47. </a-row>
  48. <a-row type="flex">
  49. <a-col :span="7">
  50. <a-form-item label="联系人" name="userName" :label-col="{span:8}"
  51. :rules="[{ required: true, message: '请输入联系人!' }]">
  52. <a-input v-model:value="formData.userName" placeholder="请输入联系人"/>
  53. </a-form-item>
  54. </a-col>
  55. <a-col :span="8">
  56. <a-form-item label="联系电话" name="userMrobile" :label-col="{span:7}"
  57. :rules="[{ required: true,message:'请输入联系电话!' }]">
  58. <a-input v-model:value="formData.userMrobile" placeholder="请输入联系电话"/>
  59. </a-form-item>
  60. </a-col>
  61. <a-col :span="9">
  62. <a-form-item label="所属县区" name="regionCode" style="overflow: hidden;line-height: 35px;height: 35px;"
  63. :label-col="{span:7}" :rules="[{ required: true,message:'请选择所属县区!' }]">
  64. <a-select
  65. ref="select"
  66. v-model:value="formData.regionCode"
  67. :options="regionList"
  68. :field-names="{ label: 'name', value: 'code' }"
  69. >
  70. </a-select>
  71. </a-form-item>
  72. </a-col>
  73. </a-row>
  74. <a-row type="flex">
  75. <a-col :span="7">
  76. <a-form-item label="摊位数" name="boothCount" :label-col="{span:8}"
  77. :rules="[{ required: true, message: '请输入摊位数!' }]">
  78. <a-input-number :min="1" v-model:value="formData.boothCount" placeholder="请输入企业数量"
  79. style="width: 100%" :controls="false"/>
  80. </a-form-item>
  81. </a-col>
  82. <a-col :span="8">
  83. <a-form-item label="展位总数" name="displayCount" :label-col="{span:7}"
  84. :rules="[{ required: true,message:'请输入展位总数!' }]">
  85. <a-input-number :min="1" v-model:value="formData.displayCount" placeholder="请输入企业数量"
  86. style="width: 100%" :controls="false"/>
  87. </a-form-item>
  88. </a-col>
  89. <a-col :span="9">
  90. <a-form-item label="是否制作海报" name="isMake"
  91. :label-col="{span:7}" :rules="[{ required: true,message:'请选择确定是否制作海报!' }]">
  92. <a-select
  93. ref="select"
  94. v-model:value="formData.isMake"
  95. >
  96. <a-select-option :value="true">是</a-select-option>
  97. <a-select-option :value="false">否</a-select-option>
  98. </a-select>
  99. </a-form-item>
  100. </a-col>
  101. </a-row>
  102. <a-row type="flex">
  103. <a-col :span="7">
  104. <a-form-item label="招聘会经度" name="longitude" :label-col="{span:8}">
  105. <a-input v-model:value="formData.longitude" placeholder="请输入经度"/>
  106. </a-form-item>
  107. </a-col>
  108. <a-col :span="8">
  109. <a-form-item label="招聘会纬度" name="latitude" :label-col="{span:7}">
  110. <a-input v-model:value="formData.longitude" placeholder="请输入纬度"/>
  111. </a-form-item>
  112. </a-col>
  113. <a-col :span="9">
  114. <a-form-item label="乘车路线" name="carLine" style="overflow: hidden;line-height: 35px;height: 35px;"
  115. :label-col="{span:7}">
  116. <a-input v-model:value="formData.carLine" placeholder="请输入乘车路线"/>
  117. </a-form-item>
  118. </a-col>
  119. </a-row>
  120. <a-row>
  121. <a-col class="table-bottom-a1" span="24">
  122. <a-form-item :label-col="{span:24}" name="jobFariDesc" label="招聘会描述">
  123. <a-textarea v-model:value="formData.jobFariDesc" placeholder="请输入招聘会描述" :rows="4"/>
  124. </a-form-item>
  125. </a-col>
  126. </a-row>
  127. <a-divider orientation="left">其他</a-divider>
  128. <b-upload-file :fileRefId="formData.jobfairsID" :readonly="false" :multiple="true"
  129. :setFileList="setFileList"
  130. :accept="'.pdf,.png,.jpg,.jpeg,.xls,.xlsx,.doc,.docx,.txt,.ppt,.pptx'"></b-upload-file>
  131. <a-form-item class="buttom-btns">
  132. <a-button @click="onClose">取消</a-button>
  133. <a-button type="primary" html-type="submit">提交</a-button>
  134. </a-form-item>
  135. </a-form>
  136. </div>
  137. </template>
  138. <script setup lang="ts">
  139. import {onMounted, reactive, ref} from "vue";
  140. import {getJobFairById, saveJobFari} from "@/api/jobUserManager/jobFair";
  141. import {message, type SelectProps} from "ant-design-vue";
  142. import {getRegionCodeList} from "@/api/system/area/index";
  143. import {useTabsViewStore} from "@/store/modules/tabsView";
  144. import {useRouter} from "vue-router";
  145. import dayjs from "dayjs";
  146. import BUploadFile from "@/components/file/uploadFile.vue";
  147. const tabsViewStore = useTabsViewStore();
  148. const router = useRouter();
  149. const fullPath = router.currentRoute.value.fullPath;
  150. const formData = reactive({
  151. jobfairsID: "",
  152. name: "",
  153. zbUnit: "",
  154. cbUnit: "",
  155. address: "",
  156. companyCount: "",
  157. displayCount: "",
  158. startTime: "",
  159. endTime: "",
  160. userName: "",
  161. userMrobile: "",
  162. regionCode: "",
  163. boothCount: "",
  164. isMake: "",
  165. longitude: "",
  166. latitude: "",
  167. carLine: "",
  168. jobFariDesc: "",
  169. jobFairDate: new Array<any>()
  170. })
  171. const bodyLoading = ref(false);
  172. const regionList = ref<SelectProps['options']>();
  173. const fileList = ref([]);
  174. const isAllowCommit = ref<boolean>(false);
  175. // 加载数据
  176. async function loadData(jobFairId: string) {
  177. bodyLoading.value = true;
  178. await getRegionList()
  179. await getJobFairById(jobFairId).then((result) => {
  180. Object.keys(result).forEach((key) => {
  181. formData[key] = result[key];
  182. })
  183. formData.jobFairDate = [];
  184. if (result.startTime) {
  185. formData.jobFairDate.push(dayjs(result.startTime, 'YYYY-MM-DD'));
  186. }
  187. if (result.endTime) {
  188. formData.jobFairDate.push(dayjs(result.endTime, 'YYYY-MM-DD'));
  189. }
  190. }).finally(() => {
  191. bodyLoading.value = false;
  192. })
  193. }
  194. const mobileValidate = () => {
  195. isAllowCommit.value = true;
  196. const mobileReg = /^1[3|4|5|6|7|8|9]\d{9}$/;
  197. const landlineReg = /[0-9]{3,4}[-][0-9]{8}/;
  198. if (!mobileReg.test(formData.userMrobile) && !landlineReg.test(formData.userMrobile)) {
  199. message.error("输入的联系电话有误!");
  200. isAllowCommit.value = false;
  201. }
  202. }
  203. // 提交
  204. function onFinish() {
  205. isAllowCommit.value = true;
  206. if (!formData.startTime || !formData.endTime) {
  207. message.error("请选择完整的开始与结束时间!");
  208. return;
  209. }
  210. if (formData.userMrobile) {
  211. mobileValidate()
  212. }
  213. if (isAllowCommit.value) {
  214. saveJobFari(formData).then(() => {
  215. onClose(1)
  216. })
  217. }
  218. }
  219. // 取消
  220. function onClose(reload: any) {
  221. tabsViewStore.closeCurrentTabByPath('/jobFairs/add');
  222. tabsViewStore.closeCurrentTabByPath('/jobFairs/edit');
  223. tabsViewStore.openTab('/jobFairs/index', {reload: reload});
  224. }
  225. const getRegionList = async function () {
  226. regionList.value = await getRegionCodeList();
  227. }
  228. const onJobFairDateChange = (dateString: any) => {
  229. formData.jobFairDate = dateString;
  230. formData.startTime = dateString ? dateString[0].format("YYYY-MM-DD") : '';
  231. formData.endTime = dateString ? dateString[1].format("YYYY-MM-DD") : '';
  232. }
  233. const setFileList = (files: any) => {
  234. fileList.value = files;
  235. };
  236. onMounted(() => {
  237. const id = history.state.params?.id;
  238. loadData(id)
  239. })
  240. </script>
  241. <script lang="ts">
  242. export default {
  243. name: 'JobFairsEdit'
  244. }
  245. </script>
  246. <style scoped>
  247. </style>