index.vue 12 KB

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