details.vue 19 KB

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