edit.vue 15 KB

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