index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. <template>
  2. <div class="mainContentBox">
  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. :permission="permission"
  11. @row-save="createRow"
  12. @row-update="updateRow"
  13. @row-del="deleteRow"
  14. @search-change="searchChange"
  15. @search-reset="resetChange"
  16. @size-change="dataList"
  17. @current-change="dataList"
  18. @selection-change="selectionChange"
  19. >
  20. <template #drawingPath-form="scope">
  21. <!-- <single-upload v-model="form.drawingPath" :generatePdf="true"/>-->
  22. <FilesUpload
  23. v-model:src-list="srcList"
  24. v-model:pdf-list="pdfUrlList"
  25. v-model:file-name-list="fileNameList"
  26. :limit="10"
  27. :show-tip="true"
  28. :generate-pdf="true"
  29. @finished="testFiles"
  30. />
  31. </template>
  32. <template #enable="scope">
  33. <el-switch
  34. active-value="1"
  35. inactive-value="0"
  36. inline-prompt
  37. active-text="启用"
  38. inactive-text="禁用"
  39. v-model="scope.row.enable"
  40. @click="changeItem(scope.row)"
  41. class="ml-2"
  42. style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
  43. />
  44. </template>
  45. <template #menu="{ row, index, type }">
  46. <!-- <PDFView-->
  47. <!-- :need-to-show-pdf="true"-->
  48. <!-- content-type="button"-->
  49. <!-- :is-link="true"-->
  50. <!-- :pdf-source="filePath + row.pdfPath"-->
  51. <!-- />-->
  52. <el-button link type="primary" @click="toShowPDF(row)">
  53. 预览
  54. </el-button>
  55. <el-button
  56. v-hasPerm="[buttonPermission.BasicData.BTNS.picture_del]"
  57. @click="deleteRecord(row, index, done)"
  58. text
  59. type="primary"
  60. >删除</el-button
  61. >
  62. <el-button
  63. @click="doEdit(row, index)"
  64. text
  65. type="primary"
  66. v-hasPerm="[buttonPermission.BasicData.BTNS.picture_edit]"
  67. >编辑</el-button
  68. >
  69. <el-button
  70. @click="downloadFile(row)"
  71. :loading="row?.downloadBtnLoading"
  72. text
  73. type="primary"
  74. v-hasPerm="[buttonPermission.BasicData.BTNS.picture_download]"
  75. >下载</el-button
  76. >
  77. </template>
  78. <template #menu-left="{ size }">
  79. <el-button
  80. type="primary"
  81. icon="el-icon-plus"
  82. :size="size"
  83. @click="rowAdd"
  84. >新增</el-button
  85. >
  86. </template>
  87. </avue-crud>
  88. <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
  89. <PDFDrawerView ref="PDFDrawerViewRef"></PDFDrawerView>
  90. </div>
  91. <CommonTable
  92. ref="ctableRef"
  93. tableTitle="BOM添加"
  94. tableType="MARTERIAL"
  95. @selected-sure="onSelectedFinish"
  96. />
  97. </template>
  98. <script setup lang="ts">
  99. import { ref, getCurrentInstance } from "vue";
  100. import { useCrud } from "@/hooks/userCrud";
  101. import { useCommonStoreHook, useDictionaryStore } from "@/store";
  102. import { updateDrawaing } from "@/api/drawing";
  103. import dictDataUtil from "@/common/configs/dictDataUtil";
  104. import PDFView from "@/components/PDFView/index.vue";
  105. import { checkPerm } from "@/directive/permission";
  106. import buttonPermission from "@/common/configs/buttonPermission";
  107. const { isShowTable, tableType } = toRefs(useCommonStoreHook());
  108. // 数据字典相关
  109. const { dicts } = useDictionaryStore();
  110. const fileUrl = ref(""); //单文件
  111. const pdfUrlList = ref([]);
  112. const srcList = ref([]);
  113. const fileNameList = ref([]);
  114. const testFiles = () => {
  115. form.value.pdfPathList = pdfUrlList.value;
  116. form.value.drawingPathList = srcList.value;
  117. form.value.drawingPath = srcList.value[0];
  118. form.value.fileNameList = fileNameList.value;
  119. };
  120. const rowAdd = () => {
  121. pdfUrlList.value = [];
  122. srcList.value = [];
  123. fileNameList.value = [];
  124. crudRef.value.rowAdd();
  125. };
  126. const doEdit = (row, index) => {
  127. pdfUrlList.value = [];
  128. srcList.value = [];
  129. fileNameList.value = [];
  130. crudRef.value && crudRef.value.rowEdit(row, index);
  131. };
  132. const filePath = import.meta.env.VITE_APP_UPLOAD_URL;
  133. const test = () => {
  134. isShowTable.value = true;
  135. tableType.value = tableType.value == 1 ? 2 : 1;
  136. };
  137. const ctableRef = ref(null);
  138. const changeItem = (row) => {
  139. updateDrawaing(row).then(() => {
  140. ElMessage.success("操作成功");
  141. dataList();
  142. });
  143. };
  144. const form2 = ref(null);
  145. const PDFDrawerViewRef = ref(null);
  146. const toShowPDF = (row) => {
  147. let url = import.meta.env.VITE_APP_UPLOAD_URL + row.pdfPath;
  148. PDFDrawerViewRef.value && PDFDrawerViewRef.value.showPdf(url);
  149. };
  150. // 传入一个url,后面不带/
  151. const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  152. useCrud({
  153. src: "/api/v1/base/drawing",
  154. });
  155. const {
  156. dataEditList,
  157. createRow,
  158. updateRow,
  159. deleteRow,
  160. searchChange,
  161. dataList,
  162. resetChange,
  163. } = Methords; //增删改查
  164. const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
  165. const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
  166. // checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
  167. const permission = reactive({
  168. delBtn: checkPerm(buttonPermission.BasicData.BTNS.picture_del),
  169. editBtn: checkPerm(buttonPermission.BasicData.BTNS.picture_edit),
  170. addBtn: false,
  171. menu: true,
  172. });
  173. const crudRef = ref(null); //crudRef.value 获取avue-crud对象
  174. const router = useRouter?.();
  175. onMounted?.(() => {
  176. // console.log("crudRef", crudRef)
  177. dataEditList();
  178. });
  179. const onSelectedFinish = (selectedValue) => {
  180. form.value.associationCode = selectedValue.materialCode;
  181. form.value.associationName = selectedValue.materialName;
  182. form.value.materialCode = selectedValue.materialCode;
  183. };
  184. /**
  185. * 上传excel相关
  186. */
  187. const uploadRef = ref(null);
  188. const uploadFinished = () => {
  189. // 上传完成后的刷新操作
  190. page.currentPage = 1;
  191. dataEditList();
  192. };
  193. // 设置表格列或者其他自定义的option
  194. option.value = Object.assign(option.value, {
  195. searchEnter: true,
  196. selection: false,
  197. viewBtn: false,
  198. delBtn: false,
  199. addBtn: false,
  200. editBtn: false,
  201. menu: true,
  202. column: [
  203. {
  204. label: "图纸编号",
  205. prop: "drawingCode",
  206. width: 150,
  207. search: true,
  208. overHidden: true,
  209. editDisabled: true,
  210. rules: [
  211. {
  212. required: true,
  213. message: "请填写图纸编号",
  214. trigger: "blur",
  215. },
  216. {
  217. validator: (rule, value, callback) => {
  218. if (!value) {
  219. return callback(new Error("请填写图纸编号"));
  220. }
  221. const hasNumber = value.trim();
  222. if (!hasNumber) {
  223. form.value.drawingCode = "";
  224. callback(new Error("请填写图纸编号"));
  225. } else {
  226. callback();
  227. }
  228. },
  229. trigger: "blur",
  230. },
  231. ],
  232. },
  233. {
  234. label: "文件名称",
  235. prop: "fileName",
  236. span: 24,
  237. width: 120,
  238. overHidden: true,
  239. search: true,
  240. display: false,
  241. },
  242. {
  243. label: "图纸名称",
  244. prop: "drawingTitle",
  245. width: 150,
  246. overHidden: true,
  247. search: true,
  248. editDisabled: true,
  249. rules: [
  250. {
  251. required: true,
  252. message: "请填写图纸名称",
  253. trigger: "blur",
  254. },
  255. {
  256. validator: (rule, value, callback) => {
  257. if (!value) {
  258. return callback(new Error("请填写图纸名称"));
  259. }
  260. const hasNumber = value.trim();
  261. if (!hasNumber) {
  262. form.value.drawingTitle = "";
  263. callback(new Error("请填写图纸名称"));
  264. } else {
  265. callback();
  266. }
  267. },
  268. trigger: "blur",
  269. },
  270. ],
  271. },
  272. {
  273. label: "物料编号",
  274. prop: "associationCode",
  275. width: 150,
  276. search: true,
  277. overHidden: true,
  278. editDisabled: true,
  279. addDisplay: false,
  280. rules: [
  281. {
  282. required: true,
  283. message: "请填写物料编号",
  284. trigger: "blur",
  285. },
  286. ],
  287. },
  288. {
  289. label: "物料编号",
  290. prop: "materialCode",
  291. width: 150,
  292. overHidden: true,
  293. editDisplay: false,
  294. hide: true,
  295. rules: [
  296. {
  297. required: true,
  298. message: "请填写物料编号",
  299. trigger: "blur",
  300. },
  301. ],
  302. click() {
  303. if (ctableRef.value) {
  304. ctableRef.value.startSelect();
  305. }
  306. },
  307. },
  308. {
  309. label: "物料名称",
  310. prop: "associationName",
  311. width: 180,
  312. search: true,
  313. overHidden: true,
  314. disabled: true,
  315. rules: [
  316. {
  317. required: true,
  318. message: "请填写物料名称",
  319. trigger: "blur",
  320. },
  321. ],
  322. },
  323. {
  324. label: "图纸类型",
  325. prop: "drawingDictValue",
  326. search: true,
  327. filterable: true,
  328. type: "select",
  329. width: 100,
  330. overHidden: true,
  331. editDisabled: true,
  332. dicUrl: dictDataUtil.request_url + "drawing_type",
  333. props: { label: "dictLabel", value: "dictValue" },
  334. rules: [
  335. {
  336. required: true,
  337. message: "请选择图纸类型",
  338. trigger: "blur",
  339. },
  340. ],
  341. },
  342. {
  343. label: "文件",
  344. prop: "drawingPath",
  345. span: 24,
  346. slot: true,
  347. hide: true,
  348. rules: [
  349. {
  350. required: true,
  351. message: "请选择文件",
  352. trigger: "blur",
  353. },
  354. ],
  355. },
  356. {
  357. label: "文件数组",
  358. prop: "drawingPathList",
  359. span: 24,
  360. hide: true,
  361. display: false,
  362. },
  363. {
  364. label: "pdf数组",
  365. prop: "pdfPathList",
  366. span: 24,
  367. hide: true,
  368. display: false,
  369. },
  370. {
  371. label: "文件名称数组",
  372. prop: "fileNameList",
  373. span: 24,
  374. slot: true,
  375. hide: true,
  376. display: false,
  377. },
  378. /*{ label: "文件",
  379. prop: "drawing",
  380. type: 'img',
  381. span: 24,
  382. display:false,
  383. slot: true,
  384. formatter: (row, column, cellValue, index) => {
  385. return import.meta.env.VITE_APP_UPLOAD_URL + `${row.drawingPath}`;} },*/
  386. {
  387. label: "版本",
  388. prop: "drawingVersion",
  389. type: "number",
  390. precision: 1,
  391. editDisabled: true,
  392. min: 0,
  393. rules: [
  394. {
  395. required: true,
  396. message: "版本号不能为空",
  397. trigger: "blur",
  398. },
  399. ],
  400. },
  401. {
  402. label: "创建时间",
  403. prop: "created",
  404. width: 120,
  405. overHidden: true,
  406. display: false,
  407. },
  408. {
  409. label: "启用状态",
  410. slot: true,
  411. headerAlign: "center",
  412. prop: "enable",
  413. width: 100,
  414. addDisplay: false,
  415. editDisplay: false,
  416. },
  417. ],
  418. });
  419. const deleteRecord = (row, index, done) => {
  420. deleteRow(row, index, done);
  421. dataEditList();
  422. };
  423. const downloadBtnLoading = ref(false);
  424. const downloadFile = async (row) => {
  425. row.downloadBtnLoading = true;
  426. let url = import.meta.env.VITE_APP_UPLOAD_URL + row.drawingPath;
  427. // 1. 获取资源并转为Blob
  428. const response = await fetch(url);
  429. const blob = await response.blob();
  430. // 2. 创建临时对象URL
  431. const tempUrl = URL.createObjectURL(blob);
  432. // 3. 创建隐藏a标签触发下载
  433. const link = document.createElement("a");
  434. link.href = tempUrl;
  435. link.download = row.fileName;
  436. link.style.display = "none";
  437. document.body.appendChild(link);
  438. link.click();
  439. // 4. 清理内存
  440. URL.revokeObjectURL(tempUrl);
  441. document.body.removeChild(link);
  442. row.downloadBtnLoading = false;
  443. };
  444. </script>