edit.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  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="100px">
  13. <el-card
  14. shadow="never"
  15. header="基本信息"
  16. body-style="padding: 22px 22px 0 22px;"
  17. >
  18. <el-row>
  19. <el-col :span="8">
  20. <el-form-item
  21. label="产线编码:"
  22. prop="code"
  23. style="margin-bottom: 12px"
  24. >
  25. <el-input
  26. clearable
  27. :maxlength="20"
  28. v-model="form.code"
  29. placeholder="请输入"
  30. />
  31. </el-form-item>
  32. </el-col>
  33. <el-col :span="8">
  34. <el-form-item
  35. label="产线名称:"
  36. prop="name"
  37. style="margin-bottom: 12px"
  38. >
  39. <el-input
  40. clearable
  41. :maxlength="20"
  42. v-model="form.name"
  43. placeholder="请输入"
  44. />
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="8" style="margin-bottom: 12px">
  48. <el-form-item label="所属厂房:" prop="extInfo.factoryId">
  49. <el-select
  50. v-model="form.extInfo.factoryId"
  51. placeholder="请选择"
  52. @change="change_factoryId"
  53. filterable
  54. style="width: 100%"
  55. >
  56. <el-option
  57. v-for="item in options_factory"
  58. :key="item.id"
  59. :label="item.pathName"
  60. :value="item.id"
  61. >
  62. </el-option>
  63. </el-select>
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="8" style="margin-bottom: 12px">
  67. <el-form-item label="所属车间:" prop="parentId">
  68. <el-select
  69. v-model="form.parentId"
  70. placeholder="请选择"
  71. style="width: 100%"
  72. @change="change_workshop"
  73. >
  74. <el-option
  75. v-for="item in options.workshop"
  76. :key="item.id"
  77. :label="item.name"
  78. :value="item.id"
  79. >
  80. </el-option>
  81. </el-select>
  82. </el-form-item>
  83. </el-col>
  84. <el-col :span="8">
  85. <el-form-item
  86. label="负责人部门:"
  87. prop="extInfo.principalDep"
  88. style="margin-bottom: 12px"
  89. >
  90. <ele-tree-select
  91. clearable
  92. :data="options.principalDep"
  93. v-model="form.extInfo.principalDep"
  94. valueKey="id"
  95. labelKey="name"
  96. placeholder="请选择"
  97. @change="change_principalDep"
  98. default-expand-all
  99. />
  100. </el-form-item>
  101. </el-col>
  102. <el-col :span="8" style="margin-bottom: 12px">
  103. <el-form-item label="负责人:" prop="leaderId">
  104. <el-select
  105. v-model="form.leaderId"
  106. placeholder="请选择"
  107. @change="change_principal"
  108. style="width: 100%"
  109. >
  110. <el-option
  111. v-for="item in options.principal"
  112. :key="item.id"
  113. :label="item.name"
  114. :value="item.id"
  115. >
  116. </el-option>
  117. </el-select>
  118. </el-form-item>
  119. </el-col>
  120. <el-col :span="8" style="margin-bottom: 12px">
  121. <el-form-item label="联系方式:" prop="extInfo.phone">
  122. <el-input
  123. clearable
  124. :maxlength="20"
  125. v-model="form.extInfo.phone"
  126. οninput="value=value.replace(/[^\d]/g,'');if(value.length > 11)value = value.slice(0, 11)"
  127. placeholder="请输入"
  128. />
  129. </el-form-item>
  130. </el-col>
  131. <el-col :span="8" style="margin-bottom: 12px">
  132. <el-form-item label="工作节拍:" prop="extInfo.workMeter">
  133. <el-input
  134. clearable
  135. :maxlength="20"
  136. v-model="form.extInfo.workMeter"
  137. placeholder="请输入"
  138. />
  139. </el-form-item>
  140. </el-col>
  141. <el-col :span="8" style="margin-bottom: 12px">
  142. <el-form-item label="加工能力:" prop="extInfo.workingAbility">
  143. <el-input
  144. clearable
  145. :maxlength="20"
  146. v-model="form.extInfo.workingAbility"
  147. placeholder="请输入"
  148. />
  149. </el-form-item>
  150. </el-col>
  151. <el-col :span="8" style="margin-bottom: 12px">
  152. <el-form-item label="状态:" prop="enabled">
  153. <el-select
  154. v-model="form.enabled"
  155. placeholder="请选择"
  156. style="width: 100%"
  157. >
  158. <el-option
  159. v-for="item in options.enabled"
  160. :key="item.value"
  161. :label="item.label"
  162. :value="item.value"
  163. >
  164. </el-option>
  165. </el-select>
  166. </el-form-item>
  167. </el-col>
  168. <el-col :span="8">
  169. <el-form-item label="区域:" prop="location_city">
  170. <area-select
  171. v-model="form.areaId"
  172. @checkedKeys="getAreaInfo"
  173. :data="areaTreeList"
  174. ref="tree"
  175. />
  176. </el-form-item>
  177. </el-col>
  178. <el-col :span="24" style="margin-bottom: 12px">
  179. <el-form-item label="地址:" prop="extInfo.location">
  180. <div class="location-warp">
  181. <el-cascader
  182. clearable
  183. style="width: 400px"
  184. v-model="form.extInfo.location"
  185. :options="options.cityDataLabel"
  186. ></el-cascader>
  187. <el-input
  188. class="detail"
  189. clearable
  190. :maxlength="20"
  191. v-model="form.extInfo.locationDetail"
  192. placeholder="请输入详细地址"
  193. />
  194. </div>
  195. </el-form-item>
  196. </el-col>
  197. <el-col :span="24" style="margin-bottom: 12px">
  198. <el-form-item label="备注:" prop="remark">
  199. <el-input
  200. clearable
  201. :maxlength="100"
  202. type="textarea"
  203. v-model="form.remark"
  204. placeholder="请输入"
  205. />
  206. </el-form-item>
  207. </el-col>
  208. </el-row>
  209. </el-card>
  210. <el-card
  211. shadow="never"
  212. header="产能计划"
  213. body-style="padding: 0 22px 10px 22px;"
  214. >
  215. <el-button type="primary" class="add-btn" @click="addItem">添加</el-button>
  216. <el-table
  217. :data="form.mainFactoryCapacityList"
  218. tooltip-effect="dark"
  219. style="width: 100%"
  220. :header-cell-style="{
  221. background: '#F0F3F3',
  222. border: 'none'
  223. }"
  224. >
  225. <el-table-column prop="code" label="计划周期">
  226. <template slot-scope="{ row }">
  227. <div style="width: 95%;">
  228. <DictSelection dictName="产能计划周期" disabled clearable v-model="row.type">
  229. </DictSelection>
  230. </div>
  231. </template>
  232. </el-table-column>
  233. <el-table-column label="计划时段">
  234. <template slot-scope="{ row }">
  235. <el-date-picker
  236. style="width: 95%;"
  237. v-model="row.periodTime"
  238. type="month"
  239. value-format="yyyy-MM"
  240. placeholder="选择月">
  241. </el-date-picker>
  242. </template>
  243. </el-table-column>
  244. <el-table-column label="产量目标" width="300">
  245. <template slot-scope="{ row }">
  246. <div class="row-div">
  247. <el-input
  248. clearable
  249. :maxlength="20"
  250. v-model="row.capacityTarget"
  251. />
  252. <DictSelection dictName="产量目标单位" clearable v-model="row.capacityUnit">
  253. </DictSelection>
  254. </div>
  255. </template>
  256. </el-table-column>
  257. <el-table-column label="创建人" prop="createUserName">
  258. </el-table-column>
  259. <el-table-column label="创建时间" prop="createTime">
  260. <template slot-scope="{ row }">
  261. {{ changeTime(row.createTime) }}
  262. </template>
  263. </el-table-column>
  264. <el-table-column label="状态">
  265. <template slot-scope="{ row }">
  266. <div>
  267. <DictSelection dictName="产能计划状态" disabled v-model="row.status">
  268. </DictSelection>
  269. </div>
  270. </template>
  271. </el-table-column>
  272. <el-table-column width="80" label="操作">
  273. <template slot-scope="scope">
  274. <el-button
  275. size="mini"
  276. type="danger"
  277. @click="delItem(scope.$index,scope.row)"
  278. >删除
  279. </el-button>
  280. </template>
  281. </el-table-column>
  282. </el-table>
  283. </el-card>
  284. </el-form>
  285. <template v-slot:footer>
  286. <el-button @click="handleClose">取消</el-button>
  287. <el-button type="primary" :loading="loading" @click="save">
  288. 保存
  289. </el-button>
  290. </template>
  291. </el-dialog>
  292. </template>
  293. <script>
  294. import { saveOrUpdate, listWorkshopByParentId } from '@/api/factoryModel';
  295. import { getUserPage } from '@/api/system/organization';
  296. import { deepClone } from '@/components/FormGenerator/utils';
  297. import { cityDataLabel } from 'ele-admin/packages/utils/regions';
  298. import {basicAreaPageAPI} from "@/api/regionalManage";
  299. import AreaSelect from "@/views/enterpriseModel/regionalManage/components/area-select.vue";
  300. export default {
  301. components: {AreaSelect},
  302. props: {
  303. options_groupId: {
  304. type: Array,
  305. default() {
  306. return [];
  307. }
  308. },
  309. options_factory: {
  310. type: Array,
  311. default() {
  312. return [];
  313. }
  314. }
  315. },
  316. watch: {
  317. options_groupId(nval) {
  318. this.toTreeData(nval);
  319. }
  320. },
  321. created() {
  322. this.getBasicAreaList();
  323. },
  324. data() {
  325. const defaultForm = {
  326. id: '',
  327. code: '',
  328. name: '',
  329. leaderId:'',
  330. areaId: '',
  331. areaName: '',
  332. extInfo: {
  333. factoryId: '',
  334. // principal: '', // 负责人
  335. principalDep: '', // 负责人部门
  336. phone: '', // 手机号
  337. workMeter: '', // 工作节拍
  338. workingAbility: '', // 加工能力
  339. locationDetail: '', // 详细地址
  340. location: [] // 省市区
  341. },
  342. groupId: '',
  343. enabled: 1,
  344. parentId: '',
  345. remark: '',
  346. mainFactoryCapacityList:[],
  347. type: 4 // FACTORY(1, "工厂"), WORKSHOP_PLAN(2, "厂房"), WORKSHOP(3, "车间"), LINE(4, "厂线");
  348. };
  349. return {
  350. defaultForm,
  351. // 表单数据
  352. form: { ...defaultForm },
  353. // 表单验证规则
  354. rules: {
  355. code: [{ required: true, message: '请输入', trigger: 'blur' }],
  356. name: [{ required: true, message: '请输入', trigger: 'blur' }],
  357. 'extInfo.factoryId': [
  358. { required: true, message: '请输入', trigger: 'change' }
  359. ],
  360. parentId: { required: true, message: '请输入', trigger: 'change' },
  361. 'extInfo.principalDep': [
  362. { required: true, message: '请输入', trigger: 'change' }
  363. ],
  364. leaderId: [
  365. { required: true, message: '请选择', trigger: 'change' }
  366. ],
  367. 'extInfo.phone': [
  368. { min: 11, message: '手机号格式不正确', trigger: 'blur' }
  369. ]
  370. },
  371. visible: false,
  372. type: '', // add/edit
  373. loading: false,
  374. options: {
  375. principalDep: [],
  376. principal: [],
  377. workshop: [],
  378. enabled: [
  379. {
  380. label: '生效',
  381. value: 1
  382. },
  383. {
  384. label: '未生效',
  385. value: 0
  386. }
  387. ],
  388. cityDataLabel
  389. },
  390. delList:[],
  391. areaList: [],
  392. areaTreeList: [],
  393. };
  394. },
  395. computed: {
  396. title() {
  397. switch (this.type) {
  398. case 'add':
  399. return '新增产线';
  400. break;
  401. case 'edit':
  402. return '编辑产线';
  403. break;
  404. default:
  405. break;
  406. }
  407. }
  408. },
  409. methods: {
  410. getTime(){
  411. const d = new Date();
  412. const year = d.getFullYear()
  413. const month = (d.getMonth() + 1).toString().padStart(2,0)
  414. const day = d.getDate()
  415. return `${year}-${month}-${day}`
  416. },
  417. addItem(){
  418. const time = this.getTime()
  419. const item = {
  420. type:2,
  421. periodTime:'',
  422. capacityTarget:'',
  423. capacityUnit:null,
  424. status:1,
  425. createUserName:this.$store.state.user.info.name,
  426. createTime:time
  427. }
  428. this.form.mainFactoryCapacityList.push(item)
  429. },
  430. delItem (index,row) {
  431. row.deleted = 1
  432. this.delList.push(row)
  433. this.form.mainFactoryCapacityList.splice(index, 1)
  434. },
  435. changeTime(str){
  436. var index = str.indexOf(' ')
  437. var time = str
  438. if(index>0){
  439. time = str.substring(0,index)
  440. }
  441. return time
  442. },
  443. open(type, row) {
  444. this.type = type;
  445. this.visible = true;
  446. if (type == 'edit') {
  447. for (const key of Object.keys(this.form)) {
  448. if (key !== 'extInfo') {
  449. this.form[key] = row[key];
  450. } else {
  451. for (const el of Object.keys(this.form.extInfo)) {
  452. this.form.extInfo[el] = row.extInfo[el];
  453. }
  454. }
  455. }
  456. // 请求下拉数据
  457. if (this.form.extInfo.factoryId) {
  458. this.getListWorkshopByParentId();
  459. }
  460. if (this.form.extInfo.principalDep) {
  461. this.getUserPage();
  462. }
  463. }else{
  464. this.form = { ...this.defaultForm };
  465. const info = {
  466. factoryId: '',
  467. principalDep: '', // 负责人部门
  468. phone: '', // 手机号
  469. workMeter: '', // 工作节拍
  470. workingAbility: '', // 加工能力
  471. locationDetail: '', // 详细地址
  472. location: [] // 省市区
  473. }
  474. this.$set(this.form,'extInfo',info)
  475. this.$refs.form.resetFields();
  476. }
  477. },
  478. /* 获取区域集合 */
  479. async getBasicAreaList() {
  480. this.areaList = await basicAreaPageAPI(
  481. {
  482. pageNum: 1,
  483. size: 9999
  484. }
  485. )
  486. this.areaTreeList = this.$util.toTreeData({
  487. data: this.areaList,
  488. idField: 'id',
  489. parentIdField: 'parentId'
  490. });
  491. },
  492. getAreaInfo(val) {
  493. this.form.areaName = this.areaList.find((item) => item.id == val[0]).name;
  494. },
  495. /* 保存编辑 */
  496. save() {
  497. this.$refs.form.validate((valid) => {
  498. if (!valid) {
  499. return false;
  500. }
  501. this.loading = true;
  502. if (this.type == 'add') {
  503. delete this.form.id;
  504. }
  505. let params = deepClone(this.form)
  506. params.mainFactoryCapacityList = params.mainFactoryCapacityList.concat(this.delList)
  507. saveOrUpdate(params)
  508. .then((msg) => {
  509. this.loading = false;
  510. this.$message.success(msg);
  511. this.handleClose();
  512. this.$emit('done');
  513. })
  514. .catch((e) => {
  515. this.loading = false;
  516. this.$message.error(e.message);
  517. });
  518. });
  519. },
  520. restForm() {
  521. this.$refs.form.clearValidate();
  522. this.form = { ...this.defaultForm };
  523. },
  524. handleClose() {
  525. this.restForm();
  526. this.visible = false;
  527. this.delList = []
  528. },
  529. // 格式化公司数据
  530. toTreeData(val) {
  531. this.options.principalDep = this.$util.toTreeData({
  532. data: val,
  533. idField: 'id',
  534. parentIdField: 'parentId'
  535. });
  536. },
  537. // 获取车间
  538. getListWorkshopByParentId() {
  539. listWorkshopByParentId(this.form.extInfo.factoryId).then((res) => {
  540. this.options.workshop = res;
  541. });
  542. },
  543. // 获取人员
  544. getUserPage() {
  545. let par = {
  546. groupId: this.form.extInfo.principalDep,
  547. size: 999
  548. };
  549. getUserPage(par).then((res) => {
  550. this.options.principal = res.list;
  551. });
  552. },
  553. // 选择工厂
  554. change_factoryId() {
  555. this.form.parentId = '';
  556. this.form.groupId = '';
  557. this.options.workshop = [];
  558. this.getListWorkshopByParentId();
  559. },
  560. // 选择负责人部门
  561. change_principalDep() {
  562. this.form.leaderId = '';
  563. this.options.principal = [];
  564. this.getUserPage();
  565. },
  566. // 选择车间
  567. change_workshop() {
  568. let result = this.options.workshop.find(
  569. (n) => n.id == this.form.parentId
  570. );
  571. this.form.groupId = result.groupId;
  572. },
  573. // 选择负责人
  574. change_principal() {
  575. let result = this.options.principal.find(
  576. (n) => n.id == this.form.leaderId
  577. );
  578. this.form.extInfo.phone = result.phone;
  579. }
  580. }
  581. };
  582. </script>
  583. <style lang="scss" scoped>
  584. .location-warp {
  585. display: flex;
  586. .detail {
  587. margin-left: 10px;
  588. }
  589. }
  590. .add-btn{
  591. display:black;
  592. margin: 20px 0;
  593. }
  594. .row-div{
  595. display: flex;
  596. align-items: center;
  597. justify-content: space-around;
  598. .el-input{
  599. margin-right:10px;
  600. }
  601. }
  602. </style>