index.vue 12 KB

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