index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. <template>
  2. <div class="mainContentBox common-layout">
  3. <el-container>
  4. <el-aside
  5. width="600px"
  6. style="min-height: 800px; max-height: calc(100vh - 200px)"
  7. >
  8. <avue-crud
  9. ref="crudRef"
  10. v-model:search="search"
  11. v-model="form"
  12. :data="data"
  13. :option="option"
  14. v-model:page="page"
  15. @cell-click="handleCellClick"
  16. @search-change="searchChange"
  17. @size-change="dataList"
  18. @search-reset="resetChange"
  19. @current-change="dataList"
  20. @selection-change="selectionChange"
  21. >
  22. <template #seqNo="{ row }">
  23. <el-tag :type="chooseTagType(row.level, 'css')">{{
  24. chooseTagType(row.level, "text")
  25. }}</el-tag>
  26. {{ row.seqNo }}
  27. </template>
  28. </avue-crud>
  29. </el-aside>
  30. <el-container>
  31. <el-header style="height: 20%">
  32. <el-descriptions title="产品信息一览" border>
  33. <el-descriptions-item label="产品名称">{{
  34. productReviewInfo.materialName
  35. }}</el-descriptions-item>
  36. <el-descriptions-item label="流转卡号">{{
  37. productReviewInfo.seqNo
  38. }}</el-descriptions-item>
  39. <el-descriptions-item label="物料编号">{{
  40. productReviewInfo.materialCode
  41. }}</el-descriptions-item>
  42. <el-descriptions-item label="产品规格">{{
  43. productReviewInfo.materialModel
  44. }}</el-descriptions-item>
  45. <el-descriptions-item label="订单编号">{{
  46. productReviewInfo.orderCode
  47. }}</el-descriptions-item>
  48. <el-descriptions-item label="是否返工">
  49. <el-tag size="small">{{ productReviewInfo.rework }}</el-tag>
  50. </el-descriptions-item>
  51. <el-descriptions-item label="工单出站">{{
  52. productReviewInfo.outNum
  53. }}</el-descriptions-item>
  54. <el-descriptions-item label="交付日期">{{
  55. productReviewInfo.planStartEnd
  56. }}</el-descriptions-item>
  57. <el-descriptions-item label="工单报故"
  58. ><el-tag size="small">{{
  59. productReviewInfo.bug
  60. }}</el-tag></el-descriptions-item
  61. >
  62. </el-descriptions>
  63. </el-header>
  64. <el-main>
  65. <el-tabs
  66. type="border-card"
  67. @tab-click="tabsEvent"
  68. v-model="defaultTabName"
  69. >
  70. <el-tab-pane name="traceabilityComRef" label="生产履历">
  71. <template #label>
  72. <span
  73. >生产履历
  74. <el-badge
  75. :value="tabCount.traceability"
  76. class="item"
  77. type="primary"
  78. />
  79. </span>
  80. </template>
  81. <TraceabilityCom ref="traceabilityComRef" />
  82. </el-tab-pane>
  83. <el-tab-pane name="materialsComRef" label="已采物料">
  84. <template #label>
  85. <span
  86. >已采物料
  87. <el-badge
  88. :value="tabCount.materials"
  89. class="item"
  90. type="primary"
  91. />
  92. </span>
  93. </template>
  94. <MaterialsCom ref="materialsComRef" />
  95. </el-tab-pane>
  96. <el-tab-pane name="recordComRef" label="记录项">
  97. <template #label>
  98. <span
  99. >记录项
  100. <el-badge
  101. :value="tabCount.record"
  102. class="item"
  103. type="primary"
  104. />
  105. </span>
  106. </template>
  107. <RecordCom ref="recordComRef"
  108. /></el-tab-pane>
  109. <el-tab-pane name="checkComRef" label="点检判定">
  110. <template #label>
  111. <span
  112. >点检判定
  113. <el-badge
  114. :value="tabCount.checks"
  115. class="item"
  116. type="primary"
  117. />
  118. </span>
  119. </template>
  120. <CheckCom ref="checkComRef" />
  121. </el-tab-pane>
  122. <el-tab-pane name="equitComRef" label="设备使用">
  123. <template #label>
  124. <span
  125. >设备使用
  126. <el-badge
  127. :value="tabCount.equit"
  128. class="item"
  129. type="primary"
  130. />
  131. </span>
  132. </template>
  133. <EquitCom ref="equitComRef"
  134. /></el-tab-pane>
  135. <el-tab-pane name="faultComRef" label="报故记录">
  136. <template #label>
  137. <span
  138. >报故记录
  139. <el-badge
  140. :value="tabCount.fault"
  141. class="item"
  142. type="primary"
  143. />
  144. </span>
  145. </template>
  146. <FaultCom ref="faultComRef" />
  147. </el-tab-pane>
  148. <!-- <el-tab-pane name="bugComRef" label="缺陷项">缺陷项</el-tab-pane>-->
  149. <el-tab-pane name="mediaComRef" label="图片采集"
  150. ><template #label>
  151. <span
  152. >图片采集
  153. <el-badge
  154. :value="tabCount.medias"
  155. class="item"
  156. type="primary"
  157. />
  158. </span>
  159. </template>
  160. <media-com ref="mediaComRef"
  161. /></el-tab-pane>
  162. <el-tab-pane name="excelComRef" label="表格数据"
  163. ><template #label>
  164. <span
  165. >表格数据
  166. <el-badge
  167. :value="tabCount.excel"
  168. class="item"
  169. type="primary"
  170. />
  171. </span>
  172. </template>
  173. <ExcelCom ref="excelComRef"
  174. /></el-tab-pane>
  175. <el-tab-pane name="collectionComRef" label="表格数据"
  176. ><template #label>
  177. <span
  178. >数据采集
  179. <el-badge
  180. :value="tabCount.collect"
  181. class="item"
  182. type="primary"
  183. />
  184. </span>
  185. </template>
  186. <CollectionCom ref="collectionComRef"
  187. /></el-tab-pane>
  188. </el-tabs>
  189. </el-main>
  190. </el-container>
  191. </el-container>
  192. </div>
  193. </template>
  194. <script setup>
  195. import { ref, getCurrentInstance } from "vue";
  196. import { useCrud } from "@/hooks/userCrud";
  197. import { traceabilityTabCount } from "@/api/process";
  198. import { getMaterialDetailsByseqNo, getOperationCompent } from "@/api/material";
  199. import TraceabilityCom from "@/views/pro/traceability/components/traceabilityCom.vue";
  200. import MaterialsCom from "@/views/pro/traceability/components/materialsCom.vue";
  201. import RecordCom from "@/views/pro/traceability/components/recordCom.vue";
  202. import CheckCom from "@/views/pro/traceability/components/checkCom.vue";
  203. import EquitCom from "@/views/pro/traceability/components/equitCom.vue";
  204. import FaultCom from "@/views/pro/traceability/components/faultCom.vue";
  205. import MediaCom from "./components/mediaCom.vue";
  206. import ExcelCom from "./components/excelCom.vue";
  207. import CollectionCom from "./components/collectionCom.vue";
  208. // 传入一个url,后面不带/
  209. const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  210. useCrud({
  211. src: "/api/v1/process/web/traceability",
  212. });
  213. const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
  214. Methords; //增删改查
  215. const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
  216. const { checkBtnPerm } = Utils; //按钮权限等工具
  217. const crudRef = ref(null); //crudRef.value 获取avue-crud对象
  218. const traceabilityComRef = ref(null);
  219. const materialsComRef = ref(null);
  220. const recordComRef = ref(null);
  221. const checkComRef = ref(null);
  222. const equitComRef = ref(null);
  223. const faultComRef = ref(null);
  224. const mediaComRef = ref(null);
  225. const excelComRef = ref(null);
  226. const collectionComRef = ref(null);
  227. let defaultTabName = ref("traceabilityComRef");
  228. //tab页组件
  229. const tabNameComRef = new Map([
  230. ["traceabilityComRef", traceabilityComRef],
  231. ["materialsComRef", materialsComRef],
  232. ["recordComRef", recordComRef],
  233. ["checkComRef", checkComRef],
  234. ["equitComRef", equitComRef],
  235. ["faultComRef", faultComRef],
  236. ["mediaComRef", mediaComRef],
  237. ["excelComRef", excelComRef],
  238. ["collectionComRef", collectionComRef],
  239. ]);
  240. let temRow = ref({});
  241. const tabsEvent = (pane, ev) => {
  242. defaultTabName.value = pane.props.name;
  243. //console.log(pane.props.name, temRow.value.seqNo);
  244. if (temRow.value.seqNo) {
  245. tabNameComRef.get(pane.props.name)?.value.refreshTra(temRow.value);
  246. }
  247. };
  248. const chooseTagType = (row, type) => {
  249. let daynamicType = "";
  250. if (type == "text") {
  251. daynamicType =
  252. row === "order" ? "订单" : row === "workOrder" ? "工单" : "流转卡号";
  253. } else {
  254. daynamicType =
  255. row === "order" ? "success" : row === "workOrder" ? "warning" : "primary";
  256. }
  257. return daynamicType;
  258. };
  259. let productReviewInfo = reactive({
  260. materialName: "",
  261. seqNo: "",
  262. materialCode: "",
  263. materialModel: "",
  264. planStartEnd: "",
  265. workOrderCode: "",
  266. outNum: "",
  267. rework: "-",
  268. bug: "-",
  269. });
  270. let tabCount = reactive({
  271. traceability: "",
  272. materials: "",
  273. record: "",
  274. check: "",
  275. equit: "",
  276. fault: "",
  277. medias: "",
  278. excel: "",
  279. });
  280. const handleCellClick = (row, column, event) => {
  281. productReviewInfo.orderCode = row.orderCode;
  282. if (row.level === "order") {
  283. productReviewInfo.bug = "-";
  284. }
  285. if (row.orderType) {
  286. productReviewInfo.rework = row.orderType === "2" ? "是" : "否";
  287. }
  288. //获取出单的数量
  289. if (data.value) {
  290. for (let topTree of data.value) {
  291. if (topTree) {
  292. for (let secondTree of topTree.children) {
  293. if (row.workOrderCode == secondTree.workOrderCode) {
  294. productReviewInfo.rework = topTree.orderType === "2" ? "是" : "否";
  295. productReviewInfo.bug = secondTree.bugNum === 0 ? "否" : "是";
  296. productReviewInfo.outNum = secondTree.children.length;
  297. }
  298. }
  299. }
  300. }
  301. }
  302. temRow.value = row;
  303. // 点击行时触发的逻辑
  304. if (!row.children && row.seqNo) {
  305. if (productReviewInfo.seqNo != row.seqNo) {
  306. //物料履历
  307. //traceabilityComRef.value.refreshTra(row);
  308. tabNameComRef.get(defaultTabName.value)?.value.refreshTra(temRow.value);
  309. }
  310. //每次点击都要获取tab页面的数量
  311. traceabilityTabCount({
  312. seqNo: row.seqNo,
  313. workOrderCode: row.workOrderCode,
  314. }).then(({ data }) => {
  315. tabCount = Object.assign(tabCount, data);
  316. });
  317. if (row.workOrderCode == productReviewInfo.workOrderCode) {
  318. productReviewInfo.seqNo = row.seqNo;
  319. return;
  320. }
  321. //产品信息
  322. getMaterialDetailsByseqNo(row.workOrderCode, row.seqNo).then(({ data }) => {
  323. productReviewInfo = Object.assign(productReviewInfo, data);
  324. productReviewInfo.workOrderCode = row.workOrderCode;
  325. // productReviewInfo.outNum =
  326. });
  327. }
  328. };
  329. // 设置表格列或者其他自定义的option
  330. option.value = Object.assign(option.value, {
  331. // selection: true,
  332. excelBtn: true,
  333. border: true,
  334. index: false,
  335. expandLevel: 3,
  336. headerAlign: "center",
  337. align: "center",
  338. tree: true,
  339. labelWidth: 100,
  340. addBtn: false,
  341. menu: false,
  342. header: false,
  343. searchMenuSpan: 8,
  344. rowKey: "seqNo",
  345. rowParentKey: "seqNo",
  346. column: [
  347. {
  348. label: "Id",
  349. prop: "id",
  350. search: false,
  351. hide: true,
  352. },
  353. {
  354. label: "流转卡号",
  355. prop: "seqNo",
  356. search: true,
  357. searchLabelWidth: "100",
  358. searchSpan: 12,
  359. },
  360. {
  361. label: "数量",
  362. prop: "quantity",
  363. search: false,
  364. width: "100",
  365. },
  366. ],
  367. });
  368. onMounted(() => {
  369. dataList();
  370. });
  371. </script>