edit.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  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: [
  327. { required: true, message: '请选择', trigger: 'change' }
  328. ],
  329. 'extInfo.phone': [
  330. { min: 11, message: '手机号格式不正确', trigger: 'blur' }
  331. ],
  332. // 'extInfo.assetCode': [
  333. // { required: true, message: '请输入', trigger: 'blur' }
  334. // ],
  335. // 'extInfo.campus': [
  336. // { required: true, message: '请输入', trigger: 'blur' }
  337. // ],
  338. // 'extInfo.coveredArea': [
  339. // { required: true, message: '请输入', trigger: 'blur' }
  340. // ],
  341. // 'extInfo.level': [
  342. // { required: true, message: '请输入', trigger: 'blur' }
  343. // ],
  344. // 'extInfo.moneyCeiling': [
  345. // { required: true, message: '请输入', trigger: 'blur' }
  346. // ],
  347. // 'extInfo.useArea': [
  348. // { required: true, message: '请输入', trigger: 'blur' }
  349. // ]
  350. },
  351. visible: false,
  352. type: '', // add/edit
  353. loading: false,
  354. options: {
  355. principalDep: [],
  356. principal: [],
  357. workshop: [],
  358. enabled: [
  359. {
  360. label: '生效',
  361. value: 1
  362. },
  363. {
  364. label: '未生效',
  365. value: 0
  366. }
  367. ],
  368. cityDataLabel
  369. }
  370. };
  371. },
  372. computed: {
  373. title() {
  374. switch (this.type) {
  375. case 'add':
  376. return '新增厂房';
  377. break;
  378. case 'edit':
  379. return '编辑厂房';
  380. break;
  381. default:
  382. break;
  383. }
  384. }
  385. },
  386. methods: {
  387. /* 获取区域集合 */
  388. async getBasicAreaList() {
  389. this.areaList = await basicAreaPageAPI(
  390. {
  391. pageNum: 1,
  392. size: 9999
  393. }
  394. )
  395. this.areaTreeList = this.$util.toTreeData({
  396. data: this.areaList,
  397. idField: 'id',
  398. parentIdField: 'parentId'
  399. });
  400. },
  401. getAreaInfo(nodeInfo) {
  402. this.form.areaName = nodeInfo[0]?.pathLabels.join('/') || ''
  403. this.form.areaId = this.form.areaId || ''
  404. },
  405. open(type, row) {
  406. this.type = type;
  407. this.visible = true;
  408. if (type == 'edit') {
  409. for (const key of Object.keys(this.form)) {
  410. if (key !== 'extInfo') {
  411. this.form[key] = row[key];
  412. } else {
  413. for (const el of Object.keys(this.form.extInfo)) {
  414. this.form.extInfo[el] = row.extInfo[el];
  415. }
  416. }
  417. }
  418. // 请求下拉数据
  419. if (this.form.extInfo.factoryId) {
  420. this.getListWorkshopByParentId();
  421. }
  422. if (this.form.extInfo.principalDep) {
  423. this.getUserPage();
  424. }
  425. }else{
  426. this.form = { ...this.defaultForm };
  427. const info = {
  428. principalDep: '', // 负责人部门
  429. phone: '', // 手机号
  430. locationDetail: '', // 详细地址
  431. location: [], // 省市区
  432. assetCode: '', //房屋资产编码
  433. campus: '', //归属园院区
  434. coveredArea: '', //建筑面积
  435. level: '', //楼层
  436. moneyCeiling: '', //已配金额上限
  437. useArea: '' // 使用面积
  438. }
  439. this.$set(this.form,'extInfo',info)
  440. this.$refs.form.resetFields();
  441. }
  442. },
  443. /* 保存编辑 */
  444. save() {
  445. this.$refs.form.validate((valid) => {
  446. if (!valid) {
  447. return false;
  448. }
  449. this.loading = true;
  450. if (this.type == 'add') {
  451. delete this.form.id;
  452. }
  453. saveOrUpdate(this.form)
  454. .then((msg) => {
  455. this.loading = false;
  456. this.$message.success(msg);
  457. this.handleClose();
  458. this.$emit('done');
  459. })
  460. .catch((e) => {
  461. this.loading = false;
  462. this.$message.error(e.message);
  463. });
  464. });
  465. },
  466. restForm() {
  467. this.$refs.form.clearValidate();
  468. this.form = { ...this.defaultForm };
  469. },
  470. handleClose() {
  471. this.restForm();
  472. this.visible = false;
  473. },
  474. // 格式化公司数据
  475. toTreeData(val) {
  476. this.options.principalDep = this.$util.toTreeData({
  477. data: val,
  478. idField: 'id',
  479. parentIdField: 'parentId'
  480. });
  481. },
  482. // 获取人员
  483. getUserPage() {
  484. if (!this.form.extInfo.principalDep) return this.options.leaderId = []
  485. let par = {
  486. groupId: this.form.extInfo.principalDep,
  487. size: 999
  488. };
  489. getUserPage(par).then((res) => {
  490. this.options.principal = res.list;
  491. });
  492. },
  493. // 选择工厂
  494. change_factoryId() {
  495. let result = this.options_factory.find((n) => n.id == this.form.parentId);
  496. this.form.groupId = result.groupId;
  497. },
  498. // 选择负责人部门
  499. change_principalDep() {
  500. this.form.leaderId = '';
  501. this.options.principal = [];
  502. this.getUserPage();
  503. },
  504. // 选择负责人
  505. change_principal() {
  506. let result = this.options.principal.find(
  507. (n) => n.id == this.form.leaderId
  508. );
  509. this.form.extInfo.phone = result.phone;
  510. }
  511. }
  512. };
  513. </script>
  514. <style lang="scss" scoped>
  515. .location-warp {
  516. display: flex;
  517. .detail {
  518. margin-left: 10px;
  519. }
  520. }
  521. </style>