index.vue 26 KB

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