new_produceOrder.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. <template>
  2. <div>
  3. <ele-pro-table
  4. ref="table"
  5. :columns="columns"
  6. height="calc(100vh - 280px)"
  7. width="100%"
  8. :datasource="datasource"
  9. :selection.sync="selection"
  10. @selection-change="handleSelectionChange"
  11. @cell-click="cellClick"
  12. highlight-current-row
  13. @select="cellClick"
  14. :need-page="false"
  15. @sort-change="onSortChange"
  16. @columns-change="handleColumnChange"
  17. :cache-key="cacheKeyUrl"
  18. :row-class-name="tableRowClassName"
  19. >
  20. <template v-slot:code="{ row }">
  21. <el-link type="primary" @click="handRoute(row)" :underline="false">{{
  22. row.code
  23. }}</el-link>
  24. </template>
  25. <template v-slot:singleReport="{ row }">
  26. <el-tag size="mini">
  27. {{ row.singleReport == 1 ? '单个报工' : '批量报工' }}</el-tag
  28. >
  29. </template>
  30. <template v-slot:productUnitWeight="{ row }">
  31. <span> {{ row.productUnitWeight }}{{ row.weightUnit }}</span>
  32. </template>
  33. <template v-slot:taskName="{ row }">
  34. <span> {{ row.taskName }}</span>
  35. </template>
  36. <template v-slot:sourceType="{ row }">
  37. <span v-if="row.sourceType == 1">生产计划</span>
  38. <span v-if="row.sourceType == 2">临时生产计划</span>
  39. <span v-if="row.sourceType == 3">受托转订单</span>
  40. </template>
  41. <template v-slot:outsourceStatus="{ row }">
  42. <div v-if="row.outsourceStatus">
  43. <span v-if="row.outsourceStatus == 1">未委外</span>
  44. <span v-if="row.outsourceStatus == 2">委外中</span>
  45. <span v-if="row.outsourceStatus == 3">完成委外</span>
  46. </div>
  47. </template>
  48. <template v-slot:entrustStatus="{ row }">
  49. <div v-if="row.entrustStatus">
  50. <span v-if="row.entrustStatus == 1">未请托</span>
  51. <span v-if="row.entrustStatus == 2">请托中</span>
  52. <span v-if="row.entrustStatus == 3">请托完成</span>
  53. </div>
  54. <span v-else>未请托</span>
  55. </template>
  56. <template v-slot:workOrderType="{ row }">
  57. <span v-if="row.workOrderType == 1">普通订单</span>
  58. <span v-if="row.workOrderType == 2">临时订单</span>
  59. <span v-if="row.workOrderType == 3">受托订单</span>
  60. </template>
  61. <template v-slot:status="{ row }">
  62. <span> {{ sumStatus(row) }}</span>
  63. </template>
  64. <template v-slot:formingNum="{ row }">
  65. <span> {{ row.formingNum }} {{ row.unit }} </span>
  66. </template>
  67. <template v-slot:formingWeight="{ row }">
  68. <span> {{ row.formingWeight }} {{ row.weightUnit }} </span>
  69. </template>
  70. </ele-pro-table>
  71. <!-- //工单列表 -->
  72. <routings
  73. v-if="routingShow"
  74. :routeObj="routeObj"
  75. @closeRoute="closeRoute"
  76. ></routings>
  77. </div>
  78. </template>
  79. <script>
  80. import { workorderPage2 } from '@/api/produce/workOrder.js';
  81. import routings from './routings.vue';
  82. import { isFullscreen } from 'ele-admin';
  83. import tableColumnsMixin from '@/mixins/tableColumnsMixin';
  84. import {
  85. getList,
  86. removeItem,
  87. updateCertificateNumber
  88. } from '@/api/inspectionWork';
  89. export default {
  90. components: { routings },
  91. mixins: [tableColumnsMixin],
  92. emits: ['changeIsPreProductionResult'],
  93. props: {
  94. produceTaskInfo: {
  95. type: Object,
  96. default: () => {
  97. return null;
  98. }
  99. }
  100. },
  101. data() {
  102. return {
  103. loading: false,
  104. selection: [],
  105. routeObj: {},
  106. routingShow: false,
  107. code: '',
  108. internalIsFullscreen: isFullscreen(), // 初始值
  109. cacheKeyUrl: 'mes-145878-mes-produce',
  110. columnsVersion: 0
  111. };
  112. },
  113. computed: {
  114. // 表格列配置
  115. columns() {
  116. let columnsVersion = this.columnsVersion;
  117. return [
  118. {
  119. width: 45,
  120. type: 'selection',
  121. columnKey: 'selection',
  122. align: 'center',
  123. fixed: true
  124. },
  125. {
  126. columnKey: 'index',
  127. label: '序号',
  128. type: 'index',
  129. width: 55,
  130. align: 'center',
  131. showOverflowTooltip: true
  132. },
  133. {
  134. prop: 'batchNo',
  135. label: '批次号',
  136. align: 'center',
  137. showOverflowTooltip: true
  138. },
  139. {
  140. prop: 'code',
  141. slot: 'code',
  142. label: '生产工单号',
  143. align: 'center',
  144. minWidth: '160',
  145. showOverflowTooltip: true
  146. },
  147. {
  148. prop: 'produceRoutingName',
  149. label: '工艺路线',
  150. align: 'center',
  151. minWidth: '160',
  152. showOverflowTooltip: true
  153. },
  154. {
  155. prop: 'productCode',
  156. label: '编码',
  157. align: 'center',
  158. minWidth: '160',
  159. showOverflowTooltip: true
  160. },
  161. {
  162. prop: 'productName',
  163. label: '名称',
  164. align: 'center',
  165. showOverflowTooltip: true
  166. },
  167. {
  168. prop: 'sourceType',
  169. label: '来源类型',
  170. slot: 'sourceType',
  171. align: 'center',
  172. minWidth: 110,
  173. showOverflowTooltip: true
  174. },
  175. {
  176. prop: 'workOrderType',
  177. label: '订单类型',
  178. slot: 'workOrderType',
  179. align: 'center',
  180. minWidth: 110,
  181. showOverflowTooltip: true
  182. },
  183. {
  184. prop: 'singleReport',
  185. slot: 'singleReport',
  186. label: '报工类型',
  187. align: 'center',
  188. filters: [
  189. { text: '单个报工', value: 1 },
  190. { text: '批量报工', value: 0 }
  191. ],
  192. filterMethod: this.filterMethod,
  193. width: 100
  194. },
  195. {
  196. prop: 'model',
  197. label: '型号',
  198. align: 'center',
  199. showOverflowTooltip: true
  200. },
  201. {
  202. prop: 'specification',
  203. label: '规格',
  204. align: 'center',
  205. showOverflowTooltip: true
  206. },
  207. {
  208. prop: 'outsourceStatus',
  209. label: '委外状态',
  210. align: 'center',
  211. slot: 'outsourceStatus',
  212. showOverflowTooltip: true
  213. },
  214. {
  215. prop: 'entrustStatus',
  216. label: '请托状态',
  217. align: 'center',
  218. slot: 'entrustStatus',
  219. showOverflowTooltip: true
  220. },
  221. {
  222. prop: 'productionCodes',
  223. label: '生产编号',
  224. align: 'center',
  225. minWidth: 150,
  226. showOverflowTooltip: true
  227. },
  228. {
  229. prop: 'brandNo',
  230. label: '牌号',
  231. align: 'center',
  232. showOverflowTooltip: true
  233. },
  234. {
  235. prop: 'productUnitWeight',
  236. slot: 'productUnitWeight',
  237. label: '单重',
  238. align: 'center',
  239. showOverflowTooltip: true
  240. },
  241. {
  242. prop: 'priority',
  243. label: '优先级',
  244. align: 'center',
  245. minWidth: 120
  246. },
  247. {
  248. prop: 'formingNum',
  249. label: '要求生产数量',
  250. align: 'center',
  251. slot: 'formingNum',
  252. showOverflowTooltip: true,
  253. minWidth: 110
  254. },
  255. {
  256. prop: 'formingWeight',
  257. label: '要求生产重量',
  258. slot: 'formingWeight',
  259. align: 'center',
  260. showOverflowTooltip: true,
  261. minWidth: 110
  262. },
  263. {
  264. prop: 'formedNum',
  265. label: '已生产数量',
  266. align: 'center',
  267. showOverflowTooltip: true,
  268. minWidth: 110
  269. },
  270. {
  271. prop: 'formedWeight',
  272. label: '已生产重量',
  273. align: 'center',
  274. showOverflowTooltip: true,
  275. minWidth: 110
  276. },
  277. {
  278. slot: 'taskName',
  279. prop: 'taskName',
  280. label: '工序进度',
  281. align: 'center',
  282. showOverflowTooltip: true,
  283. sortable: 'custom',
  284. minWidth: 110
  285. },
  286. {
  287. slot: 'status',
  288. prop: 'status',
  289. label: '最新工单状态',
  290. align: 'center',
  291. showOverflowTooltip: true,
  292. minWidth: 110
  293. },
  294. {
  295. prop: 'colorKey',
  296. label: '颜色',
  297. align: 'center',
  298. showOverflowTooltip: true,
  299. minWidth: 110
  300. },
  301. {
  302. prop: 'modelKey',
  303. label: '机型',
  304. align: 'center',
  305. showOverflowTooltip: true,
  306. minWidth: 110
  307. },
  308. {
  309. prop: 'planStartTime',
  310. label: '计划开始时间',
  311. align: 'center',
  312. showOverflowTooltip: true,
  313. minWidth: 130,
  314. sortable: true
  315. },
  316. {
  317. prop: 'planCompleteTime',
  318. label: '计划结束时间',
  319. align: 'center',
  320. showOverflowTooltip: true,
  321. minWidth: 130,
  322. sortable: true
  323. },
  324. {
  325. prop: 'startTime',
  326. label: '实际开始时间',
  327. align: 'center',
  328. showOverflowTooltip: true,
  329. minWidth: 130,
  330. sortable: true
  331. },
  332. {
  333. prop: 'completeTime',
  334. label: '实际完成时间',
  335. align: 'center',
  336. showOverflowTooltip: true,
  337. minWidth: 130,
  338. sortable: true
  339. },
  340. {
  341. prop: 'createTime',
  342. label: '创建时间',
  343. align: 'center',
  344. showOverflowTooltip: true,
  345. minWidth: 130,
  346. sortable: true
  347. }
  348. ];
  349. },
  350. taskObj() {
  351. return this.$store.state.user.taskObj;
  352. },
  353. current() {
  354. console.log(this.$store.state.user, 'this.$store.state.user');
  355. return this.$store.state.user.currentObj.id;
  356. }
  357. },
  358. watch: {
  359. taskObj: {
  360. handler(val) {
  361. console.log('123');
  362. this.reload();
  363. },
  364. // immediate: true,
  365. deep: true
  366. },
  367. current: {
  368. handler(val) {
  369. console.log('456');
  370. this.reload();
  371. },
  372. // immediate: true,
  373. deep: true
  374. }
  375. },
  376. created() {},
  377. mounted() {
  378. // 添加窗口resize事件监听器
  379. window.addEventListener('resize', this.handleResize);
  380. },
  381. beforeDestroy() {
  382. // 组件销毁前移除事件监听器,防止内存泄漏
  383. window.removeEventListener('resize', this.handleResize);
  384. },
  385. methods: {
  386. filterMethod(value, row, column) {
  387. if (value == row.singleReport) {
  388. return row;
  389. }
  390. },
  391. sumStatus(row) {
  392. if (row.reportStatus === 1) {
  393. return '已报工';
  394. }
  395. if (row.feedStatus === 1) {
  396. return '已投料';
  397. }
  398. },
  399. tableRowClassName({ row, rowIndex }) {
  400. if (row.outsourceStatus == 2) {
  401. return 'warning-row';
  402. }
  403. if (row.entrustStatus == 2) {
  404. return 'ent-row';
  405. }
  406. },
  407. /* 表格数据源 */
  408. datasource({ page, where }) {
  409. if (!this.taskObj?.id) {
  410. return [];
  411. }
  412. console.log(this.taskObj?.id);
  413. // if (this.taskObj?.id == '1916800744740663298') {
  414. // return getList({
  415. // pageNum: page,
  416. // size: 1000
  417. // });
  418. // } else {
  419. return workorderPage2({
  420. pageNum: page,
  421. size: 5000,
  422. workOrderId: this.$route.query.workOrderId
  423. ? this.$route.query.workOrderId
  424. : null,
  425. taskId: this.taskObj && this.taskObj.id,
  426. deviceId: this.current && this.current.deviceId,
  427. keyWord: this.keyWord,
  428. taskName: this.taskName,
  429. ...where
  430. });
  431. // }
  432. },
  433. onSortChange(e) {
  434. console.log(e);
  435. let sort = {
  436. orderBy: e.order,
  437. sortName: e.prop
  438. };
  439. this.where = sort;
  440. this.reload();
  441. },
  442. handleSearch(obj) {
  443. this.keyWord = obj.keyWord;
  444. this.taskName = obj.taskName;
  445. this.reload();
  446. },
  447. /* 刷新表格 */
  448. reload(where) {
  449. this.$nextTick(() => {
  450. this.$refs.table.reload({ page: 1, where });
  451. });
  452. },
  453. async handleSelectionChange(val) {
  454. console.log('val 选择的工单列表', val);
  455. console.log('this.produceTaskInfo', this.produceTaskInfo);
  456. let initReportValue = val[0] && val[0].singleReport;
  457. let allSame = true;
  458. val.forEach((item) => {
  459. if (item.singleReport !== initReportValue) {
  460. allSame = false;
  461. }
  462. });
  463. if (!allSame) {
  464. return this.$message.warning('请选择报工类型相同的工单');
  465. }
  466. let ids = [];
  467. ids = val.map((item) => {
  468. return item.id;
  469. });
  470. this.$emit('workSelect', { ids: ids, list: val });
  471. },
  472. rowClick(e) {
  473. this.$emit('rowClick', e, this.taskObj.id);
  474. },
  475. cellClick() {
  476. this.$nextTick(() => {
  477. this.$emit('getTaskName', this.selection);
  478. });
  479. },
  480. handRoute(row) {
  481. this.routeObj = row;
  482. this.routingShow = true;
  483. },
  484. closeRoute() {
  485. this.routingShow = false;
  486. },
  487. handleResize() {
  488. this.internalIsFullscreen = isFullscreen();
  489. }
  490. }
  491. };
  492. </script>
  493. <style lang="scss" scoped>
  494. ::v-deep .el-table .warning-row {
  495. background: #39d9ac;
  496. // color: #39d9ac;
  497. }
  498. ::v-deep .el-table .ent-row {
  499. background: #b3e10b;
  500. // color: #39d9ac;
  501. }
  502. ::v-deep .el-table .success-row {
  503. background: #f0f9eb;
  504. }
  505. </style>