releaseDialog.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. <template>
  2. <ele-modal
  3. :width="modelWidth"
  4. :visible.sync="dispatchVisible"
  5. :close-on-click-modal="false"
  6. custom-class="ele-dialog-form"
  7. :maxable="true"
  8. :title="'派单'"
  9. append-to-body
  10. :before-close="cancel"
  11. >
  12. <div class="form-wrapper">
  13. <el-form
  14. ref="form"
  15. :model="form"
  16. :inline="true"
  17. label-position="right"
  18. label-width="100px"
  19. >
  20. <el-row :gutter="10" class="basic" type="flex" style="flex-wrap: wrap">
  21. <el-col
  22. :xs="12"
  23. :sm="12"
  24. :md="12"
  25. :lg="8"
  26. :xl="6"
  27. v-for="item in fieldList"
  28. :key="item.prop"
  29. >
  30. <el-form-item :label="item.label">
  31. <el-date-picker
  32. class="w100"
  33. v-model="current[item.prop]"
  34. type="datetime"
  35. value-format="yyyy-MM-dd HH:mm:ss"
  36. v-if="item.type == 'date'"
  37. placeholder=" "
  38. ></el-date-picker>
  39. <el-input :value="fieldValue(item.prop)" disabled v-else />
  40. </el-form-item>
  41. </el-col>
  42. </el-row>
  43. <el-row :gutter="10">
  44. <el-col :xs="12" :sm="12" :md="12" :lg="8" :xl="6">
  45. <el-form-item label="所属工厂:">
  46. <el-input v-model="form.factoryName" :disabled="true"> </el-input>
  47. </el-form-item>
  48. </el-col>
  49. <el-col :xs="12" :sm="12" :md="12" :lg="8" :xl="6">
  50. <el-form-item label="所属工作中心:">
  51. <el-select
  52. style="width: 100%"
  53. v-model="form.workCenterId"
  54. placeholder="请选择"
  55. @change="changeWork"
  56. >
  57. <el-option
  58. v-for="item in workCenterList"
  59. :key="item.id"
  60. :label="item.name"
  61. :value="item.id"
  62. >
  63. </el-option>
  64. </el-select>
  65. </el-form-item>
  66. </el-col>
  67. <el-col :xs="12" :sm="12" :md="12" :lg="8" :xl="6">
  68. <el-form-item label="所属班组:" required>
  69. <el-select
  70. style="width: 100%"
  71. v-model="form.teamId"
  72. placeholder="请选择"
  73. @change="changeGroups"
  74. >
  75. <el-option
  76. v-for="item in teamList"
  77. :key="item.id"
  78. :label="item.name"
  79. :value="item.id"
  80. >
  81. </el-option>
  82. </el-select>
  83. </el-form-item>
  84. </el-col>
  85. </el-row>
  86. <el-row>
  87. <el-form-item label="报工类型:" required>
  88. <el-radio-group
  89. v-model="form.singleReport"
  90. :disabled="form.isDisable"
  91. >
  92. <!-- v-if="clientEnvironmentId != 2" -->
  93. <el-radio :label="1" :disabled="singleDis">单件报工</el-radio>
  94. <el-radio :label="0" :disabled="batchDis">批量报工</el-radio>
  95. </el-radio-group>
  96. </el-form-item>
  97. </el-row>
  98. <el-row>
  99. <el-form-item label="派单方式:" prop="taskAss">
  100. <!-- @change="changeDispatch" -->
  101. <el-radio-group v-model="form.taskAss" :disabled="form.isDisable">
  102. <el-radio :label="1" :disabled="orderDis">生产订单派单</el-radio>
  103. <el-radio :label="0" :disabled="procTaskDis"
  104. >工序任务派单</el-radio
  105. >
  106. </el-radio-group>
  107. </el-form-item>
  108. </el-row>
  109. <el-row v-if="form.taskAss == 1">
  110. <el-col :span="24">
  111. <el-form-item label="指派:" prop="assignType">
  112. <el-radio-group
  113. v-model="form.assignType"
  114. size="mini"
  115. @change="assignRadio"
  116. :disabled="form.isDisable"
  117. >
  118. <el-radio-button :label="1">工位</el-radio-button>
  119. <el-radio-button :label="2">人员</el-radio-button>
  120. <el-radio-button :label="3">产线</el-radio-button>
  121. </el-radio-group>
  122. </el-form-item>
  123. </el-col>
  124. <el-form-item required label="工位:" v-if="form.assignType == 1">
  125. <el-select
  126. class="ele-block"
  127. v-model="form.workstationIds"
  128. placeholder="请选择工位"
  129. size="mini"
  130. multiple
  131. filterable
  132. :disabled="form.isDisable"
  133. >
  134. <el-option
  135. v-for="item in stationList"
  136. :key="item.id"
  137. :label="item.name + '(' + item.code + ')'"
  138. :value="item.id"
  139. >
  140. </el-option>
  141. </el-select>
  142. </el-form-item>
  143. <el-form-item label="人员:" v-if="form.assignType == 2">
  144. <el-select
  145. class="ele-block"
  146. v-model="form.crewIds"
  147. placeholder="请选择人员"
  148. size="mini"
  149. filterable
  150. multiple
  151. >
  152. <el-option
  153. v-for="item in crewList"
  154. :key="item.id"
  155. :label="item.name"
  156. :value="item.id"
  157. >
  158. </el-option>
  159. </el-select>
  160. </el-form-item>
  161. <el-form-item label="产线:" v-if="form.assignType == 3" required>
  162. <el-select
  163. class="ele-block"
  164. v-model="form.factoryLineIds"
  165. placeholder="请选择产线"
  166. size="mini"
  167. filterable
  168. multiple
  169. >
  170. <el-option
  171. v-for="item in productionList"
  172. :key="item.id"
  173. :label="item.name"
  174. :value="item.id"
  175. >
  176. </el-option>
  177. </el-select>
  178. </el-form-item>
  179. </el-row>
  180. <el-tabs
  181. class="process_list"
  182. v-model="processId"
  183. type="border-card"
  184. @tab-click="handleClick"
  185. v-show="form.taskAss == 0"
  186. v-loading="tabsLoading"
  187. >
  188. <el-tab-pane
  189. v-for="(item, index) in processList"
  190. :key="item.id"
  191. :label="item.name"
  192. :name="item.id"
  193. >
  194. <span style="color: green">
  195. 工序编码:{{ item.code }},所属工作中心:{{
  196. item.workCenterName
  197. }}</span
  198. >
  199. <ele-pro-table
  200. class="table"
  201. :ref="`tableRef${index}`"
  202. :columns="columns(item)"
  203. :datasource="item.list"
  204. cache-key="systemRoleTable"
  205. :pageSize="20"
  206. v-loading="tabLoading"
  207. :selection.sync="item.selection"
  208. row-key="id"
  209. >
  210. <template v-slot:toolbar>
  211. <el-button
  212. type="primary"
  213. @click="dispatch(item, 1)"
  214. :loading="toolbarLoading"
  215. :disabled="!item.isDisable"
  216. >
  217. 派单
  218. </el-button>
  219. <el-button
  220. type="primary"
  221. @click="dispatch(item, 2)"
  222. :loading="toolbarLoading"
  223. :disabled="!item.isDisable"
  224. >
  225. 撤回
  226. </el-button>
  227. <el-button
  228. type="primary"
  229. @click="dispatch(item, 3)"
  230. :loading="toolbarLoading"
  231. :disabled="!item.isDisable"
  232. >
  233. 保存
  234. </el-button>
  235. <div style="margin-left: 50px; display: inline-block">
  236. <span
  237. class="text"
  238. style="
  239. font-weight: bold;
  240. font-size: 14px;
  241. margin-right: 8px;
  242. "
  243. >指派:</span
  244. >
  245. <el-radio-group
  246. v-model="item.assignType"
  247. size="mini"
  248. @change="(e) => changeRadio(e, index)"
  249. >
  250. <el-radio-button
  251. :label="1"
  252. :disabled="radioBun(item, 'stationDis')"
  253. >工位</el-radio-button
  254. >
  255. <el-radio-button
  256. :label="2"
  257. :disabled="radioBun(item, 'staffDis')"
  258. >人员</el-radio-button
  259. >
  260. <el-radio-button
  261. :label="3"
  262. :disabled="radioBun(item, 'lineDis')"
  263. >产线</el-radio-button
  264. >
  265. </el-radio-group>
  266. </div>
  267. <div
  268. style="margin-left: 50px; display: inline-block"
  269. v-if="timeSlot(item)"
  270. >
  271. 时间段: {{ item.startDate }} ----- {{ item.endDate }}
  272. </div>
  273. </template>
  274. <template v-slot:quantity="{ row }">
  275. <el-input
  276. :disabled="permissions(row)"
  277. type="number"
  278. v-model="row.quantity"
  279. placeholder="请输入数量"
  280. @input="(e) => handleQuantityInput(e, row, item)"
  281. ></el-input>
  282. </template>
  283. <template v-slot:weight="{ row }">
  284. <el-input
  285. :disabled="permissions(row)"
  286. type="number"
  287. v-model="row.weight"
  288. placeholder="请输入重量"
  289. @input="(e) => handleWeightInput(e, row, item)"
  290. ></el-input>
  291. </template>
  292. <template v-slot:teamTimeIds="{ row }">
  293. <el-select
  294. :disabled="permissions(row)"
  295. multiple
  296. v-model="row.teamTimeIds"
  297. placeholder="班次"
  298. @change="(e) => shiftSelection(e, row, item)"
  299. >
  300. <el-option
  301. v-for="item in shiftList"
  302. :key="item.id"
  303. :label="item.name"
  304. :value="item.id"
  305. >
  306. </el-option>
  307. </el-select>
  308. </template>
  309. <template v-slot:startTime="{ row }">
  310. <el-date-picker
  311. :disabled="permissions(row)"
  312. class="w100"
  313. v-model="row.startTime"
  314. type="datetime"
  315. value-format="yyyy-MM-dd HH:mm:ss"
  316. placeholder="开始时间"
  317. @change="handleStartTimeChange(row, item)"
  318. ></el-date-picker>
  319. </template>
  320. <template v-slot:endTime="{ row }">
  321. <el-date-picker
  322. :disabled="permissions(row)"
  323. class="w100"
  324. v-model="row.endTime"
  325. type="datetime"
  326. value-format="yyyy-MM-dd HH:mm:ss"
  327. @change="handleEndTimeChange(row, item)"
  328. placeholder="完成时间"
  329. ></el-date-picker>
  330. </template>
  331. <template v-slot:action="{ row }">
  332. <!-- :disabled="resetBtnDis(row)" -->
  333. <el-popconfirm
  334. title="确定要重置该条数据吗?"
  335. @confirm="resetData(row, item)"
  336. v-if="resetBtnDis(row)"
  337. >
  338. <template v-slot:reference>
  339. <el-link type="primary" :underline="false"> 重置 </el-link>
  340. </template>
  341. </el-popconfirm>
  342. </template>
  343. </ele-pro-table>
  344. </el-tab-pane>
  345. </el-tabs>
  346. </el-form>
  347. </div>
  348. <div slot="footer">
  349. <el-button plain @click="cancel" :disabled="form.isDisable"
  350. >取消</el-button
  351. >
  352. <el-button
  353. type="primary"
  354. @click="confirm"
  355. :loading="toolbarLoading"
  356. :disabled="form.isDisable"
  357. >确定</el-button
  358. >
  359. </div>
  360. </ele-modal>
  361. </template>
  362. <script>
  363. import releaseMixin from '../mixins/release';
  364. import { parameterGetByCode } from '@/api/mainData/index';
  365. export default {
  366. components: {},
  367. props: {
  368. current: {
  369. type: Object,
  370. default: () => {}
  371. },
  372. dispatchVisible: {
  373. type: Boolean,
  374. default: false
  375. }
  376. },
  377. mixins: [releaseMixin],
  378. mixinOptions: { type: 'add' },
  379. data() {
  380. return {
  381. processId: '',
  382. tabLoading: false,
  383. dynamicName: '工位名称',
  384. form: {
  385. assignType: '',
  386. crewIds: '',
  387. workstationIds: '',
  388. teamId: '',
  389. singleReport: '',
  390. workCenterId: '',
  391. taskAss: '',
  392. factoryName: '',
  393. factoryLineIds: '',
  394. isDisable: false
  395. },
  396. processingRequired: 0,
  397. toolbarLoading: false,
  398. processList: [],
  399. workCenterList: [],
  400. teamList: [],
  401. tabsLoading: false,
  402. stationList: [], // 工位的数据
  403. productionList: [], // 产线的数据
  404. crewList: [], // 人员的数据
  405. procTaskDis: false, // 工序任务派单选择
  406. firstTaskindex: '', // 首工序id 对应的工序列表数据下标
  407. fieldList: [
  408. { label: '生产订单号:', prop: 'code' },
  409. { label: '计划编号:', prop: 'productionPlanCode' },
  410. { label: '工艺路线:', prop: 'produceRoutingName' },
  411. // { label: '编码', prop: 'productCode' },
  412. { label: '名称:', prop: 'productName' },
  413. { label: '生产编号:', prop: 'productionCodes' },
  414. { label: '牌号:', prop: 'brandNo' },
  415. { label: '批次号:', prop: 'batchNo' },
  416. { label: '型号:', prop: 'model' },
  417. { label: '要求生产数量:', prop: 'formingNum' },
  418. { label: '要求生产重量:', prop: 'initialWeight' },
  419. { label: '计划开始时间:', prop: 'planStartTime', type: 'date' },
  420. { label: '计划结束时间:', prop: 'planCompleteTime', type: 'date' }
  421. ],
  422. shiftList: [],
  423. dateValue: '',
  424. orderDis: false, // 生产订单派单
  425. singleDis: false, // 单个报工
  426. batchDis: false, // 批量报工
  427. isDispatchRow: {}, // 查询是否派单数据
  428. time_calc_code: '0', // 是否进行时间赋值 0 否 1 是
  429. isTask: true
  430. };
  431. },
  432. computed: {
  433. fieldValue() {
  434. return (field) => {
  435. return this.current[field];
  436. };
  437. },
  438. clientEnvironmentId() {
  439. return this.$store.state.user.info.clientEnvironmentId;
  440. },
  441. userInfo() {
  442. return this.$store.state.user.info;
  443. },
  444. modelWidth() {
  445. // if(this.form.taskAss == 1){
  446. // return '1000px'
  447. // }
  448. return '75vw';
  449. },
  450. // 重置按钮 的置灰权限 没有进行操作跟派单的数据 置灰
  451. resetBtnDis() {
  452. return (row) => {
  453. if (!row.status) return false;
  454. let flag = row.status.code != 1;
  455. return flag;
  456. };
  457. },
  458. // 指派单选框操作 已派单的 其它两个按钮不能操作
  459. radioBun() {
  460. return (row, type) => {
  461. if (!row.radioBun) return false;
  462. let flag = row.radioBun[type];
  463. return flag;
  464. };
  465. },
  466. // 列表输入框操作 已派单的不能操作
  467. permissions() {
  468. return (row) => {
  469. if (!row.status) return false;
  470. if (row.status.code == 1) return true;
  471. };
  472. },
  473. // 时间段显示
  474. timeSlot() {
  475. return (item) => {
  476. if (!item.startDate || !item.endDate) {
  477. return false;
  478. }
  479. return true;
  480. };
  481. },
  482. columns() {
  483. return (val) => {
  484. let data =
  485. val.assignType == 1
  486. ? [
  487. {
  488. prop: 'assetCode',
  489. label: '设备编码',
  490. align: 'center',
  491. width: 150
  492. },
  493. {
  494. prop: 'assetName',
  495. label: '设备名称',
  496. align: 'center',
  497. width: 150
  498. },
  499. {
  500. prop: 'assetModelType',
  501. label: '设备型号',
  502. align: 'center',
  503. width: 150
  504. },
  505. {
  506. prop: 'assetCategoryLevelPath',
  507. label: '设备类型',
  508. align: 'center',
  509. width: 150
  510. }
  511. ]
  512. : [];
  513. return [
  514. {
  515. columnKey: 'index',
  516. label: '序号',
  517. type: 'index',
  518. width: 55,
  519. align: 'center',
  520. fixed: 'left'
  521. },
  522. {
  523. width: 45,
  524. type: 'selection',
  525. columnKey: 'selection',
  526. align: 'center',
  527. fixed: 'left',
  528. reserveSelection: true
  529. },
  530. {
  531. prop: 'name',
  532. label: this.dynamicName,
  533. align: 'center',
  534. width: 200
  535. },
  536. {
  537. prop: 'code',
  538. label: '编码',
  539. align: 'center',
  540. width: 200
  541. },
  542. ...data,
  543. {
  544. prop: 'status',
  545. label: '状态',
  546. align: 'center',
  547. width: 150,
  548. formatter: (row) => {
  549. if (!row.status) return '';
  550. return row.status.desc || '';
  551. }
  552. },
  553. {
  554. slot: 'quantity',
  555. prop: 'quantity',
  556. label: '数量',
  557. align: 'center',
  558. width: 140
  559. },
  560. {
  561. slot: 'weight',
  562. prop: 'weight',
  563. label: `重量(${this.current.newWeightUnit})`,
  564. align: 'center',
  565. width: 140
  566. },
  567. {
  568. slot: 'teamTimeIds',
  569. prop: 'teamTimeIds',
  570. label: '班次',
  571. align: 'center',
  572. minWidth: 220
  573. },
  574. {
  575. slot: 'startTime',
  576. prop: 'startTime',
  577. label: '计划开始时间',
  578. align: 'center',
  579. minWidth: 240
  580. },
  581. {
  582. slot: 'endTime',
  583. prop: 'endTime',
  584. label: '计划完成时间',
  585. align: 'center',
  586. minWidth: 240
  587. },
  588. {
  589. columnKey: 'action',
  590. label: '操作',
  591. width: 120,
  592. align: 'center',
  593. resizable: false,
  594. fixed: 'right',
  595. slot: 'action'
  596. }
  597. ];
  598. };
  599. }
  600. },
  601. watch: {},
  602. created() {
  603. this.getDispatchMethod('dispatch_method');
  604. this.getAssignmentMethod('assignment_method');
  605. this.getReportType('report_type');
  606. // 时间计算规则code
  607. this.getCode();
  608. this.workCenterData(); // 查询工作中心
  609. this.getClassesData(); // 查询班次
  610. this.queryCheckExists(); // 查询是否派单
  611. // this.form.singleReport = this.clientEnvironmentId == 2 ? 0 : '';
  612. this.dateValue = this.getFormattedDate();
  613. },
  614. methods: {
  615. getCode() {
  616. parameterGetByCode({
  617. code: 'time_calculation_rules'
  618. }).then((res) => {
  619. if (res) {
  620. this.time_calc_code = res.value || '0';
  621. }
  622. });
  623. },
  624. async getReportType(code) {
  625. await parameterGetByCode({ code }).then((res) => {
  626. if (res) {
  627. this.form.singleReport =
  628. this.clientEnvironmentId == 2
  629. ? 0
  630. : res.value == '0'
  631. ? 0
  632. : res.value == '1'
  633. ? 1
  634. : '';
  635. console.log(this.form.singleReport, 'this.form.singleReport');
  636. }
  637. });
  638. },
  639. async getDispatchMethod(code) {
  640. await parameterGetByCode({ code }).then((res) => {
  641. if (res) {
  642. this.form.taskAss = res.value == '0' ? 0 : 1;
  643. console.log(this.form.taskAss, 'this.form.taskAss');
  644. }
  645. });
  646. },
  647. async getAssignmentMethod(code) {
  648. await parameterGetByCode({ code }).then((res) => {
  649. if (res) {
  650. this.form.assignType =
  651. res.value == '0' ? 1 : res.value == '1' ? 2 : 3;
  652. }
  653. });
  654. }
  655. }
  656. };
  657. </script>
  658. <style lang="scss" scoped>
  659. .top-box {
  660. display: flex;
  661. margin-bottom: 10px;
  662. .item-box {
  663. flex: 1;
  664. }
  665. }
  666. .radio-box {
  667. margin: 10px 0;
  668. }
  669. .table {
  670. margin-top: 20px;
  671. }
  672. ::v-deep .el-radio-button__orig-radio:checked + .el-radio-button__inner {
  673. background-color: #10d070;
  674. border-color: #10d070;
  675. }
  676. ::v-deep .el-radio-button__orig-radio:checked + .el-radio-button__inner {
  677. box-shadow: none;
  678. }
  679. // ::v-deep .ele-block{
  680. // width: 240px;
  681. // }
  682. // ::v-deep .basic {
  683. // .el-form-item {
  684. // width: 100%;
  685. // }
  686. // .form80 {
  687. // .el-form-item__content {
  688. // width: calc(100% - 80px);
  689. // }
  690. // }
  691. // .form65 {
  692. // .el-form-item__content {
  693. // width: calc(100% - 65px);
  694. // }
  695. // }
  696. // .el-form-item__label {
  697. // padding: 0 4px 0 0;
  698. // }
  699. // .item_label {
  700. // white-space: nowrap;
  701. // overflow: hidden;
  702. // text-overflow: ellipsis;
  703. // width: 100%;
  704. // }
  705. // }
  706. </style>