org-edit.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  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="编码:">
  16. <el-input
  17. clearable
  18. :maxlength="20"
  19. v-model="form.groupCode"
  20. :disabled="true"
  21. />
  22. </el-form-item>
  23. </el-col>
  24. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  25. <el-form-item label="上级机构:">
  26. <org-select
  27. v-model="form.parentId"
  28. :data="organizationList"
  29. placeholder="请选择上级机构"
  30. />
  31. </el-form-item>
  32. </el-col>
  33. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  34. <el-form-item label="机构名称:" prop="name">
  35. <el-input
  36. clearable
  37. :maxlength="20"
  38. v-model="form.name"
  39. placeholder="请输入机构名称"
  40. />
  41. </el-form-item>
  42. </el-col>
  43. <el-col :span="12">
  44. <el-form-item
  45. label="机构类型:"
  46. prop="type"
  47. style="margin-bottom: 22px"
  48. >
  49. <DictSelection
  50. dictName="机构类型"
  51. clearable
  52. v-model="form.type"
  53. labelName="dictValue"
  54. >
  55. </DictSelection>
  56. </el-form-item>
  57. </el-col>
  58. <el-col :span="12">
  59. <el-form-item label="一级负责人:" style="margin-bottom: 22px">
  60. <el-input
  61. @focus="addOpen"
  62. @clear="clearManagerFirst"
  63. v-model="managerFirst.name"
  64. placeholder="请选择"
  65. clearable
  66. ></el-input>
  67. </el-form-item>
  68. </el-col>
  69. <el-col :span="12">
  70. <el-form-item label="二级负责人:" style="margin-bottom: 22px">
  71. <el-input
  72. @click.native="openStaffSelection"
  73. v-model="responsibleName"
  74. placeholder="请选择"
  75. ></el-input>
  76. </el-form-item>
  77. </el-col>
  78. <el-col :span="12">
  79. <el-form-item label="排序:" style="margin-bottom: 22px">
  80. <el-input v-model="form.sort" placeholder="请选择"></el-input>
  81. </el-form-item>
  82. </el-col>
  83. </el-row>
  84. </el-form>
  85. <headerTitle
  86. title="企业信息"
  87. style="margin-top: 30px"
  88. v-if="['10', '20'].includes(form.type)"
  89. ></headerTitle>
  90. <el-form
  91. ref="enterpriseForm"
  92. :model="enterprise"
  93. :rules="enterpriseRules"
  94. label-width="140px"
  95. v-if="['10', '20'].includes(form.type)"
  96. >
  97. <el-row :gutter="15">
  98. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  99. <el-form-item label="企业名称:" prop="name">
  100. <el-input
  101. clearable
  102. :maxlength="50"
  103. v-model="enterprise.name"
  104. placeholder="请输入企业名称"
  105. :disabled="true"
  106. />
  107. </el-form-item>
  108. </el-col>
  109. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  110. <el-form-item label="企业地址:" prop="address">
  111. <el-input
  112. clearable
  113. :maxlength="50"
  114. v-model="enterprise.address"
  115. placeholder="请输入企业地址"
  116. />
  117. </el-form-item>
  118. </el-col>
  119. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  120. <el-form-item label="企业电话:" prop="tel">
  121. <el-input
  122. clearable
  123. :maxlength="20"
  124. v-model="enterprise.tel"
  125. placeholder="请输入企业电话"
  126. />
  127. </el-form-item>
  128. </el-col>
  129. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  130. <el-form-item label="工商注册号:" prop="businessRegistrationNo">
  131. <el-input
  132. clearable
  133. v-model="enterprise.businessRegistrationNo"
  134. placeholder="请输入工商注册号"
  135. />
  136. </el-form-item>
  137. </el-col>
  138. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  139. <el-form-item label="联系人:" prop="contact">
  140. <el-input
  141. clearable
  142. v-model="enterprise.contact"
  143. placeholder="请输入联系人"
  144. />
  145. </el-form-item>
  146. </el-col>
  147. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  148. <el-form-item label="登记日期:" prop="registerDate">
  149. <el-date-picker
  150. style="width: 100%"
  151. clearable
  152. v-model="enterprise.registerDate"
  153. type="date"
  154. value-format="yyyy-MM-dd"
  155. placeholder="请选择日期"
  156. >
  157. </el-date-picker>
  158. </el-form-item>
  159. </el-col>
  160. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  161. <el-form-item label="统一社会性代码:" prop="unifiedSocialCreditCode">
  162. <el-input
  163. clearable
  164. :maxlength="50"
  165. v-model="enterprise.unifiedSocialCreditCode"
  166. placeholder="请输入统一社会性代码"
  167. />
  168. </el-form-item>
  169. </el-col>
  170. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  171. <el-form-item label="经营范围:" prop="businessScope">
  172. <el-input
  173. clearable
  174. type="textarea"
  175. :maxlength="100"
  176. v-model="enterprise.businessScope"
  177. placeholder="请输入经营范围"
  178. />
  179. </el-form-item>
  180. </el-col>
  181. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  182. <el-form-item label="经营产品:" prop="mainProduct">
  183. <el-input
  184. clearable
  185. type="textarea"
  186. :maxlength="100"
  187. v-model="enterprise.mainProduct"
  188. placeholder="请输入经营产品"
  189. />
  190. </el-form-item>
  191. </el-col>
  192. <el-col
  193. v-bind="styleResponsive ? { sm: 12 } : { span: 12 }"
  194. style="margin-bottom: 20px"
  195. >
  196. <el-form-item label="企业传真:" prop="fax">
  197. <el-input
  198. clearable
  199. v-model="enterprise.fax"
  200. placeholder="请输入企业传真"
  201. />
  202. </el-form-item>
  203. </el-col>
  204. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  205. <el-form-item prop="files" label="附件:">
  206. <fileUpload
  207. v-model="enterprise.businessLicenseFile"
  208. module="main"
  209. :showLib="false"
  210. :limit="10"
  211. />
  212. </el-form-item>
  213. </el-col>
  214. </el-row>
  215. </el-form>
  216. <template v-slot:footer>
  217. <el-button @click="updateVisible(false)">取消</el-button>
  218. <el-button type="primary" :loading="loading" @click="save">
  219. 保存
  220. </el-button>
  221. </template>
  222. <staffSelection
  223. ref="staffSelection"
  224. @confirm="confirmStaffSelection"
  225. ></staffSelection>
  226. <addUser ref="addUserRef" @success="userBk"></addUser>
  227. </ele-modal>
  228. </template>
  229. <script>
  230. import OrgSelect from './org-select.vue';
  231. import OrgTypeSelect from './org-type-select.vue';
  232. import staffSelection from './staffSelection.vue';
  233. import fileUpload from '@/components/upload/fileUpload';
  234. import { copyObj } from '@/utils/util';
  235. import addUser from '@/views/system/user/components/add.vue';
  236. const defEnterprise = {
  237. businessLicenseFile: [],
  238. name: null,
  239. address: null,
  240. tel: '',
  241. registerDate: '',
  242. unifiedSocialCreditCode: '',
  243. businessScope: '',
  244. mainProduct: '',
  245. remark: '',
  246. fax: '',
  247. businessRegistrationNo: '',
  248. contact: ''
  249. };
  250. import {
  251. addOrganization,
  252. updateOrganization,
  253. getById,
  254. getCode
  255. } from '@/api/system/organization';
  256. export default {
  257. components: {
  258. OrgSelect,
  259. OrgTypeSelect,
  260. staffSelection,
  261. fileUpload,
  262. addUser
  263. },
  264. props: {
  265. // 弹窗是否打开
  266. visible: Boolean,
  267. // 修改回显的数据
  268. data: Object,
  269. // 上级id
  270. parentId: [Number, String],
  271. // 机构数据
  272. organizationList: Array
  273. },
  274. data() {
  275. const defaultForm = {
  276. id: null,
  277. parentId: null,
  278. name: '',
  279. type: '',
  280. sort: null,
  281. manager: [],
  282. groupCode: '',
  283. managerFirst: []
  284. };
  285. return {
  286. defaultForm,
  287. responsibleName: '',
  288. managerFirst: {},
  289. // 表单数据
  290. form: { ...defaultForm },
  291. enterprise: { ...defEnterprise },
  292. // 表单验证规则
  293. rules: {
  294. name: [
  295. { required: true, message: '请输入机构名称', trigger: 'blur' }
  296. ],
  297. manager: [
  298. { required: true, message: '请选择负责人', trigger: 'blur' }
  299. ],
  300. type: [{ required: true, message: '请选择机构类型', trigger: 'blur' }]
  301. },
  302. // 表单验证规则
  303. enterpriseRules: {
  304. name: [
  305. { required: true, message: '请输入企业名称', trigger: 'blur' }
  306. ],
  307. address: [
  308. { required: true, message: '请输入企业地址', trigger: 'blur' }
  309. ],
  310. unifiedSocialCreditCode: [
  311. { required: true, message: '请输入统一社会性代码', trigger: 'blur' }
  312. ]
  313. },
  314. // 提交状态
  315. loading: false,
  316. // 是否是修改
  317. isUpdate: false
  318. };
  319. },
  320. computed: {
  321. // 是否开启响应式布局
  322. styleResponsive() {
  323. return this.$store.state.theme.styleResponsive;
  324. }
  325. },
  326. methods: {
  327. /* 保存编辑 */
  328. async save() {
  329. if (!(await this.formValidate())) {
  330. return false;
  331. }
  332. if (
  333. ['10', '20'].includes(this.form.type) &&
  334. !(await this.enterpriseValidate())
  335. ) {
  336. return false;
  337. }
  338. let form = {
  339. ...this.form
  340. };
  341. if (['10', '20'].includes(this.form.type)) {
  342. form['enterprise'] = this.enterprise;
  343. }
  344. if (this.managerFirst?.name) {
  345. this.form.managerFirst[0] = this.managerFirst;
  346. }
  347. this.loading = true;
  348. const data = {
  349. ...form,
  350. parentId: this.form.parentId || 0
  351. };
  352. if (!this.isUpdate) {
  353. delete data.id;
  354. }
  355. const saveOrUpdate = this.isUpdate
  356. ? updateOrganization
  357. : addOrganization;
  358. saveOrUpdate(data)
  359. .then((msg) => {
  360. this.loading = false;
  361. this.$message.success(msg);
  362. this.updateVisible(false);
  363. this.$emit('done');
  364. })
  365. .catch((e) => {
  366. this.loading = false;
  367. // this.$message.error(e.message);
  368. });
  369. },
  370. formValidate() {
  371. return new Promise((resolve, reject) => {
  372. this.$refs.form.validate((valid) => {
  373. resolve(valid);
  374. });
  375. });
  376. },
  377. enterpriseValidate() {
  378. return new Promise((resolve, reject) => {
  379. this.$refs.enterpriseForm.validate((valid) => {
  380. resolve(valid);
  381. });
  382. });
  383. },
  384. //选择负责人
  385. confirmStaffSelection(data) {
  386. this.form.manager = JSON.parse(JSON.stringify(data));
  387. this.responsibleName = data.map((item) => item.name).toString();
  388. },
  389. openStaffSelection() {
  390. console.log(this.form.manager);
  391. this.$refs.staffSelection.open(
  392. JSON.parse(JSON.stringify(this.form.manager)) || []
  393. );
  394. },
  395. addOpen() {
  396. this.$refs.addUserRef.open();
  397. },
  398. clearManagerFirst() {
  399. this.managerFirst = {};
  400. },
  401. userBk(data) {
  402. this.managerFirst = data;
  403. },
  404. /* 更新visible */
  405. updateVisible(value) {
  406. this.$emit('update:visible', value);
  407. }
  408. },
  409. watch: {
  410. form: {
  411. deep: true,
  412. handler(n) {
  413. this.enterprise.name = n.name;
  414. }
  415. },
  416. visible(visible) {
  417. if (visible) {
  418. if (this.data) {
  419. getById(this.data.id).then((res) => {
  420. for (const key in res.enterprise) {
  421. this.$set(this.enterprise, key, res.enterprise[key]);
  422. }
  423. for (const key in res) {
  424. if (key == 'parentId') {
  425. this.$set(
  426. this.form,
  427. key,
  428. res[key] == 0 ? '' : res[key] ?? ''
  429. );
  430. }
  431. if (key != 'enterprise') {
  432. this.$set(this.form, key, res[key]);
  433. }
  434. }
  435. this.form.type = '' + this.form.type; //回显
  436. if (this.form?.managerFirst.length) {
  437. this.managerFirst = this.form.managerFirst[0];
  438. }
  439. this.responsibleName =
  440. res.manager && res.manager.map((item) => item.name).toString();
  441. });
  442. // this.form.type = '' + this.form.type; //回显
  443. // this.responsibleName =
  444. // this.data.manager &&
  445. // this.data.manager.map((item) => item.name).toString();
  446. this.isUpdate = true;
  447. } else {
  448. this.form.parentId = this.parentId;
  449. getCode().then((res) => {
  450. this.form.groupCode = res;
  451. });
  452. this.isUpdate = false;
  453. }
  454. } else {
  455. this.$refs.form.clearValidate();
  456. this.$refs.enterpriseForm &&
  457. this.$refs.enterpriseForm.clearValidate();
  458. this.form = { ...this.defaultForm };
  459. this.enterprise = { ...defEnterprise };
  460. this.managerFirst = {};
  461. this.responsibleName = '';
  462. }
  463. }
  464. }
  465. };
  466. </script>