edit.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. <!-- 用户编辑弹窗 -->
  2. <template>
  3. <el-dialog
  4. class="ele-dialog-form"
  5. :title="title"
  6. :visible.sync="visible"
  7. :before-close="handleClose"
  8. :close-on-click-modal="false"
  9. :close-on-press-escape="false"
  10. width="1200px"
  11. >
  12. <el-form ref="form" :model="form" :rules="rules" label-width="120px">
  13. <el-row>
  14. <el-col :span="8">
  15. <el-form-item
  16. label="厂房编码:"
  17. prop="code"
  18. style="margin-bottom: 12px"
  19. >
  20. <el-input
  21. clearable
  22. :maxlength="20"
  23. v-model="form.code"
  24. placeholder="请输入"
  25. :disabled="type === 'edit'"
  26. />
  27. </el-form-item>
  28. </el-col>
  29. <el-col :span="8">
  30. <el-form-item
  31. label="厂房名称:"
  32. prop="name"
  33. style="margin-bottom: 12px"
  34. >
  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="8" style="margin-bottom: 12px">
  44. <el-form-item label="状态:" prop="enabled">
  45. <el-select
  46. v-model="form.enabled"
  47. placeholder="请选择"
  48. style="width: 100%"
  49. >
  50. <el-option
  51. v-for="item in options.enabled"
  52. :key="item.value"
  53. :label="item.label"
  54. :value="item.value"
  55. >
  56. </el-option>
  57. </el-select>
  58. </el-form-item>
  59. </el-col>
  60. </el-row>
  61. <el-row>
  62. <el-col :span="8" style="margin-bottom: 12px">
  63. <el-form-item label="所属工厂:" prop="parentId">
  64. <el-select
  65. v-model="form.parentId"
  66. placeholder="请选择"
  67. @change="change_factoryId"
  68. style="width: 100%"
  69. >
  70. <el-option
  71. v-for="item in options_factory"
  72. :key="item.id"
  73. :label="item.name"
  74. :value="item.id"
  75. >
  76. </el-option>
  77. </el-select>
  78. </el-form-item>
  79. </el-col>
  80. <el-col :span="8">
  81. <el-form-item
  82. label="负责人部门:"
  83. prop="extInfo.principalDep"
  84. style="margin-bottom: 12px"
  85. >
  86. <ele-tree-select
  87. clearable
  88. :data="options.principalDep"
  89. v-model="form.extInfo.principalDep"
  90. valueKey="id"
  91. labelKey="name"
  92. placeholder="请选择"
  93. @change="change_principalDep"
  94. default-expand-all
  95. />
  96. </el-form-item>
  97. </el-col>
  98. <el-col :span="8" style="margin-bottom: 12px">
  99. <el-form-item label="负责人:" prop="leaderId">
  100. <el-select
  101. v-model="form.leaderId"
  102. filterable
  103. placeholder="请选择"
  104. @change="change_principal"
  105. style="width: 100%"
  106. >
  107. <el-option
  108. v-for="item in options.principal"
  109. :key="item.id"
  110. :label="item.name"
  111. :value="item.id"
  112. >
  113. </el-option>
  114. </el-select>
  115. </el-form-item>
  116. </el-col>
  117. </el-row>
  118. <el-row>
  119. <el-col :span="8" style="margin-bottom: 12px">
  120. <el-form-item label="联系方式:" prop="extInfo.phone">
  121. <el-input
  122. clearable
  123. :maxlength="20"
  124. v-model="form.extInfo.phone"
  125. οninput="value=value.replace(/[^\d]/g,'');if(value.length > 11)value = value.slice(0, 11)"
  126. placeholder="请输入"
  127. />
  128. </el-form-item>
  129. </el-col>
  130. <el-col :span="8" style="margin-bottom: 12px">
  131. <el-form-item prop="extInfo.assetCode" label="房屋资产编码">
  132. <el-input
  133. class="form-ipt"
  134. size="small"
  135. style="width: 100%"
  136. placeholder="请输入"
  137. v-model="form.extInfo.assetCode"
  138. ></el-input>
  139. </el-form-item>
  140. </el-col>
  141. <el-col :span="8" style="margin-bottom: 12px">
  142. <el-form-item label="所属区域:" prop="areaId">
  143. <area-select
  144. v-model="form.areaId"
  145. @checkedKeys="getAreaInfo"
  146. :data="areaTreeList"
  147. ref="tree"
  148. />
  149. </el-form-item>
  150. </el-col>
  151. </el-row>
  152. <el-row>
  153. <el-col :span="8" style="margin-bottom: 12px">
  154. <el-form-item prop="extInfo.level" label="楼层">
  155. <el-input
  156. class="form-ipt"
  157. size="small"
  158. style="width: 100%"
  159. placeholder="请输入"
  160. v-model="form.extInfo.level"
  161. ></el-input>
  162. </el-form-item>
  163. </el-col>
  164. <!-- <el-col :span="8" style="margin-bottom: 12px">-->
  165. <!-- <el-form-item prop="extInfo.campus" label="归属园院区">-->
  166. <!-- <el-input-->
  167. <!-- class="form-ipt"-->
  168. <!-- size="small"-->
  169. <!-- style="width: 100%"-->
  170. <!-- placeholder="请输入"-->
  171. <!-- v-model="form.extInfo.campus"-->
  172. <!-- ></el-input>-->
  173. <!-- </el-form-item>-->
  174. <!-- </el-col>-->
  175. <el-col :span="8" style="margin-bottom: 12px">
  176. <el-form-item prop="extInfo.coveredArea" label="建筑面积">
  177. <el-input
  178. class="form-ipt"
  179. size="small"
  180. style="width: 100%"
  181. placeholder="请输入"
  182. v-model="form.extInfo.coveredArea"
  183. ></el-input>
  184. </el-form-item>
  185. </el-col>
  186. <el-col :span="8" style="margin-bottom: 12px">
  187. <el-form-item prop="extInfo.moneyCeiling" label="已配金额上限">
  188. <el-input
  189. class="form-ipt"
  190. size="small"
  191. style="width: 100%"
  192. placeholder="请输入"
  193. v-model="form.extInfo.moneyCeiling"
  194. ></el-input>
  195. </el-form-item>
  196. </el-col>
  197. </el-row>
  198. <el-row>
  199. <el-col :span="8" style="margin-bottom: 12px">
  200. <el-form-item prop="extInfo.useArea" label="使用面积">
  201. <el-input
  202. class="form-ipt"
  203. size="small"
  204. style="width: 100%"
  205. placeholder="请输入"
  206. v-model="form.extInfo.useArea"
  207. ></el-input>
  208. </el-form-item>
  209. </el-col>
  210. <el-col :span="16" style="margin-bottom: 12px">
  211. <el-form-item label="地址:" prop="extInfo.location">
  212. <div class="location-warp">
  213. <el-cascader
  214. clearable
  215. style="width: 400px"
  216. v-model="form.extInfo.location"
  217. :options="options.cityDataLabel"
  218. ></el-cascader>
  219. <el-input
  220. class="detail"
  221. clearable
  222. :maxlength="20"
  223. v-model="form.extInfo.locationDetail"
  224. placeholder="请输入详细地址"
  225. />
  226. </div>
  227. </el-form-item>
  228. </el-col>
  229. </el-row>
  230. <el-row>
  231. <el-col :span="24" style="margin-bottom: 12px">
  232. <el-form-item label="备注:" prop="remark">
  233. <el-input
  234. clearable
  235. :maxlength="100"
  236. type="textarea"
  237. v-model="form.remark"
  238. placeholder="请输入"
  239. />
  240. </el-form-item>
  241. </el-col>
  242. </el-row>
  243. </el-form>
  244. <template v-slot:footer>
  245. <el-button @click="handleClose">取消</el-button>
  246. <el-button type="primary" :loading="loading" @click="save">
  247. 保存
  248. </el-button>
  249. </template>
  250. </el-dialog>
  251. </template>
  252. <script>
  253. import { saveOrUpdate, listWorkshopByParentId } from '@/api/factoryModel';
  254. import { getUserPage } from '@/api/system/organization';
  255. import { cityDataLabel } from 'ele-admin/packages/utils/regions';
  256. import AreaSelect from '@/views/enterpriseModel/regionalManage/components/area-cascader.vue';
  257. import { basicAreaPageAPI } from '@/api/regionalManage';
  258. export default {
  259. components: { AreaSelect },
  260. props: {
  261. options_groupId: {
  262. type: Array,
  263. default() {
  264. return [];
  265. }
  266. },
  267. options_factory: {
  268. type: Array,
  269. default() {
  270. return [];
  271. }
  272. }
  273. },
  274. watch: {
  275. options_groupId(nval) {
  276. this.toTreeData(nval);
  277. }
  278. },
  279. created() {
  280. this.getBasicAreaList();
  281. },
  282. data() {
  283. const defaultForm = {
  284. id: '',
  285. code: '',
  286. name: '',
  287. leaderId: '',
  288. areaId: '',
  289. areaName: '',
  290. extInfo: {
  291. principalDep: '', // 负责人部门
  292. phone: '', // 手机号
  293. locationDetail: '', // 详细地址
  294. location: [], // 省市区
  295. assetCode: '', //房屋资产编码
  296. campus: '', //归属园院区
  297. coveredArea: '', //建筑面积
  298. level: '', //楼层
  299. moneyCeiling: '', //已配金额上限
  300. useArea: '' // 使用面积
  301. },
  302. groupId: '',
  303. enabled: 1,
  304. parentId: '',
  305. remark: '',
  306. type: 2 // FACTORY(1, "工厂"), WORKSHOP_PLAN(2, "厂房"), WORKSHOP(3, "车间"), LINE(4, "厂线");
  307. };
  308. return {
  309. defaultForm,
  310. // 表单数据
  311. form: { ...defaultForm },
  312. areaList: [],
  313. areaTreeList: [],
  314. // 表单验证规则
  315. rules: {
  316. code: [{ required: true, message: '请输入', trigger: 'blur' }],
  317. name: [{ required: true, message: '请输入', trigger: 'blur' }],
  318. 'extInfo.factoryId': [
  319. { required: true, message: '请输入', trigger: 'change' }
  320. ],
  321. parentId: { required: true, message: '请输入', trigger: 'change' },
  322. enabled: { required: true, message: '请输入', trigger: 'change' },
  323. 'extInfo.principalDep': [
  324. { required: true, message: '请输入', trigger: 'change' }
  325. ],
  326. leaderId: [{ required: true, message: '请选择', trigger: 'change' }],
  327. 'extInfo.phone': [
  328. { min: 11, message: '手机号格式不正确', trigger: 'blur' }
  329. ]
  330. // 'extInfo.assetCode': [
  331. // { required: true, message: '请输入', trigger: 'blur' }
  332. // ],
  333. // 'extInfo.campus': [
  334. // { required: true, message: '请输入', trigger: 'blur' }
  335. // ],
  336. // 'extInfo.coveredArea': [
  337. // { required: true, message: '请输入', trigger: 'blur' }
  338. // ],
  339. // 'extInfo.level': [
  340. // { required: true, message: '请输入', trigger: 'blur' }
  341. // ],
  342. // 'extInfo.moneyCeiling': [
  343. // { required: true, message: '请输入', trigger: 'blur' }
  344. // ],
  345. // 'extInfo.useArea': [
  346. // { required: true, message: '请输入', trigger: 'blur' }
  347. // ]
  348. },
  349. visible: false,
  350. type: '', // add/edit
  351. loading: false,
  352. options: {
  353. principalDep: [],
  354. principal: [],
  355. workshop: [],
  356. enabled: [
  357. {
  358. label: '生效',
  359. value: 1
  360. },
  361. {
  362. label: '未生效',
  363. value: 0
  364. }
  365. ],
  366. cityDataLabel
  367. }
  368. };
  369. },
  370. computed: {
  371. title() {
  372. switch (this.type) {
  373. case 'add':
  374. return '新增厂房';
  375. case 'copy':
  376. return '新增厂房';
  377. case 'edit':
  378. return '编辑厂房';
  379. default:
  380. break;
  381. }
  382. }
  383. },
  384. methods: {
  385. /* 获取区域集合 */
  386. async getBasicAreaList() {
  387. this.areaList = await basicAreaPageAPI({
  388. pageNum: 1,
  389. size: 9999
  390. });
  391. this.areaTreeList = this.$util.toTreeData({
  392. data: this.areaList,
  393. idField: 'id',
  394. parentIdField: 'parentId'
  395. });
  396. },
  397. getAreaInfo(nodeInfo) {
  398. this.form.areaName = nodeInfo[0]?.pathLabels.join('/') || '';
  399. this.form.areaId = this.form.areaId || '';
  400. },
  401. open(type, row) {
  402. this.type = type;
  403. this.visible = true;
  404. if (type == 'edit' || type == 'copy') {
  405. for (const key of Object.keys(this.form)) {
  406. if (key !== 'extInfo') {
  407. this.form[key] = row[key];
  408. } else {
  409. for (const el of Object.keys(this.form.extInfo)) {
  410. this.form.extInfo[el] = row.extInfo[el];
  411. }
  412. }
  413. }
  414. // 请求下拉数据
  415. if (this.form.extInfo.factoryId) {
  416. this.getListWorkshopByParentId();
  417. }
  418. if (this.form.extInfo.principalDep) {
  419. this.getUserPage();
  420. }
  421. } else {
  422. this.form = { ...this.defaultForm };
  423. const info = {
  424. principalDep: '', // 负责人部门
  425. phone: '', // 手机号
  426. locationDetail: '', // 详细地址
  427. location: [], // 省市区
  428. assetCode: '', //房屋资产编码
  429. campus: '', //归属园院区
  430. coveredArea: '', //建筑面积
  431. level: '', //楼层
  432. moneyCeiling: '', //已配金额上限
  433. useArea: '' // 使用面积
  434. };
  435. this.$set(this.form, 'extInfo', info);
  436. this.$refs.form.resetFields();
  437. }
  438. if (type == 'copy') {
  439. this.form.code = '';
  440. }
  441. },
  442. /* 保存编辑 */
  443. save() {
  444. this.$refs.form.validate((valid) => {
  445. if (!valid) {
  446. return false;
  447. }
  448. this.loading = true;
  449. if (this.type != 'edit') {
  450. delete this.form.id;
  451. }
  452. saveOrUpdate(this.form)
  453. .then((msg) => {
  454. this.loading = false;
  455. this.$message.success(msg);
  456. this.handleClose();
  457. this.$emit('done');
  458. })
  459. .catch((e) => {
  460. this.loading = false;
  461. });
  462. });
  463. },
  464. restForm() {
  465. this.$refs.form.clearValidate();
  466. this.form = { ...this.defaultForm };
  467. },
  468. handleClose() {
  469. this.restForm();
  470. this.visible = false;
  471. },
  472. // 格式化公司数据
  473. toTreeData(val) {
  474. this.options.principalDep = this.$util.toTreeData({
  475. data: val,
  476. idField: 'id',
  477. parentIdField: 'parentId'
  478. });
  479. },
  480. // 获取人员
  481. getUserPage() {
  482. if (!this.form.extInfo.principalDep)
  483. return (this.options.leaderId = []);
  484. let par = {
  485. groupId: this.form.extInfo.principalDep,
  486. size: 999
  487. };
  488. getUserPage(par).then((res) => {
  489. this.options.principal = res.list;
  490. });
  491. },
  492. // 选择工厂
  493. change_factoryId() {
  494. let result = this.options_factory.find(
  495. (n) => n.id == this.form.parentId
  496. );
  497. this.form.groupId = result.groupId;
  498. },
  499. // 选择负责人部门
  500. change_principalDep() {
  501. this.form.leaderId = '';
  502. this.options.principal = [];
  503. this.getUserPage();
  504. },
  505. // 选择负责人
  506. change_principal() {
  507. let result = this.options.principal.find(
  508. (n) => n.id == this.form.leaderId
  509. );
  510. this.form.extInfo.phone = result.phone;
  511. }
  512. }
  513. };
  514. </script>
  515. <style lang="scss" scoped>
  516. .location-warp {
  517. display: flex;
  518. .detail {
  519. margin-left: 10px;
  520. }
  521. }
  522. </style>