index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. <template>
  2. <div class="ele-body">
  3. <el-card shadow="never" v-loading="loading">
  4. <search @search="reload" ref="searchRef"> </search>
  5. <!-- 数据表格 -->
  6. <ele-pro-table
  7. ref="table"
  8. :columns="columns"
  9. :datasource="datasource"
  10. cache-key="outsourcingListDatas"
  11. :pageSize="20"
  12. >
  13. <template v-slot:code="{ row }">
  14. <el-link
  15. type="primary"
  16. :underline="false"
  17. @click="handleDetails(row)"
  18. >{{ row.code }}</el-link
  19. >
  20. </template>
  21. <template v-slot:totalCount="{ row }">
  22. <div v-if="row.totalCount"
  23. >{{ row.totalCount }}{{ row.measuringUnit }}</div
  24. >
  25. </template>
  26. <template v-slot:totalWeight="{ row }">
  27. <div v-if="row.totalWeight"
  28. >{{ row.totalWeight }}{{ row.weightUnit }}</div
  29. >
  30. <div v-else>无</div>
  31. </template>
  32. <template v-slot:requireDeliveryTime="{ row }">
  33. <span v-if="row.deliveryMethod == 1">{{
  34. row.requireDeliveryTime
  35. }}</span>
  36. <el-link
  37. v-if="row.deliveryMethod == 2"
  38. type="primary"
  39. :underline="false"
  40. @click.native="handleMethod(row)"
  41. >分批时间</el-link
  42. >
  43. </template>
  44. <template v-slot:type="{ row }">
  45. <div v-if="row.type == 1">采购委外</div>
  46. <div v-if="row.type == 2">直接发货委外</div>
  47. <div v-if="row.type == 3">无采购委外</div>
  48. <div v-if="row.type == 4">带料委外</div>
  49. <div v-if="row.type == 5">不带料委外</div>
  50. </template>
  51. <template v-slot:status="{ row }">
  52. <el-tag>{{
  53. row.status == 0 ? '未提交' : row.status == 1 ? '已提交' : '已发布'
  54. }}</el-tag>
  55. </template>
  56. <template v-slot:approvalStatus="{ row }">
  57. <el-tag v-if="row.approvalStatus == 0">未提交</el-tag>
  58. <el-tag v-if="row.approvalStatus == 1" type="warning">审核中</el-tag>
  59. <el-tag v-if="row.approvalStatus == 2" type="success"
  60. >审核通过</el-tag
  61. >
  62. <el-tag v-if="row.approvalStatus == 3" type="danger"
  63. >审核不通过</el-tag
  64. >
  65. </template>
  66. <template v-slot:purchaseStatus="{ row }">
  67. <el-tag v-if="row.purchaseStatus == 0 || !row.purchaseStatus"
  68. >未入库</el-tag
  69. >
  70. <el-tag v-if="row.purchaseStatus == 1" type="warning"
  71. >原料入库</el-tag
  72. >
  73. <!-- <el-tag v-if="row.purchaseStatus == 2" type="success"
  74. >审核通过</el-tag
  75. > -->
  76. <el-tag v-if="row.purchaseStatus == 3" type="success"
  77. >委外完成</el-tag
  78. >
  79. </template>
  80. <template v-slot:outsourceScene="{ row }">
  81. <span>{{ row.outsourceScene | outsourceSceneText }}</span>
  82. </template>
  83. <template v-slot:technicalDrawings="{ row }">
  84. <div v-if="row.technicalDrawings && row.technicalDrawings?.length">
  85. <el-link
  86. v-for="link in row.technicalDrawings"
  87. :key="link.id"
  88. type="primary"
  89. :underline="false"
  90. @click="downloadFile(link)"
  91. >
  92. {{ link.name }}</el-link
  93. >
  94. </div>
  95. </template>
  96. <template v-slot:files="{ row }">
  97. <div v-if="row.files && row.files?.length">
  98. <el-link
  99. v-for="link in row.files"
  100. :key="link.id"
  101. type="primary"
  102. :underline="false"
  103. @click="downloadFile(link)"
  104. >
  105. {{ link.name }}</el-link
  106. >
  107. </div>
  108. </template>
  109. <template v-slot:action="{ row }">
  110. <!-- <el-link
  111. type="primary"
  112. :underline="false"
  113. @click="handleDetails(row)"
  114. >
  115. 详情
  116. </el-link> -->
  117. <el-link
  118. type="primary"
  119. v-if="row.status == 1 || row.status == 2"
  120. :underline="false"
  121. @click="handleFlow(row)"
  122. >
  123. 流程
  124. </el-link>
  125. <el-link
  126. type="primary"
  127. v-if="row.status == 0"
  128. :underline="false"
  129. @click="handleRelease(row)"
  130. >
  131. 提交
  132. </el-link>
  133. </template>
  134. </ele-pro-table>
  135. </el-card>
  136. <flow ref="flowRef"></flow>
  137. <release ref="releaseRef" @refresh="releaseRefresh"></release>
  138. <detail ref="detailsRef"></detail>
  139. <timeDialog ref="timeDialogRef"></timeDialog>
  140. </div>
  141. </template>
  142. <script>
  143. import { getList } from '@/api/outsourcing/index.js';
  144. import flow from './components/flow.vue';
  145. import search from './components/search.vue';
  146. import release from './components/release.vue';
  147. import Detail from './components/details.vue';
  148. import timeDialog from './components/timeDialog.vue';
  149. import { getFile } from '@/api/system/file';
  150. export default {
  151. components: {
  152. search,
  153. flow,
  154. release,
  155. Detail,
  156. timeDialog
  157. },
  158. data() {
  159. return {
  160. loading: false
  161. };
  162. },
  163. filters: {
  164. outsourceSceneText(text) {
  165. switch (text) {
  166. case 1:
  167. return '首工序委外';
  168. case 2:
  169. return '单工序';
  170. case 3:
  171. return '多工序';
  172. case 4:
  173. return '首工序及多工序';
  174. default:
  175. return '';
  176. }
  177. }
  178. },
  179. computed: {
  180. // 表格列配置
  181. columns() {
  182. return [
  183. {
  184. columnKey: 'index',
  185. label: '序号',
  186. type: 'index',
  187. width: 55,
  188. align: 'center',
  189. showOverflowTooltip: true,
  190. fixed: 'left'
  191. },
  192. {
  193. prop: 'batchNo',
  194. label: '批次号',
  195. align: 'center',
  196. minWidth: 100,
  197. showOverflowTooltip: true
  198. },
  199. {
  200. slot: 'code',
  201. prop: 'code',
  202. label: '委外单编码',
  203. align: 'center',
  204. showOverflowTooltip: true
  205. },
  206. {
  207. prop: 'name',
  208. label: '委外单名称',
  209. align: 'center',
  210. showOverflowTooltip: true
  211. },
  212. {
  213. prop: 'workOrderCode',
  214. label: '工单编码',
  215. align: 'center',
  216. showOverflowTooltip: true
  217. },
  218. {
  219. prop: 'taskName',
  220. label: '委外发起工序',
  221. align: 'center',
  222. showOverflowTooltip: true
  223. },
  224. {
  225. prop: 'taskNames',
  226. label: '委外工序',
  227. align: 'center',
  228. showOverflowTooltip: true
  229. },
  230. {
  231. prop: 'totalCount',
  232. slot: 'totalCount',
  233. label: '委外数量',
  234. align: 'center',
  235. showOverflowTooltip: true
  236. },
  237. {
  238. prop: 'totalWeight',
  239. slot: 'totalWeight',
  240. label: '委外重量',
  241. align: 'center',
  242. showOverflowTooltip: true
  243. },
  244. {
  245. slot: 'type',
  246. label: '委外类型',
  247. align: 'center',
  248. showOverflowTooltip: true
  249. },
  250. {
  251. prop: 'outsourceScene',
  252. slot: 'outsourceScene',
  253. label: '委外场景',
  254. align: 'center',
  255. showOverflowTooltip: true
  256. },
  257. {
  258. prop: 'supplierName',
  259. label: '委外单位',
  260. align: 'center',
  261. showOverflowTooltip: true
  262. },
  263. {
  264. slot: 'requireDeliveryTime',
  265. label: '预计到货日期',
  266. align: 'center',
  267. width: 100,
  268. showOverflowTooltip: true
  269. },
  270. // {
  271. // prop: 'produceRoutingName',
  272. // label: '工艺路线',
  273. // align: 'center'
  274. // },
  275. {
  276. prop: 'warehouseName',
  277. label: '仓库',
  278. align: 'center',
  279. showOverflowTooltip: true
  280. },
  281. {
  282. prop: 'createUserName',
  283. label: '申请人',
  284. align: 'center',
  285. showOverflowTooltip: true
  286. },
  287. {
  288. prop: 'createTime',
  289. label: '创建时间',
  290. align: 'center',
  291. width: 100,
  292. showOverflowTooltip: true
  293. },
  294. {
  295. slot: 'status',
  296. label: '状态',
  297. align: 'center',
  298. showOverflowTooltip: true,
  299. width: 100
  300. },
  301. {
  302. slot: 'purchaseStatus',
  303. label: '委外状态',
  304. align: 'center',
  305. showOverflowTooltip: true,
  306. width: 100
  307. },
  308. {
  309. slot: 'approvalStatus',
  310. label: '审核状态',
  311. align: 'center',
  312. showOverflowTooltip: true,
  313. width: 110
  314. },
  315. {
  316. label: '图片附件',
  317. slot: 'technicalDrawings',
  318. prop: 'technicalDrawings',
  319. minWidth: 100
  320. },
  321. {
  322. label: '附件',
  323. slot: 'files',
  324. prop: 'files',
  325. minWidth: 100
  326. },
  327. {
  328. prop: 'remark',
  329. label: '备注',
  330. align: 'center'
  331. },
  332. {
  333. columnKey: 'action',
  334. label: '操作',
  335. width: 140,
  336. align: 'center',
  337. resizable: false,
  338. fixed: 'right',
  339. slot: 'action',
  340. showOverflowTooltip: true
  341. }
  342. ];
  343. },
  344. clientEnvironmentId() {
  345. return this.$store.state.user.info.clientEnvironmentId;
  346. }
  347. },
  348. created() {},
  349. methods: {
  350. statusFormatter(status) {
  351. const obj = this.statusOpt.find((i) => i.value == status);
  352. return obj && obj.label;
  353. },
  354. /* 表格数据源 */
  355. datasource({ page, limit, where }) {
  356. return getList({
  357. pageNum: page,
  358. size: limit,
  359. ...where
  360. });
  361. },
  362. downloadFile(file) {
  363. getFile({ objectName: file.storePath }, file.name);
  364. },
  365. handleFlow(row) {
  366. if (!row.processInstanceId) {
  367. return this.$message.warning('暂无流程图');
  368. }
  369. this.$refs.flowRef.open(row.processInstanceId);
  370. },
  371. handleDetails(row) {
  372. this.$refs.detailsRef.open(row);
  373. },
  374. handleMethod(row) {
  375. this.$refs.timeDialogRef.open(row, 'details');
  376. },
  377. handleRelease(row) {
  378. this.$refs.releaseRef.open(row);
  379. },
  380. /* 刷新表格 */
  381. reload(where) {
  382. this.$nextTick(() => {
  383. this.$refs.table.reload({ page: 1, where });
  384. });
  385. },
  386. releaseRefresh() {
  387. this.$refs.table.reload();
  388. }
  389. }
  390. };
  391. </script>
  392. <style lang="scss" scoped></style>