diff --git a/api/index/index.js b/api/index/index.js
index 542906d..fa65633 100644
--- a/api/index/index.js
+++ b/api/index/index.js
@@ -30,5 +30,23 @@ export const iWorkOrderSummary = (params) => {
return post('/app-api/homePage/summary/iWorkOrderSummary', params);
};
+/**
+ * 距离待办已办
+ * @param {Object} params {mobile, password, code}
+ * @returns {Promise}
+ */
+export const taskDetailsWithDistance = (params) => {
+ return post('/app-api/homePage/summary/taskDetailsWithDistance', params);
+};
+
+/**
+ * 效率待办已办
+ * @param {Object} params {mobile, password, code}
+ * @returns {Promise}
+ */
+export const taskDetailsWithSmartSort = (params) => {
+ return post('/app-api/homePage/summary/taskDetailsWithSmartSort', params);
+};
+
diff --git a/common/config/env.js b/common/config/env.js
index f5adff5..999e2b2 100644
--- a/common/config/env.js
+++ b/common/config/env.js
@@ -4,7 +4,8 @@ const env = {
development: {
baseUrl: 'https://test.jichengshanshui.com.cn:28302',
// https://test.jichengshanshui.com.cn:28302
- // http://h95ce3aa.natappfree.cc
+
+ // baseUrl: 'http://192.168.1.186:48081',
uploadUrl: 'https://test.jichengshanshui.com.cn:28302',
// baseApi:'admin-api',
diff --git a/pages-sub/data/tree-archive/addTree.vue b/pages-sub/data/tree-archive/addTree.vue
index 0fba291..7c3c58f 100644
--- a/pages-sub/data/tree-archive/addTree.vue
+++ b/pages-sub/data/tree-archive/addTree.vue
@@ -5,11 +5,22 @@
+
+
+
-
+
厘米
@@ -17,7 +28,7 @@
-
米
@@ -65,7 +76,7 @@
:width="70"
:height="70"
:max-count="treeImgs.uploadConfig.maxCount"
- :upload-text="treeImgs.uploadConfig.uploadText"
+ :upload-text="treeImgs.uploadText"
:size-type="treeImgs.uploadConfig.sizeType"
>
@@ -182,11 +193,13 @@
import { timeFormat } from '@/uni_modules/uview-plus';
import { ref, reactive, nextTick } from 'vue'
import { onReady, onLoad, onShow, onUnload } from '@dcloudio/uni-app';
+
onUnload(() => {
uni.reLaunch({
url: '/pages-sub/data/tree-archive/index'
})
})
+
import { addTree } from "@/api/tree-archive/tree-archive.js";
import { useUploadImgs } from '@/common/utils/useUploadImgs'
import { useUserStore } from '@/pinia/user';
@@ -224,10 +237,10 @@ const isShow = ref(false)
const contentHeight = ref(200)
const treeOwnershipData = ref([])
const treeLevelData = ref([])
+const treeSpeciesTypeList = ref([])
const loadingFlag = ref(false)
const showActionSheet = ref(false);
const currentActionSheetData = reactive({ type: '', list: [], title: '' });
-// 年月弹窗开关
const showDatePicker = ref(false);
const plantingDate = ref(Date.now())
@@ -241,9 +254,11 @@ const treeImgs = useUploadImgs({
})
if (!Array.isArray(treeImgs.rawImgList.value)) treeImgs.rawImgList.value = [];
-// 表单数据:estimationtreeage 改为 plantingDate
+// 表单数据:treeSpeciesType 存编码,treeSpeciesTypeName 页面展示文字
const formData = reactive({
treetype: '',
+ // treeSpeciesType: '',
+ treeSpeciesTypeName: '',
treeheight: '',
dbh: '',
treelevel: '',
@@ -252,7 +267,7 @@ const formData = reactive({
oldtreeownership: '',
oldtreeownershipText: '',
latinname: '',
- plantingDate: '', //栽种年月 yyyy-MM
+ plantingDate: '',
canopysouthnorth: '',
canopyeastwest: '',
weekday: '',
@@ -266,84 +281,107 @@ const formData = reactive({
maintainunit: ''
})
-// 表单校验规则(移除estimationtreeage,plantingDate非必填)
+// 表单校验规则
const rules = reactive({
treetype: [
- {validator: (rule, val, callback) => {
+ {
+ validator: (rule, val, callback) => {
if (val && hasEmoji(val)) return callback(new Error('禁止输入表情符号'));
callback();
- }, trigger: ['blur','change','input'], priority: 10},
- {required: true, message: '请输入名称', trigger: ['blur','change','input']},
- {max:30, message:'名称最多输入30个字符', trigger: ['blur','change','input']}
+ }, trigger: ['blur', 'change', 'input'], priority: 10
+ },
+ { required: true, message: '请输入名称', trigger: ['blur', 'change', 'input'] },
+ { max: 30, message: '名称最多输入30个字符', trigger: ['blur', 'change', 'input'] }
],
+ // treeSpeciesType: [
+ // { required: true, message: '请选择树种类型', trigger: ['change'] }
+ // ],
treeheight: [
- {max: 10, message: '树高不能超过10个字符', trigger: ['blur','change','input']},
- {pattern: /^\d+(\.\d{1,2})?$/, message: '格式不正确,支持数字或两位小数', trigger: ['blur','change','input']},
- {validator: (rule, val, callback) => {
+ { max: 10, message: '树高不能超过10个字符', trigger: ['blur', 'change', 'input'] },
+ { pattern: /^\d+(\.\d{1,2})?$/, message: '格式不正确,支持数字或两位小数', trigger: ['blur', 'change', 'input'] },
+ {
+ validator: (rule, val, callback) => {
if (isPureZero(val)) return callback(new Error('不能输入纯0无效值'));
callback();
- }, trigger: ['blur','change','input']}
+ }, trigger: ['blur', 'change', 'input']
+ }
],
dbh: [
- {validator: (rule, val, callback) => {
+ {
+ validator: (rule, val, callback) => {
if (val && hasEmoji(val)) return callback(new Error('禁止输入表情符号'));
callback();
- }, trigger: ['blur','change','input'], priority:10},
- {required: true, message: '请输入胸径',trigger: ['blur','change','input']},
- {max: 10, message: '胸径不能超过10个字符', trigger: ['blur','change','input']},
- {pattern: /^\d+(\.\d{1,2})?$/, message: '格式不正确,支持数字或两位小数', trigger: ['blur','change','input']},
- {validator: (rule, val, callback) => {
+ }, trigger: ['blur', 'change', 'input'], priority: 10
+ },
+ { required: true, message: '请输入胸径', trigger: ['blur', 'change', 'input'] },
+ { max: 10, message: '胸径不能超过10个字符', trigger: ['blur', 'change', 'input'] },
+ { pattern: /^\d+(\.\d{1,2})?$/, message: '格式不正确,支持数字或两位小数', trigger: ['blur', 'change', 'input'] },
+ {
+ validator: (rule, val, callback) => {
if (isPureZero(val)) return callback(new Error('不能输入纯0无效值'));
callback();
- }, trigger: ['blur','change','input']}
+ }, trigger: ['blur', 'change', 'input']
+ }
],
weekday: [
- {max: 10, message: '干周不能超过10个字符', trigger: ['blur','change','input']},
- {pattern: /^\d+(\.\d{1,2})?$/, message: '格式不正确,支持数字或两位小数', trigger: ['blur','change','input']},
- {validator: (rule, val, callback) => {
+ { max: 10, message: '干周不能超过10个字符', trigger: ['blur', 'change', 'input'] },
+ { pattern: /^\d+(\.\d{1,2})?$/, message: '格式不正确,支持数字或两位小数', trigger: ['blur', 'change', 'input'] },
+ {
+ validator: (rule, val, callback) => {
if (isPureZero(val)) return callback(new Error('不能输入纯0无效值'));
callback();
- }, trigger: ['blur','change','input']}
+ }, trigger: ['blur', 'change', 'input']
+ }
],
canopyeastwest: [
- {max: 10, message: '东西冠幅不能超过10个字符',trigger: ['blur','change','input']},
- {pattern: /^\d+(\.\d{1,2})?$/, message: '格式不正确,支持数字或两位小数', trigger: ['blur','change','input']},
- {validator: (rule, val, callback) => {
+ { max: 10, message: '东西冠幅不能超过10个字符', trigger: ['blur', 'change', 'input'] },
+ { pattern: /^\d+(\.\d{1,2})?$/, message: '格式不正确,支持数字或两位小数', trigger: ['blur', 'change', 'input'] },
+ {
+ validator: (rule, val, callback) => {
if (isPureZero(val)) return callback(new Error('不能输入纯0无效值'));
callback();
- }, trigger: ['blur','change','input']}
+ }, trigger: ['blur', 'change', 'input']
+ }
],
canopysouthnorth: [
- {max: 10, message: '南北冠幅不能超过10个字符', trigger: ['blur','change','input']},
- {pattern: /^\d+(\.\d{1,2})?$/, message: '格式不正确,支持数字或两位小数', trigger: ['blur','change','input']},
- {validator: (rule, val, callback) => {
+ { max: 10, message: '南北冠幅不能超过10个字符', trigger: ['blur', 'change', 'input'] },
+ { pattern: /^\d+(\.\d{1,2})?$/, message: '格式不正确,支持数字或两位小数', trigger: ['blur', 'change', 'input'] },
+ {
+ validator: (rule, val, callback) => {
if (isPureZero(val)) return callback(new Error('不能输入纯0无效值'));
callback();
- }, trigger: ['blur','change','input']}
+ }, trigger: ['blur', 'change', 'input']
+ }
],
- growlocation: [{required: true, message: '请选择地图位置', trigger: ['blur','change','manual']}],
+ growlocation: [{ required: true, message: '请选择地图位置', trigger: ['blur', 'change', 'manual'] }],
managedutyunit: [
- {validator: (rule, val, callback) => {
+ {
+ validator: (rule, val, callback) => {
if (val && hasEmoji(val)) return callback(new Error('禁止输入表情符号'));
callback();
- }, trigger: ['blur','change','input'], priority:10},
- {required: true, message: '请输入管护单位', trigger: ['blur','change','input']},
- {max:30, message:'管护单位最多输入30个字符', trigger: ['blur','change','input']}
+ }, trigger: ['blur', 'change', 'input'], priority: 10
+ },
+ { required: true, message: '请输入管护单位', trigger: ['blur', 'change', 'input'] },
+ { max: 30, message: '管护单位最多输入30个字符', trigger: ['blur', 'change', 'input'] }
],
- oldtreeownershipText: [{required: true, message: '请选择权属分类', trigger: ['blur','change']}],
+ oldtreeownershipText: [{ required: true, message: '请选择权属分类', trigger: ['blur', 'change'] }],
latinname: [
- {validator: (rule, val, callback) => {
+ {
+ validator: (rule, val, callback) => {
if (val && hasEmoji(val)) return callback(new Error('禁止输入表情符号'));
callback();
- }, trigger: ['blur','change','input'], priority:10},
- {max:30, message:'拉丁文最多输入30个字符', trigger: ['blur','change','input']}
+ }, trigger: ['blur', 'change', 'input'], priority: 10
+ },
+ { max: 30, message: '拉丁文最多输入30个字符', trigger: ['blur', 'change', 'input'] }
],
growthenvironment: [
- {validator: (rule, val, callback) => {
+ {
+ validator: (rule, val, callback) => {
if (val && hasEmoji(val)) return callback(new Error('禁止输入表情符号'));
callback();
- }, trigger: ['blur','change','input'], priority:10},
- {max:50, message:'生长环境最多输入50个字符', trigger: ['blur','change','input']}
+ }, trigger: ['blur', 'change', 'input'], priority: 10
+ },
+ { max: 50, message: '生长环境最多输入50个字符', trigger: ['blur', 'change', 'input'] }
],
treeImgList: [treeImgs.imgValidateRule]
})
@@ -352,10 +390,13 @@ const rules = reactive({
onLoad((options) => {
formData.road = options.roadId
})
+
onShow(async () => {
treeLevelData.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList('tree_level'))
- treeOwnershipData.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList('tree_ownership'))
+ treeOwnershipData.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList('tree_ownership'))
+ treeSpeciesTypeList.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList('tree_species_type'))
})
+
onReady(() => {
nextTick(() => {
formRef.value?.setRules(rules);
@@ -363,22 +404,22 @@ onReady(() => {
});
// 打开栽种年月选择器
-const openPlantDatePicker = ()=>{
+const openPlantDatePicker = () => {
showDatePicker.value = true
}
-// 选中年月回调,自动格式 yyyy-MM
-const onSelectPlantDate = (date)=>{
-console.log(plantingDate.value)
- console.log(timeFormat(plantingDate.value, 'yyyy-mm'))
- // date格式:yyyy-MM
- formData.plantingDate = timeFormat(plantingDate.value, 'yyyy-mm')
+
+// 年月选择回调
+const onSelectPlantDate = () => {
+ formData.plantingDate = timeFormat(plantingDate.value, 'yyyy-mm')
showDatePicker.value = false
}
+// 展开/收起更多区域
const toggleArea = () => {
isShow.value = !isShow.value
}
+// 打开权属/级别选择弹窗
const handleActionSheetOpen = (type) => {
const configMap = {
ownership: { title: '请选择权属分类', list: treeOwnershipData.value },
@@ -388,11 +429,23 @@ const handleActionSheetOpen = (type) => {
showActionSheet.value = true;
};
+// 打开树种类型选择弹窗
+const openTreeSpeciesType = () => {
+ Object.assign(currentActionSheetData, {
+ title: '请选择树种类型',
+ list: treeSpeciesTypeList.value,
+ type: 'treeSpecies'
+ })
+ showActionSheet.value = true
+}
+
+// 关闭弹窗
const handleActionSheetClose = () => {
showActionSheet.value = false;
Object.assign(currentActionSheetData, { type: '', list: [], title: '' });
};
+// 弹窗选中回调
const handleActionSheetSelect = (e) => {
const { type } = currentActionSheetData;
if (type === 'ownership') {
@@ -402,6 +455,10 @@ const handleActionSheetSelect = (e) => {
} else if (type === 'level') {
formData.treelevel = e.value
formData.treeleveltext = e.name
+ } else if (type === 'treeSpecies') {
+ formData.treeSpeciesType = e.value
+ formData.treeSpeciesTypeName = e.name
+ formRef.value?.validateField('treeSpeciesType');
}
handleActionSheetClose();
};
@@ -419,13 +476,13 @@ const openMap = () => {
fail: (err) => {
console.error('地图选择失败', err);
if (err.errMsg.includes('auth deny')) {
- uni.showToast({title: '请授权位置权限', icon: 'none'});
+ uni.showToast({ title: '请授权位置权限', icon: 'none' });
}
}
});
}
-// 提交
+// 提交表单
const submit = async () => {
if (loadingFlag.value) return
@@ -443,11 +500,11 @@ const submit = async () => {
formData.treeImgList = uploadImgUrls
loadingFlag.value = true
try {
- const res = await addTree(formData)
- uni.showToast({title: "新增成功", icon: "success"});
- uni.redirectTo({url: '/pages-sub/data/tree-archive/index'});
+ await addTree(formData)
+ uni.showToast({ title: "新增成功", icon: "success" });
+ uni.redirectTo({ url: '/pages-sub/data/tree-archive/index' });
} catch (err) {
- uni.showToast({title: "新增失败,请重试", icon: "none"});
+ uni.showToast({ title: "新增失败,请重试", icon: "none" });
console.error(err)
} finally {
loadingFlag.value = false
@@ -479,7 +536,7 @@ const submit = async () => {
position: relative;
margin-bottom: 0 !important;
}
- :deep(.u-form-item__body__right__message ) {
+ :deep(.u-form-item__body__right__message) {
position: absolute;
left: 0;
bottom: -20rpx;
@@ -490,6 +547,7 @@ const submit = async () => {
box-sizing: border-box;
}
}
+
.form-row-wrap + .u-form-item {
margin-top: 25rpx !important;
}
diff --git a/pages-sub/data/tree-archive/editTree.vue b/pages-sub/data/tree-archive/editTree.vue
index 3ca7316..50d14ad 100644
--- a/pages-sub/data/tree-archive/editTree.vue
+++ b/pages-sub/data/tree-archive/editTree.vue
@@ -22,6 +22,17 @@
+
+
+
@@ -277,8 +288,6 @@ import { onReady, onLoad, onShow, onUnload } from '@dcloudio/uni-app';
import { treeRoadReq, treeLogReq, treeDetailReq, updateTree, inspectionLogReq }
from "@/api/tree-archive/tree-archive.js";
-// 引入巡检列表接口
-// import { getInspectListReq } from "@/api/tree-archive/tree-archive.js";
import { timeFormat } from '@/uni_modules/uview-plus';
import { useUploadImgs } from '@/common/utils/useUploadImgs'
@@ -289,11 +298,6 @@ const CONST = {
UPLOAD_CONFIG: { maxCount: 3, uploadText: '选择图片', sizeType: ['compressed'] }
}
-// ========== 页面关闭统一跳转 ==========
-onUnload(() => {
- uni.reLaunch({url: '/pages-sub/data/tree-archive/index'})
-})
-
// ========== 基础变量 ==========
const rows = ref([])
const roadId = ref('')
@@ -321,6 +325,7 @@ const isShow = ref(false)
const contentHeight = ref(200)
const treeOwnershipData = ref([])
const treeLevelData = ref([])
+const treeSpeciesTypeList = ref([]) // 树种类型字典列表
const showActionSheet = ref(false);
const currentActionSheetData = reactive({type: '', list: [], title: ''});
@@ -333,10 +338,12 @@ const treeImgList = useUploadImgs({
treeImgList.imgList.value = []
treeImgList.rawImgList.value = []
-// ========== 表单数据 移除estimationtreeage,替换为plantingDate ==========
+// ========== 表单数据 ==========
const formData = reactive({
id: '',
treetype: '',
+ // treeSpeciesType: '', // 树种类型编码(提交接口)
+ treeSpeciesTypeName: '', // 树种类型名称(页面展示)
treeheight: '',
dbh: '',
treelevel: '',
@@ -390,6 +397,10 @@ const rules = reactive({
{required: true, message: '请输入名称', trigger: ['blur', 'change', 'input']},
{max: 30, message: '名称最多输入30个字符', trigger: ['blur', 'change', 'input']}
],
+ // 树种类型 必填校验
+ // treeSpeciesType: [
+ // { required: true, message: '请选择树种类型', trigger: ['change'] }
+ // ],
treeheight: [
{max: 10, message: '树高不能超过10个字符', trigger: ['blur', 'change', 'input']},
{pattern: /^\d+(\.\d{1,2})?$/, message: '格式不正确,支持数字或两位小数', trigger: ['blur', 'change', 'input']},
@@ -478,8 +489,11 @@ onLoad((options) => {
});
onShow(async () => {
+ // 加载全部字典
treeLevelData.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList('tree_level'))
treeOwnershipData.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList('tree_ownership'))
+ treeSpeciesTypeList.value = uni.$dict.transformLabelValueToNameValue(uni.$dict.getDictSimpleList('tree_species_type'))
+
if (activeTab.value === 0 && treeId.value && !isInit.value) {
await getTreeDetail()
isInit.value = true
@@ -511,12 +525,14 @@ const treeRoadQuery = async () => {
rows.value = res.list
}
-// 获取树木详情
+// 获取树木详情(回显树种类型名称+编码)
const getTreeDetail = async () => {
const res = await treeDetailReq({id: treeId.value})
Object.assign(formData, res)
+ // 字典回显
formData.oldtreeownershipText = uni.$dict.getDictLabel('tree_ownership', res.oldtreeownership)
formData.treeleveltext = uni.$dict.getDictLabel('tree_level', formData.treelevel)
+ // formData.treeSpeciesTypeName = uni.$dict.getDictLabel('tree_species_type', formData.treeSpeciesType)
treeImgList.imgList.value = []
treeImgList.rawImgList.value = []
@@ -545,7 +561,6 @@ const getTreeLogList = async () => {
// 获取巡检记录列表
const getInspectList = async () => {
- // 正式环境启用下面接口
const res = await inspectionLogReq({treeId: treeId.value,pageNo:1,pageSize:100})
console.log(res)
inspectRows.value = res.list || []
@@ -556,10 +571,6 @@ const openPlantDatePicker = () => {
showDatePicker.value = true
}
const onSelectPlantDate = (date) => {
- // date自动 yyyy-MM
- console.log(plantingDate.value)
- console.log(timeFormat(plantingDate.value, 'yyyy-mm'))
- // date格式:yyyy-MM
formData.plantingDate = timeFormat(plantingDate.value, 'yyyy-mm')
showDatePicker.value = false
}
@@ -567,6 +578,7 @@ const onSelectPlantDate = (date) => {
// ========== 表单相关方法 ==========
const toggleArea = () => isShow.value = !isShow.value
+// 打开权属/级别弹窗
const handleActionSheetOpen = (type) => {
const configMap = {
ownership: {title: '请选择权属分类', list: treeOwnershipData.value},
@@ -576,11 +588,22 @@ const handleActionSheetOpen = (type) => {
showActionSheet.value = true;
};
+// 打开树种类型弹窗
+const openTreeSpeciesType = () => {
+ Object.assign(currentActionSheetData, {
+ title: '请选择树种类型',
+ list: treeSpeciesTypeList.value,
+ type: 'treeSpecies'
+ })
+ showActionSheet.value = true
+}
+
const handleActionSheetClose = () => {
showActionSheet.value = false;
Object.assign(currentActionSheetData, {type: '', list: [], title: ''});
};
+// 弹窗选中回调(区分三种类型)
const handleActionSheetSelect = (e) => {
const {type} = currentActionSheetData;
if (type === 'ownership') {
@@ -590,6 +613,11 @@ const handleActionSheetSelect = (e) => {
} else if (type === 'level') {
formData.treelevel = e.value
formData.treeleveltext = e.name
+ } else if (type === 'treeSpecies') {
+ // 树种类型:编码存接口字段,名称页面展示
+ formData.treeSpeciesType = e.value
+ formData.treeSpeciesTypeName = e.name
+ formRef.value?.validateField('treeSpeciesType');
}
handleActionSheetClose();
};
@@ -658,11 +686,9 @@ const toInspectDetailPage = (item) => {
// 跳转到新增巡检页面
const toAddInspect = () => {
const firstItem = inspectRows.value.length > 0 ? inspectRows.value[0] : null
- // 存入本地缓存
if (firstItem) {
uni.setStorageSync('temp_inspect_fill_data', JSON.stringify(firstItem))
} else {
- // 没有数据先清空残留缓存
uni.removeStorageSync('temp_inspect_fill_data')
}
uni.navigateTo({
diff --git a/pages-sub/data/tree-archive/logDetail.vue b/pages-sub/data/tree-archive/logDetail.vue
index ba094b0..6fd4976 100644
--- a/pages-sub/data/tree-archive/logDetail.vue
+++ b/pages-sub/data/tree-archive/logDetail.vue
@@ -185,9 +185,18 @@ const formatImgList = (imgList) => {
// ========== 生命周期 ==========
onUnload(() => {
- uni.reLaunch({
- url: '/pages-sub/data/tree-archive/index'
- })
+ const pages = getCurrentPages()
+ // 页面栈长度 >=2 说明有上两页,回退2级
+ if (pages.length >= 2) {
+ uni.navigateBack({
+ delta: 2
+ })
+ } else {
+ // 兜底:页面栈不足时,跳列表页
+ uni.reLaunch({
+ url: '/pages-sub/data/tree-archive/index'
+ })
+ }
})
onLoad((options) => {
diff --git a/pages-sub/data/tree-archive/treeRecord.vue b/pages-sub/data/tree-archive/treeRecord.vue
index 48b48eb..ba7f101 100644
--- a/pages-sub/data/tree-archive/treeRecord.vue
+++ b/pages-sub/data/tree-archive/treeRecord.vue
@@ -69,12 +69,12 @@
\ No newline at end of file