form.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717
  1. <template>
  2. <xn-form-container
  3. :title="formData.id ? '编辑用户' : '增加用户'"
  4. :width="800"
  5. :visible="visible"
  6. :destroy-on-close="true"
  7. :body-style="{ 'padding-top': '0px' }"
  8. @close="onClose"
  9. >
  10. <a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
  11. <a-tabs v-model:activeKey="activeTabsKey">
  12. <a-tab-pane key="1" tab="基础信息" force-render>
  13. <a-row :gutter="16">
  14. <a-col :span="12">
  15. <a-form-item label="账号:" name="account">
  16. <a-input v-model:value="formData.account" placeholder="请输入账号" allow-clear />
  17. </a-form-item>
  18. </a-col>
  19. <a-col :span="12">
  20. <a-form-item label="姓名:" name="name">
  21. <a-input v-model:value="formData.name" placeholder="请输入姓名" allow-clear />
  22. </a-form-item>
  23. </a-col>
  24. </a-row>
  25. <a-row :gutter="16">
  26. <a-col :span="12">
  27. <a-form-item label="性别:" name="gender">
  28. <a-radio-group v-model:value="formData.gender" :options="genderOptions" />
  29. </a-form-item>
  30. </a-col>
  31. <a-col :span="12">
  32. <a-form-item label="昵称:" name="nickname">
  33. <a-input v-model:value="formData.nickname" placeholder="请输入昵称" allow-clear />
  34. </a-form-item>
  35. </a-col>
  36. </a-row>
  37. <a-row :gutter="16">
  38. <a-col :span="12">
  39. <a-form-item label="手机号:" name="phone">
  40. <a-input v-model:value="formData.phone" placeholder="请输入手机" allow-clear />
  41. </a-form-item>
  42. </a-col>
  43. <a-col :span="12">
  44. <a-form-item label="邮箱:" name="email">
  45. <a-input v-model:value="formData.email" placeholder="请输入邮箱" allow-clear />
  46. </a-form-item>
  47. </a-col>
  48. </a-row>
  49. <a-row :gutter="16">
  50. <a-col :span="12">
  51. <a-form-item label="出生日期:" name="birthday">
  52. <a-date-picker v-model:value="formData.birthday" value-format="YYYY-MM-DD" style="width: 100%" />
  53. </a-form-item>
  54. </a-col>
  55. <a-col :span="12">
  56. <a-form-item label="学号:" name="studentNum">
  57. <a-input v-model:value="formData.studentNum" placeholder="请输入学号" allow-clear />
  58. </a-form-item>
  59. </a-col>
  60. </a-row>
  61. <a-row :gutter="16">
  62. <a-col :span="8">
  63. <a-form-item label="所属院系:" name="collegeId">
  64. <a-select
  65. v-model:value="formData.collegeId"
  66. placeholder="请选择所属院系"
  67. :options="collegeList"
  68. :field-names="{ label: 'name', value: 'id' }"
  69. @change="handleCollegeChange"
  70. allow-clear
  71. />
  72. </a-form-item>
  73. </a-col>
  74. <a-col :span="8">
  75. <a-form-item label="专业:" name="majorId">
  76. <a-select
  77. v-model:value="formData.majorId"
  78. placeholder="请选择专业"
  79. :options="majorList"
  80. :field-names="{ label: 'majorName', value: 'id' }"
  81. @change="handleMajorChange"
  82. allow-clear
  83. />
  84. </a-form-item>
  85. </a-col>
  86. <a-col :span="8">
  87. <a-form-item label="班级:" name="gradesId">
  88. <a-select
  89. v-model:value="formData.gradesId"
  90. placeholder="请选择班级"
  91. :options="gradesList"
  92. :field-names="{ label: 'gradesName', value: 'gradesId' }"
  93. allow-clear
  94. />
  95. </a-form-item>
  96. </a-col>
  97. </a-row>
  98. <a-row :gutter="16">
  99. <a-col :span="8">
  100. <a-form-item label="学届:" name="fallDue">
  101. <a-select
  102. v-model:value="formData.fallDue"
  103. placeholder="请选择学届"
  104. :options="fallDueOptions"
  105. allow-clear
  106. />
  107. </a-form-item>
  108. </a-col>
  109. </a-row>
  110. <a-row :gutter="16">
  111. <a-col :span="8">
  112. <a-form-item label="选择组织:" name="orgId">
  113. <a-tree-select
  114. v-model:value="formData.orgId"
  115. style="width: 100%"
  116. :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
  117. placeholder="请选择组织"
  118. allow-clear
  119. tree-default-expand-all
  120. :tree-data="treeData"
  121. :tree-default-expanded-keys="treeDefaultExpandedKeys"
  122. :field-names="{
  123. children: 'children',
  124. label: 'name',
  125. value: 'id'
  126. }"
  127. @change="selePositionData(formData.orgId, 0)"
  128. />
  129. </a-form-item>
  130. </a-col>
  131. <a-col :span="8">
  132. <a-form-item label="选择职位:" name="positionId">
  133. <xn-page-select
  134. ref="xnPositionPageSelectRef"
  135. v-model:value="formData.positionId"
  136. placeholder="请选择职位"
  137. allow-clear
  138. :page-function="selectApiFunction.positionSelector"
  139. :echo-function="selectApiFunction.echoPosition"
  140. />
  141. </a-form-item>
  142. </a-col>
  143. <a-col :span="8">
  144. <a-form-item label="选择教育身份:" name="eduIdentity">
  145. <a-select
  146. v-model:value="formData.eduIdentity"
  147. placeholder="请选择选择项类型"
  148. :options="eduIdentityOptions"
  149. />
  150. </a-form-item>
  151. </a-col>
  152. <a-col :span="8">
  153. <a-form-item label="选择主管:" name="directorId">
  154. <xn-page-select
  155. ref="xnUserPageSelectRef"
  156. v-model:value="formData.directorId"
  157. placeholder="请选择主管"
  158. allow-clear
  159. :page-function="selectApiFunction.userSelector"
  160. :echo-function="selectApiFunction.echoUser"
  161. />
  162. </a-form-item>
  163. </a-col>
  164. </a-row>
  165. <a-row :gutter="16">
  166. <a-col :span="8">
  167. <a-form-item label="员工编号:" name="empNo">
  168. <a-input v-model:value="formData.empNo" placeholder="请输入员工编号" allow-clear />
  169. </a-form-item>
  170. </a-col>
  171. <a-col :span="8">
  172. <a-form-item label="职级:" name="positionLevel">
  173. <a-input v-model:value="formData.positionLevel" placeholder="请输入职级" allow-clear />
  174. </a-form-item>
  175. </a-col>
  176. <a-col :span="8">
  177. <a-form-item label="入职日期:" name="entryDate">
  178. <a-date-picker v-model:value="formData.entryDate" value-format="YYYY-MM-DD" style="width: 100%" />
  179. </a-form-item>
  180. </a-col>
  181. </a-row>
  182. <a-form-item label="任职信息" name="positionJson">
  183. <a-button type="primary" class="childAddButton" @click="addDomains()">
  184. <PlusOutlined />
  185. 增加任职
  186. </a-button>
  187. <a-row :gutter="10" class="form-row">
  188. <a-col :span="7" class="form-row-con"> 机构 </a-col>
  189. <a-col :span="7" class="form-row-con"> 职位 </a-col>
  190. <a-col :span="7" class="form-row-con"> 主管 </a-col>
  191. <a-col :span="3" class="form-row-con"> 操作 </a-col>
  192. </a-row>
  193. <div v-for="(positionInfo, index) in formData.positionJson" :key="index" class="form-div">
  194. <a-row :gutter="10">
  195. <a-col :span="7">
  196. <a-form-item
  197. :name="['positionJson', index, 'orgId']"
  198. :rules="{ required: true, message: '请选择组织' }"
  199. >
  200. <a-tree-select
  201. v-model:value="positionInfo.orgId"
  202. style="width: 100%"
  203. :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
  204. placeholder="请选择组织"
  205. allow-clear
  206. tree-default-expand-all
  207. :tree-data="treeData"
  208. :tree-default-expanded-keys="treeDefaultExpandedKeys"
  209. :field-names="{ children: 'children', label: 'name', value: 'id' }"
  210. @select="childOrgSelect(positionInfo, 0, index)"
  211. />
  212. </a-form-item>
  213. </a-col>
  214. <a-col :span="7">
  215. <a-form-item
  216. :name="['positionJson', index, 'positionId']"
  217. :rules="{ required: true, message: '请选择职位' }"
  218. >
  219. <xn-page-select
  220. ref="xnChildPositionPageSelectRef"
  221. v-model:value="positionInfo.positionId"
  222. placeholder="请选择职位"
  223. allow-clear
  224. :page-function="selectApiFunction.childPositionSelector"
  225. :echo-function="selectApiFunction.echoPosition"
  226. />
  227. </a-form-item>
  228. </a-col>
  229. <a-col :span="7">
  230. <a-form-item :name="['positionJson', index, 'directorId']">
  231. <xn-page-select
  232. ref="xnChildUserPageSelectRef"
  233. v-model:value="positionInfo.directorId"
  234. placeholder="请选择主管"
  235. allow-clear
  236. :page-function="selectApiFunction.childUserSelector"
  237. :echo-function="selectApiFunction.echoUser"
  238. />
  239. </a-form-item>
  240. </a-col>
  241. <a-col :span="3" style="margin-top: 4px">
  242. <a-button size="small" type="primary" danger ghost @click="delDomains(index)">移除</a-button>
  243. </a-col>
  244. </a-row>
  245. </div>
  246. </a-form-item>
  247. </a-tab-pane>
  248. <a-tab-pane key="2" tab="更多信息" force-render>
  249. <a-row :gutter="16">
  250. <a-col :span="12">
  251. <a-form-item label="民族:" name="nation">
  252. <a-select v-model:value="formData.nation" placeholder="请选择民族" :options="nationOptions" />
  253. </a-form-item>
  254. </a-col>
  255. <a-col :span="12">
  256. <a-form-item label="籍贯:" name="nativePlace">
  257. <a-input v-model:value="formData.nativePlace" placeholder="请输入籍贯" allow-clear />
  258. </a-form-item>
  259. </a-col>
  260. </a-row>
  261. <a-row :gutter="16">
  262. <a-col :span="12">
  263. <a-form-item label="家庭住址:" name="homeAddress">
  264. <a-textarea
  265. v-model:value="formData.homeAddress"
  266. placeholder="请输入家庭住址"
  267. :auto-size="{ minRows: 2, maxRows: 5 }"
  268. allow-clear
  269. />
  270. </a-form-item>
  271. </a-col>
  272. <a-col :span="12">
  273. <a-form-item label="通信地址:" name="mailingAddress">
  274. <a-textarea
  275. v-model:value="formData.mailingAddress"
  276. placeholder="请输入通信地址"
  277. :auto-size="{ minRows: 2, maxRows: 5 }"
  278. allow-clear
  279. />
  280. </a-form-item>
  281. </a-col>
  282. </a-row>
  283. <a-row :gutter="16">
  284. <a-col :span="12">
  285. <a-form-item label="证件类型:" name="idCardType">
  286. <a-select
  287. v-model:value="formData.idCardType"
  288. placeholder="请选择证件类型"
  289. :options="idcardTypeOptions"
  290. />
  291. </a-form-item>
  292. </a-col>
  293. <a-col :span="12">
  294. <a-form-item label="证件号码:" name="idCardNumber">
  295. <a-input v-model:value="formData.idCardNumber" placeholder="请输入证件号码" allow-clear />
  296. </a-form-item>
  297. </a-col>
  298. </a-row>
  299. <a-row :gutter="16">
  300. <a-col :span="12">
  301. <a-form-item label="文化程度:" name="cultureLevel">
  302. <a-select
  303. v-model:value="formData.cultureLevel"
  304. placeholder="请选择文化程度"
  305. :options="cultureLevelOptions"
  306. />
  307. </a-form-item>
  308. </a-col>
  309. <a-col :span="12">
  310. <a-form-item label="政治面貌:" name="politicalOutlook">
  311. <a-input v-model:value="formData.politicalOutlook" placeholder="请输入政治面貌" allow-clear />
  312. </a-form-item>
  313. </a-col>
  314. </a-row>
  315. <a-row :gutter="16">
  316. <a-col :span="12">
  317. <a-form-item label="毕业学校:" name="college">
  318. <a-input v-model:value="formData.college" placeholder="请输入毕业学校" allow-clear />
  319. </a-form-item>
  320. </a-col>
  321. <a-col :span="12">
  322. <a-form-item label="学历:" name="education">
  323. <a-input v-model:value="formData.education" placeholder="请输入学历" allow-clear />
  324. </a-form-item>
  325. </a-col>
  326. </a-row>
  327. <a-row :gutter="16">
  328. <a-col :span="12">
  329. <a-form-item label="学制:" name="eduLength">
  330. <a-input v-model:value="formData.eduLength" placeholder="请输入学制" allow-clear />
  331. </a-form-item>
  332. </a-col>
  333. <a-col :span="12">
  334. <a-form-item label="学位:" name="degree">
  335. <a-input v-model:value="formData.degree" placeholder="请输入学位" allow-clear />
  336. </a-form-item>
  337. </a-col>
  338. </a-row>
  339. <a-row :gutter="16">
  340. <a-col :span="12">
  341. <a-form-item label="家庭电话:" name="homeTel">
  342. <a-input v-model:value="formData.homeTel" placeholder="请输入家庭电话" allow-clear />
  343. </a-form-item>
  344. </a-col>
  345. <a-col :span="12">
  346. <a-form-item label="办公电话:" name="officeTel">
  347. <a-input v-model:value="formData.officeTel" placeholder="请输入办公电话" allow-clear />
  348. </a-form-item>
  349. </a-col>
  350. </a-row>
  351. <a-row :gutter="16">
  352. <a-col :span="12">
  353. <a-form-item label="紧急联系人:" name="emergencyContact">
  354. <a-input v-model:value="formData.emergencyContact" placeholder="请输入紧急联系人" allow-clear />
  355. </a-form-item>
  356. </a-col>
  357. <a-col :span="12">
  358. <a-form-item label="紧急联系电话:" name="emergencyPhone">
  359. <a-input v-model:value="formData.emergencyPhone" placeholder="请输入紧急联系电话" allow-clear />
  360. </a-form-item>
  361. </a-col>
  362. </a-row>
  363. <a-row :gutter="16">
  364. <a-col :span="12">
  365. <a-form-item label="紧急联系人地址:" name="emergencyAddress">
  366. <a-textarea
  367. v-model:value="formData.emergencyAddress"
  368. placeholder="请输入紧急联系人地址"
  369. :auto-size="{ minRows: 2, maxRows: 5 }"
  370. allow-clear
  371. />
  372. </a-form-item>
  373. </a-col>
  374. </a-row>
  375. </a-tab-pane>
  376. </a-tabs>
  377. </a-form>
  378. <template #footer>
  379. <a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
  380. <a-button type="primary" :loading="formLoading" @click="onSubmit">保存</a-button>
  381. </template>
  382. </xn-form-container>
  383. </template>
  384. <script setup>
  385. import userApi from '@/api/sys/userApi'
  386. import userCenterApi from '@/api/sys/userCenterApi'
  387. import resourceAuditApi from '@/api/resourceAudit'
  388. import { required } from '@/utils/formRules'
  389. import tool from '@/utils/tool'
  390. // 默认是关闭状态
  391. const visible = ref(false)
  392. const formRef = ref()
  393. const activeTabsKey = ref('1')
  394. const emit = defineEmits({ successful: null })
  395. const formLoading = ref(false)
  396. const treeData = ref([])
  397. const treeDefaultExpandedKeys = ref([])
  398. const eduIdentityOptions = tool.dictList('SYS_USER_EDU_IDENTITY')
  399. const collegeList = ref([])
  400. const majorList = ref([])
  401. const gradesList = ref([])
  402. console.log(eduIdentityOptions, 'eduIdentityOptions')
  403. // 分页select组件dom定义
  404. const xnPositionPageSelectRef = ref()
  405. const xnUserPageSelectRef = ref()
  406. const xnChildPositionPageSelectRef = ref()
  407. const xnChildUserPageSelectRef = ref()
  408. // 表单数据
  409. const formData = ref({})
  410. const fallDueOptions = tool.dictList('FALL_TYPE')
  411. // 加载院系列表
  412. const loadCollegeList = () => {
  413. resourceAuditApi.orgList().then((res) => {
  414. if (res) {
  415. collegeList.value = res.data
  416. }
  417. })
  418. }
  419. // 处理院系变化
  420. const handleCollegeChange = (value) => {
  421. formData.value.majorId = undefined
  422. formData.value.gradesId = undefined
  423. majorList.value = []
  424. gradesList.value = []
  425. if (value) {
  426. // 加载专业列表
  427. resourceAuditApi.zyselect({ collegeId: value }).then((res) => {
  428. if (res) {
  429. majorList.value = res.data
  430. }
  431. })
  432. }
  433. }
  434. // 处理专业变化
  435. const handleMajorChange = (value) => {
  436. formData.value.gradesId = undefined
  437. gradesList.value = []
  438. if (value && formData.value.collegeId) {
  439. // 加载班级列表
  440. resourceAuditApi
  441. .gradeByZyAndOrgId({
  442. collegeId: formData.value.collegeId,
  443. majorId: value
  444. })
  445. .then((res) => {
  446. if (res) {
  447. gradesList.value = res.data
  448. }
  449. })
  450. }
  451. }
  452. // 打开抽屉
  453. const onOpen = (record, orgId) => {
  454. visible.value = true
  455. formData.value = {
  456. gender: '男',
  457. positionJson: [],
  458. collegeId: undefined,
  459. majorId: undefined,
  460. gradesId: undefined,
  461. studentNum: '',
  462. fallDue: undefined
  463. }
  464. // 加载院系列表
  465. loadCollegeList()
  466. if (orgId) {
  467. formData.value.orgId = orgId
  468. // 通过机构再查询职位、主管
  469. nextTick(() => {
  470. selePositionData(orgId)
  471. })
  472. }
  473. if (record) {
  474. convertFormData(record)
  475. }
  476. nextTick(() => {
  477. // 机构选择器数据
  478. userApi.userOrgTreeSelector().then((res) => {
  479. if (res !== null) {
  480. treeData.value = res
  481. // 默认展开2级
  482. treeData.value.forEach((item) => {
  483. // 因为0的顶级
  484. if (item.parentId === '0') {
  485. treeDefaultExpandedKeys.value.push(item.id)
  486. // 取到下级ID
  487. if (item.children) {
  488. item.children.forEach((items) => {
  489. treeDefaultExpandedKeys.value.push(items.id)
  490. })
  491. }
  492. }
  493. })
  494. }
  495. })
  496. })
  497. }
  498. // 关闭抽屉
  499. const onClose = () => {
  500. treeData.value = []
  501. treeDefaultExpandedKeys.value = []
  502. visible.value = false
  503. }
  504. // 回显数据
  505. const convertFormData = (record) => {
  506. const param = {
  507. id: record.id
  508. }
  509. // 查询详情
  510. userApi.userDetail(param).then((data) => {
  511. if (data.positionJson) {
  512. // 替换表单中的格式与后端查到的
  513. data.positionJson = JSON.parse(data.positionJson)
  514. }
  515. formData.value = Object.assign(formData.value, data)
  516. // 这里再写一次是因为上面需要先加载增行,下面再进行循环赋值
  517. if (data.positionJson) {
  518. // 遍历进行补充
  519. data.positionJson.map((item, index) => {
  520. childOrgSelect(item, 1, index)
  521. return item
  522. })
  523. }
  524. selePositionData(formData.value.orgId)
  525. // 如果有院系ID,加载专业列表并回显
  526. if (formData.value.collegeId) {
  527. resourceAuditApi.zyselect({ collegeId: formData.value.collegeId }).then((res) => {
  528. if (res) {
  529. majorList.value = res.data
  530. // 如果有专业ID,加载班级列表并回显
  531. if (formData.value.majorId) {
  532. resourceAuditApi
  533. .gradeByZyAndOrgId({
  534. collegeId: formData.value.collegeId,
  535. majorId: formData.value.majorId
  536. })
  537. .then((gradeRes) => {
  538. if (gradeRes) {
  539. formData.value.gradesId = Number(formData.value.gradesId)
  540. gradesList.value = gradeRes.data
  541. }
  542. })
  543. }
  544. }
  545. })
  546. }
  547. })
  548. }
  549. // 默认要校验的
  550. const formRules = {
  551. account: [required('请输入账号')],
  552. name: [required('请输入姓名')],
  553. sex: [required('请选择性别')],
  554. orgId: [required('请选择组织')],
  555. positionId: [required('请选择职位')],
  556. eduIdentity: [required('请选择教育身份')],
  557. collegeId: [required('请选择所属院系')],
  558. majorId: [required('请选择专业')],
  559. gradesId: [required('请选择班级')],
  560. studentNum: [required('请输入学号')],
  561. fallDue: [required('请选择学届')]
  562. }
  563. // 机构选择后查询对应的职位
  564. const selePositionData = (orgId, type) => {
  565. if (orgId) {
  566. const xnPositionPageSelectParam = {
  567. orgId: orgId
  568. }
  569. xnPositionPageSelectRef.value.onPage(xnPositionPageSelectParam)
  570. xnUserPageSelectRef.value.onPage()
  571. // 此类型代表选择的时候重置后面的职位
  572. if (type === 0) {
  573. formData.value.positionId = undefined
  574. formData.value.directorId = undefined
  575. }
  576. } else {
  577. formData.value.positionId = undefined
  578. formData.value.directorId = undefined
  579. }
  580. }
  581. // 传递选择组件需要的API
  582. const selectApiFunction = {
  583. positionSelector: (param) => {
  584. return userApi.userPositionSelector(param).then((data) => {
  585. return Promise.resolve(data)
  586. })
  587. },
  588. userSelector: (param) => {
  589. return userApi.userSelector(param).then((data) => {
  590. return Promise.resolve(data)
  591. })
  592. },
  593. childPositionSelector: (param) => {
  594. return userApi.userPositionSelector(param).then((data) => {
  595. return Promise.resolve(data)
  596. })
  597. },
  598. childUserSelector: (param) => {
  599. return userApi.userSelector(param).then((data) => {
  600. return Promise.resolve(data)
  601. })
  602. },
  603. // 通过id回显数据接口
  604. echoPosition: (param) => {
  605. return userCenterApi.userCenterGetPositionListByIdList(param).then((data) => {
  606. return Promise.resolve(data)
  607. })
  608. },
  609. echoUser: (param) => {
  610. return userCenterApi.userCenterGetUserListByIdList(param).then((data) => {
  611. return Promise.resolve(data)
  612. })
  613. }
  614. }
  615. // 附属职位信息增行
  616. const addDomains = () => {
  617. if (formData.value.positionJson === null) {
  618. formData.value.positionJson = []
  619. }
  620. formData.value.positionJson.push({
  621. orgId: undefined,
  622. positionId: undefined,
  623. directorId: undefined
  624. })
  625. }
  626. // 删减行
  627. const delDomains = (index) => {
  628. formData.value.positionJson.splice(index, 1)
  629. }
  630. // 子表行内选择机构
  631. const childOrgSelect = (data, type, index) => {
  632. // 说明正在切换机构,我们就将他的后面的设置空
  633. if (type === 0) {
  634. formData.value.positionJson.filter((item, serial) => {
  635. if (item.orgId === data.orgId && serial === index) {
  636. item.positionId = undefined
  637. item.directorId = undefined
  638. }
  639. })
  640. }
  641. const param = {
  642. orgId: data.orgId
  643. }
  644. nextTick(() => {
  645. xnChildPositionPageSelectRef.value[index].onPage(param)
  646. xnChildUserPageSelectRef.value[index].onPage(param)
  647. })
  648. }
  649. // 验证并提交数据
  650. const onSubmit = () => {
  651. formRef.value.validate().then(() => {
  652. // 因为不切断,我下面转换数据格式,影响上面表单会报错
  653. let formDatas = JSON.parse(JSON.stringify(formData.value))
  654. if (formDatas.positionJson && formDatas.positionJson.length > 0) {
  655. formDatas.positionJson = JSON.stringify(formDatas.positionJson)
  656. } else {
  657. delete formDatas.positionJson
  658. }
  659. formLoading.value = true
  660. userApi
  661. .submitForm(formDatas, formDatas.id)
  662. .then(() => {
  663. onClose()
  664. emit('successful')
  665. })
  666. .finally(() => {
  667. formLoading.value = false
  668. })
  669. })
  670. }
  671. // 性别
  672. const genderOptions = tool.dictList('GENDER')
  673. // 民族
  674. const nationOptions = tool.dictList('NATION')
  675. // 身份证件
  676. const idcardTypeOptions = tool.dictList('IDCARD_TYPE')
  677. // 文化程度
  678. const cultureLevelOptions = tool.dictList('CULTURE_LEVEL')
  679. // 调用这个函数将子组件的一些数据和方法暴露出去
  680. defineExpose({
  681. onOpen
  682. })
  683. </script>
  684. <style scoped type="less">
  685. .childAddButton {
  686. margin-bottom: 10px;
  687. }
  688. .form-row {
  689. background-color: var(--item-hover-bg);
  690. margin-left: 0px !important;
  691. }
  692. .form-row-con {
  693. padding-bottom: 5px;
  694. padding-top: 5px;
  695. padding-left: 15px;
  696. }
  697. .form-div {
  698. padding-top: 10px;
  699. }
  700. </style>