修改地块列表

master
贾肃 4 months ago
parent fafb606490
commit f02a2514eb
  1. 66
      src/api/basicData/massifApi.js
  2. 120
      src/views/system/base/massifForm.vue
  3. 136
      src/views/system/base/massifTable.vue

@ -0,0 +1,66 @@
import request from '@/utils/request'
// 添加地块
export function addPlot(query) {
return request({
url: '/plot_info/add',
method: 'post',
data: query
})
}
// 删除地块
export function delPlotById(data) {
return request({
url: '/plot_info/deleteById',
method: 'get',
params: data
})
}
//分页查询地块信息
export function selPlotPage(query) {
return request({
url: '/plot_info/queryByPage',
method: 'post',
data: query
})
}
//不分页查询地块信息
export function selAllPlot(query) {
return request({
url: '/plot_info/selectByPage',
method: 'post',
data: query
})
}
// 查询作物种类
export function selCropInfo(query) {
return request({
url: '/crop_info/selCropInfo',
method: 'post',
data: query
})
}
//通过id查询地块信息
export function selPlotById(query) {
return request({
url: '/plot_info/queryById',
method: 'get',
params: query
})
}
//修改地块信息
export function editPlot(data) {
return request({
url: '/plot_info/edit',
method: 'put',
data: data
})
}
//修改地块状态
export function editPlotStatus(data) {
return request({
url: '/plot_info/editStatus',
method: 'post',
data: data
})
}

