create.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. <template>
  2. <view class="page">
  3. <scroll-view scroll-y="true" class="detail">
  4. <view class="form-content">
  5. <uni-forms
  6. ref="maintenanceFormRef"
  7. labelWidth="140px"
  8. :modelValue="mainWorkOrder"
  9. :rules="mainWorkOrderRules"
  10. >
  11. <!-- 工单名称 -->
  12. <uni-forms-item
  13. class="form-item"
  14. :label="$t('workOrder.workOrderName')"
  15. name="name"
  16. :required="true"
  17. >
  18. <uni-easyinput
  19. style="text-align: right"
  20. :inputBorder="false"
  21. :clearable="true"
  22. :styles="{ disableColor: '#fff' }"
  23. v-model="mainWorkOrder.name"
  24. :placeholder="$t('operation.PleaseFillIn')"
  25. />
  26. </uni-forms-item>
  27. <!-- 工单编号 -->
  28. <!-- <uni-forms-item class="form-item" :label="$t('workOrder.workOrderNumber')" name="orderNumber"
  29. :required="false">
  30. <uni-easyinput style="text-align: right" :inputBorder="false" :clearable="true"
  31. :disabled="true" :styles="{disableColor:'transparent'}" v-model="mainWorkOrder.orderNumber"
  32. :placeholder="$t('operation.PleaseFillIn')" />
  33. </uni-forms-item> -->
  34. <!-- 保养类型 -->
  35. <uni-forms-item
  36. class="form-item"
  37. :label="$t('maintenanceWorkOrder.maintenanceType')"
  38. name="outsourcingFlag"
  39. :required="false"
  40. >
  41. <uni-data-select
  42. :clear="false"
  43. v-model="mainWorkOrder.outsourcingFlag"
  44. :localdata="outsourcingFlagRange"
  45. >
  46. </uni-data-select>
  47. </uni-forms-item>
  48. <!-- 填报人 -->
  49. <uni-forms-item
  50. class="form-item"
  51. :label="$t('maintenanceWorkOrder.applicant')"
  52. name="applicant"
  53. :required="true"
  54. >
  55. <uni-easyinput
  56. style="text-align: right"
  57. :inputBorder="false"
  58. :clearable="true"
  59. :styles="{ disableColor: '#fff' }"
  60. v-model="mainWorkOrder.applicant"
  61. :placeholder="$t('operation.PleaseFillIn')"
  62. />
  63. </uni-forms-item>
  64. <!-- 实际保养开始时间 -->
  65. <uni-forms-item
  66. class="form-item"
  67. :label="$t('maintenanceWorkOrder.actualMaintenanceStartTime')"
  68. name="actualStartTime"
  69. :required="true"
  70. >
  71. <uni-datetime-picker
  72. :end="dateMax"
  73. type="datetime"
  74. :border="false"
  75. returnType="timestamp"
  76. :placeholder="$t('operation.PleaseSelect')"
  77. :style="{
  78. color: mainWorkOrder.actualStartTime ? '#333' : '#999',
  79. 'font-size': mainWorkOrder.actualStartTime
  80. ? '14px !important'
  81. : 'inherit !important',
  82. }"
  83. v-model="mainWorkOrder.actualStartTime"
  84. >
  85. </uni-datetime-picker>
  86. </uni-forms-item>
  87. <!-- return-type="timestamp" -->
  88. <!-- 实际保养结束时间 -->
  89. <uni-forms-item
  90. class="form-item"
  91. :label="$t('maintenanceWorkOrder.actualEndTime')"
  92. name="actualEndTime"
  93. :required="true"
  94. >
  95. <uni-datetime-picker
  96. :end="dateMax"
  97. type="datetime"
  98. :border="false"
  99. returnType="timestamp"
  100. :placeholder="$t('operation.PleaseSelect')"
  101. :style="{
  102. color: mainWorkOrder.actualEndTime ? '#333' : '#999',
  103. 'font-size': mainWorkOrder.actualEndTime
  104. ? '14px !important'
  105. : 'inherit !important',
  106. }"
  107. v-model="mainWorkOrder.actualEndTime"
  108. >
  109. </uni-datetime-picker>
  110. </uni-forms-item>
  111. <!-- 保养费用 -->
  112. <uni-forms-item
  113. class="form-item"
  114. :label="$t('maintenanceWorkOrder.maintenanceCost')"
  115. name="cost"
  116. :required="false"
  117. >
  118. <uni-easyinput
  119. style="text-align: right"
  120. :inputBorder="false"
  121. :clearable="true"
  122. type="digit"
  123. :styles="{ disableColor: 'transparent' }"
  124. v-model="mainWorkOrder.cost"
  125. :disabled="true"
  126. />
  127. </uni-forms-item>
  128. <!-- 其他费用 -->
  129. <uni-forms-item
  130. class="form-item"
  131. :label="$t('maintenanceWorkOrder.otherCost')"
  132. :required="false"
  133. name="otherCost"
  134. >
  135. <uni-easyinput
  136. style="text-align: right"
  137. :inputBorder="false"
  138. :clearable="true"
  139. type="digit"
  140. :styles="{ disableColor: '#fff' }"
  141. v-model="mainWorkOrder.otherCost"
  142. :placeholder="$t('operation.PleaseFillIn')"
  143. />
  144. </uni-forms-item>
  145. <!-- 备注 -->
  146. <uni-forms-item
  147. class="form-item"
  148. :label="$t('operation.remark')"
  149. :required="false"
  150. name="remark"
  151. >
  152. <uni-easyinput
  153. style="text-align: right"
  154. type="textarea"
  155. :autoHeight="true"
  156. :inputBorder="false"
  157. :clearable="true"
  158. :styles="{ disableColor: '#fff' }"
  159. v-model="mainWorkOrder.remark"
  160. :placeholder="$t('operation.PleaseFillIn')"
  161. />
  162. </uni-forms-item>
  163. </uni-forms>
  164. <!-- 新增设备 -->
  165. <uni-row class="form-item flex-row align-center">
  166. <uni-col :span="8">
  167. <button
  168. class="add-btn"
  169. size="mini"
  170. type="primary"
  171. @click="onAddDevice()"
  172. >
  173. <uni-icons type="plusempty" color="white"></uni-icons>
  174. {{ $t("workOrder.addDevice") }}
  175. </button>
  176. </uni-col>
  177. </uni-row>
  178. <view class="device-section" v-for="bom in mainWorkOrderBom">
  179. <!-- 设备编码 -->
  180. <view class="item-module">
  181. <view class="item-content flex-row align-center justify-between">
  182. <view class="item-title">
  183. <span class="item-title-width"
  184. >{{ $t("device.deviceCode") }}:</span
  185. >
  186. </view>
  187. <view class="item-title">
  188. <span>{{ bom.deviceCode }}</span>
  189. </view>
  190. </view>
  191. <view class="module-border"> </view>
  192. </view>
  193. <!-- 设备名称 -->
  194. <view class="item-content flex-row align-center justify-between">
  195. <view class="item-title">
  196. <span class="item-title-width"
  197. >{{ $t("device.deviceName") }}:</span
  198. >
  199. </view>
  200. <view class="item-title">
  201. <span>{{ bom.deviceName }}</span>
  202. </view>
  203. </view>
  204. <!-- 累计运行时间 -->
  205. <view class="item-content flex-row align-center justify-between">
  206. <view class="item-title">
  207. <span class="item-title-width"
  208. >{{
  209. $t("maintenanceWorkOrder.accumulatedRunningTime")
  210. }}(h):</span
  211. >
  212. </view>
  213. <view class="item-title">
  214. <span>{{ bom.totalRunTime }}</span>
  215. </view>
  216. </view>
  217. <!-- 累计运行里程 -->
  218. <view class="item-content flex-row align-center justify-between">
  219. <view class="item-title">
  220. <span class="item-title-width"
  221. >{{
  222. $t("maintenanceWorkOrder.accumulatedRunningMileage")
  223. }}(km):</span
  224. >
  225. </view>
  226. <view class="item-title">
  227. <span>{{ bom.totalMileage }}</span>
  228. </view>
  229. </view>
  230. <!-- 保养项 -->
  231. <view class="item-content flex-row align-center justify-between">
  232. <view class="item-title">
  233. <span class="item-title-width"
  234. >{{ $t("maintenanceWorkOrder.maintenanceItems") }}:</span
  235. >
  236. </view>
  237. <view class="item-title">
  238. <span>{{ bom.name }}</span>
  239. </view>
  240. </view>
  241. <!-- 物料数量 -->
  242. <view class="item-content flex-row align-center justify-between">
  243. <view class="item-title">
  244. <span class="item-title-width"
  245. >{{ $t("workOrder.materialCount") }}:</span
  246. >
  247. </view>
  248. <view class="item-title">
  249. <span>{{ bom.materialCount }}</span>
  250. </view>
  251. </view>
  252. <!-- 操作按钮 -->
  253. <view class="item-opera flex-row justify-end">
  254. <!-- 删除 -->
  255. <button type="primary" :plain="true" @click="onDelete(bom)">
  256. {{ $t("operation.delete") }}
  257. </button>
  258. <!-- 选择物料 -->
  259. <button type="primary" :plain="true" @click="onMaterialChoose(bom)">
  260. {{ $t("workOrder.selectMaterial") }}
  261. </button>
  262. <!-- 物料详情 -->
  263. <button
  264. type="primary"
  265. :plain="false"
  266. @click="onMaterialView(bom)"
  267. v-if="bom.materialSelected"
  268. >
  269. {{ $t("workOrder.materialDetails") }}
  270. </button>
  271. </view>
  272. </view>
  273. </view>
  274. </scroll-view>
  275. <button
  276. class="submit-btn"
  277. type="primary"
  278. @click="formSubmit(maintenanceFormRef)"
  279. >
  280. {{ $t("operation.submit") }}
  281. </button>
  282. </view>
  283. <deviceMultiple
  284. ref="deviceMultipleRef"
  285. @multiple-devide-submit="onChooseDevice"
  286. />
  287. <materialsChoose
  288. ref="materialsChooseRef"
  289. :deviceId="addMateriaItem.id"
  290. :materialItem="addMateriaItem"
  291. @material-submit="materialSubmit"
  292. />
  293. <materials-view ref="materialsViewRef" />
  294. </template>
  295. <script setup>
  296. import { onLoad, onReady, onBackPress } from "@dcloudio/uni-app";
  297. import {
  298. reactive,
  299. ref,
  300. onMounted,
  301. onBeforeUnmount,
  302. nextTick,
  303. getCurrentInstance,
  304. } from "vue";
  305. import { getUserDeptInfo } from "@/api";
  306. import { getDeviceAssociateBomList, saveMaintenance } from "@/api/maintenance";
  307. import { getDeptId, getUserId } from "@/utils/auth";
  308. import dayjs from "dayjs";
  309. import deviceMultiple from "@/components/device/multiple.vue";
  310. import materialsChoose from "@/components/materials/choose.vue";
  311. import materialsView from "@/components/materials/view.vue";
  312. import { useDataDictStore } from "@/store/modules/dataDict";
  313. const { getDataDictList } = useDataDictStore();
  314. const dict = getDataDictList("pms_main_work_order_process_mode");
  315. // 遍历dict,新增text字段 值为label
  316. dict.forEach((item) => {
  317. item.text = item.label;
  318. });
  319. console.log("resultDict", dict);
  320. // 引用全局变量$t
  321. const { appContext } = getCurrentInstance();
  322. const t = appContext.config.globalProperties.$t;
  323. const outsourcingFlagRange = ref([
  324. {
  325. value: 0,
  326. text: t("maintenanceWorkOrder.maintenanceTypeIn"),
  327. },
  328. // {
  329. // value: 1,
  330. // text: t("maintenanceWorkOrder.maintenanceTypeOut"),
  331. // },
  332. ]);
  333. // 获取当前时间
  334. const now = dayjs().format("YYYY-MM-DD HH:mm:ss");
  335. const dateMax = ref(now);
  336. // 获取当前用户部门信息
  337. const deptInfo = ref({});
  338. onMounted(() => {
  339. // 获取当前用户部门信息
  340. getUserDeptInfo({ id: getDeptId() }).then((res) => {
  341. deptInfo.value = res.data;
  342. // 给mainWorkOrder.name赋值
  343. mainWorkOrder.value.name =
  344. deptInfo.value.name +
  345. "-" +
  346. dayjs().format("YYYY-MM-DD") +
  347. t("maintenanceWorkOrder.title");
  348. // 给mainWorkOrder.deptId赋值
  349. mainWorkOrder.value.deptId = deptInfo.value.id;
  350. });
  351. });
  352. const mainWorkOrder = ref({
  353. // id: getRandomNumber(),
  354. name: "", // 工单名称
  355. orderNumber: "", // 工单编号
  356. outsourcingFlag: 0, // 保养类型(是否委外 0否 1是)
  357. applicant: "", // 填报人
  358. actualStartTime: "", // 实际开始时间
  359. actualEndTime: "", // 实际结束时间
  360. remark: "", // 备注
  361. cost: "", // 保养费用
  362. otherCost: "", // 其他费用
  363. type: 2, //工单类型(1计划生成 2临时新建),
  364. deptId: "", // 部门id"
  365. responsiblePerson: getUserId(), // 负责人
  366. });
  367. const deviceMultipleRef = ref(null);
  368. const selectedDevices = ref([]);
  369. const onAddDevice = () => {
  370. deviceMultipleRef.value.open();
  371. };
  372. const onChooseDevice = (data) => {
  373. console.log("onChooseDevice", data);
  374. selectedDevices.value = data;
  375. onDeviceBomList();
  376. };
  377. // 保养工单明细
  378. const mainWorkOrderBom = ref([]);
  379. const onDeviceBomList = () => {
  380. const ids = selectedDevices.value.map((item) => item.id);
  381. console.log("onDeviceBomList-ids", ids);
  382. getDeviceAssociateBomList({
  383. deviceIds: ids.join(","),
  384. bomFlag: "b", // 维修时选择 物料 传值 w 保养时选择 物料 传值 b
  385. }).then((res) => {
  386. console.log("getDeviceAssociateBomList", res.data);
  387. // 如果返回的data为空,则提示没有可选择的保养项
  388. if (!res.data.length) {
  389. uni.showToast({
  390. title: t("maintenanceWorkOrder.noMaintenanceItems"),
  391. icon: "none",
  392. });
  393. return;
  394. }
  395. /**
  396. * 重新生成工单名称
  397. * 格式:deviceCode - deviceName - currentDate 保养工单
  398. * 首先提取出已经获取到的所有设备保养项集合中的第1个保养项对象的属性 deviceCode deviceName
  399. * 然后拼接上 currentDate 保养工单
  400. * 最后赋值给mainWorkOrder.name
  401. */
  402. // 查找res.data中第一个存在deviceCode和deviceName属性的对象
  403. const device = res.data.find((item) => item.deviceCode && item.deviceName);
  404. console.log("🚀 ~ onDeviceBomList ~ device:", device);
  405. if (device) {
  406. mainWorkOrder.value.name =
  407. device.deviceCode +
  408. " - " +
  409. device.deviceName +
  410. " - " +
  411. dayjs().format("YYYY-MM-DD") +
  412. t("maintenanceWorkOrder.title");
  413. }
  414. // 遍历res.data,如果bomNodeId不存在于mainWorkOrderBom中,则添加到mainWorkOrderBom中,并将是否选择物料设为false
  415. res.data.forEach((bom) => {
  416. if (
  417. !mainWorkOrderBom.value.some(
  418. (item) => item.bomNodeId === bom.bomNodeId && item.id === bom.id
  419. )
  420. ) {
  421. mainWorkOrderBom.value.push({
  422. ...bom,
  423. deviceId: bom.id,
  424. materialCount: 0, // 物料数量
  425. workOrderBomOnlyKey: bom.id + "_" + bom.bomNodeId, //手动拼接列表中的唯一标识
  426. materialSelected: false, //手动添加是否选择物料标识
  427. });
  428. }
  429. });
  430. console.log(
  431. "getDeviceAssociateBomList- mainWorkOrderBom",
  432. mainWorkOrderBom.value
  433. );
  434. });
  435. };
  436. // 物料选择
  437. const materialsChooseRef = ref(null);
  438. const addMateriaItem = ref({});
  439. const onMaterialChoose = (item) => {
  440. console.log("onMaterialChoose", item);
  441. addMateriaItem.value = item;
  442. materialsChooseRef.value.open(item);
  443. };
  444. // 保养工单 - 物料
  445. const mainWorkOrderMaterials = ref([]);
  446. const materialSubmit = (material) => {
  447. console.log("material - submit", material);
  448. // 判断mainWorkOrderMaterials中是否存在相同chooseKey和workOrderBomOnlyKey的物料,如果存在,则更新数量,如果不存在,则添加
  449. const index = mainWorkOrderMaterials.value.findIndex(
  450. (item) =>
  451. item.chooseKey === material.chooseKey &&
  452. item.workOrderBomOnlyKey == material.workOrderBomOnlyKey
  453. );
  454. if (index !== -1) {
  455. mainWorkOrderMaterials.value[index].quantity =
  456. parseFloat(mainWorkOrderMaterials.value[index].quantity) +
  457. parseFloat(material.quantity);
  458. } else {
  459. mainWorkOrderMaterials.value.push({
  460. ...material,
  461. });
  462. // 修改是否选择物料
  463. mainWorkOrderBom.value.forEach((bom) => {
  464. if (bom.workOrderBomOnlyKey === material.workOrderBomOnlyKey) {
  465. bom.materialSelected = true;
  466. }
  467. });
  468. }
  469. // 根据workOrderBomOnlyKey计算所选物料的数量 赋值给mainWorkOrderBom.materialCount
  470. mainWorkOrderBom.value.forEach((bom) => {
  471. bom.materialCount = mainWorkOrderMaterials.value
  472. .filter((item) => item.workOrderBomOnlyKey === bom.workOrderBomOnlyKey)
  473. .reduce((total, item) => {
  474. return parseFloat(total) + parseFloat(item.quantity);
  475. }, 0);
  476. });
  477. // 计算保养费用
  478. mainWorkOrder.value.cost = mainWorkOrderMaterials.value.reduce(
  479. (total, item) => {
  480. return (
  481. parseFloat(total) +
  482. parseFloat(item.quantity) * parseFloat(item.unitPrice)
  483. );
  484. },
  485. 0
  486. );
  487. // mainWorkOrder.value.cost保留两位小数
  488. mainWorkOrder.value.cost = mainWorkOrder.value.cost.toFixed(2);
  489. console.log("mainWorkOrderMaterials", mainWorkOrderMaterials.value);
  490. };
  491. const materialsViewRef = ref(null);
  492. const onMaterialView = (item) => {
  493. console.log("onMaterialView", item);
  494. // 筛选mainWorkOrderMaterials中相同workOrderBomOnlyKey的物料
  495. const materials = mainWorkOrderMaterials.value.filter(
  496. (material) => material.workOrderBomOnlyKey === item.workOrderBomOnlyKey
  497. );
  498. console.log("onMaterialView-materials", materials);
  499. // uni.$emit('material-view', materials)
  500. uni.navigateTo({
  501. url: "/pages/material/view",
  502. success: () => {
  503. setTimeout(() => {
  504. uni.$emit("material-view", materials);
  505. }, 300); // 延迟300ms,根据实际情况调整
  506. },
  507. });
  508. // materialsViewRef.value.openDrawer()
  509. };
  510. const onDelete = (item) => {
  511. console.log("onDelete", item);
  512. // 删除对应保养项以及对应保养项添加的物料
  513. mainWorkOrderBom.value = mainWorkOrderBom.value.filter(
  514. (bom) => bom.workOrderBomOnlyKey !== item.workOrderBomOnlyKey
  515. );
  516. mainWorkOrderMaterials.value = mainWorkOrderMaterials.value.filter(
  517. (material) => material.workOrderBomOnlyKey !== item.workOrderBomOnlyKey
  518. );
  519. };
  520. const maintenanceFormRef = ref(null);
  521. const mainWorkOrderRules = ref({
  522. name: {
  523. rules: [
  524. {
  525. required: true,
  526. errorMessage: t("operation.PleaseFillIn"),
  527. },
  528. ],
  529. },
  530. applicant: {
  531. rules: [
  532. {
  533. required: true,
  534. errorMessage:
  535. t("operation.PleaseFillIn") + t("maintenanceWorkOrder.applicant"),
  536. },
  537. ],
  538. },
  539. actualStartTime: {
  540. rules: [
  541. {
  542. required: true,
  543. errorMessage:
  544. t("operation.PleaseSelect") +
  545. t("maintenanceWorkOrder.actualMaintenanceStartTime"),
  546. },
  547. ],
  548. },
  549. actualEndTime: {
  550. rules: [
  551. {
  552. required: true,
  553. errorMessage:
  554. t("operation.PleaseSelect") + t("maintenanceWorkOrder.actualEndTime"),
  555. },
  556. ],
  557. },
  558. });
  559. const formSubmit = async (formEl) => {
  560. if (!formEl) return;
  561. await formEl
  562. .validate()
  563. .then((res) => {
  564. console.log("success", res);
  565. // 判断mainWorkOrder.value中的实际保养结束时间是否大于实际保养开始时间
  566. if (
  567. mainWorkOrder.value.actualEndTime &&
  568. mainWorkOrder.value.actualStartTime &&
  569. mainWorkOrder.value.actualEndTime < mainWorkOrder.value.actualStartTime
  570. ) {
  571. uni.showToast({
  572. title: t("maintenanceWorkOrder.timeNotBeEarlier"),
  573. icon: "none",
  574. });
  575. mainWorkOrder.value.actualEndTime = "";
  576. return;
  577. }
  578. // 判断是否存在保养明细
  579. if (mainWorkOrderBom.value.length === 0) {
  580. uni.showToast({
  581. title: t("maintenanceWorkOrder.bomEmpty"),
  582. icon: "none",
  583. });
  584. return;
  585. }
  586. // 判断是否所有保养项都已选择物料
  587. const unselectedBoms = mainWorkOrderBom.value.filter(
  588. (bom) => !bom.materialSelected
  589. );
  590. if (unselectedBoms.length > 0) {
  591. let message = "";
  592. if (unselectedBoms.length <= 1) {
  593. // 少于等于1个时全部显示
  594. message = unselectedBoms
  595. .map((bom) => `【${bom.deviceCode}-${bom.name}】${t("maintenanceWorkOrder.materialUnselected")}`)
  596. .join("\n");
  597. } else {
  598. // 超过1个时显示前1个加省略
  599. const firstThree = unselectedBoms
  600. .slice(0, 1)
  601. .map((bom) => `【${bom.deviceCode}-${bom.name}】`)
  602. .join("\n");
  603. message = `${firstThree}\n...${t("maintenanceWorkOrder.unselectedMaintenanceItems")}`;
  604. }
  605. uni.showToast({
  606. title: message,
  607. icon: "none",
  608. duration: 3000, // 延长显示时间以便用户阅读
  609. mask: true,
  610. });
  611. return;
  612. }
  613. // 提取数据处理逻辑为独立函数 - 使用对象解构赋值代替 delete 操作,避免修改原始数据
  614. const processBomData = (bomItems) => {
  615. return bomItems.map((item) => {
  616. const {
  617. id,
  618. materialCount,
  619. workOrderBomOnlyKey,
  620. materialSelected,
  621. ...rest
  622. } = item;
  623. return rest;
  624. });
  625. };
  626. const processMaterialData = (materialItems) => {
  627. return materialItems.map((item) => {
  628. const { chooseKey, workOrderBomOnlyKey, ...rest } = item;
  629. return {
  630. ...rest,
  631. };
  632. });
  633. };
  634. // 删除mainWorkOrderBom.value中的workOrderBomOnlyKey与materialSelected
  635. const orderBom = processBomData([...mainWorkOrderBom.value]);
  636. console.log("orderBom", orderBom);
  637. // 删除mainWorkOrderMaterials.value中的chooseKey与workOrderBomOnlyKey
  638. const orderMaterials = processMaterialData([
  639. ...mainWorkOrderMaterials.value,
  640. ]);
  641. saveMaintenance({
  642. mainWorkOrder: mainWorkOrder.value,
  643. mainWorkOrderBom: orderBom,
  644. mainWorkOrderMaterials: orderMaterials,
  645. })
  646. .then((res) => {
  647. console.log("saveMaintenance", res);
  648. if (res.code == 0) {
  649. uni.showToast({
  650. title: t("operation.success"),
  651. icon: "success",
  652. });
  653. uni.navigateBack();
  654. } else {
  655. uni.showToast({
  656. title: res.msg,
  657. icon: "none",
  658. });
  659. }
  660. })
  661. .catch((err) => {
  662. console.log("err", err);
  663. });
  664. })
  665. .catch((err) => {
  666. console.log("err", err);
  667. });
  668. };
  669. onLoad(() => {
  670. console.log("onLoad");
  671. });
  672. onReady(() => {
  673. // 设置自定义表单校验规则,必须在节点渲染完毕后执行
  674. // this.$refs.customForm.setRules(this.customRules)
  675. });
  676. </script>
  677. <style lang="scss" scoped>
  678. @import "@/style/work-order-detail.scss";
  679. </style>