org-edit.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892
  1. <!-- 机构编辑弹窗 -->
  2. <template>
  3. <ele-modal
  4. width="880px"
  5. :visible="visible"
  6. :close-on-click-modal="false"
  7. custom-class="ele-dialog-form"
  8. :title="isUpdate ? '修改机构' : '添加机构'"
  9. @update:visible="updateVisible"
  10. :maxable="true"
  11. >
  12. <el-form ref="form" :model="form" :rules="rules" label-width="140px">
  13. <el-row :gutter="15">
  14. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  15. <el-form-item label="编码:" prop="groupCode">
  16. <el-input clearable :maxlength="20" v-model="form.groupCode" />
  17. </el-form-item>
  18. </el-col>
  19. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  20. <el-form-item label="上级机构:">
  21. <org-select
  22. v-model="form.parentId"
  23. :data="organizationList"
  24. placeholder="请选择上级机构"
  25. />
  26. </el-form-item>
  27. </el-col>
  28. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  29. <el-form-item label="机构名称:" prop="name">
  30. <el-input
  31. clearable
  32. :maxlength="20"
  33. v-model="form.name"
  34. placeholder="请输入机构名称"
  35. />
  36. </el-form-item>
  37. </el-col>
  38. <el-col :span="12">
  39. <el-form-item
  40. label="机构类型:"
  41. prop="type"
  42. style="margin-bottom: 22px"
  43. >
  44. <DictSelection
  45. dictName="机构类型"
  46. clearable
  47. v-model="form.type"
  48. labelName="dictValue"
  49. >
  50. </DictSelection>
  51. </el-form-item>
  52. </el-col>
  53. <el-col :span="12">
  54. <el-form-item label="一级负责人:" style="margin-bottom: 22px">
  55. <el-input
  56. @focus="addOpen"
  57. @clear="clearManagerFirst"
  58. v-model="managerFirst.name"
  59. placeholder="请选择"
  60. clearable
  61. ></el-input>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="12">
  65. <el-form-item label="二级负责人:" style="margin-bottom: 22px">
  66. <el-input
  67. @click.native="openStaffSelection"
  68. v-model="responsibleName"
  69. placeholder="请选择"
  70. ></el-input>
  71. </el-form-item>
  72. </el-col>
  73. <el-col :span="12">
  74. <el-form-item label="状态:" style="margin-bottom: 22px">
  75. <el-select v-model="form.status" style="width: 100%">
  76. <el-option label="开启" :value="1"></el-option>
  77. <el-option label="关闭" :value="0"></el-option>
  78. </el-select>
  79. </el-form-item>
  80. </el-col>
  81. <el-col :span="12">
  82. <el-form-item label="排序:" style="margin-bottom: 22px">
  83. <el-input v-model="form.sort" placeholder="请选择"></el-input>
  84. </el-form-item>
  85. </el-col>
  86. </el-row>
  87. </el-form>
  88. <headerTitle
  89. title="企业信息"
  90. style="margin-top: 30px"
  91. v-if="['10', '20'].includes(form.type)"
  92. ></headerTitle>
  93. <el-form
  94. ref="enterpriseForm"
  95. :model="enterprise"
  96. :rules="enterpriseRules"
  97. label-width="140px"
  98. v-if="['10', '20'].includes(form.type)"
  99. >
  100. <el-row :gutter="15">
  101. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  102. <el-form-item label="企业名称:" prop="name">
  103. <el-input
  104. clearable
  105. :maxlength="50"
  106. v-model="enterprise.name"
  107. placeholder="请输入企业名称"
  108. :disabled="true"
  109. />
  110. </el-form-item>
  111. </el-col>
  112. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  113. <el-form-item label="企业地址:" prop="address">
  114. <el-input
  115. clearable
  116. :maxlength="50"
  117. v-model="enterprise.address"
  118. placeholder="请输入企业地址"
  119. />
  120. </el-form-item>
  121. </el-col>
  122. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  123. <el-form-item label="企业电话:" prop="tel">
  124. <el-input
  125. clearable
  126. :maxlength="20"
  127. v-model="enterprise.tel"
  128. placeholder="请输入企业电话"
  129. />
  130. </el-form-item>
  131. </el-col>
  132. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  133. <el-form-item label="工商注册号:" prop="businessRegistrationNo">
  134. <el-input
  135. clearable
  136. v-model="enterprise.businessRegistrationNo"
  137. placeholder="请输入工商注册号"
  138. />
  139. </el-form-item>
  140. </el-col>
  141. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  142. <el-form-item label="联系人:" prop="contact">
  143. <el-input
  144. clearable
  145. v-model="enterprise.contact"
  146. placeholder="请输入联系人"
  147. />
  148. </el-form-item>
  149. </el-col>
  150. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  151. <el-form-item label="登记日期:" prop="registerDate">
  152. <el-date-picker
  153. style="width: 100%"
  154. clearable
  155. v-model="enterprise.registerDate"
  156. type="date"
  157. value-format="yyyy-MM-dd"
  158. placeholder="请选择日期"
  159. >
  160. </el-date-picker>
  161. </el-form-item>
  162. </el-col>
  163. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  164. <el-form-item label="统一社会性代码:" prop="unifiedSocialCreditCode">
  165. <el-input
  166. clearable
  167. :maxlength="50"
  168. v-model="enterprise.unifiedSocialCreditCode"
  169. placeholder="请输入统一社会性代码"
  170. />
  171. </el-form-item>
  172. </el-col>
  173. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  174. <el-form-item label="经营范围:" prop="businessScope">
  175. <el-input
  176. clearable
  177. type="textarea"
  178. :maxlength="100"
  179. v-model="enterprise.businessScope"
  180. placeholder="请输入经营范围"
  181. />
  182. </el-form-item>
  183. </el-col>
  184. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  185. <el-form-item label="经营产品:" prop="mainProduct">
  186. <el-input
  187. clearable
  188. type="textarea"
  189. :maxlength="100"
  190. v-model="enterprise.mainProduct"
  191. placeholder="请输入经营产品"
  192. />
  193. </el-form-item>
  194. </el-col>
  195. <el-col
  196. v-bind="styleResponsive ? { sm: 12 } : { span: 12 }"
  197. style="margin-bottom: 20px"
  198. >
  199. <el-form-item label="企业传真:" prop="fax">
  200. <el-input
  201. clearable
  202. v-model="enterprise.fax"
  203. placeholder="请输入企业传真"
  204. />
  205. </el-form-item>
  206. </el-col>
  207. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  208. <el-form-item prop="files" label="附件:">
  209. <fileUpload
  210. v-model="enterprise.businessLicenseFile"
  211. module="main"
  212. :showLib="false"
  213. :limit="10"
  214. />
  215. </el-form-item>
  216. </el-col>
  217. </el-row>
  218. </el-form>
  219. <headerTitle
  220. title="部门信息"
  221. style="margin-top: 30px"
  222. v-if="isDeptType"
  223. >
  224. <el-button
  225. type="primary"
  226. size="small"
  227. icon="el-icon-plus"
  228. class="ele-btn-icon"
  229. @click="addDeptPosition"
  230. >
  231. 新增
  232. </el-button>
  233. </headerTitle>
  234. <el-table
  235. v-if="isDeptType"
  236. :data="departmentPositionList"
  237. border
  238. class="dept-position-table"
  239. >
  240. <el-table-column type="index" label="序号" width="80" align="center" />
  241. <el-table-column label="岗位名称" min-width="160" align="center">
  242. <template slot-scope="{ row }">
  243. <el-select
  244. v-if="!row.id"
  245. v-model="row.positionId"
  246. filterable
  247. clearable
  248. placeholder="请选择"
  249. style="width: 100%"
  250. @change="onDeptPositionNameChange(row)"
  251. >
  252. <el-option
  253. v-for="item in positionList"
  254. :key="item.id"
  255. :label="item.positionName"
  256. :value="item.id"
  257. />
  258. </el-select>
  259. <span v-else>{{ row.positionName }}</span>
  260. </template>
  261. </el-table-column>
  262. <el-table-column label="岗位层级" min-width="140" align="center">
  263. <template slot-scope="{ row }">
  264. <el-select
  265. v-if="!row.id"
  266. v-model="row.positionLevelId"
  267. filterable
  268. clearable
  269. placeholder="请选择"
  270. style="width: 100%"
  271. :disabled="!row.positionId"
  272. @change="onDeptPositionLevelChange(row)"
  273. >
  274. <el-option
  275. v-for="item in row.levelOptions"
  276. :key="item.positionLevelId"
  277. :label="item.positionLevel"
  278. :value="item.positionLevelId"
  279. />
  280. </el-select>
  281. <span v-else>{{ row.positionLevel }}</span>
  282. </template>
  283. </el-table-column>
  284. <el-table-column label="编制人数" min-width="120" align="center">
  285. <template slot-scope="{ row }">
  286. <el-input-number
  287. v-model="row.establishmentCount"
  288. :min="0"
  289. :precision="0"
  290. controls-position="right"
  291. style="width: 100%"
  292. />
  293. </template>
  294. </el-table-column>
  295. <el-table-column label="操作" width="80" align="center">
  296. <template slot-scope="{ row }">
  297. <el-link
  298. type="danger"
  299. :underline="false"
  300. @click="removeDeptPosition(row)"
  301. >
  302. 删除
  303. </el-link>
  304. </template>
  305. </el-table-column>
  306. </el-table>
  307. <!-- <headerTitle
  308. title="工厂信息"
  309. style="margin-top: 30px"
  310. v-if="['40'].includes(form.type)"
  311. ></headerTitle>
  312. <el-form
  313. ref="factoryFormRef"
  314. :model="factoryForm"
  315. :rules="factoryForm"
  316. label-width="100px"
  317. v-if="['40'].includes(form.type)"
  318. >
  319. <el-row>
  320. <el-col :span="12">
  321. <el-form-item label="工厂编码:" prop="code">
  322. <el-input
  323. clearable
  324. :maxlength="20"
  325. v-model="factoryForm.code"
  326. placeholder="请输入"
  327. />
  328. </el-form-item>
  329. </el-col>
  330. <el-col :span="12">
  331. <el-form-item label="工厂名称:" prop="name">
  332. <el-input
  333. clearable
  334. :maxlength="20"
  335. :disabled="true"
  336. v-model="factoryForm.name"
  337. placeholder="请输入"
  338. />
  339. </el-form-item>
  340. </el-col>
  341. <el-col :span="12">
  342. <el-form-item label="所属公司:" prop="groupId">
  343. <org-select
  344. v-model="factoryForm.groupId"
  345. :data="organizationList"
  346. placeholder="请选择"
  347. />
  348. </el-form-item>
  349. </el-col>
  350. <el-col :span="12">
  351. <el-form-item label="状态:" prop="enabled">
  352. <div class="location-warp">
  353. <el-select v-model="factoryForm.enabled" style="width: 100%" disabled>
  354. <el-option label="生效" :value="1"></el-option>
  355. <el-option label="未生效" :value="0"></el-option>
  356. </el-select>
  357. </div>
  358. </el-form-item>
  359. </el-col>
  360. <el-col :span="12">
  361. <el-form-item label="负责人:" prop="leaderId">
  362. <el-input
  363. @click.native="openStaffSelection"
  364. v-model="factoryForm.responsibleName"
  365. :disabled="true"
  366. placeholder="请选择"
  367. ></el-input>
  368. </el-form-item>
  369. </el-col>
  370. <el-col :span="24">
  371. <el-form-item label="所属区域:" prop="location_city">
  372. <area-select
  373. v-model="factoryForm.areaId"
  374. @checkedKeys="getAreaInfo"
  375. :data="areaTreeList"
  376. ref="tree"
  377. />
  378. </el-form-item>
  379. </el-col>
  380. <el-col :span="24">
  381. <el-form-item label="地址:" prop="location_city">
  382. <div class="location-warp">
  383. <el-cascader
  384. clearable
  385. style="width: 385px"
  386. v-model="factoryForm.extInfo.location"
  387. :options="cityDataLabel"
  388. ></el-cascader>
  389. <el-input
  390. class="detail"
  391. clearable
  392. :maxlength="20"
  393. v-model="factoryForm.extInfo.locationDetail"
  394. placeholder="请输入详细地址"
  395. />
  396. </div>
  397. </el-form-item>
  398. </el-col>
  399. </el-row>
  400. </el-form> -->
  401. <template v-slot:footer>
  402. <el-button @click="updateVisible(false)">取消</el-button>
  403. <el-button type="primary" :loading="loading" @click="save">
  404. 保存
  405. </el-button>
  406. </template>
  407. <staffSelection
  408. ref="staffSelection"
  409. @confirm="confirmStaffSelection"
  410. ></staffSelection>
  411. <addUser ref="addUserRef" @success="userBk"></addUser>
  412. </ele-modal>
  413. </template>
  414. <script>
  415. import OrgSelect from './org-select.vue';
  416. import OrgTypeSelect from './org-type-select.vue';
  417. import staffSelection from './staffSelection.vue';
  418. import fileUpload from '@/components/upload/fileUpload';
  419. import AreaSelect from '@/views/enterpriseModel/regionalManage/components/area-cascader.vue';
  420. import addUser from '@/views/system/user/components/add.vue';
  421. const defEnterprise = {
  422. businessLicenseFile: [],
  423. name: null,
  424. address: null,
  425. tel: '',
  426. registerDate: '',
  427. unifiedSocialCreditCode: '',
  428. businessScope: '',
  429. mainProduct: '',
  430. remark: '',
  431. fax: ''
  432. };
  433. const defFactoryForm = {
  434. id: '',
  435. code: '',
  436. name: '',
  437. groupId: '',
  438. areaId: '',
  439. areaName: '',
  440. extInfo: {
  441. principalDep: '', // 负责人部门
  442. location: [],
  443. locationDetail: ''
  444. },
  445. areaIdList: [],
  446. enabled: 1,
  447. parentId: 0,
  448. leaderId: '',
  449. type: 1 // FACTORY(1, "工厂"), WORKSHOP_PLAN(2, "厂房"), WORKSHOP(3, "车间"), LINE(4, "厂线");
  450. };
  451. import {
  452. addOrganization,
  453. updateOrganization,
  454. getById,
  455. getCode,
  456. getDepartmentPositionPage,
  457. saveDepartmentPositionBatch,
  458. deleteDepartmentPosition,
  459. getHrPositionPage,
  460. getHrPositionById
  461. } from '@/api/system/organization';
  462. import { basicAreaPageAPI } from '@/api/regionalManage';
  463. import { cityDataLabel } from 'ele-admin/packages/utils/regions';
  464. export default {
  465. components: {
  466. OrgSelect,
  467. OrgTypeSelect,
  468. staffSelection,
  469. fileUpload,
  470. AreaSelect,
  471. addUser
  472. },
  473. props: {
  474. // 弹窗是否打开
  475. visible: Boolean,
  476. // 修改回显的数据
  477. data: Object,
  478. // 上级id
  479. parentId: [Number, String],
  480. // 机构数据
  481. organizationList: Array
  482. },
  483. data() {
  484. const defaultForm = {
  485. id: null,
  486. parentId: null,
  487. name: '',
  488. type: '',
  489. sort: null,
  490. status: 1,
  491. manager: [],
  492. groupCode: '',
  493. managerFirst: [],
  494. businessRegistrationNo:'',
  495. contact:''
  496. };
  497. return {
  498. defaultForm,
  499. responsibleName: '',
  500. // 表单数据
  501. form: { ...defaultForm },
  502. enterprise: { ...defEnterprise },
  503. factoryForm: {
  504. ...defFactoryForm
  505. },
  506. managerFirst: {},
  507. cityDataLabel,
  508. // 表单验证规则
  509. rules: {
  510. groupCode: [
  511. { required: true, message: '请输入编码', trigger: 'blur' }
  512. ],
  513. name: [
  514. { required: true, message: '请输入机构名称', trigger: 'blur' }
  515. ],
  516. manager: [
  517. { required: true, message: '请选择负责人', trigger: 'blur' }
  518. ],
  519. type: [{ required: true, message: '请选择机构类型', trigger: 'blur' }]
  520. },
  521. // 表单验证规则
  522. enterpriseRules: {
  523. name: [
  524. { required: true, message: '请输入企业名称', trigger: 'blur' }
  525. ],
  526. address: [
  527. { required: true, message: '请输入企业地址', trigger: 'blur' }
  528. ],
  529. unifiedSocialCreditCode: [
  530. { required: true, message: '请输入统一社会性代码', trigger: 'blur' }
  531. ]
  532. },
  533. // 提交状态
  534. loading: false,
  535. // 是否是修改
  536. isUpdate: false,
  537. departmentPositionList: [],
  538. positionList: []
  539. };
  540. },
  541. computed: {
  542. // 是否开启响应式布局
  543. styleResponsive() {
  544. return this.$store.state.theme.styleResponsive;
  545. },
  546. isDeptType() {
  547. return String(this.form.type) === '30';
  548. }
  549. },
  550. created() {
  551. this.getBasicAreaList();
  552. },
  553. methods: {
  554. /* 保存编辑 */
  555. async save() {
  556. if (!(await this.formValidate())) {
  557. return false;
  558. }
  559. if (
  560. ['10', '20'].includes(this.form.type) &&
  561. !(await this.enterpriseValidate())
  562. ) {
  563. return false;
  564. }
  565. let form = {
  566. ...this.form,
  567. managerFirst: this.managerFirst?.name ? [this.managerFirst] : []
  568. };
  569. if (['10', '20'].includes(this.form.type)) {
  570. form['enterprise'] = this.enterprise;
  571. }
  572. this.loading = true;
  573. const data = {
  574. ...form,
  575. parentId: this.form.parentId || 0
  576. };
  577. if (!this.isUpdate) {
  578. delete data.id;
  579. }
  580. const saveOrUpdate = this.isUpdate
  581. ? updateOrganization
  582. : addOrganization;
  583. const submit = async () => {
  584. if (this.isDeptType) {
  585. const payload = this.buildDepartmentPositionPayload();
  586. if (payload === false) {
  587. return;
  588. }
  589. if (payload.length) {
  590. await saveDepartmentPositionBatch(payload);
  591. }
  592. }
  593. const msg = await saveOrUpdate(data);
  594. this.$message.success(msg);
  595. this.updateVisible(false);
  596. this.$emit('done');
  597. };
  598. submit()
  599. .catch(() => {})
  600. .finally(() => {
  601. this.loading = false;
  602. });
  603. },
  604. createDeptPositionRow() {
  605. return {
  606. id: null,
  607. positionId: '',
  608. positionName: '',
  609. positionLevel: '',
  610. positionLevelId: '',
  611. establishmentCount: undefined,
  612. levelOptions: []
  613. };
  614. },
  615. buildDepartmentPositionPayload() {
  616. if (!this.form.id) {
  617. return [];
  618. }
  619. const rows = [];
  620. for (const row of this.departmentPositionList) {
  621. const isNew = !row.id;
  622. const emptyNew =
  623. isNew &&
  624. !row.positionId &&
  625. !row.positionLevelId &&
  626. (row.establishmentCount === undefined ||
  627. row.establishmentCount === null ||
  628. row.establishmentCount === '');
  629. if (emptyNew) {
  630. continue;
  631. }
  632. if (
  633. !row.positionId ||
  634. !row.positionName ||
  635. !row.positionLevelId ||
  636. row.establishmentCount === undefined ||
  637. row.establishmentCount === null ||
  638. row.establishmentCount === ''
  639. ) {
  640. this.$message.warning('请完善部门岗位信息');
  641. return false;
  642. }
  643. rows.push({
  644. ...(row.id ? { id: row.id } : {}),
  645. deptId: this.form.id,
  646. positionId: row.positionId,
  647. positionName: row.positionName,
  648. positionLevelId: row.positionLevelId,
  649. positionLevel: row.positionLevel,
  650. establishmentCount: Number(row.establishmentCount)
  651. });
  652. }
  653. return rows;
  654. },
  655. isDeptPositionFilled(row) {
  656. return (
  657. !!row.positionId &&
  658. !!row.positionLevelId &&
  659. row.establishmentCount !== undefined &&
  660. row.establishmentCount !== null &&
  661. row.establishmentCount !== ''
  662. );
  663. },
  664. addDeptPosition() {
  665. if (
  666. this.departmentPositionList.some(
  667. (item) => !this.isDeptPositionFilled(item)
  668. )
  669. ) {
  670. this.$message.warning('请先填写岗位名称、岗位层级和编制人数');
  671. return;
  672. }
  673. this.ensurePositionOptions();
  674. this.departmentPositionList.push(this.createDeptPositionRow());
  675. },
  676. async removeDeptPosition(row) {
  677. const list = this.departmentPositionList;
  678. const index = list.indexOf(row);
  679. if (index < 0) {
  680. return;
  681. }
  682. if (!row.id) {
  683. list.splice(index, 1);
  684. return;
  685. }
  686. try {
  687. await this.$confirm('确定删除该岗位编制吗?', '提示', {
  688. type: 'warning'
  689. });
  690. await deleteDepartmentPosition(row.id);
  691. list.splice(index, 1);
  692. this.$message.success('删除成功');
  693. } catch (e) {}
  694. },
  695. async ensurePositionOptions() {
  696. if (this.positionList.length) {
  697. return;
  698. }
  699. const res = await getHrPositionPage({
  700. pageNum: 1,
  701. size: 9999,
  702. status: 1
  703. });
  704. this.positionList = (res && res.list) || [];
  705. },
  706. async onDeptPositionNameChange(row) {
  707. row.positionLevel = '';
  708. row.positionLevelId = '';
  709. row.levelOptions = [];
  710. const position = this.positionList.find(
  711. (item) => item.id === row.positionId
  712. );
  713. row.positionName = position ? position.positionName : '';
  714. if (!row.positionId) {
  715. return;
  716. }
  717. const detail = await getHrPositionById(row.positionId);
  718. const configs = (detail && detail.levelConfigs) || [];
  719. row.levelOptions = configs
  720. .filter((item) => item.positionLevelId)
  721. .map((item) => ({
  722. positionLevelId: item.positionLevelId,
  723. positionLevel: item.positionLevel
  724. }));
  725. },
  726. onDeptPositionLevelChange(row) {
  727. const level = (row.levelOptions || []).find(
  728. (item) => item.positionLevelId === row.positionLevelId
  729. );
  730. row.positionLevel = level ? level.positionLevel : '';
  731. },
  732. async loadDepartmentPositions() {
  733. if (!this.form.id || !this.isDeptType) {
  734. this.departmentPositionList = [];
  735. return;
  736. }
  737. await this.ensurePositionOptions();
  738. const res = await getDepartmentPositionPage({
  739. deptId: this.form.id,
  740. pageNum: 1,
  741. size: 9999
  742. });
  743. this.departmentPositionList = ((res && res.list) || []).map((item) => ({
  744. ...item,
  745. levelOptions: []
  746. }));
  747. },
  748. resetDepartmentPosition() {
  749. this.departmentPositionList = [];
  750. this.positionList = [];
  751. },
  752. formValidate() {
  753. return new Promise((resolve, reject) => {
  754. this.$refs.form.validate((valid) => {
  755. resolve(valid);
  756. });
  757. });
  758. },
  759. getAreaInfo(nodeInfo) {
  760. this.factoryForm.areaName = nodeInfo[0]?.pathLabels.join('/') || '';
  761. this.factoryForm.areaId = this.factoryForm.areaId || '';
  762. },
  763. enterpriseValidate() {
  764. return new Promise((resolve, reject) => {
  765. this.$refs.enterpriseForm.validate((valid) => {
  766. resolve(valid);
  767. });
  768. });
  769. },
  770. /* 获取区域集合 */
  771. async getBasicAreaList() {
  772. this.areaList = await basicAreaPageAPI({
  773. pageNum: 1,
  774. size: 9999
  775. });
  776. this.areaTreeList = this.$util.toTreeData({
  777. data: this.areaList,
  778. idField: 'id',
  779. parentIdField: 'parentId'
  780. });
  781. },
  782. //选择负责人
  783. confirmStaffSelection(data) {
  784. this.form.manager = JSON.parse(JSON.stringify(data));
  785. this.responsibleName = data.map((item) => item.name).toString();
  786. },
  787. addOpen() {
  788. this.$refs.addUserRef.open();
  789. },
  790. clearManagerFirst() {
  791. this.managerFirst = {};
  792. this.form.managerFirst = [];
  793. },
  794. userBk(data) {
  795. this.managerFirst = data;
  796. this.form.managerFirst = data?.name ? [data] : [];
  797. },
  798. openStaffSelection() {
  799. console.log(this.form.manager);
  800. this.$refs.staffSelection.open(
  801. JSON.parse(JSON.stringify(this.form.manager)) || []
  802. );
  803. },
  804. /* 更新visible */
  805. updateVisible(value) {
  806. this.$emit('update:visible', value);
  807. }
  808. },
  809. watch: {
  810. form: {
  811. deep: true,
  812. handler(n) {
  813. this.enterprise.name = n.name;
  814. this.factoryForm.name = n.name;
  815. }
  816. },
  817. 'form.type'(val) {
  818. if (this.visible && String(val) === '30' && this.form.id) {
  819. this.loadDepartmentPositions();
  820. }
  821. },
  822. visible(visible) {
  823. if (visible) {
  824. if (this.data) {
  825. getById(this.data.id).then((res) => {
  826. for (const key in res.enterprise) {
  827. this.$set(this.enterprise, key, res.enterprise[key]);
  828. }
  829. for (const key in res) {
  830. if (key == 'parentId') {
  831. this.$set(
  832. this.form,
  833. key,
  834. res[key] == 0 ? '' : res[key] ?? ''
  835. );
  836. }
  837. if (key != 'enterprise') {
  838. this.$set(this.form, key, res[key]);
  839. }
  840. }
  841. this.form.type = '' + this.form.type; //回显
  842. if (this.form?.managerFirst.length) {
  843. this.managerFirst = this.form.managerFirst[0];
  844. }
  845. this.responsibleName =
  846. res.manager && res.manager.map((item) => item.name).toString();
  847. this.loadDepartmentPositions();
  848. });
  849. // this.form.type = '' + this.form.type; //回显
  850. // this.responsibleName =
  851. // this.data.manager &&
  852. // this.data.manager.map((item) => item.name).toString();
  853. this.isUpdate = true;
  854. } else {
  855. this.form.parentId = this.parentId;
  856. getCode().then((res) => {
  857. this.form.groupCode = res;
  858. });
  859. this.isUpdate = false;
  860. }
  861. } else {
  862. this.$refs.form.clearValidate();
  863. this.$refs.enterpriseForm &&
  864. this.$refs.enterpriseForm.clearValidate();
  865. this.form = { ...this.defaultForm };
  866. this.enterprise = { ...defEnterprise };
  867. this.managerFirst = {};
  868. this.responsibleName = '';
  869. this.resetDepartmentPosition();
  870. }
  871. }
  872. }
  873. };
  874. </script>
  875. <style scoped>
  876. .dept-position-table {
  877. width: 100%;
  878. margin-bottom: 10px;
  879. }
  880. </style>