work-order-form.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. <template>
  2. <scroll-view scroll-y="true" class="work-order-form">
  3. <view class="form-content">
  4. <uni-forms
  5. ref="repairFormRef"
  6. labelWidth="140px"
  7. :modelValue="formData"
  8. :rules="formDataRules"
  9. err-show-type="toast"
  10. >
  11. <!-- 设备 -->
  12. <uni-forms-item
  13. class="form-item"
  14. :label="$t('maintenanceWorkOrder.equipment')"
  15. name="deviceName"
  16. :required="true"
  17. >
  18. <uni-easyinput
  19. style="text-align: right"
  20. :inputBorder="false"
  21. :clearable="false"
  22. :styles="{ disableColor: '#fff' }"
  23. :placeholder="selectPlaceholder"
  24. v-model="formData.deviceName"
  25. @focus="onAddDevice"
  26. />
  27. </uni-forms-item>
  28. <!-- 维修类型 -->
  29. <uni-forms-item
  30. class="form-item"
  31. :label="$t('equipmentMaintenance.maintenanceType')"
  32. name="type"
  33. :required="true"
  34. >
  35. <uni-data-select
  36. :clear="false"
  37. v-model="formData.type"
  38. :localdata="typeRange"
  39. >
  40. </uni-data-select>
  41. </uni-forms-item>
  42. <!-- 是否停机 -->
  43. <uni-forms-item
  44. class="form-item"
  45. :label="$t('equipmentMaintenance.isStop')"
  46. name="ifStop"
  47. :required="true"
  48. >
  49. <uni-data-select
  50. :clear="false"
  51. v-model="formData.ifStop"
  52. :localdata="ifStopRange"
  53. >
  54. </uni-data-select>
  55. </uni-forms-item>
  56. <!-- 维修开始时间 维修类型是委外时不必填-->
  57. <uni-forms-item
  58. class="form-item"
  59. :label="$t('equipmentMaintenance.maintenanceStartTime')"
  60. name="maintainStartTime"
  61. :required="formData.type == 'out' ? false : true"
  62. >
  63. <!-- :end="dateMax" -->
  64. <uni-datetime-picker
  65. type="datetime"
  66. :border="false"
  67. returnType="timestamp"
  68. :placeholder="selectPlaceholder"
  69. :style="{
  70. color: formData.maintainStartTime ? '#333' : '#999',
  71. 'font-size': formData.maintainStartTime
  72. ? '14px !important'
  73. : 'inherit !important',
  74. }"
  75. v-model="formData.maintainStartTime"
  76. >
  77. </uni-datetime-picker>
  78. </uni-forms-item>
  79. <!-- return-type="timestamp" -->
  80. <!-- 维修结束时间 维修类型是委外时不必填-->
  81. <uni-forms-item
  82. class="form-item"
  83. :label="$t('equipmentMaintenance.maintenanceEndTime')"
  84. name="maintainEndTime"
  85. :required="formData.type == 'out' ? false : true"
  86. >
  87. <!-- :end="dateMax" -->
  88. <uni-datetime-picker
  89. type="datetime"
  90. :border="false"
  91. returnType="timestamp"
  92. :placeholder="selectPlaceholder"
  93. :style="{
  94. color: formData.maintainEndTime ? '#333' : '#999',
  95. 'font-size': formData.maintainEndTime
  96. ? '14px !important'
  97. : 'inherit !important',
  98. }"
  99. v-model="formData.maintainEndTime"
  100. >
  101. </uni-datetime-picker>
  102. </uni-forms-item>
  103. <!-- 故障时间 维修类型是委外时必填-->
  104. <uni-forms-item
  105. class="form-item"
  106. :label="$t('fault.faultTime')"
  107. name="failureTime"
  108. :required="formData.type == 'out' ? true : false"
  109. >
  110. <!-- :end="dateMax" -->
  111. <uni-datetime-picker
  112. type="datetime"
  113. :border="false"
  114. returnType="timestamp"
  115. :placeholder="selectPlaceholder"
  116. :style="{
  117. color: formData.failureTime ? '#333' : '#999',
  118. 'font-size': formData.failureTime
  119. ? '14px !important'
  120. : 'inherit !important',
  121. }"
  122. v-model="formData.failureTime"
  123. >
  124. </uni-datetime-picker>
  125. </uni-forms-item>
  126. <!-- 故障影响 -->
  127. <uni-forms-item
  128. class="form-item"
  129. :label="$t('fault.faultImpact')"
  130. name="failureInfluence"
  131. :required="false"
  132. >
  133. <uni-easyinput
  134. style="text-align: right"
  135. :inputBorder="false"
  136. :clearable="true"
  137. :styles="{ disableColor: '#fff' }"
  138. v-model="formData.failureInfluence"
  139. :placeholder="fillInPlaceholder"
  140. />
  141. </uni-forms-item>
  142. <!-- 故障系统 -->
  143. <uni-forms-item
  144. class="form-item"
  145. :label="$t('fault.faultSystem')"
  146. name="failureSystem"
  147. :required="false"
  148. >
  149. <uni-easyinput
  150. style="text-align: right"
  151. :inputBorder="false"
  152. :clearable="true"
  153. :styles="{ disableColor: '#fff' }"
  154. v-model="formData.failureSystem"
  155. :placeholder="fillInPlaceholder"
  156. />
  157. </uni-forms-item>
  158. <!-- 维修费用 维修类型=in 时展示 -->
  159. <uni-forms-item
  160. class="form-item"
  161. :label="$t('equipmentMaintenance.cost')"
  162. name="maintainFee"
  163. :required="false"
  164. v-if="formData.type == 'in'"
  165. >
  166. <uni-easyinput
  167. type="digit"
  168. style="text-align: right"
  169. :inputBorder="false"
  170. :clearable="true"
  171. :styles="{ disableColor: '#fff' }"
  172. v-model="formData.maintainFee"
  173. :disabled="formData.type == 'out' ? false : true"
  174. />
  175. </uni-forms-item>
  176. <!-- 图片 -->
  177. <uni-forms-item
  178. class="form-item"
  179. :label="$t('general.picture')"
  180. name="picList"
  181. :required="false"
  182. >
  183. <uni-file-picker
  184. file-mediatype="image"
  185. mode="grid"
  186. :auto-upload="false"
  187. :limit="9"
  188. :imageStyles="{ border: false }"
  189. v-model="formData.picList"
  190. @select="uploadImg"
  191. @delete="deleteImg"
  192. >
  193. <template #default>
  194. <view
  195. class="flex-col align-center justify-center"
  196. style="width: 60px; height: 60px; background-color: #f4f4f4"
  197. >
  198. <uni-icons type="plusempty" color="#ACACAC" size="12" />
  199. </view>
  200. </template>
  201. </uni-file-picker>
  202. </uni-forms-item>
  203. <!-- 类型是out(OA委外)时,触发oa流程 -->
  204. <template v-if="formData.type == 'out'">
  205. <!-- 申请人 -->
  206. <uni-forms-item
  207. class="form-item"
  208. :label="$t('equipmentMaintenance.applicant')"
  209. :required="true"
  210. name="applyPersonId"
  211. >
  212. <uni-data-select
  213. :clear="false"
  214. :disabled="true"
  215. v-model="formData.applyPersonId"
  216. :localdata="applyPersonRange"
  217. @click="
  218. openLocalSearch(
  219. applyPersonRange,
  220. 'applyPersonId',
  221. $t('equipmentMaintenance.applicant')
  222. )
  223. "
  224. >
  225. </uni-data-select>
  226. </uni-forms-item>
  227. <!-- 维修类别 -->
  228. <uni-forms-item
  229. class="form-item"
  230. :label="$t('equipmentMaintenance.classify')"
  231. :required="true"
  232. name="maintainClassify"
  233. >
  234. <uni-data-select
  235. :clear="false"
  236. v-model="formData.maintainClassify"
  237. :localdata="maintainClassifyRange"
  238. >
  239. </uni-data-select>
  240. </uni-forms-item>
  241. <!-- 运行公里/小时 -->
  242. <uni-forms-item
  243. class="form-item"
  244. :label="$t('equipmentMaintenance.runningKilometersPerHour')"
  245. :required="false"
  246. name="kmHour"
  247. >
  248. <uni-easyinput
  249. style="text-align: right"
  250. :inputBorder="false"
  251. :clearable="true"
  252. :styles="{ disableColor: '#fff' }"
  253. v-model="formData.kmHour"
  254. :placeholder="fillInPlaceholder"
  255. />
  256. </uni-forms-item>
  257. <!-- 规格型号 -->
  258. <uni-forms-item
  259. class="form-item"
  260. :label="$t('equipmentMaintenance.specificationModel')"
  261. :required="true"
  262. name="specificationModel"
  263. >
  264. <uni-easyinput
  265. style="text-align: right"
  266. :inputBorder="false"
  267. :clearable="true"
  268. :styles="{ disableColor: '#fff' }"
  269. v-model="formData.model"
  270. :placeholder="fillInPlaceholder"
  271. />
  272. </uni-forms-item>
  273. <!-- 启用日期 -->
  274. <uni-forms-item
  275. class="form-item"
  276. :label="$t('equipmentMaintenance.enableDate')"
  277. :required="true"
  278. name="enableDate"
  279. >
  280. <uni-datetime-picker
  281. type="date"
  282. :border="false"
  283. returnType="string"
  284. :placeholder="selectPlaceholder"
  285. :style="{
  286. color: formData.enableDate ? '#333' : '#999',
  287. 'font-size': formData.enableDate
  288. ? '14px !important'
  289. : 'inherit !important',
  290. }"
  291. v-model="formData.enableDate"
  292. >
  293. </uni-datetime-picker>
  294. </uni-forms-item>
  295. <!-- 供应商 -->
  296. <uni-forms-item
  297. class="form-item"
  298. :label="$t('equipmentMaintenance.supplier')"
  299. :required="true"
  300. name="supplier"
  301. >
  302. <uni-easyinput
  303. style="text-align: right"
  304. :inputBorder="false"
  305. :clearable="true"
  306. :styles="{ disableColor: '#fff' }"
  307. v-model="formData.supplier"
  308. :placeholder="fillInPlaceholder"
  309. >
  310. <template #right>
  311. <button
  312. class="mini-btn"
  313. type="primary"
  314. size="mini"
  315. @click="onManufacturerChoose"
  316. >
  317. {{ $t("operation.PleaseSelect") }}
  318. </button>
  319. </template>
  320. </uni-easyinput>
  321. </uni-forms-item>
  322. <!-- 维修费用 -->
  323. <uni-forms-item
  324. class="form-item"
  325. :label="$t('equipmentMaintenance.cost')"
  326. :required="true"
  327. name="maintainFee"
  328. >
  329. <uni-easyinput
  330. type="digit"
  331. style="text-align: right"
  332. :inputBorder="false"
  333. :clearable="true"
  334. :styles="{ disableColor: '#fff' }"
  335. v-model="formData.maintainFee"
  336. :placeholder="fillInPlaceholder"
  337. :disabled="formData.type == 'out' ? false : true"
  338. />
  339. </uni-forms-item>
  340. <!-- 项目经理 -->
  341. <uni-forms-item
  342. class="form-item"
  343. :label="$t('equipmentMaintenance.projectManager')"
  344. :required="true"
  345. name="projectManager"
  346. >
  347. <uni-data-select
  348. :clear="false"
  349. :disabled="true"
  350. v-model="formData.projectManager"
  351. :localdata="projectManagerRange"
  352. @click="
  353. openLocalSearch(
  354. projectManagerRange,
  355. 'projectManager',
  356. $t('equipmentMaintenance.projectManager')
  357. )
  358. "
  359. >
  360. </uni-data-select>
  361. </uni-forms-item>
  362. <!-- 维修地点 -->
  363. <uni-forms-item
  364. class="form-item"
  365. :label="$t('equipmentMaintenance.maintenanceLocation')"
  366. :required="false"
  367. name="address"
  368. >
  369. <uni-easyinput
  370. style="text-align: right"
  371. :inputBorder="false"
  372. :clearable="true"
  373. :styles="{ disableColor: '#fff' }"
  374. v-model="formData.address"
  375. :placeholder="fillInPlaceholder"
  376. />
  377. </uni-forms-item>
  378. <!-- 委外相关附件 -->
  379. <uni-forms-item
  380. class="form-item"
  381. :label="$t('equipmentMaintenance.outsourceRelatedAttachments')"
  382. :required="false"
  383. name="outFilesList"
  384. >
  385. <uni-file-picker
  386. :clear="false"
  387. :limit="9"
  388. file-mediatype="all"
  389. v-model="formData.outFilesList"
  390. @select="uploadOutFiles"
  391. @delete="deleteOutFiles"
  392. >
  393. </uni-file-picker>
  394. </uni-forms-item>
  395. <!-- 维修项目 -->
  396. <uni-forms-item
  397. class="form-item"
  398. :label="$t('equipmentMaintenance.maintenanceItem')"
  399. :required="true"
  400. name="maintainItem"
  401. >
  402. <uni-easyinput
  403. style="text-align: right"
  404. type="textarea"
  405. :autoHeight="true"
  406. :inputBorder="false"
  407. :clearable="true"
  408. :styles="{ disableColor: '#fff' }"
  409. v-model="formData.maintainItem"
  410. :placeholder="fillInPlaceholder"
  411. />
  412. </uni-forms-item>
  413. </template>
  414. <!-- ----------------------------------- OA委外 end ------------------------ -->
  415. <!-- 故障描述 -->
  416. <uni-forms-item
  417. class="form-item"
  418. :label="$t('fault.description')"
  419. :required="true"
  420. name="description"
  421. >
  422. <uni-easyinput
  423. style="text-align: right"
  424. type="textarea"
  425. :autoHeight="true"
  426. :inputBorder="false"
  427. :clearable="true"
  428. :styles="{ disableColor: '#fff' }"
  429. v-model="formData.description"
  430. :placeholder="fillInPlaceholder"
  431. />
  432. </uni-forms-item>
  433. <!-- 维修描述 维修类型是委外时不必填-->
  434. <uni-forms-item
  435. class="form-item"
  436. :label="$t('equipmentMaintenance.description')"
  437. :required="formData.type == 'out' ? false : true"
  438. name="maintainDescription"
  439. >
  440. <uni-easyinput
  441. style="text-align: right"
  442. type="textarea"
  443. :autoHeight="true"
  444. :inputBorder="false"
  445. :clearable="true"
  446. :styles="{ disableColor: '#fff' }"
  447. v-model="formData.maintainDescription"
  448. :placeholder="fillInPlaceholder"
  449. />
  450. </uni-forms-item>
  451. <!-- 解决办法 -->
  452. <uni-forms-item
  453. class="form-item"
  454. :label="$t('fault.solution')"
  455. :required="false"
  456. name="solution"
  457. >
  458. <uni-easyinput
  459. style="text-align: right"
  460. type="textarea"
  461. :autoHeight="true"
  462. :inputBorder="false"
  463. :clearable="true"
  464. :styles="{ disableColor: '#fff' }"
  465. v-model="formData.solution"
  466. :placeholder="fillInPlaceholder"
  467. />
  468. </uni-forms-item>
  469. <!-- 备注 -->
  470. <uni-forms-item
  471. class="form-item"
  472. :label="$t('operation.remark')"
  473. :required="false"
  474. name="remark"
  475. >
  476. <uni-easyinput
  477. style="text-align: right"
  478. type="textarea"
  479. :autoHeight="true"
  480. :inputBorder="false"
  481. :clearable="true"
  482. :styles="{ disableColor: '#fff' }"
  483. v-model="formData.remark"
  484. :placeholder="fillInPlaceholder"
  485. />
  486. </uni-forms-item>
  487. </uni-forms>
  488. </view>
  489. </scroll-view>
  490. <!-- 选择设备 -->
  491. <device-single ref="deviceSingleRef" @devide-submit="onChooseDevice" />
  492. <!-- 本地搜索 (选择申请人、项目经理) -->
  493. <local-search ref="localSearchRef" @choosed="onChooseLocalSearch" />
  494. <!-- 选择供应商 -->
  495. <supplier-choose
  496. ref="manufacturerPopupRef"
  497. @confirm="onSelectedManufacturer"
  498. />
  499. </template>
  500. <script setup>
  501. import { onLoad, onReady, onBackPress } from "@dcloudio/uni-app";
  502. import { ref, reactive, computed, getCurrentInstance, onMounted ,nextTick} from "vue";
  503. import dayjs from "dayjs";
  504. // -------------------------- 引入api接口 start--------------------------
  505. import {
  506. createRepair,
  507. getRepairApplicantList,
  508. getRepairProjectManagerList,
  509. } from "@/api/repair.js";
  510. // -------------------------- 引入api接口 end --------------------------
  511. // --------------------------引用组件-----start---------------------------
  512. import supplierChoose from "@/components/supplier/choose.vue";
  513. import deviceSingle from "@/components/device/single.vue";
  514. import localSearch from "@/components/local-search.vue";
  515. // --------------------------引用组件-----end-----------------------------
  516. // --------------------------引用全局变量$t-------------------------------
  517. const { appContext } = getCurrentInstance();
  518. const t = appContext.config.globalProperties.$t;
  519. // --------------------------引用字典项-----------------------------------
  520. import { useDataDictStore } from "@/store/modules/dataDict";
  521. const { getIntDictOptions, getStrDictOptions } = useDataDictStore();
  522. // -------------------------接收父组件传递的参数---------------------------
  523. const props = defineProps({
  524. formData: {
  525. type: Object,
  526. default: () => {},
  527. },
  528. formDisabled: {
  529. type: Boolean,
  530. default: false,
  531. },
  532. });
  533. // -------------------------- 表单需要的数据 --------------------------
  534. // 获取当前时间
  535. const now = dayjs().format("YYYY-MM-DD HH:mm:ss");
  536. // 最大时间为当前时间
  537. const dateMax = ref(now);
  538. // 根据formDisabled动态返回表单placeholder - 填写
  539. const fillInPlaceholder = computed(() => {
  540. return props.formDisabled ? " " : t("operation.PleaseFillIn");
  541. });
  542. // 根据formDisabled动态返回表单placeholder - 选择
  543. const selectPlaceholder = computed(() => {
  544. return props.formDisabled ? " " : t("operation.PleaseSelect");
  545. });
  546. // 根据formDisabled动态返回表单required
  547. const formItemRequired = computed(() => {
  548. return props.formDisabled ? false : true;
  549. });
  550. // --------------------------------------------------------------------
  551. // 维修类型
  552. const typeRange = getStrDictOptions("pms_main_type").map((item) => {
  553. return {
  554. ...item,
  555. text: item.label,
  556. };
  557. });
  558. console.log("🚀 ~ typeRange:", typeRange);
  559. // 是否停机
  560. const ifStopRange = getIntDictOptions("pms_boolean").map((item) => {
  561. return {
  562. ...item,
  563. text: item.label,
  564. };
  565. });
  566. // 维修类别
  567. const maintainClassifyRange = getStrDictOptions("pms_maintain_classify").map(
  568. (item) => {
  569. return {
  570. ...item,
  571. text: item.label,
  572. };
  573. }
  574. );
  575. // 申请人
  576. const applyPersonRange = ref([]);
  577. // 获取申请人列表
  578. const getApplicantList = async () => {
  579. // id参数创建的时候传undefined,详情的时候需要传入工单的创建人creator
  580. const res = await getRepairApplicantList({
  581. id: "",
  582. });
  583. if (res.code == 0) {
  584. applyPersonRange.value = res.data.map((item) => {
  585. return {
  586. value: item.oaId,
  587. text: item.lastname,
  588. };
  589. });
  590. // console.log(
  591. // "🚀 ~ getApplicantList ~ applyPersonRange.value:",
  592. // applyPersonRange.value
  593. // );
  594. }
  595. };
  596. // 项目经理
  597. const projectManagerRange = ref([]);
  598. // 获取项目经理列表
  599. const getProjectManagerList = async () => {
  600. // id参数创建的时候传undefined,详情的时候需要传入工单的创建人creator
  601. const res = await getRepairProjectManagerList({
  602. id: "",
  603. });
  604. if (res.code !== 0) {
  605. uni.showToast({
  606. title: res.msg,
  607. icon: "error",
  608. });
  609. return;
  610. }
  611. projectManagerRange.value = res.data.map((item) => {
  612. return {
  613. value: item.oaId,
  614. text: item.lastname,
  615. };
  616. });
  617. // console.log(
  618. // "🚀 ~ getProjectManagerList ~ projectManagerRange.value:",
  619. // projectManagerRange.value
  620. // );
  621. };
  622. // 供应商选择
  623. const manufacturerPopupRef = ref(null);
  624. const onManufacturerChoose = () => {
  625. console.log(
  626. "🚀 ~ onManufacturerChoose ~ onManufacturerChoose:",
  627. onManufacturerChoose
  628. );
  629. manufacturerPopupRef.value.open("bottom");
  630. };
  631. // 供应商选择确认
  632. const onSelectedManufacturer = (item) => {
  633. console.log("🚀 ~ onSelectedManufacturer ~ item:", item);
  634. emit("chooseManufacturer", item);
  635. };
  636. // 本地搜索
  637. const localSearchRef = ref(null);
  638. // 打开本地搜索
  639. const openLocalSearch = (list, propKey, title) => {
  640. localSearchRef.value.open({
  641. list,
  642. propKey,
  643. title,
  644. choosed: props.formData[propKey],
  645. });
  646. };
  647. // 本地搜索确认选择
  648. const onChooseLocalSearch = (propKey, item) => {
  649. console.log("🚀 ~ onChooseLocalSearch ~ propKey, item:", propKey, item);
  650. emit("chooseLocalSearch", propKey, item);
  651. };
  652. // --------------------------------------------------------------------------
  653. // 选择设备
  654. const deviceSingleRef = ref(null);
  655. const onAddDevice = () => {
  656. deviceSingleRef.value.open();
  657. };
  658. const onChooseDevice = (data) => {
  659. console.log("onChooseDevice", data);
  660. // if (data.hasSetMaintenanceBom === false) {
  661. // uni.showToast({
  662. // title: t("equipmentMaintenance.noMaintenanceItems"),
  663. // icon: "none",
  664. // });
  665. // return;
  666. // }
  667. emit("chooseDevice", data);
  668. };
  669. // 上传图片
  670. const uploadImg = (event) => {
  671. emit("uploadImg", event);
  672. };
  673. // 删除图片
  674. const deleteImg = (event) => {
  675. emit("deleteImg", event);
  676. };
  677. // 上传委外相关附件
  678. const uploadOutFiles = (event) => {
  679. emit("uploadOutFiles", event);
  680. };
  681. // 删除委外相关附件
  682. const deleteOutFiles = (event) => {
  683. emit("deleteOutFiles", event);
  684. };
  685. // --------------------------------------------------------------------------
  686. // 表单实例
  687. const repairFormRef = ref(null);
  688. // 表单校验规则
  689. const formDataBaseRules = ref({
  690. // 设备名称
  691. deviceName: {
  692. rules: [
  693. {
  694. required: true,
  695. errorMessage: `${t("operation.PleaseSelect")}${t(
  696. "maintenanceWorkOrder.equipment"
  697. )}`,
  698. },
  699. ],
  700. },
  701. // 维修类型
  702. type: {
  703. rules: [
  704. {
  705. required: true,
  706. errorMessage: `${t("operation.PleaseSelect")}${t(
  707. "equipmentMaintenance.maintenanceType"
  708. )}`,
  709. },
  710. ],
  711. },
  712. // 是否停机
  713. ifStop: {
  714. rules: [
  715. {
  716. required: true,
  717. errorMessage: `${t("operation.PleaseSelect")}${t(
  718. "equipmentMaintenance.isStop"
  719. )}`,
  720. },
  721. ],
  722. },
  723. // 维修开始时间
  724. maintainStartTime: {
  725. rules: [
  726. {
  727. required: false,
  728. errorMessage: `${t("operation.PleaseSelect")}${t(
  729. "equipmentMaintenance.maintenanceStartTime"
  730. )}`,
  731. },
  732. {
  733. validator: (rule, value, callback, source) => {
  734. if (source.maintainEndTime && value > source.maintainEndTime) {
  735. callback(new Error(`${t("general.timeNotBeLater")}`));
  736. } else {
  737. callback();
  738. }
  739. },
  740. },
  741. ],
  742. },
  743. // 维修结束时间
  744. maintainEndTime: {
  745. rules: [
  746. {
  747. required: false,
  748. errorMessage: `${t("operation.PleaseSelect")}${t(
  749. "equipmentMaintenance.maintenanceEndTime"
  750. )}`,
  751. },
  752. {
  753. validator: (rule, value, callback, source) => {
  754. if (source.maintainStartTime && value < source.maintainStartTime) {
  755. callback(new Error(`${t("general.timeNotBeEarlier")}`));
  756. } else {
  757. callback();
  758. }
  759. },
  760. },
  761. ],
  762. },
  763. // 故障时间
  764. failureTime: {
  765. rules: [
  766. {
  767. required: false,
  768. errorMessage: `${t("operation.PleaseSelect")}${t("fault.faultTime")}`,
  769. },
  770. ],
  771. },
  772. // 故障描述
  773. description: {
  774. rules:[
  775. {
  776. required: true,
  777. errorMessage: `${t("operation.PleaseFillIn")}${t(
  778. "fault.description"
  779. )}`,
  780. },
  781. ]
  782. },
  783. // 维修描述
  784. maintainDescription: {
  785. rules: [
  786. {
  787. required: false,
  788. errorMessage: `${t("operation.PleaseFillIn")}${t(
  789. "equipmentMaintenance.description"
  790. )}`,
  791. },
  792. ],
  793. },
  794. // 以下是OA委外的校验规则 type = out
  795. // 申请人
  796. applyPersonId: {
  797. rules: [
  798. {
  799. required: false,
  800. errorMessage: `${t("operation.PleaseSelect")}${t(
  801. "equipmentMaintenance.applicant"
  802. )}`,
  803. },
  804. ],
  805. },
  806. // 维修类别
  807. maintainClassify: {
  808. rules: [
  809. {
  810. required: false,
  811. errorMessage: `${t("operation.PleaseSelect")}${t(
  812. "equipmentMaintenance.classify"
  813. )}`,
  814. },
  815. ],
  816. },
  817. // 规格型号
  818. model: {
  819. rules: [
  820. {
  821. required: false,
  822. errorMessage: `${t("operation.PleaseFillIn")}${t(
  823. "equipmentMaintenance.specificationModel"
  824. )}`,
  825. },
  826. ],
  827. },
  828. // 启用日期
  829. enableDate: {
  830. rules: [
  831. {
  832. required: false,
  833. errorMessage: `${t("operation.PleaseSelect")}${t(
  834. "equipmentMaintenance.enableDate"
  835. )}`,
  836. },
  837. ],
  838. },
  839. // 供应商
  840. supplier: {
  841. rules: [
  842. {
  843. required: false,
  844. errorMessage: `${t("operation.PleaseFillIn")}${t(
  845. "equipmentMaintenance.supplier"
  846. )}`,
  847. },
  848. ],
  849. },
  850. // 维修费用
  851. maintainFee: {
  852. rules: [
  853. {
  854. required: false,
  855. errorMessage: `${t("operation.PleaseFillIn")}${t(
  856. "equipmentMaintenance.cost"
  857. )}`,
  858. },
  859. ],
  860. },
  861. // 项目经理
  862. projectManager: {
  863. rules: [
  864. {
  865. required: false,
  866. errorMessage: `${t("operation.PleaseSelect")}${t(
  867. "equipmentMaintenance.projectManager"
  868. )}`,
  869. },
  870. ],
  871. },
  872. // 维修项目
  873. maintenanceItem: {
  874. rules: [
  875. {
  876. required: false,
  877. errorMessage: `${t("operation.PleaseFillIn")}${t(
  878. "equipmentMaintenance.maintenanceItem"
  879. )}`,
  880. },
  881. ],
  882. },
  883. });
  884. // 动态计算表单校验规则
  885. const formDataRules = computed(() => {
  886. const rules = JSON.parse(JSON.stringify(formDataBaseRules.value));
  887. // 根据维修类型动态调整规则
  888. if (props.formData.type === "out") {
  889. // 委外维修:维修开始/结束时间可选,故障时间必填
  890. rules.maintainStartTime.rules[0].required = false;
  891. rules.maintainEndTime.rules[0].required = false;
  892. rules.failureTime.rules[0].required = true;
  893. rules.maintainDescription.rules[0].required = false;
  894. // oa委外:申请人、维修类别、规格型号、启用日期、供应商、维修费用、项目经理、维修项目必填
  895. rules.applyPersonId.rules[0].required = true;
  896. rules.maintainClassify.rules[0].required = true;
  897. rules.model.rules[0].required = true;
  898. rules.enableDate.rules[0].required = true;
  899. rules.supplier.rules[0].required = true;
  900. rules.maintainFee.rules[0].required = true;
  901. rules.projectManager.rules[0].required = true;
  902. rules.maintenanceItem.rules[0].required = true;
  903. } else {
  904. // 非委外维修:维修开始/结束时间必填,故障时间可选
  905. rules.maintainStartTime.rules[0].required = true;
  906. rules.maintainEndTime.rules[0].required = true;
  907. rules.failureTime.rules[0].required = false;
  908. rules.maintainDescription.rules[0].required = true;
  909. // 非委外:申请人、维修类别、规格型号、启用日期、供应商、维修费用、项目经理、维修项目非必填
  910. rules.applyPersonId.rules[0].required = false;
  911. rules.maintainClassify.rules[0].required = false;
  912. rules.model.rules[0].required = false;
  913. rules.enableDate.rules[0].required = false;
  914. rules.supplier.rules[0].required = false;
  915. rules.maintainFee.rules[0].required = false;
  916. rules.projectManager.rules[0].required = false;
  917. rules.maintenanceItem.rules[0].required = false;
  918. }
  919. return rules;
  920. });
  921. // 表单校验方法
  922. const validate = async () => {
  923. // 同步最新的formDataRules(解决computed延迟)
  924. const latestRules = formDataRules.value;
  925. await nextTick(); // 等待DOM与规则同步
  926. repairFormRef.value.setRules(latestRules);
  927. console.log("基础校验通过(formDataRules已生效)");
  928. // 调用uni-forms的validate方法进行校验
  929. return await repairFormRef.value.validate();
  930. };
  931. // -------------------------- 生命周期函数 --------------------------
  932. onMounted(() => {
  933. // 初始化获取申请人列表
  934. getApplicantList();
  935. // 初始化获取项目经理列表
  936. getProjectManagerList();
  937. });
  938. // -------------------------- 暴露给父组件的外部方法 --------------------------
  939. defineExpose({
  940. validate,
  941. });
  942. // -------------------------- 事件派发 --------------------------
  943. const emit = defineEmits([
  944. "chooseDevice",
  945. "chooseLocalSearch",
  946. "chooseManufacturer",
  947. "uploadImg",
  948. "deleteImg",
  949. "uploadOutFiles",
  950. "deleteOutFiles",
  951. ]);
  952. </script>
  953. <style lang="scss" scoped>
  954. @import "@/style/work-order-form.scss";
  955. </style>