org-edit.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  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. >
  11. <el-form ref="form" :model="form" :rules="rules" label-width="140px">
  12. <el-row :gutter="15">
  13. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  14. <el-form-item label="编码:">
  15. <el-input
  16. clearable
  17. :maxlength="20"
  18. v-model="form.groupCode"
  19. :disabled="true"
  20. />
  21. </el-form-item>
  22. </el-col>
  23. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  24. <el-form-item label="上级机构:">
  25. <org-select
  26. v-model="form.parentId"
  27. :data="organizationList"
  28. placeholder="请选择上级机构"
  29. />
  30. </el-form-item>
  31. </el-col>
  32. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  33. <el-form-item label="机构名称:" prop="name">
  34. <el-input
  35. clearable
  36. :maxlength="20"
  37. v-model="form.name"
  38. placeholder="请输入机构名称"
  39. />
  40. </el-form-item>
  41. </el-col>
  42. <el-col :span="12">
  43. <el-form-item
  44. label="机构类型:"
  45. prop="type"
  46. style="margin-bottom: 22px"
  47. >
  48. <DictSelection
  49. dictName="机构类型"
  50. clearable
  51. v-model="form.type"
  52. labelName="dictValue"
  53. >
  54. </DictSelection>
  55. </el-form-item>
  56. </el-col>
  57. <el-col :span="12">
  58. <el-form-item label="负责人:" style="margin-bottom: 22px">
  59. <el-input
  60. @click.native="openStaffSelection"
  61. v-model="responsibleName"
  62. placeholder="请选择"
  63. ></el-input>
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="12">
  67. <el-form-item label="状态:" style="margin-bottom: 22px">
  68. <el-select v-model="form.status" style="width: 100%">
  69. <el-option label="开启" :value="1"></el-option>
  70. <el-option label="关闭" :value="0"></el-option>
  71. </el-select>
  72. </el-form-item>
  73. </el-col>
  74. <el-col :span="12">
  75. <el-form-item label="排序:" style="margin-bottom: 22px">
  76. <el-input v-model="form.sort" placeholder="请选择"></el-input>
  77. </el-form-item>
  78. </el-col>
  79. </el-row>
  80. </el-form>
  81. <headerTitle
  82. title="企业信息"
  83. style="margin-top: 30px"
  84. v-if="['10', '20'].includes(form.type)"
  85. ></headerTitle>
  86. <el-form
  87. ref="enterpriseForm"
  88. :model="enterprise"
  89. :rules="enterpriseRules"
  90. label-width="140px"
  91. v-if="['10', '20'].includes(form.type)"
  92. >
  93. <el-row :gutter="15">
  94. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  95. <el-form-item label="企业名称:" prop="name">
  96. <el-input
  97. clearable
  98. :maxlength="50"
  99. v-model="enterprise.name"
  100. placeholder="请输入企业名称"
  101. :disabled="true"
  102. />
  103. </el-form-item>
  104. </el-col>
  105. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  106. <el-form-item label="企业地址:" prop="address">
  107. <el-input
  108. clearable
  109. :maxlength="50"
  110. v-model="enterprise.address"
  111. placeholder="请输入企业地址"
  112. />
  113. </el-form-item>
  114. </el-col>
  115. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  116. <el-form-item label="企业电话:" prop="tel">
  117. <el-input
  118. clearable
  119. :maxlength="20"
  120. v-model="enterprise.tel"
  121. placeholder="请输入企业电话"
  122. />
  123. </el-form-item>
  124. </el-col>
  125. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  126. <el-form-item label="登记日期:" prop="registerDate">
  127. <el-date-picker
  128. style="width: 100%"
  129. clearable
  130. v-model="enterprise.registerDate"
  131. type="date"
  132. value-format="yyyy-MM-dd"
  133. placeholder="请选择日期"
  134. >
  135. </el-date-picker>
  136. </el-form-item>
  137. </el-col>
  138. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  139. <el-form-item label="统一社会性代码:" prop="unifiedSocialCreditCode">
  140. <el-input
  141. clearable
  142. :maxlength="50"
  143. v-model="enterprise.unifiedSocialCreditCode"
  144. placeholder="请输入统一社会性代码"
  145. />
  146. </el-form-item>
  147. </el-col>
  148. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  149. <el-form-item label="经营范围:" prop="businessScope">
  150. <el-input
  151. clearable
  152. type="textarea"
  153. :maxlength="100"
  154. v-model="enterprise.businessScope"
  155. placeholder="请输入经营范围"
  156. />
  157. </el-form-item>
  158. </el-col>
  159. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  160. <el-form-item label="经营产品:" prop="mainProduct">
  161. <el-input
  162. clearable
  163. type="textarea"
  164. :maxlength="100"
  165. v-model="enterprise.mainProduct"
  166. placeholder="请输入经营产品"
  167. />
  168. </el-form-item>
  169. </el-col>
  170. <el-col
  171. v-bind="styleResponsive ? { sm: 12 } : { span: 12 }"
  172. style="margin-bottom: 20px"
  173. >
  174. <el-form-item label="企业传真:" prop="fax">
  175. <el-input
  176. clearable
  177. v-model="enterprise.fax"
  178. placeholder="请输入企业传真"
  179. />
  180. </el-form-item>
  181. </el-col>
  182. <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
  183. <el-form-item prop="files" label="附件:">
  184. <fileUpload
  185. v-model="enterprise.businessLicenseFile"
  186. module="main"
  187. :showLib="false"
  188. :limit="10"
  189. />
  190. </el-form-item>
  191. </el-col>
  192. </el-row>
  193. </el-form>
  194. <!-- <headerTitle
  195. title="工厂信息"
  196. style="margin-top: 30px"
  197. v-if="['40'].includes(form.type)"
  198. ></headerTitle>
  199. <el-form
  200. ref="factoryFormRef"
  201. :model="factoryForm"
  202. :rules="factoryForm"
  203. label-width="100px"
  204. v-if="['40'].includes(form.type)"
  205. >
  206. <el-row>
  207. <el-col :span="12">
  208. <el-form-item label="工厂编码:" prop="code">
  209. <el-input
  210. clearable
  211. :maxlength="20"
  212. v-model="factoryForm.code"
  213. placeholder="请输入"
  214. />
  215. </el-form-item>
  216. </el-col>
  217. <el-col :span="12">
  218. <el-form-item label="工厂名称:" prop="name">
  219. <el-input
  220. clearable
  221. :maxlength="20"
  222. :disabled="true"
  223. v-model="factoryForm.name"
  224. placeholder="请输入"
  225. />
  226. </el-form-item>
  227. </el-col>
  228. <el-col :span="12">
  229. <el-form-item label="所属公司:" prop="groupId">
  230. <org-select
  231. v-model="factoryForm.groupId"
  232. :data="organizationList"
  233. placeholder="请选择"
  234. />
  235. </el-form-item>
  236. </el-col>
  237. <el-col :span="12">
  238. <el-form-item label="状态:" prop="enabled">
  239. <div class="location-warp">
  240. <el-select v-model="factoryForm.enabled" style="width: 100%" disabled>
  241. <el-option label="生效" :value="1"></el-option>
  242. <el-option label="未生效" :value="0"></el-option>
  243. </el-select>
  244. </div>
  245. </el-form-item>
  246. </el-col>
  247. <el-col :span="12">
  248. <el-form-item label="负责人:" prop="leaderId">
  249. <el-input
  250. @click.native="openStaffSelection"
  251. v-model="factoryForm.responsibleName"
  252. :disabled="true"
  253. placeholder="请选择"
  254. ></el-input>
  255. </el-form-item>
  256. </el-col>
  257. <el-col :span="24">
  258. <el-form-item label="所属区域:" prop="location_city">
  259. <area-select
  260. v-model="factoryForm.areaId"
  261. @checkedKeys="getAreaInfo"
  262. :data="areaTreeList"
  263. ref="tree"
  264. />
  265. </el-form-item>
  266. </el-col>
  267. <el-col :span="24">
  268. <el-form-item label="地址:" prop="location_city">
  269. <div class="location-warp">
  270. <el-cascader
  271. clearable
  272. style="width: 385px"
  273. v-model="factoryForm.extInfo.location"
  274. :options="cityDataLabel"
  275. ></el-cascader>
  276. <el-input
  277. class="detail"
  278. clearable
  279. :maxlength="20"
  280. v-model="factoryForm.extInfo.locationDetail"
  281. placeholder="请输入详细地址"
  282. />
  283. </div>
  284. </el-form-item>
  285. </el-col>
  286. </el-row>
  287. </el-form> -->
  288. <template v-slot:footer>
  289. <el-button @click="updateVisible(false)">取消</el-button>
  290. <el-button type="primary" :loading="loading" @click="save">
  291. 保存
  292. </el-button>
  293. </template>
  294. <staffSelection
  295. ref="staffSelection"
  296. @confirm="confirmStaffSelection"
  297. ></staffSelection>
  298. </ele-modal>
  299. </template>
  300. <script>
  301. import OrgSelect from './org-select.vue';
  302. import OrgTypeSelect from './org-type-select.vue';
  303. import staffSelection from './staffSelection.vue';
  304. import fileUpload from '@/components/upload/fileUpload';
  305. import AreaSelect from '@/views/enterpriseModel/regionalManage/components/area-cascader.vue';
  306. const defEnterprise = {
  307. businessLicenseFile: [],
  308. name: null,
  309. address: null,
  310. tel: '',
  311. registerDate: '',
  312. unifiedSocialCreditCode: '',
  313. businessScope: '',
  314. mainProduct: '',
  315. remark: '',
  316. fax: ''
  317. };
  318. const defFactoryForm = {
  319. id: '',
  320. code: '',
  321. name: '',
  322. groupId: '',
  323. areaId: '',
  324. areaName: '',
  325. extInfo: {
  326. principalDep: '', // 负责人部门
  327. location: [],
  328. locationDetail: ''
  329. },
  330. areaIdList: [],
  331. enabled: 1,
  332. parentId: 0,
  333. leaderId: '',
  334. type: 1 // FACTORY(1, "工厂"), WORKSHOP_PLAN(2, "厂房"), WORKSHOP(3, "车间"), LINE(4, "厂线");
  335. };
  336. import {
  337. addOrganization,
  338. updateOrganization,
  339. getById,
  340. getCode
  341. } from '@/api/system/organization';
  342. import { basicAreaPageAPI } from '@/api/regionalManage';
  343. import { cityDataLabel } from 'ele-admin/packages/utils/regions';
  344. export default {
  345. components: {
  346. OrgSelect,
  347. OrgTypeSelect,
  348. staffSelection,
  349. fileUpload,
  350. AreaSelect
  351. },
  352. props: {
  353. // 弹窗是否打开
  354. visible: Boolean,
  355. // 修改回显的数据
  356. data: Object,
  357. // 上级id
  358. parentId: [Number, String],
  359. // 机构数据
  360. organizationList: Array
  361. },
  362. data() {
  363. const defaultForm = {
  364. id: null,
  365. parentId: null,
  366. name: '',
  367. type: '',
  368. sort: null,
  369. status: 1,
  370. manager: [],
  371. groupCode:''
  372. };
  373. return {
  374. defaultForm,
  375. responsibleName: '',
  376. // 表单数据
  377. form: { ...defaultForm },
  378. enterprise: { ...defEnterprise },
  379. factoryForm: {
  380. ...defFactoryForm
  381. },
  382. cityDataLabel,
  383. // 表单验证规则
  384. rules: {
  385. name: [{ required: true, message: '请输入机构名称', trigger: 'blur' }],
  386. manager: [{ required: true, message: '请选择负责人', trigger: 'blur' }],
  387. type: [{ required: true, message: '请选择机构类型', trigger: 'blur' }]
  388. },
  389. // 表单验证规则
  390. enterpriseRules: {
  391. name: [{ required: true, message: '请输入企业名称', trigger: 'blur' }],
  392. address: [
  393. { required: true, message: '请输入企业地址', trigger: 'blur' }
  394. ],
  395. unifiedSocialCreditCode: [
  396. { required: true, message: '请输入统一社会性代码', trigger: 'blur' }
  397. ]
  398. },
  399. // 提交状态
  400. loading: false,
  401. // 是否是修改
  402. isUpdate: false
  403. };
  404. },
  405. computed: {
  406. // 是否开启响应式布局
  407. styleResponsive() {
  408. return this.$store.state.theme.styleResponsive;
  409. }
  410. },
  411. created() {
  412. this.getBasicAreaList();
  413. },
  414. methods: {
  415. /* 保存编辑 */
  416. async save() {
  417. if (!(await this.formValidate())) {
  418. return false;
  419. }
  420. if (
  421. ['10', '20'].includes(this.form.type) &&
  422. !(await this.enterpriseValidate())
  423. ) {
  424. return false;
  425. }
  426. let form = {
  427. ...this.form
  428. };
  429. if (['10', '20'].includes(this.form.type)) {
  430. form['enterprise'] = this.enterprise;
  431. }
  432. this.loading = true;
  433. const data = {
  434. ...form,
  435. parentId: this.form.parentId || 0
  436. };
  437. if (!this.isUpdate) {
  438. delete data.id;
  439. }
  440. const saveOrUpdate = this.isUpdate ? updateOrganization : addOrganization;
  441. saveOrUpdate(data)
  442. .then((msg) => {
  443. this.loading = false;
  444. this.$message.success(msg);
  445. this.updateVisible(false);
  446. this.$emit('done');
  447. })
  448. .catch((e) => {
  449. this.loading = false;
  450. // this.$message.error(e.message);
  451. });
  452. },
  453. formValidate() {
  454. return new Promise((resolve, reject) => {
  455. this.$refs.form.validate((valid) => {
  456. resolve(valid);
  457. });
  458. });
  459. },
  460. getAreaInfo(nodeInfo) {
  461. this.factoryForm.areaName = nodeInfo[0]?.pathLabels.join('/') || '';
  462. this.factoryForm.areaId = this.factoryForm.areaId || '';
  463. },
  464. enterpriseValidate() {
  465. return new Promise((resolve, reject) => {
  466. this.$refs.enterpriseForm.validate((valid) => {
  467. resolve(valid);
  468. });
  469. });
  470. },
  471. /* 获取区域集合 */
  472. async getBasicAreaList() {
  473. this.areaList = await basicAreaPageAPI({
  474. pageNum: 1,
  475. size: 9999
  476. });
  477. this.areaTreeList = this.$util.toTreeData({
  478. data: this.areaList,
  479. idField: 'id',
  480. parentIdField: 'parentId'
  481. });
  482. },
  483. //选择负责人
  484. confirmStaffSelection(data) {
  485. this.form.manager = JSON.parse(JSON.stringify(data));
  486. this.responsibleName = data.map((item) => item.name).toString();
  487. },
  488. openStaffSelection() {
  489. console.log(this.form.manager);
  490. this.$refs.staffSelection.open(
  491. JSON.parse(JSON.stringify(this.form.manager)) || []
  492. );
  493. },
  494. /* 更新visible */
  495. updateVisible(value) {
  496. this.$emit('update:visible', value);
  497. }
  498. },
  499. watch: {
  500. form: {
  501. deep: true,
  502. handler(n) {
  503. this.enterprise.name = n.name;
  504. this.factoryForm.name = n.name;
  505. }
  506. },
  507. visible(visible) {
  508. if (visible) {
  509. if (this.data) {
  510. getById(this.data.id).then((res) => {
  511. for (const key in res.enterprise) {
  512. this.$set(this.enterprise, key, res.enterprise[key]);
  513. }
  514. for (const key in res) {
  515. if (key == 'parentId') {
  516. this.$set(this.form, key, res[key] == 0 ? '' : res[key] ?? '');
  517. }
  518. if (key != 'enterprise') {
  519. this.$set(this.form, key, res[key]);
  520. }
  521. }
  522. this.form.type = '' + this.form.type; //回显
  523. this.responsibleName =
  524. res.manager && res.manager.map((item) => item.name).toString();
  525. });
  526. // this.form.type = '' + this.form.type; //回显
  527. // this.responsibleName =
  528. // this.data.manager &&
  529. // this.data.manager.map((item) => item.name).toString();
  530. this.isUpdate = true;
  531. } else {
  532. this.form.parentId = this.parentId;
  533. getCode().then((res) => {
  534. this.form.groupCode = res;
  535. });
  536. this.isUpdate = false;
  537. }
  538. } else {
  539. this.$refs.form.clearValidate();
  540. this.$refs.enterpriseForm && this.$refs.enterpriseForm.clearValidate();
  541. this.form = { ...this.defaultForm };
  542. this.enterprise = { ...defEnterprise };
  543. this.responsibleName = '';
  544. }
  545. }
  546. }
  547. };
  548. </script>