index.vue 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218
  1. <template>
  2. <div class="mainContentBox">
  3. <avue-crud
  4. ref="crudRef"
  5. v-model:search="search"
  6. v-loading="loading"
  7. v-model="form"
  8. :data="data"
  9. :option="option"
  10. v-model:page="page"
  11. :permission="permission"
  12. @row-save="createRow"
  13. @row-update="updateRow"
  14. @row-del="deleteRow"
  15. @search-change="searchChange"
  16. @search-reset="resetChange"
  17. @size-change="dataList"
  18. @current-change="dataList"
  19. @selection-change="selectionChange"
  20. >
  21. <template #menu-left="{ size }">
  22. <el-button
  23. :disabled="toDeleteIds.length < 1"
  24. type="danger"
  25. icon="el-icon-delete"
  26. :size="size"
  27. @click="multipleDelete"
  28. >删除</el-button
  29. >
  30. <el-button
  31. :disabled="toDeleteIds.length < 1"
  32. type="primary"
  33. icon="el-icon-primary"
  34. :size="size"
  35. @click="aps1"
  36. >批量排程</el-button
  37. >
  38. </template>
  39. <template #menu="{ size, row, index }">
  40. <el-button
  41. v-hasPerm="[buttonPermission.PLAN.BTNS.work_order_edit]"
  42. v-if="
  43. row.workOrderState === '0' ||
  44. row.workOrderState === '1' ||
  45. row.workOrderState === '2'
  46. "
  47. type="primary"
  48. link
  49. size="small"
  50. @click="handleEdit(row, 0)"
  51. ><i-ep-edit />编辑
  52. </el-button>
  53. <el-button
  54. @click="aps(row.id)"
  55. icon="el-icon-setting"
  56. text
  57. v-hasPerm="[buttonPermission.PLAN.BTNS.work_order_aps]"
  58. v-if="
  59. row.workOrderState === '0' ||
  60. row.workOrderState === '1' ||
  61. row.workOrderState === '2'
  62. "
  63. type="primary"
  64. :size="size"
  65. >排程</el-button
  66. >
  67. <el-button
  68. icon="el-icon-setting"
  69. text
  70. v-hasPerm="[buttonPermission.PLAN.BTNS.work_order_lock]"
  71. v-if="row.workOrderState === '4'"
  72. @click="lockOrUnLockWorkOrder(row.id, 5)"
  73. type="primary"
  74. :size="size"
  75. >冻结</el-button
  76. >
  77. <el-button
  78. icon="el-icon-setting"
  79. text
  80. v-if="row.workOrderState === '5'"
  81. v-hasPerm="[buttonPermission.PLAN.BTNS.work_order_lock]"
  82. @click="lockOrUnLockWorkOrder(row.id, 4)"
  83. type="primary"
  84. :size="size"
  85. >解冻</el-button
  86. >
  87. <el-button
  88. icon="el-icon-setting"
  89. text
  90. v-if="row.workOrderState === '2'"
  91. @click="distribute(row.id)"
  92. type="primary"
  93. v-hasPerm="[buttonPermission.PLAN.BTNS.work_order_aps]"
  94. :size="size"
  95. >下发</el-button
  96. >
  97. <el-button
  98. icon="el-icon-setting"
  99. text
  100. @click="showSeqPage(row)"
  101. type="primary"
  102. :size="size"
  103. >产品管号</el-button
  104. >
  105. <el-button
  106. icon="el-icon-delete"
  107. text
  108. v-if="row.workOrderState === '3'"
  109. @click="revoke(row.id)"
  110. type="primary"
  111. :size="size"
  112. >撤销</el-button
  113. >
  114. <!-- <el-button
  115. icon="el-icon-setting"
  116. text
  117. @click="showCheckTask(row)"
  118. type="primary"
  119. :size="size"
  120. >检验任务</el-button
  121. > -->
  122. <el-button
  123. icon="el-icon-setting"
  124. text
  125. @click="jumpPage(row.workOrderCode, 2)"
  126. type="primary"
  127. :size="size"
  128. >生产准备</el-button
  129. >
  130. <el-button
  131. icon="el-icon-setting"
  132. text
  133. @click="showProExcel(row.id)"
  134. type="primary"
  135. v-if="row.workOrderState > 3"
  136. :size="size"
  137. >生产随工单</el-button
  138. >
  139. <el-button
  140. icon="el-icon-setting"
  141. text
  142. @click="exportDataZip(row.id)"
  143. type="primary"
  144. v-if="row.workOrderState === '6'"
  145. :size="size"
  146. >生产数据包</el-button
  147. >
  148. <!-- <el-button
  149. icon="el-icon-notebook"
  150. text
  151. v-if="row.workOrderState === '6'"
  152. @click="workOrderData(row.id)"
  153. type="primary"
  154. v-hasPerm="[buttonPermission.PLAN.BTNS.work_order_data]"
  155. :size="size"
  156. >生成生产随工单</el-button
  157. >-->
  158. <!-- <el-button
  159. icon="el-icon-download"
  160. text
  161. v-if="row.workOrderState === '6'&&row.packageUrl!=='0'"
  162. @click="downloadTemplate('/api/v1/plan/workOrder/zip/'+row.id)"
  163. type="primary"
  164. v-hasPerm="[buttonPermission.PLAN.BTNS.work_order_downLoad]"
  165. :size="size">下载数据包</el-button>-->
  166. </template>
  167. </avue-crud>
  168. <el-dialog
  169. v-model="dialog.visible"
  170. :title="dialog.title"
  171. width="80%"
  172. @close="dialog.visible = false"
  173. >
  174. <order-page queryType="1" @order-info="orderInfo" />
  175. </el-dialog>
  176. <el-dialog
  177. v-model="dialog1.visible"
  178. :title="dialog1.title"
  179. width="80%"
  180. @close="dialog1.visible = false"
  181. >
  182. <choice-route-page
  183. :processRouteType="processRouteType"
  184. :material-code="form.materialCode"
  185. @route-info="routeInfo"
  186. />
  187. </el-dialog>
  188. <el-dialog
  189. v-model="dialog2.visible"
  190. :title="dialog2.title"
  191. width="80%"
  192. @close="dialog2.visible = false"
  193. >
  194. <choice-workshop-page @work-shop-info="workShopInfo" />
  195. </el-dialog>
  196. <el-dialog
  197. v-model="dialog3.visible"
  198. :title="dialog3.title"
  199. width="80%"
  200. @close="dialog3.visible = false"
  201. >
  202. <choice-line-page
  203. :parentCode="form.workshopCode"
  204. :materialCode="form.materialCode"
  205. @line-info="lineInfo"
  206. />
  207. </el-dialog>
  208. <el-dialog
  209. v-model="dialog4.visible"
  210. :title="dialog4.title"
  211. width="950px"
  212. @close="dialog4.visible = false"
  213. >
  214. <work-order-seq :workOrderInfo="form" />
  215. </el-dialog>
  216. <el-dialog
  217. v-model="dialog6.visible"
  218. :append-to-body="true"
  219. :title="dialog6.title"
  220. width="1100px"
  221. @close="dialog6.visible = false"
  222. >
  223. <check-task :workOrderInfo="form" />
  224. </el-dialog>
  225. <el-dialog
  226. v-model="dialog5.visible"
  227. :title="dialog5.title"
  228. width="450px"
  229. @close="dialog5.visible = false"
  230. >
  231. <el-form
  232. ref="dataFormRef"
  233. :model="formData"
  234. :rules="rules"
  235. label-width="150px"
  236. >
  237. <el-form-item label="排程时间" prop="apsTime">
  238. <el-date-picker
  239. v-model="formData.apsTime"
  240. type="date"
  241. style="width: 200px"
  242. :disabled-date="disabledDate"
  243. placeholder="请选择时间"
  244. format="YYYY/MM/DD"
  245. value-format="YYYY-MM-DD"
  246. />
  247. <!-- <el-input width="250px" v-model="formData.apsTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>-->
  248. </el-form-item>
  249. <el-form-item label="优先级" prop="priority" v-if="apsType === 1">
  250. <el-select
  251. v-model="formData.priority"
  252. placeholder="排程类型"
  253. style="width: 200px"
  254. >
  255. <el-option
  256. v-for="item in apsPriority"
  257. :label="item.dictLabel"
  258. :value="item.dictValue"
  259. :key="item.dictValue"
  260. />
  261. </el-select>
  262. </el-form-item>
  263. <el-form-item label="排程类型" prop="apsModel">
  264. <el-select
  265. v-model="formData.apsModel"
  266. placeholder="排程类型"
  267. style="width: 200px"
  268. >
  269. <el-option
  270. v-for="item in schedulingTypes"
  271. :label="item.dictLabel"
  272. :value="item.dictValue"
  273. :key="item.dictValue"
  274. />
  275. </el-select>
  276. </el-form-item>
  277. </el-form>
  278. <template #footer>
  279. <div class="dialog-footer">
  280. <el-button type="primary" @click="handleSubmit">确 定</el-button>
  281. <el-button @click="dialog5.visible = false">取 消</el-button>
  282. </div>
  283. </template>
  284. </el-dialog>
  285. <!-- 生产随工单 -->
  286. <el-dialog
  287. v-model="workOderShow"
  288. :title="updateTitle"
  289. @close="workOderShow = false"
  290. append-to-body
  291. fullscreen
  292. >
  293. <ExcelShowingSGD :data="ExDataObj" @close="closeShow" />
  294. </el-dialog>
  295. <el-dialog
  296. v-model="dialog7.visible"
  297. :title="dialog7.title"
  298. width="950px"
  299. @close="dialog7.visible = false"
  300. >
  301. <work-order-page
  302. queryType="2"
  303. @order-info="workOrderInfoClick"
  304. multipleKey="workOrderCode"
  305. />
  306. </el-dialog>
  307. </div>
  308. </template>
  309. <script setup>
  310. import { ref, getCurrentInstance } from "vue";
  311. import { useCrud } from "@/hooks/userCrud";
  312. import buttonPermission from "@/common/configs/buttonPermission";
  313. import ExcelShowingSGD from "./components/ExcelShowingSGD.vue";
  314. import {
  315. apsWorkOrder,
  316. distributeWorkOrder,
  317. revokeWorkOrder,
  318. lockWorkOrder,
  319. exportOrder,
  320. excelWorkOrder,
  321. workOrderGroupStr,
  322. } from "@/api/order";
  323. import { useCommonStoreHook } from "@/store";
  324. import dictDataUtil from "@/common/configs/dictDataUtil";
  325. import ChoiceRoutePage from "./components/choice-route-page.vue";
  326. import ChoiceWorkshopPage from "./components/choice-workshop-page.vue";
  327. import WorkOrderSeq from "./components/work-order-seq.vue";
  328. import CheckTask from "./components/check-task.vue";
  329. import { checkPerm } from "@/directive/permission";
  330. import { queryDictDataByType } from "@/api/system/dict";
  331. import { getProExcel } from "@/api/excel";
  332. import { exportDataInfo } from "@/api/order";
  333. import { getJobInfo, getWorkshopData } from "@/api/report";
  334. import ButtonPermKeys from "@/common/configs/buttonPermission";
  335. const { isShowTable, tableType } = toRefs(useCommonStoreHook());
  336. const updateTitle = ref("生产随工单");
  337. const workshopName = ref("");
  338. const router = useRouter();
  339. const workOderShow = ref(false);
  340. const ExDataObj = ref({});
  341. const excelData = ref([]);
  342. const showProExcel = async (id) => {
  343. const { data, code } = await getProExcel(id);
  344. if (code == "200") {
  345. ExDataObj.value = data;
  346. workOderShow.value = true;
  347. } else {
  348. ExDataObj.value = {};
  349. workOderShow.value = false;
  350. }
  351. };
  352. const exportDataZip = async (id) => {
  353. exportDataInfo(1, id).then((response) => {
  354. console.log(response);
  355. try {
  356. const decoder = new TextDecoder("utf-8");
  357. const jsonString = decoder.decode(response.data);
  358. const jsonObject = JSON.parse(jsonString);
  359. const { code, msg } = jsonObject;
  360. if (code != "200") {
  361. ElMessage.error(msg);
  362. }
  363. } catch (e) {
  364. downFile(response);
  365. }
  366. });
  367. };
  368. const downFile = (response) => {
  369. const fileData = response.data;
  370. const fileName = decodeURI(
  371. response.headers["content-disposition"].split(";")[1].split("=")[1]
  372. );
  373. const fileType =
  374. "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
  375. const blob = new Blob([fileData], { type: fileType });
  376. const downloadUrl = window.URL.createObjectURL(blob);
  377. const downloadLink = document.createElement("a");
  378. downloadLink.href = downloadUrl;
  379. downloadLink.download = fileName;
  380. document.body.appendChild(downloadLink);
  381. downloadLink.click();
  382. document.body.removeChild(downloadLink);
  383. window.URL.revokeObjectURL(downloadUrl);
  384. };
  385. const toShowExcel = (item) => {
  386. ExDataObj.value = item;
  387. workOderShow.value = true;
  388. };
  389. const closeShow = () => {
  390. workOderShow.value = false;
  391. };
  392. const test = () => {
  393. isShowTable.value = true;
  394. tableType.value = tableType.value == 1 ? 2 : 1;
  395. };
  396. const processRouteType = ref("");
  397. const permission = ref({});
  398. const disabledDate = (time) => {
  399. return time.getTime() < Date.now(); // 8.64e7 毫秒数代表一天
  400. };
  401. const jumpPage = (workOrderCode, type) => {
  402. if (type === 1) {
  403. router.push("/requisition?workOrderCode=" + workOrderCode);
  404. } else {
  405. router.push("/plan/prepare?workOrderCode=" + workOrderCode);
  406. }
  407. };
  408. const dialog = reactive({
  409. title: "订单选择",
  410. visible: false,
  411. });
  412. const dialog1 = reactive({
  413. title: "工艺选择",
  414. visible: false,
  415. });
  416. const dialog2 = reactive({
  417. title: "车间选择",
  418. visible: false,
  419. });
  420. const dialog3 = reactive({
  421. title: "产线选择",
  422. visible: false,
  423. });
  424. const dialog4 = reactive({
  425. title: "产品管号",
  426. visible: false,
  427. });
  428. const dialog5 = reactive({
  429. title: "排程确认",
  430. visible: false,
  431. });
  432. const dialog6 = reactive({
  433. title: "检验任务",
  434. visible: false,
  435. });
  436. const dialog7 = reactive({
  437. title: "前置工单选择",
  438. visible: false,
  439. });
  440. const dialog8 = reactive({
  441. title: "生产随工单列表",
  442. visible: false,
  443. });
  444. const apsType = ref(0);
  445. const aps = (id) => {
  446. apsType.value = 0;
  447. formData.workOrderIds = [id];
  448. dialog5.visible = true;
  449. };
  450. const showSeqPage = (workOrderCode) => {
  451. form.value = workOrderCode;
  452. dialog4.visible = true;
  453. };
  454. const showCheckTask = (workOrderCode) => {
  455. form.value = workOrderCode;
  456. dialog6.visible = true;
  457. };
  458. const distribute = (id) => {
  459. ElMessageBox.confirm("当前操作不可逆,确定下发工单吗?")
  460. .then(() => {
  461. distributeWorkOrder(id).then((data) => {
  462. ElMessage.success(data.msg);
  463. dataList();
  464. });
  465. })
  466. .catch(() => {
  467. // catch error
  468. });
  469. };
  470. const lockOrUnLockWorkOrder = (id, status) => {
  471. let message = status === "4" ? "解冻" : "冻结";
  472. ElMessageBox.confirm("当前操作不可逆,确定" + message + "工单吗?")
  473. .then(() => {
  474. loading.value = true;
  475. lockWorkOrder({ id: id, workOrderState: status }).then((data) => {
  476. loading.value = false;
  477. ElMessage.success(data.msg);
  478. dataList();
  479. });
  480. })
  481. .catch(() => {
  482. // catch error
  483. });
  484. };
  485. const loading = ref(false);
  486. const excelWork = ref({});
  487. const workOrderData = (id) => {
  488. loading.value = true;
  489. excelWork.value.workOrderId = id;
  490. excelWorkOrder(excelWork.value).then((data) => {
  491. if (data.code === "200") {
  492. loading.value = false;
  493. ElMessage.success(data.msg);
  494. dataList();
  495. } else {
  496. loading.value = false;
  497. ElMessage.error(data.msg);
  498. }
  499. });
  500. };
  501. const revoke = (id) => {
  502. ElMessageBox.confirm("当前操作不可逆,确定撤销工单吗?")
  503. .then(() => {
  504. loading.value = true;
  505. revokeWorkOrder(id).then((data) => {
  506. if (data.code === "200") {
  507. loading.value = false;
  508. ElMessage.success(data.msg);
  509. dataList();
  510. } else {
  511. loading.value = false;
  512. ElMessage.error(data.msg);
  513. }
  514. });
  515. })
  516. .catch(() => {
  517. // catch error
  518. });
  519. };
  520. const allData = ref([]);
  521. const getAllData = async () => {
  522. const { data, code } = await getWorkshopData({
  523. pageNo: 1,
  524. pageSize: 999999,
  525. });
  526. allData.value = data.records;
  527. };
  528. const setWorkShop = () => {
  529. allData.value.forEach((item) => {
  530. if (item.name == workshopName.value) {
  531. workShopInfo(item);
  532. }
  533. });
  534. };
  535. const handleEdit = (row, index) => {
  536. workshopName.value = row.workshopName;
  537. crudRef.value && crudRef.value.rowEdit(row, index);
  538. setWorkShop();
  539. };
  540. const aps1 = () => {
  541. apsType.value = 1;
  542. formData.workOrderIds = toDeleteIds;
  543. dialog5.visible = true;
  544. };
  545. const dataFormRef = ref(ElForm);
  546. const schedulingTypes = ref([]);
  547. const apsPriority = ref([]);
  548. const formData = reactive({
  549. apsTime: null,
  550. priority: "1",
  551. apsModel: "0",
  552. workOrderId: 0,
  553. });
  554. const rules = reactive({
  555. priority: [{ required: true, message: "请选择优先级", trigger: "blur" }],
  556. apsTime: [{ required: true, message: "排程时间不能为空", trigger: "blur" }],
  557. apsModel: [{ required: true, message: "排程类型不能为空", trigger: "blur" }],
  558. });
  559. const handleSubmit = () => {
  560. dataFormRef.value.validate((isValid) => {
  561. if (isValid) {
  562. apsWorkOrder(formData).then((data) => {
  563. if (data.code === "200") {
  564. ElMessage.success(data.msg);
  565. dialog5.visible = false;
  566. dataList();
  567. } else {
  568. ElMessage.error(data.msg);
  569. }
  570. });
  571. }
  572. });
  573. };
  574. const workOrderInfoClick = (value) => {
  575. if (value) {
  576. form.value.frontWorkOrderCode = value.join(",");
  577. }
  578. dialog7.visible = false;
  579. };
  580. const orderInfo = (value) => {
  581. form.value.orderCode = value.orderCode;
  582. form.value.orderName = value.orderName;
  583. form.value.materialCode = value.materialCode;
  584. form.value.materialName = value.materialName;
  585. form.value.materialModel = value.materialModel;
  586. form.value.priority = value.priority;
  587. form.value.orderType = value.orderType;
  588. form.value.processRouteId = "";
  589. form.value.processRouteCode = "";
  590. form.value.processRouteName = "";
  591. form.value.processRouteVersion = "";
  592. form.value.productLineId = "";
  593. form.value.productLineName = "";
  594. form.value.workshopName = "";
  595. form.value.workshopCode = "";
  596. form.value.workshopName = "";
  597. dialog.visible = false;
  598. };
  599. const lineInfo = (value) => {
  600. form.value.productLineId = value.id;
  601. form.value.productLineName = value.name;
  602. dialog3.visible = false;
  603. };
  604. const workShopInfo = (value) => {
  605. if (
  606. form.value.workshopCode &&
  607. value.code &&
  608. form.value.workshopCode !== value.code
  609. ) {
  610. form.value.productLineId = "";
  611. form.value.productLineName = "";
  612. }
  613. form.value.workshopName = value.id;
  614. form.value.workshopCode = value.code;
  615. form.value.workshopName = value.name;
  616. dialog2.visible = false;
  617. };
  618. const routeInfo = (value) => {
  619. form.value.processRouteId = value.id;
  620. form.value.processRouteCode = value.processRouteCode;
  621. form.value.processRouteName = value.processRouteName;
  622. form.value.processRouteVersion = value.processRouteVersion;
  623. console.log("ddddd", value.opGroups);
  624. option.value.column.forEach((item) => {
  625. if (item.prop === "opGroup") {
  626. item.dicData = value.opGroups;
  627. item.disabled = false;
  628. }
  629. if (item.prop === "opType") {
  630. item.disabled = false;
  631. }
  632. });
  633. dialog1.visible = false;
  634. };
  635. const opGroupList = ref([]);
  636. // 传入一个url,后面不带/
  637. const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  638. useCrud({
  639. src: "/api/v1/plan/workOrder",
  640. });
  641. const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
  642. Methords; //增删改查
  643. const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
  644. const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
  645. const opGroupShow = ref(true);
  646. const crudRef = ref(null); //crudRef.value 获取avue-crud对象
  647. const groupStri = ref({});
  648. const switchOp = [
  649. {
  650. label: "否",
  651. value: 0,
  652. },
  653. {
  654. label: "是",
  655. value: 1,
  656. },
  657. ];
  658. // 设置表格列或者其他自定义的option
  659. option.value = Object.assign(option.value, {
  660. searchEnter: true,
  661. delBtn: false,
  662. selection: true,
  663. viewBtn: false,
  664. editBtn: false,
  665. labelWidth: 120,
  666. column: [
  667. {
  668. label: "生产批号",
  669. prop: "workOrderCode",
  670. search: true,
  671. display: false,
  672. width: 125,
  673. overHidden: true,
  674. },
  675. {
  676. label: "订单编号",
  677. prop: "orderCode",
  678. search: true,
  679. width: 125,
  680. overHidden: true,
  681. rules: [
  682. {
  683. required: true,
  684. message: "订单编号不能为空",
  685. trigger: "trigger",
  686. },
  687. ],
  688. click: ({ value, column }) => {
  689. if (column.boxType) {
  690. dialog.visible = true;
  691. }
  692. },
  693. change: ({ value, column }) => {
  694. if (column.boxType) {
  695. if (value != form.value.orderCode) {
  696. dialog.visible = true;
  697. }
  698. }
  699. },
  700. },
  701. {
  702. label: "订单名称",
  703. prop: "orderName",
  704. search: true,
  705. disabled: true,
  706. width: 125,
  707. overHidden: true,
  708. },
  709. {
  710. label: "订单类型",
  711. prop: "orderType",
  712. type: "select", //类型为下拉选择框
  713. width: 100,
  714. rules: [
  715. {
  716. required: true,
  717. message: "订单类型不能为空",
  718. trigger: "trigger",
  719. },
  720. ],
  721. overHidden: true,
  722. dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_type,
  723. props: {
  724. label: "dictLabel",
  725. value: "dictValue",
  726. },
  727. },
  728. {
  729. label: "产品编号",
  730. width: 125,
  731. overHidden: true,
  732. search: true,
  733. disabled: true,
  734. prop: "materialCode",
  735. },
  736. {
  737. label: "产品名称",
  738. width: 125,
  739. overHidden: true,
  740. search: true,
  741. disabled: true,
  742. prop: "materialName",
  743. },
  744. {
  745. label: "产品规格",
  746. width: 125,
  747. search: true,
  748. overHidden: true,
  749. disabled: true,
  750. prop: "materialModel",
  751. },
  752. {
  753. label: "质量等级",
  754. prop: "hOrder",
  755. type: "select", //类型为下拉选择框
  756. width: 100,
  757. overHidden: true,
  758. dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.quality_grade,
  759. props: {
  760. label: "dictLabel",
  761. value: "dictValue",
  762. },
  763. rules: [
  764. {
  765. required: true,
  766. message: "质量等级不能为空",
  767. trigger: "trigger",
  768. },
  769. ],
  770. },
  771. {
  772. label: "优先级",
  773. prop: "priority",
  774. display: false,
  775. width: "80",
  776. type: "select", //类型为下拉选择框
  777. dicUrl:
  778. dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_priority,
  779. props: {
  780. label: "dictLabel",
  781. value: "dictValue",
  782. },
  783. },
  784. {
  785. label: "状态",
  786. prop: "workOrderState",
  787. search: true,
  788. width: "80",
  789. display: false,
  790. type: "select", //类型为下拉选择框
  791. dicUrl:
  792. dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_work_order_state,
  793. props: {
  794. label: "dictLabel",
  795. value: "dictValue",
  796. },
  797. },
  798. {
  799. label: "工艺路线",
  800. prop: "processRouteName",
  801. width: 125,
  802. overHidden: true,
  803. rules: [
  804. {
  805. required: true,
  806. message: "工艺路线不能为空",
  807. trigger: "trigger",
  808. },
  809. ],
  810. click: ({ value, column }) => {
  811. if (column.boxType) {
  812. if (!form.value.materialCode) {
  813. ElMessage({
  814. message: "请先选择订单",
  815. type: "warning",
  816. });
  817. return;
  818. }
  819. processRouteType.value = form.value.orderType === "2" ? "FG" : "ZC";
  820. dialog1.visible = true;
  821. }
  822. },
  823. change: ({ value, column }) => {
  824. //form.value.opType = ''
  825. if (column.boxType) {
  826. if (value != form.value.processRouteName) {
  827. dialog1.visible = true;
  828. }
  829. }
  830. },
  831. },
  832. {
  833. label: "工序分组",
  834. prop: "opType",
  835. width: "100",
  836. disabled: true,
  837. type: "select", //类型为下拉选择框
  838. dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.op_group,
  839. props: {
  840. label: "dictLabel",
  841. value: "dictValue",
  842. },
  843. change: ({ value, column }) => {
  844. option.value.column.forEach((item) => {
  845. if (value) {
  846. if (column.boxType === "edit") {
  847. if (item.prop === "opType") {
  848. item.disabled = false;
  849. }
  850. }
  851. if (item.prop === "frontWorkOrderCode" || item.prop === "opGroup") {
  852. if (value === "2") {
  853. item.display = false;
  854. }
  855. if (item.prop === "opGroup") {
  856. if (value === "1") {
  857. item.display = true;
  858. item.disabled = false;
  859. groupStri.value.workSection = "HGX";
  860. groupStri.value.procecssRouteId = form.value.processRouteId;
  861. workOrderGroupStr(groupStri.value).then((data) => {
  862. opGroupList.value = data.data;
  863. if (item.prop === "opGroup") {
  864. item.dicData = data.data;
  865. }
  866. });
  867. }
  868. if (value === "0") {
  869. item.display = true;
  870. item.disabled = false;
  871. groupStri.value.workSection = "QGX";
  872. groupStri.value.procecssRouteId = form.value.processRouteId;
  873. workOrderGroupStr(groupStri.value).then((data) => {
  874. opGroupList.value = data.data;
  875. if (item.prop === "opGroup") {
  876. item.dicData = data.data;
  877. }
  878. });
  879. }
  880. }
  881. if (item.prop === "frontWorkOrderCode") {
  882. if (value === "1") {
  883. item.display = true;
  884. item.disabled = false;
  885. }
  886. if (value === "0") {
  887. item.display = false;
  888. item.disabled = false;
  889. }
  890. }
  891. }
  892. }
  893. });
  894. // 只有新增的时候需要调用,编辑的时候可能只限编辑先工序
  895. if (column.boxType && column.boxType === "add") {
  896. getOpGroup(value);
  897. }
  898. },
  899. rules: [
  900. {
  901. required: true,
  902. message: "工序分组不能为空",
  903. trigger: "trigger",
  904. },
  905. ],
  906. },
  907. {
  908. label: "工单编号",
  909. prop: "workOrderCode",
  910. rules: [
  911. {
  912. required: true,
  913. message: "工单编号不能为空",
  914. trigger: "trigger",
  915. },
  916. ],
  917. },
  918. {
  919. label: "分组标识",
  920. prop: "opGroup",
  921. width: "100",
  922. display: false,
  923. disabled: true,
  924. type: "select", //类型为下拉选择框
  925. dicData: opGroupList.value,
  926. props: {
  927. label: "name",
  928. value: "name",
  929. },
  930. rules: [
  931. {
  932. required: true,
  933. message: "分组标识不能为空",
  934. trigger: "trigger",
  935. },
  936. ],
  937. },
  938. {
  939. label: "前置工单",
  940. prop: "frontWorkOrderCode",
  941. width: "100",
  942. display: false,
  943. overHidden: true,
  944. rules: [
  945. {
  946. required: true,
  947. message: "前置工单不能为空",
  948. trigger: "trigger",
  949. },
  950. ],
  951. click: ({ value, column }) => {
  952. if (column.boxType) {
  953. dialog7.visible = true;
  954. }
  955. },
  956. },
  957. {
  958. label: "工艺版本",
  959. width: 100,
  960. overHidden: true,
  961. prop: "processRouteVersion",
  962. display: false,
  963. html: true,
  964. formatter: (val) => {
  965. return (
  966. '<b class="el-tag el-tag--success el-tag--light">' +
  967. val.processRouteVersion +
  968. "</b>"
  969. );
  970. },
  971. },
  972. {
  973. label: "生产车间",
  974. prop: "workshopName",
  975. width: 120,
  976. overHidden: true,
  977. rules: [
  978. {
  979. required: true,
  980. message: "生产车间不能为空",
  981. trigger: "trigger",
  982. },
  983. ],
  984. click: ({ value, column }) => {
  985. if (column.boxType) {
  986. dialog2.visible = true;
  987. }
  988. if (column.boxType == "edit") {
  989. form.value.productLineName = "";
  990. }
  991. },
  992. change: ({ value, column }) => {
  993. if (column.boxType) {
  994. if (value != form.value.workshopName) {
  995. dialog2.visible = true;
  996. }
  997. }
  998. },
  999. },
  1000. {
  1001. label: "产线名称",
  1002. prop: "productLineName",
  1003. width: 120,
  1004. overHidden: true,
  1005. rules: [
  1006. {
  1007. required: true,
  1008. message: "产线名称不能为空",
  1009. trigger: "trigger",
  1010. },
  1011. ],
  1012. click: ({ value, column }) => {
  1013. if (column.boxType) {
  1014. if (!form.value.workshopName) {
  1015. ElMessage({
  1016. message: "请先选择生产车间",
  1017. type: "warning",
  1018. });
  1019. return;
  1020. }
  1021. dialog3.visible = true;
  1022. }
  1023. },
  1024. change: ({ value, column }) => {
  1025. if (column.boxType) {
  1026. if (value != form.value.productLineName) {
  1027. dialog3.visible = true;
  1028. }
  1029. }
  1030. },
  1031. },
  1032. /* {
  1033. label: "检验批号",
  1034. prop: "produceCode",
  1035. width: "100",
  1036. },*/
  1037. {
  1038. label: "开始时间",
  1039. prop: "planStartWhen",
  1040. width: 180,
  1041. overHidden: true,
  1042. display: false,
  1043. },
  1044. {
  1045. label: "结束时间",
  1046. prop: "planStartEnd",
  1047. width: 180,
  1048. display: false,
  1049. overHidden: true,
  1050. },
  1051. {
  1052. label: "管号最小值",
  1053. prop: "seqMin",
  1054. type: "number",
  1055. min: 1,
  1056. max: 99999,
  1057. rules: [
  1058. {
  1059. required: true,
  1060. message: "管号最小值不能为空",
  1061. trigger: "trigger",
  1062. },
  1063. ],
  1064. },
  1065. {
  1066. label: "管号最大值",
  1067. prop: "seqMax",
  1068. type: "number",
  1069. min: 1,
  1070. max: 99999,
  1071. blur: () => {
  1072. countPlanNum();
  1073. },
  1074. rules: [
  1075. {
  1076. required: true,
  1077. message: "管号最小值不能为空",
  1078. trigger: "trigger",
  1079. },
  1080. ],
  1081. },
  1082. {
  1083. label: "工单数量",
  1084. prop: "planNum",
  1085. width: 85,
  1086. disabled: true,
  1087. },
  1088. {
  1089. label: "检验批号",
  1090. width: 85,
  1091. display: false,
  1092. prop: "checkCode",
  1093. },
  1094. {
  1095. label: "完成数量",
  1096. width: 85,
  1097. display: false,
  1098. prop: "completeNum",
  1099. },
  1100. {
  1101. label: "下线数量",
  1102. width: 85,
  1103. display: false,
  1104. prop: "beforeNum",
  1105. },
  1106. {
  1107. label: "报废数量",
  1108. width: 85,
  1109. display: false,
  1110. prop: "scrapNum",
  1111. },
  1112. // {
  1113. // label: "首检数量",
  1114. // width: 85,
  1115. // prop: "firstCheckNum",
  1116. // value: 0,
  1117. // },
  1118. {
  1119. label: "已检数量",
  1120. width: 85,
  1121. display: false,
  1122. prop: "firstCheckAlreadyNum",
  1123. },
  1124. {
  1125. label: "创建时间",
  1126. width: 180,
  1127. display: false,
  1128. prop: "created",
  1129. },
  1130. {
  1131. label: "创建人",
  1132. width: 90,
  1133. display: false,
  1134. prop: "creator",
  1135. },
  1136. {
  1137. label: "数据包地址",
  1138. width: 90,
  1139. display: false,
  1140. prop: "packageUrl",
  1141. hide: true,
  1142. },
  1143. {
  1144. label: "水汽",
  1145. prop: "waterVapor",
  1146. span: 12,
  1147. type: "switch",
  1148. dicData: switchOp,
  1149. value: 0,
  1150. },
  1151. {
  1152. label: "DPA",
  1153. prop: "dpa",
  1154. span: 12,
  1155. type: "switch",
  1156. dicData: switchOp,
  1157. value: 0,
  1158. },
  1159. {
  1160. label: "备注",
  1161. prop: "remark",
  1162. width: 100,
  1163. overHidden: true,
  1164. minRows: 2, //最小行/最小值
  1165. type: "textarea", //类型为多行文本域框
  1166. maxlength: 512, //最大输入长度
  1167. },
  1168. ],
  1169. });
  1170. onMounted(() => {
  1171. getAllData();
  1172. dataList();
  1173. queryDictDataByType("order_scheduling_type").then((data) => {
  1174. schedulingTypes.value = data.data;
  1175. });
  1176. queryDictDataByType("aps_priority").then((data) => {
  1177. apsPriority.value = data.data;
  1178. });
  1179. permission.value = {
  1180. delBtn: checkPerm(ButtonPermKeys.PLAN.BTNS.work_order_del),
  1181. addBtn: checkPerm(ButtonPermKeys.PLAN.BTNS.work_order_add),
  1182. editBtn: checkPerm(buttonPermission.PLAN.BTNS.work_order_edit),
  1183. };
  1184. });
  1185. // 选择完前工序或者后工序后获取这个
  1186. const getOpGroup = (value) => {
  1187. getJobInfo(form.value.orderCode, value + "").then((res) => {
  1188. form.value.workOrderCode = res.data;
  1189. });
  1190. };
  1191. // 输入完最大值和最小值计算工单数量
  1192. const countPlanNum = () => {
  1193. if (form.value.seqMax && form.value.seqMin) {
  1194. form.value.planNum = form.value.seqMax - form.value.seqMin + 1;
  1195. }
  1196. };
  1197. </script>