bottomTable.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. <template>
  2. <div>
  3. <avue-crud
  4. ref="crudRef"
  5. v-model:search="search"
  6. v-model="form"
  7. :data="data"
  8. :option="option"
  9. v-model:page="page"
  10. @row-save="createRow"
  11. @row-update="updateRow"
  12. @row-del="deleteRow"
  13. @selection-change="selectionChange"
  14. @sortable-change="onSortChange"
  15. @search-change="searchChange"
  16. @search-reset="resetChange"
  17. @size-change="dataList"
  18. @current-change="dataList"
  19. >
  20. <template #filePath-form="scope">
  21. <!-- <single-upload v-model="form.filePath" />
  22. <FilesUpload v-model:src="form.filePath" v-model:src-list="form.filePath" /> -->
  23. <div style="height: 100px; width: 100px; overflow: hidden">
  24. <PDFView
  25. :need-to-show-pdf="true"
  26. content-type="button"
  27. :is-link="true"
  28. :show-pdf-number="form.showAppointPageNum"
  29. :pdf-source="pdfPath"
  30. />
  31. </div>
  32. </template>
  33. <template #filePath="{ row }">
  34. <PDFView
  35. :need-to-show-pdf="true"
  36. content-type="button"
  37. btnText="查看PDF"
  38. :is-link="true"
  39. :pdf-source="getSOAPpdf(row)"
  40. />
  41. </template>
  42. </avue-crud>
  43. <CommonTable
  44. ref="commonTableRef"
  45. :tableTitle="tableTitle"
  46. :tableType="commonTableType"
  47. :multipleRow="true"
  48. @selected-sure="onSelectedFinish"
  49. />
  50. <el-dialog v-model="dialogVisible">
  51. <VuePdfEmbed :source="previewImgUrl" annotation-layer text-layer />
  52. </el-dialog>
  53. <el-dialog v-model="versionDV" title="请先选择版本号" width="500" center>
  54. <el-select
  55. v-model="selectedVersion"
  56. placeholder="请先选择版本号"
  57. style="margin-bottom: 20px"
  58. >
  59. <el-option
  60. v-for="item in versionList"
  61. :key="item.id"
  62. :label="item.bomVersion"
  63. :value="item.bomVersion"
  64. />
  65. </el-select>
  66. <template #footer>
  67. <div class="dialog-footer">
  68. <el-button @click="versionDV = false">取消</el-button>
  69. <el-button type="primary" @click="goToSelectMaterial">
  70. 确定
  71. </el-button>
  72. </div>
  73. </template>
  74. </el-dialog>
  75. </div>
  76. </template>
  77. <script setup>
  78. import { ref, getCurrentInstance } from "vue";
  79. import { useCrud } from "@/hooks/userCrud";
  80. import { getTableConfig } from "./configs";
  81. import PDFView from "@/components/PDFView/index.vue";
  82. import VuePdfEmbed from "vue-pdf-embed";
  83. import {
  84. saveCompoents,
  85. getBomVersion,
  86. getRouteMaxVersion,
  87. addBatch,
  88. addEsopBatch,
  89. addCheckBatch,
  90. addFuliao,
  91. } from "@/api/craft/process/index";
  92. import SingleUpload from "@/components/Upload/SingleUpload.vue";
  93. const props = defineProps({
  94. tableTitle: {
  95. default: "",
  96. type: String,
  97. },
  98. tableType: {
  99. default: "",
  100. type: String,
  101. },
  102. });
  103. const route = useRoute();
  104. const tableConfig = getTableConfig(route.fullPath.split("/")[4]);
  105. const afterDataListToGetBomVersion = () => {
  106. toGetBomVersion();
  107. };
  108. // 传入一个url,后面不带/
  109. const { url, form, data, option, search, page, toDeleteIds, Methords, Utils } =
  110. useCrud({
  111. src: tableConfig[props.tableType].url,
  112. afterDataList: afterDataListToGetBomVersion,
  113. });
  114. const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
  115. Methords; //增删改查
  116. const { selectionChange, multipleUpdate } = Methords; //选中和批量删除事件
  117. const crudRef = ref(null); //crudRef.value 获取avue-crud对象
  118. const bomVersion = ref(null);
  119. const pdfPath = ref(null);
  120. // 如果物料采集列表有值,就只能选择当前的版本,否则先选择版本
  121. const versionList = ref([]);
  122. const versionDV = ref(false);
  123. const selectedVersion = ref("");
  124. const goToSelectMaterial = () => {
  125. if (!route.fullPath.split("/")[5]) {
  126. ElMessage.error("物料编号读取错误");
  127. return;
  128. }
  129. let configParam = {};
  130. configParam.materialCode = route.fullPath.split("/")[5];
  131. configParam.bomVersion = selectedVersion.value;
  132. //根据物料编码和版本号获取对应的物料BOM
  133. commonTableType.value = "MARTERIAL_BOM";
  134. nextTick(() => {
  135. commonTableRef.value?.startSelect(configParam);
  136. commonTableRef.value?.refreshDictData("bomVersion", [], "value");
  137. commonTableRef.value?.mergeOption({
  138. searchShow: true,
  139. selection: true,
  140. reserveSelection: true,
  141. });
  142. });
  143. selectedVersion.value = "";
  144. versionDV.value = false;
  145. };
  146. const startCreat = () => {
  147. if (props.tableType === "wuliaocaiji") {
  148. if (bomVersion.value) {
  149. selectedVersion.value = bomVersion.value;
  150. goToSelectMaterial();
  151. } else {
  152. getBomVersion({ materialCode: route.fullPath.split("/")[5] }).then(
  153. (res) => {
  154. versionList.value = res?.data ?? [];
  155. versionDV.value = true;
  156. }
  157. );
  158. }
  159. // if (!route.fullPath.split("/")[5]) {
  160. // ElMessage.error("物料编号读取错误");
  161. // return;
  162. // }
  163. // //根据物料编码和版本号获取对应的物料BOM
  164. // let bomParam = {
  165. // materialCode: route.fullPath.split("/")[5],
  166. // };
  167. // getBomVersion(bomParam).then((res) => {
  168. // versionList.value = res?.data ?? [];
  169. // let resListMap = [];
  170. // //说明时物料采集的添加框 进行物料采集的下拉框数据获取
  171. // res?.data.forEach((versions) => {
  172. // resListMap.push({
  173. // label: versions.bomVersion,
  174. // value: versions.bomVersion,
  175. // });
  176. // });
  177. // //查询参数
  178. // let configParam = {};
  179. // configParam.materialCode = route.fullPath.split("/")[5];
  180. // if (bomVersion.value) {
  181. // configParam.bomVersion = bomVersion.value;
  182. // }
  183. // //根据物料编码和版本号获取对应的物料BOM
  184. // commonTableType.value = "MARTERIAL_BOM";
  185. // nextTick(() => {
  186. // commonTableRef.value?.startSelect(configParam);
  187. // commonTableRef.value?.refreshDictData(
  188. // "bomVersion",
  189. // resListMap,
  190. // "value"
  191. // );
  192. // commonTableRef.value?.mergeOption({
  193. // searchShow: true,
  194. // selection: true,
  195. // reserveSelection: true,
  196. // });
  197. // });
  198. // });
  199. } else if (props.tableType === "dianjian") {
  200. commonTableType.value = "OP_CHECK";
  201. nextTick(() => {
  202. commonTableRef.value?.startSelect({
  203. operationId: route.params.id
  204. });
  205. commonTableRef.value?.mergeOption({
  206. selection: true,
  207. reserveSelection: true,
  208. header: false,
  209. selectable: function (row, index) {
  210. return row.isSelect;
  211. },
  212. });
  213. });
  214. } else if (props.tableType === "ESOP") {
  215. commonTableType.value = "ESOP";
  216. nextTick(() => {
  217. commonTableRef.value?.startSelect({
  218. materialCode: route.fullPath.split("/")[5],
  219. enable: 1,
  220. });
  221. commonTableRef.value?.mergeOption({
  222. selection: true,
  223. reserveSelection: true,
  224. });
  225. });
  226. } else if (props.tableType === "fuliaoCJ") {
  227. commonTableType.value = "FULIAO_CAIJI";
  228. nextTick(() => {
  229. commonTableRef.value?.startSelect({
  230. accessoriesProperty: "2", //默认直接查所有的部件辅料)
  231. });
  232. commonTableRef.value?.mergeOption({
  233. selection: true,
  234. reserveSelection: true,
  235. });
  236. });
  237. } else {
  238. crudRef.value && crudRef.value.rowAdd();
  239. }
  240. };
  241. const saveSortData = async () => {
  242. multipleUpdate();
  243. };
  244. defineExpose({ startCreat, saveSortData });
  245. const onSortChange = () => {
  246. data.value.forEach((item) => {
  247. console.log(item.id);
  248. });
  249. };
  250. const routeId = ref("");
  251. // ============公共弹窗table选择相关,物料采集等使用===============
  252. const commonTableRef = ref({});
  253. const commonTableType = ref("MARTERIAL_BOM");
  254. //批量增加物料采集
  255. const itemRecord = ref({});
  256. const itemRecordList = ref([]);
  257. //批量增加ESOP
  258. const esopItem = ref({});
  259. const esopList = ref([]);
  260. //批量增加点检
  261. const checkItem = ref({});
  262. const checkList = ref([]);
  263. const onSelectedFinish = (itemValue) => {
  264. console.log(itemValue);
  265. if (Object.keys(itemValue).length == 0) {
  266. ElMessage.error("请选择数据,数据不能为空!");
  267. }
  268. //crudRef.value && crudRef.value.rowAdd();
  269. itemRecordList.value = [];
  270. itemRecord.value.itemRecordList = [];
  271. checkList.value = [];
  272. checkItem.value.checkList = [];
  273. esopItem.value.esopList = [];
  274. esopList.value = [];
  275. if (props.tableType === "wuliaocaiji") {
  276. itemValue?.forEach((item, index) => {
  277. const recordItem = ref({});
  278. recordItem.value.itemName = item.bomMaterialName;
  279. recordItem.value.itemCode = item.bomMaterialCode;
  280. recordItem.value.itemModel = item.spec;
  281. recordItem.value.recordVersion = item.bomVersion;
  282. recordItem.value.num = item.bomMaterialNumber;
  283. recordItem.value.traceType = "S";
  284. recordItem.value.operationId = route.params.id;
  285. recordItem.value.unit = item.unit;
  286. recordItem.value.isTrace = 1;
  287. itemRecordList.value.push(recordItem.value);
  288. });
  289. itemRecord.value.operationId = route.params.id;
  290. itemRecord.value.itemRecordList = Array.from(itemRecordList.value);
  291. addBatch(itemRecord.value).then((data) => {
  292. if (data.code == "200") {
  293. dataList();
  294. ElMessage({
  295. message: data.msg,
  296. type: "success",
  297. });
  298. } else {
  299. ElMessage({
  300. message: data.msg,
  301. type: "error",
  302. });
  303. }
  304. });
  305. } else if (props.tableType === "dianjian") {
  306. itemValue?.forEach((item, index) => {
  307. const recordItem = ref({});
  308. recordItem.value.operationId = route.params.id;
  309. recordItem.value.checkName = item.checkName;
  310. recordItem.value.checkCode = item.checkCode;
  311. recordItem.value.content = item.content;
  312. recordItem.value.standard = item.standard;
  313. recordItem.value.upper = item.upper;
  314. recordItem.value.lower = item.lower;
  315. recordItem.value.unit = item.unit;
  316. checkList.value.push(recordItem.value);
  317. });
  318. checkItem.value.operationId = route.params.id;
  319. checkItem.value.checkList = Array.from(checkList.value);
  320. addCheckBatch(checkItem.value).then((data) => {
  321. if (data.code == "200") {
  322. dataList();
  323. commonTableRef.value?.mergeOption({
  324. reserveSelection: false,
  325. });
  326. ElMessage({
  327. message: data.msg,
  328. type: "success",
  329. });
  330. } else {
  331. ElMessage({
  332. message: data.msg,
  333. type: "error",
  334. });
  335. }
  336. });
  337. } else if (props.tableType === "ESOP") {
  338. itemValue?.forEach((item, index) => {
  339. const recordItem = ref({});
  340. recordItem.value.operationId = route.params.id;
  341. recordItem.value.filePath = item.pdfPath;
  342. recordItem.value.showAppointPageNum = 1;
  343. recordItem.value.drawingCode = item.drawingCode;
  344. recordItem.value.recordVersion = item.drawingVersion;
  345. recordItem.value.sortNum = item.sort;
  346. recordItem.value.title = item.drawingTitle;
  347. esopList.value.push(recordItem.value);
  348. });
  349. esopItem.value.operationId = route.params.id;
  350. esopItem.value.esopList = Array.from(esopList.value);
  351. addEsopBatch(esopItem.value).then((data) => {
  352. if (data.code == "200") {
  353. dataList();
  354. ElMessage({
  355. message: data.msg,
  356. type: "success",
  357. });
  358. } else {
  359. ElMessage({
  360. message: data.msg,
  361. type: "error",
  362. });
  363. }
  364. });
  365. } else if (props.tableType === "fuliaoCJ") {
  366. itemValue?.forEach((item, index) => {
  367. const recordItem = ref({});
  368. recordItem.value.itemName = item.materialName;
  369. recordItem.value.itemCode = item.materialCode;
  370. recordItem.value.itemModel = item.spec;
  371. recordItem.value.recordVersion = item.bomVersion;
  372. recordItem.value.num = item.materialNumber;
  373. recordItem.value.traceType = "S";
  374. recordItem.value.operationId = route.params.id;
  375. recordItem.value.unit = item.unit;
  376. recordItem.value.isTrace = 1;
  377. itemRecordList.value.push(recordItem.value);
  378. });
  379. itemRecord.value.operationId = route.params.id;
  380. itemRecord.value.itemList = Array.from(itemRecordList.value);
  381. addFuliao(itemRecord.value).then((data) => {
  382. if (data.code == "200") {
  383. dataList();
  384. ElMessage({
  385. message: data.msg,
  386. type: "success",
  387. });
  388. } else {
  389. ElMessage({
  390. message: data.msg,
  391. type: "error",
  392. });
  393. }
  394. });
  395. }
  396. };
  397. const previewImgUrl = ref("");
  398. const dialogVisible = ref(false);
  399. const imgUrlClick = (itemValue) => {
  400. previewImgUrl.value =
  401. import.meta.env.VITE_APP_UPLOAD_URL + itemValue.filePath;
  402. dialogVisible.value = true;
  403. };
  404. const getSOAPpdf = (itemValue) => {
  405. return import.meta.env.VITE_APP_UPLOAD_URL + itemValue.filePath;
  406. };
  407. onMounted(() => {
  408. routeId.value = route.fullPath.split("/")[6];
  409. search.value.operationId = route.fullPath.split("/")[4];
  410. url.value = tableConfig[props.tableType].url;
  411. option.value = Object.assign(option.value, {
  412. searchEnter: true,
  413. addBtn: false,
  414. searchShow: false,
  415. header: false,
  416. sortable: true,
  417. column: tableConfig[props.tableType].column,
  418. });
  419. dataList();
  420. toGetBomVersion();
  421. });
  422. watch(
  423. () => props.tableType,
  424. () => {
  425. routeId.value = route.fullPath.split("/")[6];
  426. url.value = tableConfig[props.tableType].url;
  427. option.value = Object.assign(option.value, {
  428. searchEnter: true,
  429. addBtn: false,
  430. searchShow: false,
  431. header: false,
  432. sortable: true,
  433. column: tableConfig[props.tableType].column,
  434. });
  435. dataList();
  436. toGetBomVersion();
  437. }
  438. );
  439. const toGetBomVersion = () => {
  440. getRouteMaxVersion(
  441. route.fullPath.split("/")[6] ? route.fullPath.split("/")[6] : routeId.value
  442. ).then(({ data }) => {
  443. bomVersion.value = data;
  444. });
  445. };
  446. </script>