edit.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  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="1000px"
  11. >
  12. <el-form ref="form" :model="form" :rules="rules" label-width="100px">
  13. <el-row>
  14. <el-col :span="8">
  15. <el-form-item label="工厂编码:" prop="code">
  16. <el-input
  17. clearable
  18. :maxlength="20"
  19. v-model="form.code"
  20. placeholder="请输入"
  21. />
  22. </el-form-item>
  23. </el-col>
  24. <el-col :span="8">
  25. <el-form-item label="工厂名称:" prop="name">
  26. <el-input
  27. clearable
  28. :maxlength="20"
  29. v-model="form.name"
  30. placeholder="请输入"
  31. />
  32. </el-form-item>
  33. </el-col>
  34. <el-col :span="8">
  35. <el-form-item label="所属公司:" prop="groupId">
  36. <ele-tree-select
  37. clearable
  38. :data="options.groupId"
  39. v-model="form.groupId"
  40. valueKey="id"
  41. labelKey="name"
  42. placeholder="请选择"
  43. default-expand-all
  44. />
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="8">
  48. <el-form-item label="状态:" prop="enabled">
  49. <div class="location-warp">
  50. <el-select
  51. v-model="form.enabled"
  52. v
  53. placeholder="请选择"
  54. style="width: 100%"
  55. >
  56. <el-option
  57. v-for="item in options.zt"
  58. :key="item.value"
  59. :label="item.label"
  60. :value="item.value"
  61. >
  62. </el-option>
  63. </el-select>
  64. </div>
  65. </el-form-item>
  66. </el-col>
  67. <!-- options_groupId -->
  68. <el-col :span="8">
  69. <el-form-item label="负责人部门:" prop="extInfo.principalDep">
  70. <ele-tree-select
  71. clearable
  72. :data="options.groupId"
  73. v-model="form.extInfo.principalDep"
  74. valueKey="id"
  75. labelKey="name"
  76. placeholder="请选择"
  77. @change="change_principalDep"
  78. default-expand-all
  79. />
  80. </el-form-item>
  81. </el-col>
  82. <el-col :span="8">
  83. <el-form-item label="负责人:" prop="leaderId">
  84. <el-select
  85. v-model="form.leaderId"
  86. placeholder="请选择"
  87. style="width: 100%"
  88. >
  89. <el-option
  90. v-for="item in options.leaderId"
  91. :key="item.id"
  92. :label="item.name"
  93. :value="item.id"
  94. >
  95. </el-option>
  96. </el-select>
  97. </el-form-item>
  98. </el-col>
  99. <el-col :span="8">
  100. <el-form-item label="所属区域:" prop="location_city">
  101. <area-select
  102. v-model="form.areaId"
  103. @checkedKeys="getAreaInfo"
  104. :data="areaTreeList"
  105. ref="tree"
  106. />
  107. </el-form-item>
  108. </el-col>
  109. <el-col :span="16">
  110. <el-form-item label="地址:" prop="location_city">
  111. <div class="location-warp">
  112. <el-cascader
  113. clearable
  114. style="width: 385px"
  115. v-model="form.extInfo.location"
  116. :options="options.cityDataLabel"
  117. ></el-cascader>
  118. <el-input
  119. class="detail"
  120. clearable
  121. :maxlength="20"
  122. v-model="form.extInfo.locationDetail"
  123. placeholder="请输入详细地址"
  124. />
  125. </div>
  126. </el-form-item>
  127. </el-col>
  128. </el-row>
  129. </el-form>
  130. <template v-slot:footer>
  131. <el-button @click="handleClose">取消</el-button>
  132. <el-button type="primary" :loading="loading" @click="save">
  133. 保存
  134. </el-button>
  135. </template>
  136. </el-dialog>
  137. </template>
  138. <script>
  139. import {cityDataLabel} from 'ele-admin/packages/utils/regions';
  140. import {listOrganizations} from '@/api/system/organization';
  141. import {saveOrUpdate} from '@/api/factoryModel';
  142. import {getUserPage} from '@/api/system/organization';
  143. import AreaSelect from "@/views/enterpriseModel/regionalManage/components/area-cascader.vue";
  144. import {basicAreaPageAPI} from "@/api/regionalManage";
  145. export default {
  146. components: {AreaSelect},
  147. props: {
  148. options_groupId: {
  149. type: Array,
  150. default() {
  151. return [];
  152. }
  153. }
  154. },
  155. watch: {
  156. options_groupId(nval) {
  157. this.toTreeData(nval);
  158. }
  159. },
  160. data() {
  161. const defaultForm = function () {
  162. return {
  163. id: '',
  164. code: '',
  165. name: '',
  166. groupId: '',
  167. areaId: '',
  168. areaName: '',
  169. extInfo: {
  170. principalDep: '', // 负责人部门
  171. location: [],
  172. locationDetail: ''
  173. },
  174. areaIdList: [],
  175. enabled: 1,
  176. parentId: 0,
  177. leaderId: '',
  178. type: 1 // FACTORY(1, "工厂"), WORKSHOP_PLAN(2, "厂房"), WORKSHOP(3, "车间"), LINE(4, "厂线");
  179. };
  180. };
  181. return {
  182. defaultForm,
  183. // 表单数据
  184. form: {...defaultForm()},
  185. // 表单验证规则
  186. rules: {
  187. code: [{required: true, message: '请输入', trigger: 'blur'}],
  188. name: [{required: true, message: '请输入', trigger: 'blur'}],
  189. groupId: [{required: true, message: '请输入', trigger: 'blur'}],
  190. leaderId: {
  191. required: true,
  192. message: '请输入',
  193. trigger: 'change'
  194. },
  195. 'extInfo.principalDep': [
  196. {required: true, message: '请输入', trigger: 'change'}
  197. ]
  198. },
  199. visible: false,
  200. areaList: [],
  201. areaTreeList: [],
  202. type: '', // add/edit
  203. loading: false,
  204. options: {
  205. zt: [
  206. {
  207. label: '生效',
  208. value: 1
  209. },
  210. {
  211. label: '未生效',
  212. value: 0
  213. }
  214. ],
  215. groupId: [],
  216. cityDataLabel,
  217. leaderId: []
  218. }
  219. };
  220. },
  221. computed: {
  222. title() {
  223. switch (this.type) {
  224. case 'add':
  225. return '新增工厂';
  226. break;
  227. case 'edit':
  228. return '编辑工厂';
  229. break;
  230. default:
  231. break;
  232. }
  233. }
  234. },
  235. created() {
  236. this.getGs();
  237. this.getBasicAreaList();
  238. },
  239. methods: {
  240. open(type, row) {
  241. this.type = type;
  242. this.visible = true;
  243. if (type == 'edit') {
  244. for (const key of Object.keys(this.form)) {
  245. if (key !== 'extInfo') {
  246. this.form[key] = row[key];
  247. } else {
  248. for (const el of Object.keys(this.form.extInfo)) {
  249. this.form.extInfo[el] = row.extInfo[el];
  250. }
  251. }
  252. }
  253. this.getUserPage();
  254. }
  255. },
  256. toTreeData(val) {
  257. this.options.principalDep = this.$util.toTreeData({
  258. data: val,
  259. idField: 'id',
  260. parentIdField: 'parentId'
  261. });
  262. },
  263. /* 保存编辑 */
  264. save() {
  265. this.$refs.form.validate((valid) => {
  266. if (!valid) {
  267. return false;
  268. }
  269. this.loading = true;
  270. if (this.type == 'add') {
  271. delete this.form.id;
  272. }
  273. saveOrUpdate(this.form)
  274. .then((msg) => {
  275. this.loading = false;
  276. this.$message.success(msg);
  277. this.handleClose();
  278. this.$emit('done');
  279. })
  280. .catch((e) => {
  281. this.loading = false;
  282. // this.$message.error(e.message);
  283. });
  284. });
  285. },
  286. restForm() {
  287. this.form = {...this.defaultForm()};
  288. this.$nextTick(() => {
  289. this.$refs.form.clearValidate();
  290. });
  291. },
  292. handleClose() {
  293. this.restForm();
  294. this.visible = false;
  295. },
  296. /* 获取区域集合 */
  297. async getBasicAreaList() {
  298. this.areaList = await basicAreaPageAPI(
  299. {
  300. pageNum: 1,
  301. size: 9999
  302. }
  303. )
  304. this.areaTreeList = this.$util.toTreeData({
  305. data: this.areaList,
  306. idField: 'id',
  307. parentIdField: 'parentId'
  308. });
  309. },
  310. getAreaInfo(nodeInfo) {
  311. this.form.areaName = nodeInfo[0]?.pathLabels.join('/') || ''
  312. this.form.areaId = this.form.areaId || ''
  313. },
  314. // 获取公司数据
  315. getGs() {
  316. listOrganizations().then((list) => {
  317. this.options.groupId = this.$util.toTreeData({
  318. data: list,
  319. idField: 'id',
  320. parentIdField: 'parentId'
  321. });
  322. });
  323. },
  324. // 选择负责人部门
  325. change_principalDep() {
  326. this.form.leaderId = '';
  327. this.getUserPage();
  328. },
  329. // 获取人员
  330. getUserPage() {
  331. if (!this.form.extInfo.principalDep) return this.options.leaderId = []
  332. let par = {
  333. groupId: this.form.extInfo.principalDep,
  334. size: 999
  335. };
  336. getUserPage(par).then((res) => {
  337. this.options.leaderId = res.list;
  338. });
  339. }
  340. }
  341. };
  342. </script>
  343. <style lang="scss" scoped>
  344. .location-warp {
  345. display: flex;
  346. .detail {
  347. margin-left: 10px;
  348. }
  349. }
  350. :deep(
  351. .el-dialog:not(.ele-dialog-form)
  352. .el-dialog__body
  353. .el-form
  354. .el-form-item:last-child
  355. ) {
  356. margin-bottom: 22px;
  357. }
  358. </style>