index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865
  1. <template>
  2. <div class="mainContentBox">
  3. <avue-crud
  4. ref="crudRef"
  5. :option="option"
  6. v-model:page="page"
  7. v-model:search="search"
  8. v-model="form"
  9. :table-loading="loading"
  10. :permission="permission"
  11. @search-change="handleQuery"
  12. @search-reset="resetQuery"
  13. @size-change="handleQuery"
  14. @current-change="handleQuery"
  15. @row-save="rowSave"
  16. @row-update="rowUpdate"
  17. @row-del="rowDel"
  18. :data="pageData"
  19. >
  20. <template #menu-left="{ size }">
  21. <el-button type="primary" @click="scan">扫码导入</el-button>
  22. <el-button type="primary" @click="test">测试数据</el-button>
  23. </template>
  24. <template #menu-right="{}">
  25. <el-dropdown split-button v-hasPerm="['plan:order:import']"
  26. >导入
  27. <template #dropdown>
  28. <el-dropdown-menu>
  29. <el-dropdown-item @click="downloadTemplate">
  30. <i-ep-download />下载模板
  31. </el-dropdown-item>
  32. <el-dropdown-item @click="openDialog('obj-import')">
  33. <i-ep-top />导入数据
  34. </el-dropdown-item>
  35. </el-dropdown-menu>
  36. </template>
  37. </el-dropdown>
  38. <el-button
  39. class="ml-3"
  40. v-hasPerm="['plan:order:export']"
  41. @click="handleExport"
  42. >
  43. <template #icon> <i-ep-download /> </template>导出
  44. </el-button>
  45. </template>
  46. <template #menu="{ size, row, index }">
  47. <el-button
  48. v-hasPerm="[buttonPermission.PLAN.BTNS.order_edit]"
  49. v-if="
  50. row.orderState === '0' ||
  51. row.orderState === '1' ||
  52. row.orderState === '2'
  53. "
  54. type="primary"
  55. link
  56. size="small"
  57. @click="handleEdit(row, 0)"
  58. ><i-ep-edit />编辑
  59. </el-button>
  60. <!-- <el-button
  61. v-if="row.nameplated === 1"
  62. type="info"
  63. link
  64. size="small"
  65. @click="handleNameplated(row)"
  66. ><i-ep-edit />铭牌
  67. </el-button>-->
  68. <el-button
  69. v-hasPerm="[buttonPermission.PLAN.BTNS.order_del]"
  70. v-if="
  71. row.orderState === '0' ||
  72. row.orderState === '1' ||
  73. row.orderState === '2'
  74. "
  75. type="danger"
  76. link
  77. size="small"
  78. @click="rowDel(row, 0)"
  79. ><i-ep-edit />删除
  80. </el-button>
  81. <el-button
  82. type="primary"
  83. size="small"
  84. v-if="row.oderState == '5'"
  85. @click="handleScanCode(row.id)"
  86. >二维码生成
  87. </el-button>
  88. </template>
  89. </avue-crud>
  90. <el-dialog
  91. v-model="dialog1.visible"
  92. :title="dialog1.title"
  93. width="950px"
  94. @close="dialog1.visible = false"
  95. >
  96. <choice-item-page @material-info="materialInfo" />
  97. </el-dialog>
  98. <el-dialog
  99. v-model="dialog.visible"
  100. :title="dialog.title"
  101. width="500px"
  102. @close="closeDialog"
  103. >
  104. <el-form
  105. v-if="dialog.type === 'obj-import'"
  106. :model="importData"
  107. label-width="100px"
  108. >
  109. <el-form-item label="Excel文件">
  110. <el-upload
  111. ref="uploadRef"
  112. action=""
  113. drag
  114. accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
  115. :limit="1"
  116. :auto-upload="false"
  117. :file-list="importData.fileList"
  118. :on-change="handleFileChange"
  119. :on-exceed="handleFileExceed"
  120. >
  121. <el-icon class="el-icon--upload">
  122. <i-ep-upload-filled />
  123. </el-icon>
  124. <div class="el-upload__text">
  125. 将文件拖到此处,或
  126. <em>点击上传</em>
  127. </div>
  128. <template #tip>
  129. <div style="color: red">文件类型: xls/xlsx</div>
  130. </template>
  131. </el-upload>
  132. </el-form-item>
  133. </el-form>
  134. <!-- 弹窗底部操作按钮 -->
  135. <template #footer>
  136. <div class="dialog-footer">
  137. <el-button type="primary" @click="handleSubmit">确 定</el-button>
  138. <el-button @click="closeDialog">取 消</el-button>
  139. </div>
  140. </template>
  141. </el-dialog>
  142. <el-dialog
  143. v-model="dialog2.visible"
  144. :title="dialog2.title"
  145. width="950px"
  146. @close="
  147. dialog2.visible = false;
  148. scanArray = [];
  149. scanCpArray = [];
  150. "
  151. >
  152. <el-input
  153. @keyup.enter="scanFnc"
  154. v-model="scanCode"
  155. style="padding: 20px"
  156. placeholder="请扫码"
  157. />
  158. <div class="scanInfo">
  159. <el-scrollbar class="scrollbar">
  160. <div class="item" v-for="(item, index) in scanArray" :key="index">
  161. <div class="text">扫码Cp: {{ item.cp }}</div>
  162. <div @click="deleteItem(index)" class="text">
  163. <el-icon><Delete /></el-icon>
  164. </div>
  165. </div>
  166. <div v-if="scanArray.length < 1">暂无数据</div>
  167. </el-scrollbar>
  168. <div class="bottombtn">
  169. <el-button
  170. type="primary"
  171. :disabled="scanArray.length < 1"
  172. @click="scanSubmit"
  173. >生 成</el-button
  174. >
  175. </div>
  176. <!-- <vue-qrcode value="1241421gaga" size="45" error-level="H" /> -->
  177. </div>
  178. </el-dialog>
  179. <el-dialog
  180. v-model="dialog3.visible"
  181. :title="dialog3.title"
  182. width="950px"
  183. @close="
  184. dialog3.visible = false;
  185. scanCodeArray = [];
  186. "
  187. >
  188. <div class="scanInfo">
  189. <div style="padding: 0 20px; text-align: center">
  190. 二维码数量:{{ scanCodeArray.length }}
  191. </div>
  192. <el-scrollbar class="scrollbar">
  193. <div
  194. class="scancodeitem"
  195. v-for="(item, index) in scanCodeArray"
  196. :key="index"
  197. >
  198. <vue-qrcode :value="item" size="45" error-level="H" />
  199. </div>
  200. <div v-if="scanCodeArray.length < 1">暂无数据</div>
  201. </el-scrollbar>
  202. </div>
  203. </el-dialog>
  204. <CommonTable
  205. ref="ctableRef"
  206. tableTitle="报故单"
  207. tableType="FAULT"
  208. @selected-sure="onSelectedFinish"
  209. />
  210. </div>
  211. </template>
  212. <script setup lang="ts">
  213. import { checkPerm } from "@/directive/permission";
  214. import type { UploadInstance } from "element-plus";
  215. import { genFileId } from "element-plus";
  216. import dictDataUtil from "@/common/configs/dictDataUtil";
  217. import buttonPermission from "@/common/configs/buttonPermission";
  218. import {
  219. addOrder,
  220. deleteOrders,
  221. downloadTemplateApi,
  222. exportOrder,
  223. getOrderPage,
  224. importOrder,
  225. updateOrder,
  226. getExpandAlias,
  227. scanImport,
  228. getScanCode,
  229. getTestCode,
  230. } from "@/api/order";
  231. import { ref } from "vue";
  232. import _ from "lodash-es";
  233. import ChoiceItemPage from "@/views/base/materials/components/choice-item-page.vue";
  234. // 弹窗对象
  235. const dialog = reactive({
  236. visible: false,
  237. type: "order-form",
  238. width: 800,
  239. title: "",
  240. });
  241. const ctableRef = ref(null);
  242. const search = ref({});
  243. const option = ref({});
  244. const pageData = ref([]);
  245. const form = ref({});
  246. const page = ref({ total: 0, currentPage: 1, pageSize: 10 });
  247. const loading = ref(false);
  248. const uploadRef = ref<UploadInstance>(); // 上传组件
  249. // 导入数据
  250. const importData = reactive({
  251. file: undefined,
  252. fileList: [],
  253. });
  254. const materialInfo = (value) => {
  255. form.value.materialCode = value.materialCode;
  256. form.value.materialName = value.materialName;
  257. form.value.materialModel = value.spec;
  258. dialog1.visible = false;
  259. };
  260. const dialog1 = reactive({
  261. title: "物料选择",
  262. visible: false,
  263. });
  264. const dialog2 = reactive({
  265. title: "扫码导入",
  266. visible: false,
  267. });
  268. const dialog3 = reactive({
  269. title: "二维码详情",
  270. visible: false,
  271. });
  272. const permission = reactive({
  273. delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
  274. addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
  275. editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
  276. menu: true,
  277. });
  278. const crudRef = ref(null); //crudRef.value 获取avue-crud对象
  279. option.value = {
  280. border: true,
  281. searchIndex: 3,
  282. searchIcon: true,
  283. editBtn: false,
  284. delBtn: false,
  285. searchMenuSpan: 8,
  286. align: "center",
  287. menuAlign: "center",
  288. search: true,
  289. refreshBtn: false,
  290. from: {
  291. width: "300",
  292. },
  293. column: [
  294. {
  295. label: "订单编号",
  296. prop: "orderCode",
  297. search: true,
  298. width: 130,
  299. overHidden: true,
  300. display: false,
  301. },
  302. {
  303. label: "订单名称",
  304. prop: "orderName",
  305. search: true,
  306. width: 150,
  307. overHidden: true,
  308. rules: [
  309. {
  310. required: true,
  311. message: "订单名称不能为空",
  312. trigger: "trigger",
  313. },
  314. ],
  315. },
  316. {
  317. label: "ERP号",
  318. prop: "erpCode",
  319. search: true,
  320. width: 130,
  321. overHidden: true,
  322. rules: [
  323. {
  324. required: true,
  325. message: "订单编号不能为空",
  326. trigger: "trigger",
  327. },
  328. ],
  329. },
  330. {
  331. label: "订单类型",
  332. prop: "orderType",
  333. type: "select", //类型为下拉选择框
  334. width: 100,
  335. overHidden: true,
  336. editDisabled: true,
  337. dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_type,
  338. props: {
  339. label: "dictLabel",
  340. value: "dictValue",
  341. },
  342. searchClearable: false, //可清空的输入框,默认为true
  343. filterable: true, //添加filterable属性即可启用搜索功能
  344. rules: [
  345. {
  346. required: true,
  347. message: "订单类型不能为空",
  348. trigger: "trigger",
  349. },
  350. ],
  351. change: ({ value, column }) => {
  352. if (value === "2") {
  353. option.value.column[4].display = true;
  354. option.value.column[6].disabled = true;
  355. option.value.column[10].disabled = true;
  356. }
  357. if (value === "1") {
  358. option.value.column[4].display = false;
  359. option.value.column[6].disabled = false;
  360. option.value.column[10].disabled = false;
  361. }
  362. },
  363. },
  364. {
  365. label: "报故单",
  366. prop: "trackingNumber",
  367. width: 100,
  368. display: false,
  369. click: ({ value, column }) => {
  370. if (ctableRef.value) {
  371. ctableRef.value.startSelect();
  372. }
  373. },
  374. },
  375. {
  376. label: "报故单id",
  377. prop: "faultId",
  378. width: 100,
  379. display: false,
  380. hide: true,
  381. },
  382. {
  383. label: "产品编码",
  384. prop: "materialCode",
  385. search: true,
  386. width: 130,
  387. overHidden: true,
  388. rules: [
  389. {
  390. required: true,
  391. message: "订单编号不能为空",
  392. trigger: "trigger",
  393. },
  394. ],
  395. click: ({ value, column }) => {
  396. if (column.boxType) {
  397. dialog1.visible = true;
  398. }
  399. },
  400. },
  401. {
  402. label: "产品名称",
  403. prop: "materialName",
  404. search: true,
  405. width: 130,
  406. overHidden: true,
  407. rules: [
  408. {
  409. required: true,
  410. message: "产品名称不能为空",
  411. trigger: "trigger",
  412. },
  413. ],
  414. disabled: true,
  415. },
  416. {
  417. label: "产品规格",
  418. width: 130,
  419. overHidden: true,
  420. disabled: true,
  421. prop: "materialModel",
  422. },
  423. {
  424. label: "订单状态",
  425. prop: "orderState",
  426. display: false,
  427. width: 100,
  428. overHidden: true,
  429. type: "select", //类型为下拉选择框
  430. dicUrl:
  431. dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_state,
  432. props: {
  433. label: "dictLabel",
  434. value: "dictValue",
  435. },
  436. searchClearable: false, //可清空的输入框,默认为true
  437. filterable: true, //添加filterable属性即可启用搜索功能
  438. },
  439. {
  440. label: "订单数量",
  441. prop: "orderNum",
  442. type: "number",
  443. width: 100,
  444. overHidden: true,
  445. min: 1,
  446. max: 99999,
  447. rules: [
  448. {
  449. required: true,
  450. message: "订单数量不能为空",
  451. trigger: "trigger",
  452. },
  453. ],
  454. },
  455. {
  456. label: "排产数量",
  457. prop: "scheduledNum",
  458. width: 100,
  459. overHidden: true,
  460. display: false,
  461. },
  462. {
  463. label: "优先级",
  464. prop: "priority",
  465. width: 100,
  466. overHidden: true,
  467. type: "select", //类型为下拉选择框
  468. dicUrl:
  469. dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_priority,
  470. props: {
  471. label: "dictLabel",
  472. value: "dictValue",
  473. },
  474. searchClearable: false, //可清空的输入框,默认为true
  475. filterable: true, //添加filterable属性即可启用搜索功能
  476. rules: [
  477. {
  478. required: true,
  479. message: "订单类型不能为空",
  480. trigger: "trigger",
  481. },
  482. ],
  483. },
  484. {
  485. label: "交付日期",
  486. prop: "deliverTime",
  487. type: "date",
  488. width: 100,
  489. overHidden: true,
  490. format: "YYYY-MM-DD", //前端展示格式
  491. valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
  492. rules: [
  493. {
  494. required: true,
  495. message: "请选择交付日期",
  496. trigger: "trigger",
  497. },
  498. ],
  499. },
  500. /* {
  501. label: "所属公司",
  502. prop: "companyId",
  503. width: 100,
  504. overHidden: true,
  505. type: "select", //类型为下拉选择框
  506. dicUrl: import.meta.env.VITE_APP_BASE_API + "/api/v1/sys/dept/orgList",
  507. props: {
  508. label: "deptName",
  509. value: "id",
  510. },
  511. rules: [
  512. {
  513. required: true,
  514. message: "请选择所属公司",
  515. trigger: "trigger",
  516. },
  517. ],
  518. },*/
  519. {
  520. label: "项目号",
  521. width: 100,
  522. overHidden: true,
  523. prop: "projectCode",
  524. },
  525. {
  526. label: "绑定铭牌",
  527. prop: "nameplated",
  528. width: "100",
  529. type: "radio", //类型为单选框
  530. dicData: [
  531. {
  532. label: "否",
  533. value: 0,
  534. },
  535. {
  536. label: "是",
  537. value: 1,
  538. },
  539. ],
  540. value: 0,
  541. },
  542. {
  543. label: "备注",
  544. prop: "remark",
  545. width: 100,
  546. overHidden: true,
  547. minRows: 2, //最小行/最小值
  548. type: "textarea", //类型为多行文本域框
  549. maxlength: 512, //最大输入长度
  550. },
  551. {
  552. label: "创建时间",
  553. prop: "created",
  554. width: "140",
  555. overHidden: true,
  556. display: false,
  557. type: "datetime",
  558. valueFormat: "yyyy-MM-dd HH:mm:ss",
  559. },
  560. {
  561. label: "创建人",
  562. prop: "creator",
  563. display: false,
  564. width: 80,
  565. overHidden: true,
  566. },
  567. ],
  568. };
  569. function useScanCode() {
  570. const scanCodeArray = ref([]);
  571. const test = async () => {
  572. const { data, code } = await getTestCode();
  573. let data1 = [];
  574. data1.push(JSON.stringify(data[0]));
  575. scanCodeArray.value = data1;
  576. dialog3.visible = true;
  577. };
  578. const handleScanCode = async (id: string) => {
  579. const { data, code } = await getScanCode(id);
  580. let data1 = [];
  581. data1.push(data[0]);
  582. scanCodeArray.value = data1;
  583. dialog3.visible = true;
  584. };
  585. return { scanCodeArray, handleScanCode, test };
  586. }
  587. const { scanCodeArray, handleScanCode, test } = useScanCode();
  588. //扫码板块
  589. function useScan() {
  590. const scanCode = ref("");
  591. const scanArray = ref([]);
  592. const scanCpArray = ref([]);
  593. const scanStatus = ref(false);
  594. const deleteItem = (index: any) => {
  595. scanArray.value.splice(index, 1);
  596. };
  597. const scan = () => {
  598. dialog2.visible = true;
  599. };
  600. const scanFnc = () => {
  601. if (scanCode.value) {
  602. // scanCode.value =
  603. // '{"id":"453b5261e07745f2b7f4a042171f0644","tp":"10","cp":"1", "data":"PD94bWwgdmVyc2lvbj0iMS4wliBlbmNvZGluZz0iROlyMzEylj8+PFI+PERBIEIEPSJhc2QyMzRhZGYzNDJkZGZhc3NzliBOcDOiNSlgY3A9liEiPjxsaXN0IE5hPSJCT00iPjxCT00gdHk9lkkiPjxBPuS6p+WTgeWei+WPtzQT48Qj7lm77li7c8L0|+PEM+5qOA6agM5L6d5o2uPC9DPjxUSj"}';
  604. let obj = {};
  605. obj = JSON.parse(scanCode.value);
  606. if (!_.includes(scanCpArray.value, obj.cp)) {
  607. scanArray.value.push(obj);
  608. scanCpArray.value.push(obj.cp);
  609. ElMessage.success("扫码成功");
  610. } else {
  611. ElMessage.error("请勿重复扫码");
  612. }
  613. //判定是否重复扫码
  614. } else {
  615. ElMessage.error("请正确扫码");
  616. }
  617. scanCode.value = "";
  618. };
  619. const scanSubmit = async () => {
  620. const { data, code } = await scanImport({
  621. planOrderImportList: scanArray.value,
  622. });
  623. if (code == "200") {
  624. ElMessage.success("导入成功!");
  625. dialog2.visible = false;
  626. scanArray.value = [];
  627. scanCpArray.value = [];
  628. handleQuery(null, null);
  629. }
  630. };
  631. return {
  632. scanCode,
  633. scanArray,
  634. scanCpArray,
  635. scanStatus,
  636. scan,
  637. scanFnc,
  638. deleteItem,
  639. scanSubmit,
  640. };
  641. }
  642. const {
  643. scanCode,
  644. scanArray,
  645. scanCpArray,
  646. scanStatus,
  647. scanSubmit,
  648. scan,
  649. scanFnc,
  650. deleteItem,
  651. } = useScan();
  652. const queryExpandAlias = () => {
  653. getExpandAlias(dictDataUtil.EXPAND_FIELD_TABLE.plan_order_info).then(
  654. (data: any) => {
  655. if (data.data) {
  656. data.data.forEach((item: any) => {
  657. option.value.column.push({
  658. label: item.label,
  659. prop: item.field,
  660. width: 100,
  661. overHidden: true,
  662. });
  663. });
  664. }
  665. }
  666. );
  667. };
  668. const handleQuery = (params, done) => {
  669. console.log(JSON.stringify(option.value.column));
  670. loading.value = true;
  671. const querySearch = {
  672. pageSize: page.value.pageSize,
  673. pageNo: page.value.currentPage,
  674. ...params,
  675. };
  676. getOrderPage(querySearch)
  677. .then(({ data }) => {
  678. pageData.value = data.records;
  679. page.value.total = data.totalCount;
  680. page.value.currentPage = data.pageNo;
  681. page.value.pageSize = data.pageSize;
  682. })
  683. .finally(() => {
  684. loading.value = false;
  685. if (done) {
  686. done();
  687. }
  688. });
  689. };
  690. const resetQuery = () => {};
  691. const rowSave = (form, done, loading) => {
  692. loading();
  693. addOrder(form).then((data: any) => {
  694. ElMessage({
  695. message: data.msg,
  696. type: "success",
  697. });
  698. done();
  699. handleQuery(null, null);
  700. });
  701. };
  702. const rowUpdate = (form: any, index: any, done: any, loading: any) => {
  703. loading();
  704. updateOrder(form).then((data: any) => {
  705. ElMessage({
  706. message: data.msg,
  707. type: "success",
  708. });
  709. done();
  710. handleQuery(null, null);
  711. });
  712. };
  713. const handleNameplated = (row) => {
  714. ElMessage.warning("功能开发中");
  715. };
  716. const rowDel = (form: any, index) => {
  717. ElMessageBox.confirm("当前操作会删除数据,你确认要继续吗?")
  718. .then(() => {
  719. deleteOrders([form.id])
  720. .then((data: any) => {
  721. ElMessage({
  722. message: data.msg,
  723. type: "success",
  724. });
  725. handleQuery(null, null);
  726. })
  727. .finally(() => {});
  728. })
  729. .catch(() => {
  730. // catch error
  731. });
  732. };
  733. const openDialog = (type: any) => {
  734. dialog.visible = true;
  735. dialog.type = type;
  736. if (dialog.type === "obj-import") {
  737. // 导入弹窗
  738. dialog.title = "数据导入";
  739. dialog.width = 600;
  740. }
  741. };
  742. const closeDialog = () => {
  743. dialog.visible = false;
  744. if (dialog.type === "obj-import") {
  745. importData.file = undefined;
  746. importData.fileList = [];
  747. }
  748. };
  749. const downloadTemplate = () => {
  750. downloadTemplateApi().then((response) => {
  751. downFile(response);
  752. });
  753. };
  754. const handleEdit = (row: any, index: any) => {
  755. crudRef.value && crudRef.value.rowEdit(row, index);
  756. };
  757. /** 弹窗提交 */
  758. const handleSubmit = () => {
  759. importOrder(importData).then((data: any) => {
  760. ElMessage({
  761. message: data.msg,
  762. type: "success",
  763. });
  764. dialog.visible = false;
  765. handleQuery(null, null);
  766. });
  767. };
  768. /** Excel文件 Change */
  769. const handleFileChange = (file: any) => {
  770. importData.file = file.raw;
  771. };
  772. /** 文件下载 */
  773. const downFile = (response: any) => {
  774. const fileData = response.data;
  775. const fileName = decodeURI(
  776. response.headers["content-disposition"].split(";")[1].split("=")[1]
  777. );
  778. const fileType =
  779. "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
  780. const blob = new Blob([fileData], { type: fileType });
  781. const downloadUrl = window.URL.createObjectURL(blob);
  782. const downloadLink = document.createElement("a");
  783. downloadLink.href = downloadUrl;
  784. downloadLink.download = fileName;
  785. document.body.appendChild(downloadLink);
  786. downloadLink.click();
  787. document.body.removeChild(downloadLink);
  788. window.URL.revokeObjectURL(downloadUrl);
  789. };
  790. /** Excel文件 Exceed */
  791. const handleFileExceed = (files: any) => {
  792. uploadRef.value!.clearFiles();
  793. const file = files[0];
  794. file.uid = genFileId();
  795. uploadRef.value!.handleStart(file);
  796. importData.file = file;
  797. };
  798. /** 导出 */
  799. const handleExport = () => {
  800. exportOrder(search.value).then((response: any) => {
  801. downFile(response);
  802. });
  803. };
  804. onMounted?.(() => {
  805. queryExpandAlias();
  806. handleQuery(null, null);
  807. });
  808. /** 选择报故单 */
  809. const onSelectedFinish = (selectedValue) => {
  810. form.value.materialCode = selectedValue.materialCode;
  811. form.value.materialName = selectedValue.materialName;
  812. form.value.materialModel = selectedValue.spec;
  813. form.value.faultId = selectedValue.id;
  814. form.value.trackingNumber = selectedValue.trackingNumber;
  815. form.value.orderNum = selectedValue.unqualifiedNum;
  816. };
  817. </script>
  818. <style lang="scss" scoped>
  819. .scanInfo {
  820. width: 100%;
  821. .scrollbar {
  822. padding: 20px;
  823. height: 350px;
  824. .item {
  825. margin: 20px 0;
  826. width: 100%;
  827. background-color: #80808030;
  828. border-radius: 16px;
  829. height: 60px;
  830. display: flex;
  831. justify-content: space-between;
  832. align-items: center;
  833. padding: 0 20px;
  834. .el-icon {
  835. width: 50px;
  836. height: 50px;
  837. color: red;
  838. cursor: pointer;
  839. }
  840. }
  841. .scancodeitem {
  842. width: 100%;
  843. margin: 10px 0;
  844. display: flex;
  845. justify-content: center;
  846. align-items: center;
  847. }
  848. }
  849. .bottombtn {
  850. display: flex;
  851. justify-content: center;
  852. align-items: center;
  853. }
  854. }
  855. </style>