index.vue 26 KB

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