create.vue 22 KB

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