orders.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <template>
  2. <div>
  3. <div class="commonTitle">
  4. {{ activeName == "ok" ? "已完成工单" : "待完成工单" }}[{{ ordersSum }}]
  5. </div>
  6. <el-tabs
  7. v-model="activeName"
  8. class="demo-tabs"
  9. type="card"
  10. @tab-click="handleClick"
  11. >
  12. <el-tab-pane label="未完成" name="false" />
  13. <el-tab-pane label="已完成" name="ok" />
  14. </el-tabs>
  15. <div style="margin-bottom: 10px">
  16. <el-input
  17. v-model="searchText"
  18. class="input-with-select"
  19. clearable
  20. placeholder="请输入物料名称或工单编号或计划编号进行查询"
  21. @clear="clearSearch"
  22. >
  23. <template #append>
  24. <el-button :icon="Search" @click="startSearch" />
  25. </template>
  26. </el-input>
  27. </div>
  28. <el-scrollbar
  29. ref="wrapRef"
  30. v-loading="map.get('getProcessOrders')"
  31. class="barHeight"
  32. @scroll="handleScroll"
  33. >
  34. <!-- <el-scrollbar class="barHeight" ref="wrapRef" @scroll="handleScroll"> -->
  35. <Order
  36. v-for="(item, index) in ordersDataArray"
  37. :key="index"
  38. :hoverStatus="index == selectIndex ? true : false"
  39. :item="item"
  40. @click="setSlectIndex(index)"
  41. />
  42. <div
  43. v-if="ordersQuery.pageNo == ordersQuery.totalPages"
  44. class="describeText notice"
  45. >
  46. 已经到底啦~
  47. </div>
  48. </el-scrollbar>
  49. <Empty v-if="ordersDataArray.length < 1" />
  50. </div>
  51. </template>
  52. <script lang="ts" setup>
  53. import Order from "@/views/process/components/order.vue";
  54. import {
  55. useCommonStoreHook,
  56. useDictionaryStore,
  57. useProcessStore,
  58. } from "@/store";
  59. import { getOrders } from "@/api/process";
  60. import { emitter, EventsNames } from "@/utils/common";
  61. import { Search } from "@element-plus/icons-vue";
  62. const dictS = useDictionaryStore();
  63. const store = useProcessStore();
  64. const selectSeqIndex = inject("selectSeqIndex");
  65. const selectedOderStatus = inject("selectedOderStatus");
  66. const ordersSum = ref(0);
  67. const commonS = useCommonStoreHook();
  68. const map = commonS.loadingMap;
  69. const emit = defineEmits(["getindex"]);
  70. const ordersDataArray = inject("ordersDataArray");
  71. const selectSeqArray = inject("selectSeqArray");
  72. //获取未完成订单的参数
  73. const ordersQuery = ref({
  74. pageNo: 1,
  75. pageSize: 5,
  76. queryComplete: 0,
  77. totalPages: 1,
  78. keyword: "",
  79. });
  80. const wrapRef = ref(null);
  81. //获取未完成订单Data
  82. const getOrdersData = async () => {
  83. const { code, data } = await getOrders(ordersQuery.value);
  84. if (code == "200") {
  85. if (ordersQuery.value.pageNo == 1) {
  86. ordersDataArray.value = data.records;
  87. } else {
  88. ordersDataArray.value.push(...data.records);
  89. }
  90. ordersSum.value = data.totalCount;
  91. ordersQuery.value.totalPages = data.totalPages;
  92. }
  93. };
  94. //重新刷新当前页码数据
  95. const resetOrdersDataArray = async () => {
  96. ordersDataArray.value = [];
  97. ordersQuery.value = {
  98. pageNo: 1,
  99. pageSize: 5,
  100. queryComplete: 0,
  101. totalPages: 1,
  102. };
  103. store.odersData.productLineId = "";
  104. store.odersData.workOrderCode = "";
  105. store.processInfo.materialName = "";
  106. store.processInfo.materialModel = "";
  107. store.odersData.operationId = "";
  108. store.processInfo.operationCode = "";
  109. store.processInfo.operationName = "";
  110. store.useSeqNo = "";
  111. selectSeqArray.value = [];
  112. selectSeqIndex.value = null;
  113. getOrdersData();
  114. };
  115. const activeName = ref("false");
  116. //这里是存放控制当前选择工序的index
  117. const selectIndex = ref(null);
  118. const setSlectIndex = (index: number) => {
  119. if (selectIndex.value == index) return;
  120. if (index == null) {
  121. selectIndex.value = null;
  122. selectedOderStatus.value = false;
  123. return;
  124. }
  125. selectIndex.value = index;
  126. store.odersData.productLineId =
  127. ordersDataArray.value[selectIndex.value].productLineId;
  128. store.odersData.workOrderCode =
  129. ordersDataArray.value[selectIndex.value].workOrderCode;
  130. store.processInfo.materialName =
  131. ordersDataArray.value[selectIndex.value].materialName;
  132. store.processInfo.materialModel =
  133. ordersDataArray.value[selectIndex.value].materialModel;
  134. store.processInfo.documentShow =
  135. ordersDataArray.value[selectIndex.value].documentShow;
  136. store.odersData.operationId = "";
  137. store.processInfo.operationCode = "";
  138. store.processInfo.operationName = "";
  139. store.useSeqNo = "";
  140. selectSeqArray.value = [];
  141. selectSeqIndex.value = null;
  142. emit("getindex", selectIndex.value);
  143. };
  144. const handleClick = (tab: TabsPaneContext, event: Event) => {
  145. setSlectIndex(null);
  146. store.odersData.productLineId = "";
  147. store.odersData.workOrderCode = "";
  148. store.processInfo.materialName = "";
  149. store.processInfo.materialModel = "";
  150. store.processInfo.documentShow = "";
  151. };
  152. //滚动事件
  153. const handleScroll = (obj: obj) => {
  154. //当发生滚动触底时
  155. if (
  156. wrapRef.value.wrapRef.scrollHeight ==
  157. Math.ceil(obj.scrollTop) + wrapRef.value.wrapRef.clientHeight
  158. ) {
  159. if (ordersQuery.value.pageNo < ordersQuery.value.totalPages) {
  160. ordersQuery.value.pageNo = ordersQuery.value.pageNo + 1;
  161. getOrdersData();
  162. }
  163. }
  164. };
  165. watch(
  166. () => activeName.value,
  167. (val) => {
  168. if (val == "ok") {
  169. ordersQuery.value.queryComplete = 1;
  170. ordersQuery.value.pageNo = 1;
  171. } else {
  172. ordersQuery.value.queryComplete = 0;
  173. ordersQuery.value.pageNo = 1;
  174. }
  175. ordersDataArray.value = [];
  176. getOrdersData();
  177. }
  178. );
  179. onMounted(() => {
  180. getOrdersData();
  181. emitter.on(EventsNames.PROCESS_REDER, () => {
  182. resetOrdersDataArray();
  183. setSlectIndex(null);
  184. });
  185. });
  186. // 顶部添加搜索
  187. const searchText = ref("");
  188. const clearSearch = () => {
  189. searchText.value = "";
  190. ordersQuery.value.keyword = "";
  191. ordersQuery.value.pageNo = 1;
  192. getOrdersData();
  193. };
  194. const startSearch = () => {
  195. if (searchText.value.trim() == "") {
  196. return;
  197. }
  198. ordersQuery.value.keyword = searchText.value;
  199. ordersQuery.value.pageNo = 1;
  200. getOrdersData();
  201. };
  202. </script>
  203. <style lang="scss" scoped>
  204. .barHeight {
  205. height: calc(100vh - 305px);
  206. .notice {
  207. text-align: center;
  208. }
  209. }
  210. :deep(.el-tabs--card > .el-tabs__header .el-tabs__nav) {
  211. background: rgba(0, 0, 0, 0.1);
  212. border-radius: 16px 16px 16px 16px;
  213. overflow: hidden;
  214. border: 0;
  215. }
  216. :deep(.el-tabs--card > .el-tabs__header) {
  217. height: 80px;
  218. border: 0;
  219. overflow: hidden;
  220. border-radius: 16px 16px 16px 16px;
  221. }
  222. :deep(.el-tabs--card > .el-tabs__header .el-tabs__item) {
  223. width: calc(12.5vw - 15px);
  224. height: 80px;
  225. border-radius: 0;
  226. font-weight: 500;
  227. font-size: 24px;
  228. overflow: hidden;
  229. background: transparent;
  230. border-color: transparent;
  231. }
  232. :deep(.el-tabs--card > .el-tabs__header .el-tabs__item.is-active) {
  233. background: white;
  234. border-radius: 16px 16px 16px 16px;
  235. border-color: transparent;
  236. overflow: hidden;
  237. }
  238. .scrollbar-demo-item {
  239. display: flex;
  240. align-items: center;
  241. justify-content: center;
  242. height: 50px;
  243. margin: 10px;
  244. text-align: center;
  245. border-radius: 4px;
  246. background: var(--el-color-primary-light-9);
  247. color: var(--el-color-primary);
  248. }
  249. .input-with-select .el-input-group__prepend {
  250. background-color: var(--el-fill-color-blank);
  251. }
  252. </style>