@ -9,24 +9,38 @@ import {ElMessage} from "element-plus";
import {areaConversion} from "@/utils/ruoyi.js";
import * as turf from "@turf/turf";
import {lazyAMapApiLoaderInstance} from "@vuemap/vue-amap";
import {addPlot, editPlot, selCropInfo, selPlotById} from "@/api/basicData/massifApi.js";
let {proxy} = getCurrentInstance();
const uploadJsonData = ref([])
const props = defineProps({})
const settingsStore = useSettingsStore()
const theme = computed(() => settingsStore.theme)
const initData = () => {
selCropInfo({}).then(res => {
selectOptions.cropClass = res.data.map(item => {
return {
label: item.cropName,
value: item.id
}
})
if (selectOptions.cropClass.length > 0) {
formData.value.cropIds = selectOptions.cropClass[0].value
}
})
}
onMounted(() => {
initData()
})
const selectOptions = reactive({
//
massifType: [
{label: '旱地', value: 1},
{label: '水浇地', value: 2},
{label: '水田', value: 2},
{label: '水浇地', value: 3},
],
//
cropClass: [
{label: '甘蔗', value: 1},
{label: '其他', value: 9},
]
cropClass: []
})
let emit = defineEmits(['beforeSubmit', 'submitSuccess']);
const loading = ref(false)
@ -39,6 +53,23 @@ const formStatus = ref(1)
const formData = ref({})
const resetForm = (params) => {
formData.value = {
id: undefined,
//
cropIds: [],
//
plotName: '',
// id
seasonId: undefined,
// id
baseNurseryId: undefined,
//
area: undefined,
//
plotType: 1,
//
remark: '',
// 1 2
status: 1,
//
coordinateList: [
{},
@ -49,20 +80,40 @@ const resetForm = (params) => {
coordinateType: 1,
...params
}
if (selectOptions.cropClass.length > 0) {
formData.value.cropIds = [selectOptions.cropClass[0].value]
}
uploadJsonData.value = []
}
const toAdd = (params = {}) => {
formStatus.value = 1
resetForm(deepClone(params))
uploadJsonData.value = []
showDrawer.value = true
}
const getById = (row) => {
selPlotById({id: row.id}).then(res => {
formData.value = res
formData.value.coordinateType = 1
let plotRanges = JSON.parse(res.plotRange) || []
let coordinateList = plotRanges?.[0].map(item => {
return {
longitude: item[0],
latitude: item[1]
}
})
formData.value.coordinateList = coordinateList
formData.value.cropIds = res.cropId?.split(',').map(Number) || []
uploadJsonData.value = coordinateList
showDrawer.value = true
})
}
const toUpdate = (row) => {
formStatus.value = 2
showDrawer.value = true
getById(row)
}
const toView = (row) => {
formStatus.value = 3
showDrawer.value = true
getById(row)
}
// ()
const calculateArea = () => {
@ -115,30 +166,38 @@ const formRef = ref(null)
const polygonList = ref([])
const saveMassif = () => {
lazyAMapApiLoaderInstance.then(() => {
let newFormData = deepClone(formData.value)
for (let item of newFormData.coordinateList) {
if (!item.longitude || !item.latitude || !newFormData.massifName) {
let coordinateList = formData.value.coordinateType === 2 ? uploadJsonData.value : formData.value.coordinateList;
for (let item of coordinateList) {
if (!item.longitude || !item.latitude || !formData.value.plotName) {
ElMessage.error('地块保存失败,请确认地块名称和坐标点均已填写。')
return
}
}
let polygonTemp = newFormData.coordinateList.map(item =>[item.longitude, item.latitude])
let polygonTemp = formData.value.coordinateList.map(item => [item.longitude, item.latitude])
for (let item of polygonList.value) {
if (AMap.GeometryUtil.doesRingRingIntersect(polygonTemp.value, item.path) || AMap.GeometryUtil.isRingInRing(polygonTemp.value, item.path) || AMap.GeometryUtil.isRingInRing(item.path, polygonTemp.value)) {
ElMessage.error('当前地块与已有地块边界重合,请修改后再确认')
return
}
}
if (formData.value.coordinateType === 2) {
newFormData.coordinateList = uploadJsonData.value
let newFormData = {
...formData.value,
cropId:formData.value.cropIds.toLocaleString(),
coordinateList: undefined,
plotRange: JSON.stringify([coordinateList.map(item => {
return [item.longitude, item.latitude]
})])
}
emit('beforeSubmit', formData.value)
loading.value = true
setTimeout(() => {
loading.value = false
emit('submitSuccess', formData.value)
let api = !!formData.value.id ? editPlot : addPlot
api(newFormData).then(res => {
proxy.$modal.msgSuccess(formData.value.id ? '修改成功' : "保存成功");
showDrawer.value = false
}, 2000)
emit('submitSuccess', formData.value)
}).finally(() => {
loading.value = false
})
})
}
@ -148,7 +207,7 @@ defineExpose({
toView
})
const rules = ref({
massifName: [{required: true, message: "地块名称不能为空", trigger: "blur"}],
plotName: [{required: true, message: "地块名称不能为空", trigger: "blur"}],
})
</script>
@ -161,15 +220,15 @@ const rules = ref({
<div v-if="formStatus === 3"></div>
</div>
<div class="form">
<el-form :model="formData" :label-position="formStatus===3?'left':'top'" :rules="rules" ref="formRef">
<el-form :model="formData" :label-position="formStatus===3?'left':'top'" :rules="rules" ref="formRef" label-width="120">
<el-row :gutter="20">
<el-col :span="24">
<title-divider title="基本信息"/>
</el-col>
<el-col :span="12">
<el-form-item label="地块名称" prop="massifName">
<el-input placeholder="请输入地块名称" v-if="formStatus!==3" v-model="formData.massifName"></el-input>
<div v-else>{{ formData.massifName }}</div>
<el-input placeholder="请输入地块名称" v-if="formStatus!==3" v-model="formData.plotName"></el-input>
<div v-else>{{ formData.plotName }}</div>
</el-form-item>
</el-col>
<el-col :span="12">
@ -190,34 +249,39 @@ const rules = ref({
</el-col>
<el-col :span="12">
<el-form-item label="所属基地/资源圃" prop="name">
<el-input disabled v-if="formStatus!==3" v-model="formData.baseName"></el-input>
<div v-else>{{formData.baseName}}</div>
<el-input disabled v-if="formStatus!==3" v-model="formData.baseNurseryName"></el-input>
<div v-else>{{ formData.baseNurseryName }}</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="地块性质" prop="name">
<el-select placeholder="请选择地块性质" clearable v-if="formStatus!==3">
<el-select placeholder="请选择地块性质" clearable v-if="formStatus!==3" v-model="formData.plotType">
<el-option v-for="item in selectOptions.massifType" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
<div v-else>{{formData.plotTypeName}}</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前作物" prop="name">
<el-select placeholder="请选择当前作物" clearable multiple v-if="formStatus!==3">
<el-select placeholder="请选择当前作物" multiple clearable v-if="formStatus!==3"
v-model="formData.cropIds">
<el-option v-for="item in selectOptions.cropClass" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
<div v-else>{{formData.cropName}}</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前状态" prop="name">
<el-switch v-if="formStatus!==3"></el-switch>
<el-switch v-if="formStatus!==3" v-model="formData.status" :active-value="1"
:inactive-value="0"></el-switch>
<div v-else>{{formData.status === 1?'':''}}</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="name">
<el-input placeholder="请输入备注" v-if="formStatus!==3"></el-input>
<el-input placeholder="请输入备注" v-if="formStatus!==3" v-model="formData.remark"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">

@ -3,7 +3,7 @@
<el-row :gutter="20">
<!--育种基地/资源圃选择-->
<el-col :span="4" :xs="24">
<base-selection v-model="currentBase"></base-selection>
<base-selection v-model="currentBase" @click-base="getList"></base-selection>
</el-col>
<!--用户数据-->
<el-col :span="20" :xs="24">
@ -17,15 +17,15 @@
<el-row :gutter="10">
<el-col :span="6">
<el-form-item label="种植季">
<el-select v-model="queryParams.plantingSeason">
<el-option v-for="item in plantingSeasonList" :value="item.value" :label="item.label"></el-option>
<el-select v-model="queryParams.seasonId">
<el-option v-for="item in seasonIdList" :value="item.value" :label="item.label"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="地块名称">
<el-input
v-model="queryParams.userName"
v-model="queryParams.plotName"
placeholder="请输入地块"
clearable
@keyup.enter="handleQuery"
@ -35,7 +35,7 @@
<el-col :span="6">
<el-form-item label="地块性质" prop="status">
<el-select
v-model="queryParams.status"
v-model="queryParams.plotType"
placeholder="地块性质"
clearable
>
@ -49,7 +49,7 @@
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="当前作物" prop="status">
<el-form-item label="当前作物" prop="cropId">
<el-select
v-model="queryParams.status"
placeholder="当前作物"
@ -72,7 +72,7 @@
clearable
>
<el-option
v-for="dict in sys_normal_disable"
v-for="dict in data.statusOptions"
:key="dict.value"
:label="dict.label"
:value="dict.value"
@ -97,23 +97,31 @@
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="地块编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
<el-table-column label="地块名称" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
<el-table-column label="地块面积(亩)" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
<el-table-column label="网格地块数量" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
<el-table-column label="地块性质" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" />
<el-table-column label="当前作物" align="center" key="phonenumber" prop="phonenumber" v-if="columns[5].visible" width="120" />
<el-table-column label="地块编号" align="center" key="plotNo" prop="plotNo" v-if="columns[0].visible" />
<el-table-column label="地块名称" align="center" key="plotName" prop="plotName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
<el-table-column label="地块面积(亩)" align="center" key="area" prop="area" v-if="columns[2].visible" :show-overflow-tooltip="true" />
<el-table-column label="网格地块数量" align="center" key="number" prop="number" v-if="columns[3].visible" :show-overflow-tooltip="true" />
<el-table-column label="地块性质" align="center" key="plotTypeName" prop="plotTypeName" v-if="columns[4].visible" width="120" >
<template #default="scope">
{{scope.row.plotTypeName || '--'}}
</template>
</el-table-column>
<el-table-column label="当前作物" align="center" key="cropIdName" prop="cropIdName" v-if="columns[5].visible" width="120" >
<template #default="scope">
{{scope.row.cropName || '--'}}
</template>
</el-table-column>
<el-table-column label="状态" align="center" key="status" v-if="columns[6].visible">
<template #default="scope">
<el-switch
v-model="scope.row.status"
active-value="0"
inactive-value="1"
:active-value="1"
:inactive-value="0"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建人" align="center" prop="createTime" v-if="columns[7].visible" width="160"></el-table-column>
<el-table-column label="创建人" align="center" prop="createUserName" v-if="columns[7].visible" width="160"></el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[8].visible" width="160">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
@ -121,15 +129,9 @@
</el-table-column>
<el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="详情" placement="top">
<el-button link type="primary" icon="View" @click="handleUpdate(scope.row)"></el-button>
</el-tooltip>
<el-tooltip content="修改" placement="top" v-if="scope.row.userId !== 1">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:user:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top" v-if="scope.row.userId !== 1">
<el-button link type="primary" icon="Delete" @click="delMassif(scope.row)" v-hasPermi="['system:user:remove']"></el-button>
</el-tooltip>
<el-link type="info" @click="toViewMassif(scope.row)"></el-link>
<el-link type="primary" @click="toUpdateMassif(scope.row)" class="operate-edit">修改</el-link>
<el-link type="danger" @click="delMassif(scope.row)"></el-link>
</template>
</el-table-column>
<template #empty>
@ -156,14 +158,14 @@
</template>
<script setup name="User">
import { changeUserStatus, listUser, resetUserPwd, delUser, getUser, updateUser, addUser, deptTreeSelect } from "@/api/system/user";
import MassifForm from "@/views/system/base/massifForm.vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {selSeasonInfo} from "@/api/basicData/breedingBaseApi.js";
import dayjs from "dayjs";
import {delPlotById, editPlotStatus, selPlotPage} from "@/api/basicData/massifApi.js";
const massifFormRef = ref(null)
const router = useRouter();
const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const currentBase = ref({})
const userList = ref([]);
const open = ref(false);
@ -190,8 +192,8 @@ const columns = ref([
//
const toAddMassif = () => {
massifFormRef.value.toAdd({
baseName:currentBase.value.baseName,
id:currentBase.value.id
baseNurseryName:currentBase.value.baseName,
baseNurseryId:currentBase.value.id
})
}
const toUpdateMassif = (row) => {
@ -201,7 +203,13 @@ const toViewMassif = (row) => {
massifFormRef.value.toView(row)
}
const exportExcel = () => {
let plantingName = ''
if (data.queryParams.seasonId){
plantingName = data.seasonIdList.find(item => item.value === data.queryParams.seasonId).label
}
proxy.download("/plot_info/export", {
...queryParams.value,
}, `${plantingName}${currentBase.value.baseName}地块列表-${dayjs().format('YYYY年MM月DD日')}.xlsx`);
}
//
const delMassif = (item) => {
@ -214,7 +222,10 @@ const delMassif = (item) => {
customClass: 'message-box'
}
).then(() => {
delPlotById({id:item.id}).then(res =>{
ElMessage.success(`${item.label || '地块'}删除成功`)
getList()
})
})
}
const data = reactive({
@ -223,11 +234,11 @@ const data = reactive({
pageNum: 1,
pageSize: 10,
userName: undefined,
plantingSeason: 1,
seasonId: undefined,
status: undefined,
deptId: undefined
},
plantingSeasonList:[],
seasonIdList:[],
//
massifType: [
{label: '旱地', value: 1},
@ -238,31 +249,42 @@ const data = reactive({
cropClass: [
{label: '甘蔗', value: 1},
{label: '其他', value: 9},
],
statusOptions:[
{label: '启用', value: 1},
{label: '停用', value: 0},
]
});
//
const submitSuccess = (value) =>{
getList()
}
const { queryParams, form, rules ,
plantingSeasonList,massifType,cropClass} = toRefs(data);
seasonIdList,massifType,cropClass} = toRefs(data);
const initData = () => {
selSeasonInfo({}).then(res =>{
data.plantingSeasonList = res.data.map(item =>{
data.seasonIdList = res.data.map(item =>{
return {
label:item.seasonName,
value:item.id
}
})
if (data.seasonIdList.length >0){
queryParams.value.seasonId = data.seasonIdList[0].value
}
})
}
onMounted(()=>{
initData()
})
/** 查询用户列表 */
/** 查询列表 */
function getList() {
loading.value = true;
listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => {
let params = {
...queryParams.value,
baseNurseryId:currentBase.value.id
}
selPlotPage(params).then(res => {
loading.value = false;
userList.value = res.rows;
total.value = res.total;
@ -276,36 +298,19 @@ function handleQuery() {
/** 重置按钮操作 */
function resetQuery() {
dateRange.value = [];
proxy.resetForm("queryRef");
queryParams.value.deptId = undefined;
proxy.$refs.deptTreeRef.setCurrentKey(null);
queryParams.value = {}
handleQuery();
};
/** 删除按钮操作 */
function handleDelete(row) {
const userIds = row.userId || ids.value;
proxy.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?').then(function () {
return delUser(userIds);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
};
/** 导出按钮操作 */
function handleExport() {
proxy.download("system/user/export", {
...queryParams.value,
},`user_${new Date().getTime()}.xlsx`);
};
/** 用户状态修改 */
function handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用";
proxy.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function () {
return changeUserStatus(row.userId, row.status);
let text = row.status === 0 ? "启用" : "停用";
proxy.$modal.confirm('确认要' + text + '"' + row.plotName + '"吗?').then(function () {
return editPlotStatus({id: row.id, status: row.status});
}).then(() => {
proxy.$modal.msgSuccess(text + "成功");
getList()
}).catch(function () {
row.status = row.status === "0" ? "1" : "0";
row.status = row.status === 0 ? 1 : 0;
});
};
/** 选择条数 */
@ -314,17 +319,6 @@ function handleSelectionChange(selection) {
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 修改按钮操作 */
function handleUpdate(row) {
reset();
const userId = row.userId || ids.value;
getUser(userId).then(response => {
form.value = response.data;
open.value = true;
title.value = "修改用户";
form.password = "";
});
};
//
const toBaseMap = (toAdd) => {
if (currentBase.value.id){

Loading…
Cancel
Save