|
|
@@ -10,31 +10,35 @@
|
|
|
<!-- 操作日期 -->
|
|
|
<view class="h-1" id="operationDatepppp"></view>
|
|
|
<up-form-item :borderBottom="false" label="操作日期" required prop="operationDate">
|
|
|
- <ut-datetime-picker v-model="form.operationDate.startDate" mode="date" dateFields="day">
|
|
|
+ <ut-datetime-picker v-model="form.operationDate.activityStart" mode="date" dateFields="day">
|
|
|
<view class="d-flex mr-20">
|
|
|
- <up-input v-model="form.operationDate.startDate" placeholder="请选择操作开始时间" border="bottom" :customStyle="{ paddingLeft: '0rpx' }"></up-input>
|
|
|
+ <up-input v-model="form.operationDate.activityStart" placeholder="请选择操作开始时间" border="bottom" :customStyle="{ paddingLeft: '0rpx' }"></up-input>
|
|
|
<up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill" style="margin-left: -20rpx"></up-icon>
|
|
|
</view>
|
|
|
</ut-datetime-picker>
|
|
|
- <ut-datetime-picker v-model="form.operationDate.endDate" mode="date" dateFields="day">
|
|
|
+ <ut-datetime-picker v-model="form.operationDate.activityEnd" mode="date" dateFields="day">
|
|
|
<view class="d-flex">
|
|
|
- <up-input v-model="form.operationDate.endDate" placeholder="请选择操作结束时间" border="bottom" :customStyle="{ paddingLeft: '0rpx' }"></up-input>
|
|
|
+ <up-input v-model="form.operationDate.activityEnd" placeholder="请选择操作结束时间" border="bottom" :customStyle="{ paddingLeft: '0rpx' }"></up-input>
|
|
|
<up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill" style="margin-left: -20rpx"></up-icon>
|
|
|
</view>
|
|
|
</ut-datetime-picker>
|
|
|
</up-form-item>
|
|
|
<!-- 操作类型 -->
|
|
|
- <ut-action-sheet v-model="form.operationType" :tabs="operationTypeOptions" title="选择操作类型" mode="custom">
|
|
|
- <up-form-item borderBottom label="操作类型" required prop="operationType" id="operationTypepppp">
|
|
|
- <view v-if="form.operationType" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(operationTypeOptions, form.operationType) }}</view>
|
|
|
+ <ut-action-sheet v-model="form.opMethod" :tabs="pt_op_method" title="选择操作类型" mode="custom">
|
|
|
+ <up-form-item borderBottom label="操作类型" required prop="opMethod" id="opMethodpppp">
|
|
|
+ <view v-if="form.opMethod" class="f-s-30 c-333 f-w-5 flex1">{{ selectDictLabel(pt_op_method, form.opMethod) }}</view>
|
|
|
<view v-else class="f-s-30 c-ccc f-w-4 flex1">请选择操作类型</view>
|
|
|
<template #right>
|
|
|
<up-icon size="22rpx" color="#2A6D52" name="arrow-down-fill"></up-icon>
|
|
|
</template>
|
|
|
</up-form-item>
|
|
|
</ut-action-sheet>
|
|
|
+ <!-- 自填操作类型 -->
|
|
|
+ <up-form-item v-if="form.opMethod == '99'" borderBottom label="自填操作类型" required prop="cusOp" id="cusOppppp">
|
|
|
+ <up-input v-model="form.cusOp" placeholder="请输入自填操作类型" border="none"></up-input>
|
|
|
+ </up-form-item>
|
|
|
<!-- 操作地块 -->
|
|
|
- <up-form-item :borderBottom="false" label="操作地块" required prop="baseId" id="baseIdpppp">
|
|
|
+ <up-form-item :borderBottom="false" label="操作地块" required prop="landIds" id="baseIdpppp">
|
|
|
<view v-if="!deawerData" class="w-100% d-flex a-c j-c pd-24 b-radius bg-#FBFDFB border-#AFDDBB" @click="goSelectBase()">
|
|
|
<view class=""></view>
|
|
|
<view class="f-s-34 c-primary">请选择操作地块</view>
|
|
|
@@ -44,36 +48,49 @@
|
|
|
</view>
|
|
|
</up-form-item>
|
|
|
<!-- 操作方式 -->
|
|
|
- <up-form-item borderBottom label="操作方式" required prop="operationMethod" id="operationMethodpppp">
|
|
|
- <up-input v-model="form.operationMethod" placeholder="如:人工锄草、机械中耕、喷雾器叶面喷施等" border="none"></up-input>
|
|
|
+ <up-form-item borderBottom label="操作方式" prop="opRemark" id="opRemarkpppp">
|
|
|
+ <up-input v-model="form.opRemark" placeholder="如:人工锄草、机械中耕、喷雾器叶面喷施等" border="none"></up-input>
|
|
|
</up-form-item>
|
|
|
-
|
|
|
<!-- 记录人 -->
|
|
|
- <up-form-item borderBottom label="记录人" required prop="recorder" id="recorderpppp">
|
|
|
- <up-input v-model="form.recorder" placeholder="请输入记录人" border="none"></up-input>
|
|
|
+ <up-form-item borderBottom label="记录人" required prop="mgName" id="mgNamepppp">
|
|
|
+ <up-input v-model="form.mgName" placeholder="请输入记录人" border="none"></up-input>
|
|
|
</up-form-item>
|
|
|
-
|
|
|
<!-- 是否使用物料 -->
|
|
|
- <up-form-item borderBottom label="是否使用物料" required prop="useMaterial" id="useMaterialpppp">
|
|
|
- <up-radio-group v-model="form.useMaterial">
|
|
|
- <up-radio :customStyle="{ marginRight: '60rpx' }" v-for="(item, index) in yes_no" :key="index" :label="item.label" :name="item.value"></up-radio>
|
|
|
- </up-radio-group>
|
|
|
+ <up-form-item borderBottom label="是否使用物料" required prop="inputFlag" id="inputFlagpppp">
|
|
|
+ <view class="d-flex flex-cln">
|
|
|
+ <view v-if="!+isAdd" class="c-#B52B21 f-s-24">因物料修改涉及退库操作,不支持修改物料信息如有错误,请删除此条管理记录,重新添加。</view>
|
|
|
+ <up-radio-group v-model="form.inputFlag">
|
|
|
+ <up-radio :disabled="!+isAdd" :customStyle="{ marginRight: '60rpx' }" v-for="(item, index) in yes_no" :key="index" :label="item.label" :name="item.value"></up-radio>
|
|
|
+ </up-radio-group>
|
|
|
+ </view>
|
|
|
+ </up-form-item>
|
|
|
+ <!-- 使用物料 -->
|
|
|
+ <up-form-item v-if="+form.inputFlag" borderBottom label="使用物料" required prop="inputFlag" id="inputFlagpppp">
|
|
|
+ <view v-if="!Material" class="w-100% d-flex a-c j-c pd-24 b-radius bg-#FBFDFB border-#AFDDBB" @click="goMaterial()">
|
|
|
+ <view class=""></view>
|
|
|
+ <view class="f-s-34 c-primary">请选择此次农事使用的物料</view>
|
|
|
+ </view>
|
|
|
+ <view v-else class="w-100%">
|
|
|
+ <Materialinfo :showClose="true" />
|
|
|
+ </view>
|
|
|
</up-form-item>
|
|
|
-
|
|
|
<!-- 备注 -->
|
|
|
<up-form-item borderBottom label="备注/说明" prop="remark" id="remarkpppp">
|
|
|
<up-input v-model="form.remark" placeholder="如:“防治阔叶杂草”、“花期追肥”" border="none"></up-input>
|
|
|
</up-form-item>
|
|
|
- <up-form-item label="过程图片" prop="technicalFile" borderBottom id="technicalFilepppp">
|
|
|
- <ut-upload v-model="form.technicalFile" :max-count="9" valueType="array" accept="image"></ut-upload>
|
|
|
+ <up-form-item label="过程图片" prop="imgs" borderBottom id="imgspppp">
|
|
|
+ <ut-upload v-model="form.imgs" :max-count="9" accept="image"></ut-upload>
|
|
|
+ </up-form-item>
|
|
|
+ <up-form-item label="过程视频" prop="videos" borderBottom id="videospppp">
|
|
|
+ <ut-upload v-model="form.videos" :max-count="9" accept="video"></ut-upload>
|
|
|
</up-form-item>
|
|
|
</view>
|
|
|
</up-form>
|
|
|
</view>
|
|
|
<template #bottom>
|
|
|
<view class="pd-24 d-flex j-c gap-20 base-bottom-wrap">
|
|
|
- <up-button type="warning" @click="saveDraft()">暂存</up-button>
|
|
|
- <up-button type="primary" @click="save()">提交</up-button>
|
|
|
+ <up-button v-if="+isAdd" type="primary" @click="save()">确认添加</up-button>
|
|
|
+ <up-button v-else type="primary" @click="change()">确认修改</up-button>
|
|
|
</view>
|
|
|
</template>
|
|
|
</z-paging>
|
|
|
@@ -83,51 +100,58 @@ import { ref, reactive, computed, getCurrentInstance, type ComponentInternalInst
|
|
|
import { useClientRequest } from '@/utils/request';
|
|
|
import { useInfoStore } from '@/store';
|
|
|
import Baseinfo from '../models/baseinfo.vue';
|
|
|
+import Materialinfo from '../models/materialinfo.vue';
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
-const { yes_no } = toRefs<any>(proxy?.useDict('yes_no'));
|
|
|
+const { yes_no, pt_op_method } = toRefs<any>(proxy?.useDict('yes_no', 'pt_op_method'));
|
|
|
const deawerData = ref();
|
|
|
const infoStore = useInfoStore();
|
|
|
// 表单数据
|
|
|
const form = ref({
|
|
|
+ taskId: '',
|
|
|
+ //管理类型 1-农事管理 2-投料
|
|
|
+ activityType: '1',
|
|
|
operationDate: {
|
|
|
- startDate: null as string | null,
|
|
|
- endDate: null as string | null,
|
|
|
+ activityStart: null as string | null,
|
|
|
+ activityEnd: null as string | null,
|
|
|
},
|
|
|
- operationType: null as string | null,
|
|
|
- operationMethod: '',
|
|
|
- recorder: infoStore.userInfo?.name,
|
|
|
- useMaterial: '0' as '0' | '1',
|
|
|
+ //作用对象类型 1-地块 2-动物
|
|
|
+ targetType: '1',
|
|
|
+ opMethod: null as string | null,
|
|
|
+ cusOp: null as string | null,
|
|
|
+ //操作地块
|
|
|
+ landIds: [],
|
|
|
+ opRemark: '',
|
|
|
+ mgName: infoStore.userInfo?.name,
|
|
|
+ //是否使用物料
|
|
|
+ inputFlag: '0' as '0' | '1',
|
|
|
+ //物料列表
|
|
|
+ inputs: [],
|
|
|
remark: '',
|
|
|
- technicalFile: '',
|
|
|
+ imgs: null as string | null,
|
|
|
+ videos: null as string | null,
|
|
|
+ landFlag: '0' as '0' | '1',
|
|
|
});
|
|
|
const baseId = ref('');
|
|
|
-// 操作类型选项(示例,可以根据实际需求调整)
|
|
|
-const operationTypeOptions = ref([
|
|
|
- { label: '浇水', value: '1' },
|
|
|
- { label: '施肥', value: '2' },
|
|
|
- { label: '除草', value: '3' },
|
|
|
- { label: '病虫害防治', value: '4' },
|
|
|
- { label: '修剪', value: '5' },
|
|
|
- { label: '其他', value: '6' },
|
|
|
-]);
|
|
|
-
|
|
|
+const Material = ref();
|
|
|
+//判断是新增还是修改
|
|
|
+const isAdd = ref(true);
|
|
|
// 自定义校验函数:操作日期校验
|
|
|
const validateOperationDate = (rule: any, value: any, callback: any) => {
|
|
|
if (!value) {
|
|
|
callback(new Error('请选择操作日期'));
|
|
|
return;
|
|
|
}
|
|
|
- const { startDate, endDate } = value;
|
|
|
- if (!startDate) {
|
|
|
+ const { activityStart, activityEnd } = value;
|
|
|
+ if (!activityStart) {
|
|
|
callback(new Error('请选择操作开始时间'));
|
|
|
return;
|
|
|
}
|
|
|
- if (!endDate) {
|
|
|
+ if (!activityEnd) {
|
|
|
callback(new Error('请选择操作结束时间'));
|
|
|
return;
|
|
|
}
|
|
|
- const start = new Date(startDate);
|
|
|
- const end = new Date(endDate);
|
|
|
+ const start = new Date(activityStart);
|
|
|
+ const end = new Date(activityEnd);
|
|
|
if (end <= start) {
|
|
|
callback(new Error('操作结束时间必须晚于开始时间'));
|
|
|
return;
|
|
|
@@ -135,13 +159,23 @@ const validateOperationDate = (rule: any, value: any, callback: any) => {
|
|
|
callback();
|
|
|
};
|
|
|
|
|
|
+// 自定义校验函数:自填操作类型校验(当opMethod为99时必填)
|
|
|
+const validateCusOp = (rule: any, value: any, callback: any) => {
|
|
|
+ if (form.value.opMethod === '99' && !value) {
|
|
|
+ callback(new Error('请输入自填操作类型'));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ callback();
|
|
|
+};
|
|
|
+
|
|
|
// 表单验证规则
|
|
|
const rules = reactive({
|
|
|
operationDate: [{ validator: validateOperationDate, trigger: 'blur' }],
|
|
|
- operationType: [{ required: true, message: '请选择操作类型' }],
|
|
|
- operationMethod: [{ required: true, message: '请输入操作方式' }],
|
|
|
- recorder: [{ required: true, message: '请输入记录人' }],
|
|
|
- useMaterial: [{ required: true, message: '请选择是否使用物料' }],
|
|
|
+ opMethod: [{ required: true, message: '请选择操作类型' }],
|
|
|
+ cusOp: [{ validator: validateCusOp, trigger: 'blur' }],
|
|
|
+ opRemark: [{ required: false, message: '请输入操作方式' }],
|
|
|
+ mgName: [{ required: true, message: '请输入记录人' }],
|
|
|
+ inputFlag: [{ required: true, message: '请选择是否使用物料' }],
|
|
|
remark: [{ required: false, message: '请输入备注' }],
|
|
|
});
|
|
|
|
|
|
@@ -170,14 +204,14 @@ const save = () => {
|
|
|
|
|
|
const params = {
|
|
|
...form.value,
|
|
|
- startDate: form.value.operationDate.startDate,
|
|
|
- endDate: form.value.operationDate.endDate,
|
|
|
+ ...form.value.operationDate,
|
|
|
+ landFlag: deawerData?.value.aloneChecked ? '1' : '0',
|
|
|
};
|
|
|
|
|
|
console.log('提交参数:', params);
|
|
|
|
|
|
// 这里需要根据实际 API 进行调整
|
|
|
- const res = await useClientRequest.post('/plt-api/app/managementRecord/save', params);
|
|
|
+ const res = await useClientRequest.post('/plt-api/app/plantationActivity/saveActivity', params);
|
|
|
if (res.code == 200) {
|
|
|
uni.showToast({
|
|
|
title: '提交成功',
|
|
|
@@ -185,7 +219,11 @@ const save = () => {
|
|
|
duration: 2000,
|
|
|
});
|
|
|
setTimeout(() => {
|
|
|
- uni.navigateBack();
|
|
|
+ //发送emit
|
|
|
+ uni.$emit('updatesuperviselist');
|
|
|
+ uni.navigateBack({
|
|
|
+ delta: 1,
|
|
|
+ });
|
|
|
}, 1000);
|
|
|
}
|
|
|
} catch (error: any) {
|
|
|
@@ -202,34 +240,47 @@ const save = () => {
|
|
|
true,
|
|
|
);
|
|
|
};
|
|
|
-
|
|
|
-// 暂存
|
|
|
-const saveDraft = () => {
|
|
|
+//修改提交表单
|
|
|
+const change = () => {
|
|
|
uni.$u.debounce(
|
|
|
async () => {
|
|
|
try {
|
|
|
+ console.log('开始提交管理记录');
|
|
|
+ await upFormRef.value?.validate();
|
|
|
+ console.log('校验完成');
|
|
|
+
|
|
|
const params = {
|
|
|
...form.value,
|
|
|
- startDate: form.value.operationDate.startDate,
|
|
|
- endDate: form.value.operationDate.endDate,
|
|
|
+ ...form.value.operationDate,
|
|
|
+ landFlag: deawerData?.value.aloneChecked ? '1' : '0',
|
|
|
};
|
|
|
|
|
|
- console.log('暂存参数:', params);
|
|
|
+ console.log('提交参数:', params);
|
|
|
|
|
|
// 这里需要根据实际 API 进行调整
|
|
|
- const res = await useClientRequest.post('/plt-api/app/managementRecord/draft', params);
|
|
|
+ const res = await useClientRequest.post('/plt-api/app/plantationActivity/updateActivity', params);
|
|
|
if (res.code == 200) {
|
|
|
uni.showToast({
|
|
|
- title: '暂存成功',
|
|
|
+ title: '提交成功',
|
|
|
icon: 'success',
|
|
|
duration: 2000,
|
|
|
});
|
|
|
setTimeout(() => {
|
|
|
- uni.navigateBack();
|
|
|
+ //发送emit
|
|
|
+ uni.$emit('updatesuperviselist');
|
|
|
+ uni.navigateBack({
|
|
|
+ delta: 1,
|
|
|
+ });
|
|
|
}, 1000);
|
|
|
}
|
|
|
} catch (error: any) {
|
|
|
- console.log('暂存错误:', error);
|
|
|
+ console.log('表单验证错误:', error);
|
|
|
+ // 滚动到第一个错误字段
|
|
|
+ if (error && error[0]?.field) {
|
|
|
+ const firstErrorField = error[0].field + 'pppp';
|
|
|
+ paging.value?.scrollIntoViewById(firstErrorField, 30, true);
|
|
|
+ }
|
|
|
+ return;
|
|
|
}
|
|
|
},
|
|
|
1000,
|
|
|
@@ -240,11 +291,40 @@ const saveDraft = () => {
|
|
|
const goSelectBase = () => {
|
|
|
uni.$once('updatelands', function (data) {
|
|
|
deawerData.value = data;
|
|
|
- console.log(deawerData.value, 'deawerData.value');
|
|
|
+ console.log(deawerData.value);
|
|
|
+
|
|
|
+ form.value.landIds = deawerData.value.checkBox;
|
|
|
});
|
|
|
uni.$u.route({ type: 'navigateTo', url: '/tools/supervise-plot/index', params: { baseId: baseId.value } });
|
|
|
};
|
|
|
-onLoad((options: any) => {
|
|
|
+//去选择物料
|
|
|
+const goMaterial = () => {
|
|
|
+ if (!+isAdd.value) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+};
|
|
|
+onLoad(async (options: any) => {
|
|
|
baseId.value = options?.baseId;
|
|
|
+ form.value.taskId = options?.taskId;
|
|
|
+ isAdd.value = options?.add;
|
|
|
+ if (!+isAdd.value) {
|
|
|
+ const res = await useClientRequest.get(`/plt-api/app/plantationActivity/getInfo/${options.id}`);
|
|
|
+ if (!res || res.code !== 200) return;
|
|
|
+ form.value = res.data;
|
|
|
+ form.value.operationDate = {
|
|
|
+ activityStart: res.data.activityStart,
|
|
|
+ activityEnd: res.data.activityEnd,
|
|
|
+ };
|
|
|
+ deawerData.value = {
|
|
|
+ ...res.data.baseInfo,
|
|
|
+ area: res?.data?.baseInfo?.gapInfo?.area,
|
|
|
+ areaUnit: res?.data?.baseInfo?.gapInfo?.areaUnit,
|
|
|
+ adcodeName: res?.data?.baseInfo?.gapInfo?.adcodeName,
|
|
|
+ medicineName: res?.data?.baseInfo?.gapInfo?.medicineName,
|
|
|
+ aloneChecked: res?.data?.inputFlag == '1' ? true : false,
|
|
|
+ data: res.data.lands,
|
|
|
+ checkBox: res.data.landIds,
|
|
|
+ };
|
|
|
+ }
|
|
|
});
|
|
|
</script>
|