|
@@ -1,13 +1,19 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <z-paging ref="paging" bgColor="#fff" safe-area-inset-bottom paging-class="paging-btm-shadow" scroll-with-animation>
|
|
|
|
|
|
|
+ <z-paging ref="paging" bgColor="#f7f7f7" safe-area-inset-bottom scroll-with-animation>
|
|
|
<template #top>
|
|
<template #top>
|
|
|
- <ut-navbar :title="did ? '编辑包装任务' : '创建包装任务'" :fixed="false" border></ut-navbar>
|
|
|
|
|
|
|
+ <ut-navbar :title="'创建包装任务'" :fixed="false" border></ut-navbar>
|
|
|
</template>
|
|
</template>
|
|
|
- <up-form class="p-rtv" labelPosition="top" :model="form" :rules="rules" labelWidth="auto" ref="upFormRef">
|
|
|
|
|
|
|
+ <up-form class="p-rtv bg-#fff" labelPosition="top" :model="form" :rules="rules" labelWidth="auto" ref="upFormRef">
|
|
|
<view class="pd-24 bg-#fff mb-10">
|
|
<view class="pd-24 bg-#fff mb-10">
|
|
|
<view class="h-1" id="inputStorageIdpppp"></view>
|
|
<view class="h-1" id="inputStorageIdpppp"></view>
|
|
|
<up-form-item borderBottom label="选择包装对象" prop="inputStorageId" required>
|
|
<up-form-item borderBottom label="选择包装对象" prop="inputStorageId" required>
|
|
|
-
|
|
|
|
|
|
|
+ <view class="flex1">
|
|
|
|
|
+ <up-button v-if="!form.inputStorageId" @click="selectStorage" type="primary" plain>
|
|
|
|
|
+ <image class="w-36 h-36 mr-10" src="https://ta.zycpzs.cn/oss-file/smart-trace/szyy/images-plt/common/select_push_icon.png" mode="widthFix" />
|
|
|
|
|
+ <span>请选择您要包装的对象</span>
|
|
|
|
|
+ </up-button>
|
|
|
|
|
+ <view v-else class="bg-#FBFDFB card-info-block pd-24 p-rtv"> </view>
|
|
|
|
|
+ </view>
|
|
|
</up-form-item>
|
|
</up-form-item>
|
|
|
<view class="h-1" id="storageUseAmountpppp"></view>
|
|
<view class="h-1" id="storageUseAmountpppp"></view>
|
|
|
<up-form-item borderBottom label="本次包装用量" prop="storageUseAmount" required>
|
|
<up-form-item borderBottom label="本次包装用量" prop="storageUseAmount" required>
|
|
@@ -46,10 +52,10 @@
|
|
|
</up-form-item>
|
|
</up-form-item>
|
|
|
<view class="h-1" id="packagingDateStartpppp"></view>
|
|
<view class="h-1" id="packagingDateStartpppp"></view>
|
|
|
<view class="h-1" id="packagingDateEndpppp"></view>
|
|
<view class="h-1" id="packagingDateEndpppp"></view>
|
|
|
- <up-form-item prop="packagingDateStart" required label="包装日期" class="form-item-bottom-padding-0">
|
|
|
|
|
|
|
+ <up-form-item required label="包装日期" class="form-item-bottom-padding-0">
|
|
|
<view class="flex1 d-flex">
|
|
<view class="flex1 d-flex">
|
|
|
<view class="flex1">
|
|
<view class="flex1">
|
|
|
- <ut-datetime-picker v-model="form.packagingDateStart" :maxDate="form.packagingDateEnd || new Date()" mode="date">
|
|
|
|
|
|
|
+ <ut-datetime-picker v-model="form.packagingDateStart" :maxDate="form.packagingDateEnd" mode="date">
|
|
|
<up-form-item borderBottom prop="packagingDateStart" class="form-item-top-padding-0">
|
|
<up-form-item borderBottom prop="packagingDateStart" class="form-item-top-padding-0">
|
|
|
<up-input v-model="form.packagingDateStart" readonly placeholder="包装开始日期" border="none" clearable></up-input>
|
|
<up-input v-model="form.packagingDateStart" readonly placeholder="包装开始日期" border="none" clearable></up-input>
|
|
|
<template #right>
|
|
<template #right>
|
|
@@ -60,7 +66,7 @@
|
|
|
</view>
|
|
</view>
|
|
|
<view class="pd2-0-20"></view>
|
|
<view class="pd2-0-20"></view>
|
|
|
<view class="flex1">
|
|
<view class="flex1">
|
|
|
- <ut-datetime-picker v-model="form.packagingDateEnd" :minDate="form.packagingDateStart" :maxDate="new Date()" mode="date">
|
|
|
|
|
|
|
+ <ut-datetime-picker v-model="form.packagingDateEnd" :minDate="form.packagingDateStart" mode="date">
|
|
|
<up-form-item borderBottom prop="packagingDateEnd" class="form-item-top-padding-0">
|
|
<up-form-item borderBottom prop="packagingDateEnd" class="form-item-top-padding-0">
|
|
|
<up-input v-model="form.packagingDateEnd" readonly placeholder="包装结束日期" border="none" clearable></up-input>
|
|
<up-input v-model="form.packagingDateEnd" readonly placeholder="包装结束日期" border="none" clearable></up-input>
|
|
|
<template #right>
|
|
<template #right>
|
|
@@ -107,10 +113,10 @@
|
|
|
</div>
|
|
</div>
|
|
|
</up-form-item>
|
|
</up-form-item>
|
|
|
<!-- 请选择赋码方式 -->
|
|
<!-- 请选择赋码方式 -->
|
|
|
- <view class="h-1" id="packCodeTypepppp"></view>
|
|
|
|
|
- <ut-action-sheet v-model="form.packCodeType" :tabs="pt_pack_code_type" mode="custom" title="请选择赋码方式">
|
|
|
|
|
- <up-form-item borderBottom label="赋码方式" required prop="packCodeType">
|
|
|
|
|
- <view v-if="form.packCodeType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_pack_code_type, form.packCodeType) }}</view>
|
|
|
|
|
|
|
+ <view class="h-1" id="refTypepppp"></view>
|
|
|
|
|
+ <ut-action-sheet v-model="form.refType" :tabs="pt_pack_ref_type" mode="custom" title="请选择赋码方式">
|
|
|
|
|
+ <up-form-item borderBottom label="赋码方式" required prop="refType">
|
|
|
|
|
+ <view v-if="form.refType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_pack_ref_type, form.refType) }}</view>
|
|
|
<view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择赋码方式</view>
|
|
<view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择赋码方式</view>
|
|
|
<template #right>
|
|
<template #right>
|
|
|
<up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
|
|
<up-icon size="22rpx" color="#37A954" name="arrow-down-fill"></up-icon>
|
|
@@ -123,26 +129,32 @@
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
</up-form>
|
|
</up-form>
|
|
|
- <template #bottom>
|
|
|
|
|
- <view class="pd-20">
|
|
|
|
|
- <up-button type="primary" @click="submit">
|
|
|
|
|
- <text>{{ did ? '保存' : '提交' }}</text>
|
|
|
|
|
- </up-button>
|
|
|
|
|
|
|
+ <view class="d-flex flex-cln a-c pd3-40-24-24">
|
|
|
|
|
+ <view class="f-s-30 c-#333 f-w-5 mb-16">
|
|
|
|
|
+ <span>预计分包数:</span>
|
|
|
|
|
+ <span class="f-s-46 c-primary f-w-7">{{ packResult.packNum || '-' }}</span>
|
|
|
|
|
+ <span>包</span>
|
|
|
</view>
|
|
</view>
|
|
|
- </template>
|
|
|
|
|
|
|
+ <view class="d-flex a-c mb-30">
|
|
|
|
|
+ <view class="f-s-28 c-#333">包装规格:</view>
|
|
|
|
|
+ <view class="d-flex a-c gap-24">
|
|
|
|
|
+ <view class="bg-#E3EFE6 pd2-12-28 c-primary radius-8 f-s-26">{{ packResult.spec1 || '-' }}</view>
|
|
|
|
|
+ <view v-if="packResult.spec2" class="bg-#E3EFE6 pd2-12-28 c-primary radius-8 f-s-26">{{ packResult.spec2 || '-' }}</view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <up-button type="primary" @click="submit">立即分包</up-button>
|
|
|
|
|
+ </view>
|
|
|
</z-paging>
|
|
</z-paging>
|
|
|
</template>
|
|
</template>
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
import { useClientRequest } from '@/utils/request';
|
|
import { useClientRequest } from '@/utils/request';
|
|
|
import { formItemBtnStyle } from '@/assets/styles/uview-plus';
|
|
import { formItemBtnStyle } from '@/assets/styles/uview-plus';
|
|
|
import type { PackTaskForm } from './types';
|
|
import type { PackTaskForm } from './types';
|
|
|
-
|
|
|
|
|
|
|
+import NP from 'number-precision';
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
-const { pt_pack_code_type, pt_pack_spec_unit, pt_expire_date_unit } = toRefs<any>(proxy?.useDict('pt_pack_code_type', 'pt_pack_spec_unit', 'pt_expire_date_unit'));
|
|
|
|
|
|
|
+const { pt_pack_ref_type, pt_pack_spec_unit, pt_expire_date_unit } = toRefs<any>(proxy?.useDict('pt_pack_ref_type', 'pt_pack_spec_unit', 'pt_expire_date_unit'));
|
|
|
const upFormRef = ref();
|
|
const upFormRef = ref();
|
|
|
const paging = ref();
|
|
const paging = ref();
|
|
|
-const did = ref<string>('');
|
|
|
|
|
-
|
|
|
|
|
const form = ref<PackTaskForm>({
|
|
const form = ref<PackTaskForm>({
|
|
|
storageUseAmount: '',
|
|
storageUseAmount: '',
|
|
|
stroeUnit: 'kg',
|
|
stroeUnit: 'kg',
|
|
@@ -154,7 +166,8 @@ const form = ref<PackTaskForm>({
|
|
|
batchSn: '',
|
|
batchSn: '',
|
|
|
expireDate: '',
|
|
expireDate: '',
|
|
|
expireDateUnit: '',
|
|
expireDateUnit: '',
|
|
|
- packCodeType: '',
|
|
|
|
|
|
|
+ refType: '',
|
|
|
|
|
+ packCodeType: '1',
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
const rules = reactive<Record<string, any>>({
|
|
const rules = reactive<Record<string, any>>({
|
|
@@ -166,6 +179,10 @@ const rules = reactive<Record<string, any>>({
|
|
|
const num = Number(value);
|
|
const num = Number(value);
|
|
|
if (Number.isNaN(num)) return Promise.reject('本次包装用量请输入数字');
|
|
if (Number.isNaN(num)) return Promise.reject('本次包装用量请输入数字');
|
|
|
if (num <= 0) return Promise.reject('本次包装用量需大于0');
|
|
if (num <= 0) return Promise.reject('本次包装用量需大于0');
|
|
|
|
|
+ // 本次包装用量不能大于剩余可用量
|
|
|
|
|
+ if (form.value.stroeObject && num > form.value.stroeObject.restAmount) {
|
|
|
|
|
+ return Promise.reject(`本次包装用量不能大于剩余量${form.value.stroeObject.restAmount}${form.value.stroeUnit}`);
|
|
|
|
|
+ }
|
|
|
return Promise.resolve();
|
|
return Promise.resolve();
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
@@ -178,6 +195,10 @@ const rules = reactive<Record<string, any>>({
|
|
|
const num = Number(value);
|
|
const num = Number(value);
|
|
|
if (Number.isNaN(num)) return Promise.reject('包装规格请输入数字');
|
|
if (Number.isNaN(num)) return Promise.reject('包装规格请输入数字');
|
|
|
if (num <= 0) return Promise.reject('包装规格需大于0');
|
|
if (num <= 0) return Promise.reject('包装规格需大于0');
|
|
|
|
|
+ // 包装规格不能大于本次包装用量
|
|
|
|
|
+ if (form.value.storageUseAmount && num > Number(form.value.storageUseAmount)) {
|
|
|
|
|
+ return Promise.reject('包装规格不能大于本次包装用量');
|
|
|
|
|
+ }
|
|
|
return Promise.resolve();
|
|
return Promise.resolve();
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
@@ -190,18 +211,9 @@ const rules = reactive<Record<string, any>>({
|
|
|
batchSn: [{ required: true, message: '请输入成品批号' }],
|
|
batchSn: [{ required: true, message: '请输入成品批号' }],
|
|
|
expireDate: [{ required: true, message: '请输入保质期' }],
|
|
expireDate: [{ required: true, message: '请输入保质期' }],
|
|
|
expireDateUnit: [{ required: true, message: '请选择保质期单位' }],
|
|
expireDateUnit: [{ required: true, message: '请选择保质期单位' }],
|
|
|
- packCodeType: [{ required: true, message: '请选择赋码方式' }],
|
|
|
|
|
|
|
+ refType: [{ required: true, message: '请选择赋码方式' }],
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
-const loadDetail = async (id: string) => {
|
|
|
|
|
- if (!id) return;
|
|
|
|
|
- const res = await useClientRequest.get(`/plt-api/app/packTask/getInfo/${id}`);
|
|
|
|
|
- if (res && res.code === 200) {
|
|
|
|
|
- const data = res.data || {};
|
|
|
|
|
- console.log(data);
|
|
|
|
|
- }
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
const submit = async () => {
|
|
const submit = async () => {
|
|
|
try {
|
|
try {
|
|
|
await upFormRef.value?.validate();
|
|
await upFormRef.value?.validate();
|
|
@@ -212,17 +224,17 @@ const submit = async () => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- await uni.showLoading({ title: did.value ? '保存中...' : '提交中...', mask: true });
|
|
|
|
|
- const url = did.value ? '/plt-api/app/packTask/edit' : '/plt-api/app/packTask/save';
|
|
|
|
|
- const payload: any = { ...(form.value as any) };
|
|
|
|
|
- if (did.value) payload.id = did.value;
|
|
|
|
|
- const res = await useClientRequest.post(url, payload);
|
|
|
|
|
|
|
+ await uni.showLoading({ title: '分包中...', mask: true });
|
|
|
|
|
+ const payload: any = { ...(form.value as any), planCount: packResult.value.packNum };
|
|
|
|
|
+ delete payload.stroeObject;
|
|
|
|
|
+ const res = await useClientRequest.post('/plt-api/app/packTask/save', payload);
|
|
|
uni.hideLoading();
|
|
uni.hideLoading();
|
|
|
if (res && res.code === 200) {
|
|
if (res && res.code === 200) {
|
|
|
- uni.showToast({ title: did.value ? '保存成功' : '新增成功', icon: 'success' });
|
|
|
|
|
- uni.$emit('refreshContactUnitDetail');
|
|
|
|
|
- uni.$emit('refreshContactUnitList');
|
|
|
|
|
- setTimeout(() => uni.navigateBack(), 300);
|
|
|
|
|
|
|
+ uni.showToast({ title: '操作成功', icon: 'success' });
|
|
|
|
|
+ uni.$emit('refreshPackTaskList');
|
|
|
|
|
+ setTimeout(() => uni.navigateBack({
|
|
|
|
|
+ delta: 1,
|
|
|
|
|
+ }), 300);
|
|
|
}
|
|
}
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
uni.hideLoading();
|
|
uni.hideLoading();
|
|
@@ -247,10 +259,56 @@ const generateBatchCode = async () => {
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
-const confirmArea = (area: any) => {
|
|
|
|
|
- form.value.adcdCodeName = area.fullName;
|
|
|
|
|
|
|
+// 去选择包装对象页选择包装对象,选择后返回并赋值
|
|
|
|
|
+const selectStorage = () => {
|
|
|
|
|
+ uni.$on('selectStorageObject', (data: any) => {
|
|
|
|
|
+ console.log(data, '---');
|
|
|
|
|
+ form.value.inputStorageId = data.id;
|
|
|
|
|
+ form.value.packTaskType = data.storageType;
|
|
|
|
|
+ form.value.stroeUnit = data.unit;
|
|
|
|
|
+ form.value.storageUseAmount = '';
|
|
|
|
|
+ form.value.capacity = '';
|
|
|
|
|
+ form.value.stroeObject = data;
|
|
|
|
|
+ uni.$off('selectStorageObject');
|
|
|
|
|
+ });
|
|
|
|
|
+ uni.$u.route({
|
|
|
|
|
+ type: 'navigateTo',
|
|
|
|
|
+ url: '/plant/packaging/select-object/index',
|
|
|
|
|
+ params: {
|
|
|
|
|
+ emitField: 'selectStorageObject',
|
|
|
|
|
+ storageType: form.value.packTaskType, // 传入当前选择的包装对象类型,种子、苗木、农资等
|
|
|
|
|
+ id: form.value.inputStorageId, // 传入当前选择的包装对象id,编辑时使用,用于回显选中状态
|
|
|
|
|
+ },
|
|
|
|
|
+ });
|
|
|
};
|
|
};
|
|
|
|
|
+// 计算属性分包结果
|
|
|
|
|
+const packResult = computed(() => {
|
|
|
|
|
+ // 预计分包数 = 本次包装用量 / 包装规格,向上取整
|
|
|
|
|
+ // 分包数,包装规格,整除的情况,直接除;不整除的情况,向上取整
|
|
|
|
|
+ // 包装规格,整除的时候包装规格只有一个,不整除包装规格有两个,第二个是剩余量
|
|
|
|
|
+ const result: any = {
|
|
|
|
|
+ packNum: 0,
|
|
|
|
|
+ spec1: '',
|
|
|
|
|
+ // 零包规格
|
|
|
|
|
+ spec2: '',
|
|
|
|
|
|
|
|
|
|
+ };
|
|
|
|
|
+ if (form.value.storageUseAmount && form.value.capacity) {
|
|
|
|
|
+ const useAmount = Number(form.value.storageUseAmount);
|
|
|
|
|
+ const capacity = Number(form.value.capacity);
|
|
|
|
|
+ if (capacity > 0) {
|
|
|
|
|
+ result.packNum = Math.ceil(useAmount / capacity);
|
|
|
|
|
+ result.spec1 = `${capacity}${form.value.stroeUnit}/${form.value.unit}`;
|
|
|
|
|
+ if (useAmount % capacity !== 0) {
|
|
|
|
|
+ const lastAmount = NP.round(useAmount - capacity * Math.floor(useAmount / capacity), 2);
|
|
|
|
|
+ result.spec2 = `${lastAmount}${form.value.stroeUnit}/${form.value.unit}`; // 零包规格
|
|
|
|
|
+ } else {
|
|
|
|
|
+ result.spec2 = ''; // 没有零包规格
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return result;
|
|
|
|
|
+});
|
|
|
onLoad((options: any) => {});
|
|
onLoad((options: any) => {});
|
|
|
</script>
|
|
</script>
|
|
|
<style lang="scss" scoped></style>
|
|
<style lang="scss" scoped></style>
|