StepSoak.vue 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <script setup lang="ts">
  2. import { showNotify, showSuccessToast } from 'vant';
  3. import { useForm, useWatcher } from 'alova/client';
  4. import { getSoakDataMethod, setSoakDataMethod } from '@/api/pda.api.ts';
  5. import { fromSoakModel, type SoakModel } from '@/model/step.model.ts';
  6. import { useStepStore } from '@/stores';
  7. import type { ScanData } from '@/core/hook/useScan.ts';
  8. const emits = defineEmits<{ back: [delta?: number] }>();
  9. const storeStore = useStepStore();
  10. const { dataset } = storeToRefs(storeStore);
  11. const {
  12. loading: submitting,
  13. form: model,
  14. send, reset,
  15. } = useForm(setSoakDataMethod, { immediate: false, initialForm: fromSoakModel() }).onSuccess(() => {
  16. showSuccessToast(`操作成功`);
  17. emits('back');
  18. });
  19. const { data, loading } = useWatcher(() => getSoakDataMethod(dataset.value?.id!), [dataset], {
  20. immediate: true,
  21. initialData: {},
  22. middleware: (_, next) => dataset.value?.id && next(),
  23. })
  24. .onSuccess(({ data }) => {
  25. for (const [key, value] of Object.entries(data)) model.value[key as keyof SoakModel] = value;
  26. })
  27. .onError(({ error: message }) => {
  28. showDialog({ title: '温馨提示', message, closeOnClickOverlay: true }).then(() => emits('back'));
  29. });
  30. function submit(picture: string[]) {
  31. let message = '';
  32. if (!+model.value.soakingWaterValue) {
  33. message = '请输入浸泡水量';
  34. } else if (!model.value.deviceCode) message = '请输入桶号';
  35. if (message) {
  36. showNotify({ message, type: 'warning' });
  37. } else {
  38. send(picture);
  39. }
  40. }
  41. defineExpose({
  42. scan(data: ScanData) {
  43. model.value.deviceCode = data?.code ?? '';
  44. },
  45. reset,
  46. });
  47. </script>
  48. <template>
  49. <van-toast :show="loading" type="loading" forbid-click />
  50. <van-field class="suffix" v-model="model.soakingWaterValue" :readonly="submitting" type="digit" label="浸泡水量" placeholder="请输入浸泡水量">
  51. <template #extra>
  52. <div v-if="model.soakingWaterValue">ml</div>
  53. </template>
  54. </van-field>
  55. <van-field class="suffix" v-model="model.soakingTime" :readonly="submitting || !!data.soakingTime" type="digit" label="浸泡时间" placeholder="请输入浸泡时间">
  56. <template #extra>
  57. <div v-if="model.soakingTime">min</div>
  58. </template>
  59. </van-field>
  60. <slot name="scanner" title="扫描桶号" :disabled="submitting"></slot>
  61. <slot name="uploader" :disabled="submitting"></slot>
  62. <van-field v-model="model.soakingNote" :readonly="submitting" rows="2" autosize label="浸泡备注" type="textarea" placeholder="请输入备注内容" />
  63. <slot name="submit" title="浸泡节点上传" :submitting="submitting" :submit="submit"></slot>
  64. </template>
  65. <style scoped lang="scss">
  66. .van-field.suffix {
  67. :deep(.van-field__value) {
  68. flex: none;
  69. //width: min-content;
  70. //min-width: 120px;
  71. max-width: 170px;
  72. input {
  73. text-align: center;
  74. }
  75. }
  76. }
  77. </style>