数据管理子系统-BUG修改

This commit is contained in:
王兴凯 2026-08-04 09:01:23 +08:00
parent 86a7f990d3
commit 978232ed5e
50 changed files with 1824 additions and 468 deletions

View File

@ -11,9 +11,9 @@ VITE_APP_BASE_URL = 'http://localhost:8093'
# 测试环境
# VITE_APP_BASE_URL = 'http://172.16.21.142:8093'
# 汤伟
# VITE_APP_BASE_URL = 'http://10.84.111.235:8093'
VITE_APP_BASE_URL = 'http://10.84.111.235:8093'
# 李林
VITE_APP_BASE_URL = 'http://10.84.111.25:8093'
# VITE_APP_BASE_URL = 'http://10.84.111.25:8093'
## 开发环境 附件服务地址
VITE_APP_ATTACHMENT_URL = 'https://211.99.26.225:12125'

View File

@ -51,6 +51,14 @@ export function assignmentPer (queryParams:any){
params: queryParams
});
}
//获取分配权限(改动之后)
export function permissionAssignmentGrouped (queryParams:any){
return request({
url:'/system/menu/permissionAssignmentGrouped' ,
method: 'post',
params: queryParams
});
}
//发出分配权限
export function setMenuById (queryParams:any){
return request({

View File

@ -33,6 +33,14 @@ export function getRvcdDropdown(params: any) {
params: params
});
}
// /、鱼类资源
export function selectForDropdown(data:any) {
return request({
url: '/env/fishDictory/list',
method: 'post',
data
});
}
//电站下拉列表
export function getEngInfoDropdown(data: any) {
return request({

View File

@ -105,6 +105,7 @@
</a-select> -->
<!-- 流域下拉框 -->
<a-select
:key="`rvcd-ly-${shuJuTianBaoStore.lyOption.length}`"
:value="formData.rvcd"
placeholder="请选择"
@change="lyChange"

View File

@ -359,6 +359,7 @@ const getData = async () => {
try {
if (props.url && modelStore.params.stcd) {
let res: any = await getStcdDetail(props.url, modelStore.params.stcd);
// debugger
if (res && res.code) {
let data = res.data;
data2.value = data;

View File

@ -129,7 +129,7 @@ const dvtp = ref([]);
const initSearchData = {
rvcd: 'all',
rstcd: null,
topHynm: null,
topHycd: null,
hycd: null,
baseId: null,
hbrvcd: null,
@ -157,7 +157,7 @@ const searchList: any = computed(() => [
},
{
type: 'Select',
name: 'topHynm',
name: 'topHycd',
label: '所属集团',
width: 140,
fieldProps: {

View File

@ -8,10 +8,10 @@
@ok="handleDataSourceConfirm"
>
<div>
<p style="color: red; margin-bottom: 8px">请输入修改依据以继续删除操作</p>
<p style="color: red; margin-bottom: 8px">请输入删除依据以继续删除操作</p>
<a-textarea
v-model:value="dataSource"
placeholder="请输入修改依据"
placeholder="请输入删除依据"
:rows="4"
/>
</div>

View File

@ -1131,6 +1131,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const formRules = computed(() => ({
stcd: props.isAdd
? [{ required: true, message: '请输入电站编码', trigger: 'blur' }]
@ -1196,7 +1197,7 @@ const bldsttCodeOptions = ref<any[]>([
{ label: '已建', value: 2 }
]); // TODO:
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter(item => item.wbsCode !== 'all') // ""
.map(item => ({
@ -1263,7 +1264,7 @@ watch(
continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? resolveSelectLabel(key, oldNorm)
? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm))
: oldNorm === null
? '空'
: String(oldNorm);
@ -1300,6 +1301,14 @@ watch(
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveSelectLabel(key, converted[key]);
}
}
originalLabels.value = labels;
}
},
{ deep: true }

View File

@ -93,10 +93,12 @@ import { getEngInfoById } from '@/api/select';
import { calcTableScrollY } from '@/utils/index';
import { useModelStore } from '@/store/modules/model';
import { useUserStore } from "@/store/modules/user";
import { useShuJuTianBaoStore } from '@/store/modules/shuJuTianBao';
const modelStore = useModelStore();
const userStore = useUserStore();
const shuJuTianBaoStore = useShuJuTianBaoStore();
const sort = ref<any>([
{
@ -360,12 +362,12 @@ const buildSearchParams = (values: any) => {
value: values.hycd
}
: null,
values.topHynm
values.topHycd
? {
field: 'topHynm',
field: 'topHycd',
operator: 'eq',
dataType: 'string',
value: values.topHynm
value: values.topHycd
}
: null,
values.ttpwr && values.ttpwr.min
@ -472,6 +474,8 @@ const handleEdit = (record: any) => {
//
const handleEditSuccess = () => {
const rvcd = searchRef.value?.searchData?.rvcd ?? 'all';
shuJuTianBaoStore.getEngOption(rvcd, 'rvcd');
initTable(currentSearchParams.value);
};

View File

@ -290,6 +290,8 @@
<a-textarea
v-model:value="formData.shapedesc"
placeholder="请输入形态描述"
:maxlength="500"
show-count
:rows="3"
/>
</a-form-item>
@ -299,6 +301,8 @@
<a-textarea
v-model:value="formData.description"
placeholder="请输入内容"
:maxlength="100"
show-count
:rows="3"
/>
</a-form-item>
@ -337,7 +341,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message, Upload } from 'ant-design-vue';
import { PlusOutlined } from '@ant-design/icons-vue';
import { addFishDictoryInfo, updateFishDictoryInfo } from '@/api/DataQueryMenuModule';
@ -366,6 +370,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
//
@ -489,6 +494,11 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
//
const resolveOriginalLabel = (field: string): string => {
return resolveSelectLabel(field, originalRecord.value[field]);
};
// formData
watch(
() => formData.value,
@ -516,7 +526,7 @@ watch(
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? resolveSelectLabel(key, oldNorm)
? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm))
: oldNorm === null
? '空'
: String(oldNorm);
@ -588,9 +598,23 @@ watch(
newRecord => {
if (newRecord) {
const converted = { ...newRecord };
// "-" null
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
//
if (converted.inffile) {
const ids = converted.inffile.split(',').filter(Boolean);
@ -609,6 +633,22 @@ watch(
{ deep: true }
);
// record code
watch(
() => shuJuTianBaoStore.lyOption,
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
watch(
() => props.open,
val => {

View File

@ -222,6 +222,8 @@
<a-textarea
v-model:value="formData.introduce"
placeholder="请输入简介"
:maxlength="1000"
show-count
:rows="2"
/>
</a-form-item>
@ -231,6 +233,8 @@
<a-textarea
v-model:value="formData.remark"
placeholder="请输入备注"
:maxlength="150"
show-count
:rows="2"
/>
</a-form-item>
@ -249,7 +253,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addAiboxInfo, updateAiboxInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -276,23 +280,22 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
stcd: [{ required: true, message: '请输入站码', trigger: 'blur' }],
stnm: [{ required: true, message: '请输入站名', trigger: 'blur' }]
stnm: [{ required: true, message: '请输入站名', trigger: 'blur' }],
sttp: [{ required: true, message: '请输入站类', trigger: 'blur' }],
});
//
const engInfoOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}))
.map((item: any) => ({ label: item.wbsName, value: item.wbsCode }))
);
const engLoading = ref(false);
@ -355,6 +358,16 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
const keyword = inputValue || '';
@ -387,7 +400,7 @@ watch(
continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? resolveSelectLabel(key, oldNorm)
? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm))
: oldNorm === null
? '空'
: String(oldNorm);
@ -416,17 +429,51 @@ watch(
);
// record
watch(
() => props.record,
newRecord => {
if (newRecord) {
const converted = { ...newRecord };
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
const isInitLoading = ref(false);
watch(() => props.record, newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
},
{ deep: true }
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
}, { deep: true });
// record code
watch(
[baseNameOptions, engInfoOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
const loadEngOptions = async (baseId?: string) => {
@ -442,17 +489,11 @@ const loadEngOptions = async (baseId?: string) => {
}
};
//
const loadDropdownData = () => {
baseNameOptions.value = jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}));
};
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});
@ -461,7 +502,6 @@ watch(
() => props.open,
val => {
if (val) {
loadDropdownData();
if (props.isAdd) {
formData.value = {};
originalRecord.value = {};

View File

@ -187,6 +187,8 @@
<a-textarea
v-model:value="formData.introduce"
placeholder="请输入简介"
:maxlength="1000"
show-count
:rows="2"
/>
</a-form-item>
@ -196,6 +198,8 @@
<a-textarea
v-model:value="formData.remark"
placeholder="请输入备注"
:maxlength="150"
show-count
:rows="2"
/>
</a-form-item>
@ -214,7 +218,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addOtweInfo, updateOtweInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -242,6 +246,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -253,13 +258,10 @@ const formRules = ref<any>({
const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}))
.map((item: any) => ({ label: item.wbsName, value: item.wbsCode }))
);
const engLoading = ref(false);
@ -322,6 +324,16 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
const keyword = inputValue || '';
@ -353,7 +365,7 @@ watch(
continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? resolveSelectLabel(key, oldNorm)
? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm))
: oldNorm === null
? '空'
: String(oldNorm);
@ -381,17 +393,52 @@ watch(
{ deep: true }
);
watch(
() => props.record,
newRecord => {
if (newRecord) {
const converted = { ...newRecord };
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// record
const isInitLoading = ref(false);
watch(() => props.record, newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
},
{ deep: true }
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
}, { deep: true });
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
const loadEngOptions = async (baseId?: string) => {
@ -426,15 +473,14 @@ const loadDropdownData = () => {
value: item.sttpCode
}));
});
baseNameOptions.value = jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}));
// store computed
};
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -231,6 +231,8 @@
<a-textarea
v-model:value="formData.introduce"
placeholder="请输入简介"
:maxlength="1000"
show-count
:rows="2"
/>
</a-form-item>
@ -240,6 +242,8 @@
<a-textarea
v-model:value="formData.remark"
placeholder="请输入备注"
:maxlength="150"
show-count
:rows="2"
/>
</a-form-item>
@ -258,7 +262,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addAiInfo, updateAiInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -286,6 +290,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -298,13 +303,10 @@ const formRules = ref<any>({
const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}))
.map((item: any) => ({ label: item.wbsName, value: item.wbsCode }))
);
const engLoading = ref(false);
@ -368,6 +370,16 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
const keyword = inputValue || '';
@ -399,11 +411,7 @@ watch(
)
continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? resolveSelectLabel(key, oldNorm)
: oldNorm === null
? '空'
: String(oldNorm);
const oldDisplay = isSelect ? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm)) : oldNorm === null ? '空' : String(oldNorm);
const newDisplay = isSelect
? resolveSelectLabel(key, newNorm)
: newNorm === null
@ -429,17 +437,51 @@ watch(
);
// record
watch(
() => props.record,
newRecord => {
if (newRecord) {
const converted = { ...newRecord };
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
const isInitLoading = ref(false);
watch(() => props.record, newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
},
{ deep: true }
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
}, { deep: true });
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
const loadEngOptions = async (baseId?: string) => {
@ -476,16 +518,14 @@ const loadDropdownData = () => {
value: item.sttpCode
}));
});
// store
baseNameOptions.value = jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}));
// store computed
};
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -55,12 +55,12 @@
</a-col>
<a-col :span="8">
<a-form-item label="开工日期" name="swdt">
<a-date-picker v-model:value="formData.swdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择开工日期" style="width: 100%" />
<a-date-picker v-model:value="formData.swdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" :disabled-date="disabledSwdtDate" placeholder="请选择开工日期" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="建成日期" name="jcdt">
<a-date-picker v-model:value="formData.jcdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择建成日期" style="width: 100%" />
<a-date-picker v-model:value="formData.jcdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" :disabled-date="disabledJcdtDate" placeholder="请选择建成日期" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8">
@ -114,7 +114,9 @@
</a-col>
<a-col :span="8">
<a-form-item label="过鱼月份" name="fpssmn">
<a-input v-model:value="formData.fpssmn" placeholder="多个月份用,隔开" style="width: 100%" />
<a-select :key="visible" v-model:value="formData.fpssmn" mode="multiple" placeholder="请选择过鱼月份" allow-clear>
<a-select-option v-for="item in fpssmnOptions" :key="item.value" :label="item.label" :value="item.value">{{ item.label }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
@ -138,7 +140,8 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import dayjs from 'dayjs';
import { message } from 'ant-design-vue';
import { addFpInfo, updateFpInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -156,8 +159,9 @@ useDraggable(visible, { boundary: true, resetOnOpen: true });
const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const formData = ref<any>({ fpssmn: [] });
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -168,12 +172,15 @@ const formRules = ref<any>({
const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData.filter((item: any) => item.wbsCode !== 'all').map((item: any) => ({ label: item.wbsName, value: item.wbsCode }))
);
const engLoading = ref(false);
// 1-12
const fpssmnOptions = ref(Array.from({ length: 12 }, (_, i) => ({ label: `${i + 1}`, value: `${i + 1}` })));
const fieldLabelMap: Record<string, string> = {
stcd: '设施编码', stnm: '设施名称', sttp: '设施类型', stlc: '站址/位置',
baseId: '水电基地', rstcd: '所属电站', lgtd: '经度(°)', lttd: '纬度(°)',
@ -196,7 +203,8 @@ const selectOptionsMap: Record<string, () => any[]> = {
mway: () => [
{ label: '人工', value: 1 },
{ label: '自动', value: 2 }
]
],
fpssmn: () => fpssmnOptions.value
};
const changeOrder = ref<{ field: string; label: string; oldValue: string; newValue: string }[]>([]);
@ -204,6 +212,16 @@ const diffList = changeOrder;
const resolveSelectLabel = (field: string, value: any): string => {
if (value === null || value === undefined || value === '') return '空';
// fpssmn label
if (field === 'fpssmn') {
const arr = Array.isArray(value) ? value : String(value).split(',');
return arr.map((v: any) => {
const trimmed = String(v).trim();
if (!trimmed) return '';
const opt = fpssmnOptions.value.find((o) => String(o.value) === trimmed);
return opt ? opt.label : trimmed;
}).filter(Boolean).join('、');
}
const getOptions = selectOptionsMap[field];
if (getOptions) {
const opt = getOptions().find((o: any) => String(o.value) === String(value));
@ -212,24 +230,55 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
return label.includes(inputValue || '');
};
//
const disabledSwdtDate = (current: any) => {
if (!formData.value.jcdt) return false;
return current && current > dayjs(formData.value.jcdt).endOf('day');
};
//
const disabledJcdtDate = (current: any) => {
if (!formData.value.swdt) return false;
return current && current < dayjs(formData.value.swdt).startOf('day');
};
watch(() => formData.value, newData => {
const original = originalRecord.value;
for (const key in newData) {
const oldVal = original[key];
const newVal = newData[key];
if (oldVal !== newVal) {
// fpssmn vs
if (key === 'fpssmn') {
const normalize = (v: any) => {
if (!v) return '';
const arr = Array.isArray(v) ? v : String(v).split(',');
return arr.map((s: string) => s.trim()).filter(Boolean).sort().join(',');
};
if (normalize(oldVal) === normalize(newVal)) continue;
}
const existingIdx = changeOrder.value.findIndex(c => c.field === key);
const oldNorm = oldVal === null || oldVal === undefined || oldVal === '-' ? null : oldVal;
const newNorm = newVal === null || newVal === undefined ? null : newVal;
if (oldNorm === newNorm) continue;
if (oldNorm !== null && newNorm !== null && !isNaN(Number(oldNorm)) && !isNaN(Number(newNorm)) && Number(oldNorm) === Number(newNorm)) continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect ? resolveSelectLabel(key, oldNorm) : oldNorm === null ? '空' : String(oldNorm);
const oldDisplay = isSelect ? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm)) : oldNorm === null ? '空' : String(oldNorm);
const newDisplay = isSelect ? resolveSelectLabel(key, newNorm) : newNorm === null ? '空' : String(newNorm);
const entry = { field: key, label: fieldLabelMap[key] || key, oldValue: oldDisplay, newValue: newDisplay };
if (existingIdx >= 0) changeOrder.value[existingIdx] = entry;
@ -240,15 +289,56 @@ watch(() => formData.value, newData => {
}
}, { deep: true });
// record
const isInitLoading = ref(false);
watch(() => props.record, newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
formData.value = { ...converted };
// fpssmn
const fpssmnArr = converted.fpssmn ? String(converted.fpssmn).split(',').map((s: string) => s.trim()).filter(Boolean) : [];
formData.value = { ...converted, fpssmn: fpssmnArr.length > 0 ? fpssmnArr : undefined };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
}, { deep: true });
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
const loadEngOptions = async (baseId?: string) => {
engLoading.value = true;
try {
@ -268,11 +358,15 @@ const loadDropdownData = () => {
}).then(res => {
sttpOptions.value = (res.data?.data || []).map((item: any) => ({ label: item.sttpName, value: item.sttpCode }));
});
baseNameOptions.value = jidiSelectEventStore.jidiData.filter((item: any) => item.wbsCode !== 'all').map((item: any) => ({ label: item.wbsName, value: item.wbsCode }));
// store computed
};
//
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});
@ -280,7 +374,7 @@ watch(() => formData.value?.baseId, (newBaseId) => {
watch(() => props.open, val => {
if (val) {
if (props.isAdd) {
formData.value = {};
formData.value = { fpssmn: [] };
originalRecord.value = {};
changeOrder.value = [];
loadEngOptions();
@ -304,10 +398,14 @@ const handleConfirmSubmit = async (source: string) => {
let res: any;
if (props.isAdd) {
Object.assign(engInfo, formData.value);
// fpssmn
if (Array.isArray(engInfo.fpssmn)) engInfo.fpssmn = engInfo.fpssmn.join(',');
res = await addFpInfo({ engInfo, source: source.trim() || '新增' });
} else {
engInfo.stcd = formData.value.stcd;
changeOrder.value.forEach(item => { engInfo[item.field] = formData.value[item.field]; });
// fpssmn
if (Array.isArray(engInfo.fpssmn)) engInfo.fpssmn = engInfo.fpssmn.join(',');
res = await updateFpInfo({ engInfo, source: source.trim() || '编辑' });
}
if (res?.code == 0 || res?.success) {

View File

@ -125,6 +125,8 @@
<a-textarea
v-model:value="formData.introduce"
placeholder="请输入简介"
:maxlength="1000"
show-count
:rows="3"
/>
</a-form-item>
@ -134,6 +136,8 @@
<a-textarea
v-model:value="formData.remark"
placeholder="请输入备注"
:maxlength="150"
show-count
:rows="2"
/>
</a-form-item>
@ -152,7 +156,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addTeInfo, updateTeInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -180,6 +184,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -192,13 +197,10 @@ const formRules = ref<any>({
const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}))
.map((item: any) => ({ label: item.wbsName, value: item.wbsCode }))
);
const engLoading = ref(false);
@ -242,6 +244,16 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
const keyword = inputValue || '';
@ -273,11 +285,7 @@ watch(
)
continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? resolveSelectLabel(key, oldNorm)
: oldNorm === null
? '空'
: String(oldNorm);
const oldDisplay = isSelect ? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm)) : oldNorm === null ? '空' : String(oldNorm);
const newDisplay = isSelect
? resolveSelectLabel(key, newNorm)
: newNorm === null
@ -303,17 +311,51 @@ watch(
);
// record
watch(
() => props.record,
newRecord => {
if (newRecord) {
const converted = { ...newRecord };
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
const isInitLoading = ref(false);
watch(() => props.record, newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
},
{ deep: true }
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
}, { deep: true });
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
// baseId
@ -351,17 +393,15 @@ const loadDropdownData = () => {
value: item.sttpCode
}));
});
// store
baseNameOptions.value = jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}));
// store computed
};
//
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -18,81 +18,174 @@
<a-row :gutter="16">
<a-col :span="8">
<a-form-item label="栖息地站码" name="stcd">
<a-input v-model:value="formData.stcd" placeholder="请输入栖息地站码" :disabled="!isAdd" style="width: 100%" />
<a-input
v-model:value="formData.stcd"
placeholder="请输入栖息地站码"
:disabled="!isAdd"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="栖息地名称" name="stnm">
<a-input v-model:value="formData.stnm" placeholder="请输入栖息地名称" style="width: 100%" />
<a-input
v-model:value="formData.stnm"
placeholder="请输入栖息地名称"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="站址" name="stlc">
<a-input v-model:value="formData.stlc" placeholder="请输入站址" style="width: 100%" />
<a-input
v-model:value="formData.stlc"
placeholder="请输入站址"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="经度(°)" name="lgtd">
<a-input-number v-model:value="formData.lgtd" placeholder="请输入" :precision="6" style="width: 100%" />
<a-input-number
v-model:value="formData.lgtd"
placeholder="请输入"
:precision="6"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="纬度(°)" name="lttd">
<a-input-number v-model:value="formData.lttd" placeholder="请输入" :precision="6" style="width: 100%" />
<a-input-number
v-model:value="formData.lttd"
placeholder="请输入"
:precision="6"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="水电基地" name="baseId">
<a-select v-model:value="formData.baseId" placeholder="请选择水电基地" allow-clear show-search :filter-option="filterOption">
<a-select-option v-for="item in baseNameOptions" :key="item.value" :label="item.label" :value="item.value">{{ item.label }}</a-select-option>
<a-select
v-model:value="formData.baseId"
placeholder="请选择水电基地"
allow-clear
show-search
:filter-option="filterOption"
>
<a-select-option
v-for="item in baseNameOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>{{ item.label }}</a-select-option
>
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="所属电站" name="rstcd">
<a-select v-model:value="formData.rstcd" placeholder="请选择所属电站" allow-clear show-search :loading="engLoading" :filter-option="filterOption">
<a-select-option v-for="item in engInfoOptions" :key="item.value" :label="item.label" :value="item.value">{{ item.label }}</a-select-option>
<a-select
v-model:value="formData.rstcd"
placeholder="请选择所属电站"
allow-clear
show-search
:loading="engLoading"
:filter-option="filterOption"
>
<a-select-option
v-for="item in engInfoOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>{{ item.label }}</a-select-option
>
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="保护对象" name="bhdx">
<a-input v-model:value="formData.bhdx" placeholder="请输入保护对象" style="width: 100%" />
<a-select
v-model:value="formData.bhdx"
mode="multiple"
placeholder="请选择保护对象"
allow-clear
show-search
:filter-option="filterOption"
>
<a-select-option
v-for="item in fishOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>{{ item.label }}</a-select-option
>
</a-select>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="保护范围" name="bhfw">
<a-input v-model:value="formData.bhfw" placeholder="请输入保护范围" style="width: 100%" />
<a-input
v-model:value="formData.bhfw"
placeholder="请输入保护范围"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="保护核心长度(km)" name="bhhxcd">
<a-input-number v-model:value="formData.bhhxcd" placeholder="请输入" :precision="2" style="width: 100%" />
<a-input-number
v-model:value="formData.bhhxcd"
placeholder="请输入"
:precision="2"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="保护河流" name="bhhl">
<a-input v-model:value="formData.bhhl" placeholder="请输入保护河流" style="width: 100%" />
<a-input
v-model:value="formData.bhhl"
placeholder="请输入保护河流"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="保护河段" name="bhhd">
<a-input v-model:value="formData.bhhd" placeholder="请输入保护河段" style="width: 100%" />
<a-input
v-model:value="formData.bhhd"
placeholder="请输入保护河段"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="保护措施" name="bhcs">
<a-input v-model:value="formData.bhcs" placeholder="请输入保护措施" style="width: 100%" />
<a-input
v-model:value="formData.bhcs"
placeholder="请输入保护措施"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="保护方式" name="bhfs">
<a-input v-model:value="formData.bhfs" placeholder="请输入保护方式" style="width: 100%" />
<a-input
v-model:value="formData.bhfs"
placeholder="请输入保护方式"
style="width: 100%"
/>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="投资(亿元)" name="inv">
<a-input-number v-model:value="formData.inv" placeholder="请输入" :precision="3" style="width: 100%" />
<a-input-number
v-model:value="formData.inv"
placeholder="请输入"
:precision="3"
style="width: 100%"
/>
</a-form-item>
</a-col>
</a-row>
@ -109,10 +202,10 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addFhInfo, updateFhInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
import { getEngInfoDropdown, selectForDropdown } from '@/api/select';
import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent';
import ConfirmModal from '@/components/ConfirmModal/index.vue';
import { useDraggable } from '@/utils/drag';
@ -121,13 +214,17 @@ const props = defineProps<{ open: boolean; record?: any; isAdd?: boolean }>();
const emit = defineEmits(['update:open', 'success']);
const jidiSelectEventStore = useJidiSelectEventStore();
const visible = computed({ get: () => props.open, set: val => emit('update:open', val) });
const visible = computed({
get: () => props.open,
set: val => emit('update:open', val)
});
useDraggable(visible, { boundary: true, resetOnOpen: true });
const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -137,7 +234,7 @@ const formRules = ref<any>({
const engInfoOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({ label: item.wbsName, value: item.wbsCode }))
@ -146,73 +243,221 @@ const baseNameOptions = ref<any[]>(
const engLoading = ref(false);
const fieldLabelMap: Record<string, string> = {
stcd: '栖息地站码', stnm: '栖息地名称', stlc: '站址', baseId: '水电基地',
rstcd: '所属电站', bhdx: '保护对象', bhfw: '保护范围',
bhhxcd: '保护核心长度(km)',
bhhl: '保护河流', bhhd: '保护河段', bhcs: '保护措施', bhfs: '保护方式', inv: '投资(亿元)', lgtd: '经度(°)', lttd: '纬度(°)'
stcd: '栖息地站码',
stnm: '栖息地名称',
stlc: '站址',
baseId: '水电基地',
rstcd: '所属电站',
bhdx: '保护对象',
bhfw: '保护范围',
bhhxcd: '保护核心长度(km)',
bhhl: '保护河流',
bhhd: '保护河段',
bhcs: '保护措施',
bhfs: '保护方式',
inv: '投资(亿元)',
lgtd: '经度(°)',
lttd: '纬度(°)'
};
const selectOptionsMap: Record<string, () => any[]> = {
baseId: () => baseNameOptions.value,
rstcd: () => engInfoOptions.value
rstcd: () => engInfoOptions.value,
bhdx: () => fishOptions.value
};
const changeOrder = ref<{ field: string; label: string; oldValue: string; newValue: string }[]>([]);
const changeOrder = ref<
{ field: string; label: string; oldValue: string; newValue: string }[]
>([]);
const diffList = changeOrder;
const resolveSelectLabel = (field: string, value: any): string => {
if (value === null || value === undefined || value === '') return '空';
// bhdx label
if (field === 'bhdx') {
const arr = Array.isArray(value) ? value : String(value).split(',');
return arr
.map((v: any) => {
const trimmed = String(v).trim();
if (!trimmed) return '';
const opt = fishOptions.value.find(
(o: any) => String(o.value) === trimmed
);
return opt ? opt.label : trimmed;
})
.filter(Boolean)
.join('、');
}
const getOptions = selectOptionsMap[field];
if (getOptions) {
const opt = getOptions().find((o: any) => String(o.value) === String(value));
const opt = getOptions().find(
(o: any) => String(o.value) === String(value)
);
if (opt) return opt.label;
}
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
return label.includes(inputValue || '');
};
const fishOptions = ref<any[]>([]);
const getFishzy = async () => {
try {
const res = await selectForDropdown({
"select": ["name","id"],
"filter": {"logic": "and","filters": []}});
fishOptions.value = (res.data || []).map((item: any) => ({
label: item.name ,
value: item.id
}));
} catch (error) {
console.error('获取保护对象列表失败:', error);
}
};
watch(() => formData.value, newData => {
watch(
() => formData.value,
newData => {
const original = originalRecord.value;
for (const key in newData) {
const oldVal = original[key];
const newVal = newData[key];
if (oldVal !== newVal) {
// bhdx vs
if (key === 'bhdx') {
const normalize = (v: any) => {
if (!v) return '';
const arr = Array.isArray(v) ? v : String(v).split(',');
return arr
.map((s: string) => s.trim())
.filter(Boolean)
.sort()
.join(',');
};
if (normalize(oldVal) === normalize(newVal)) continue;
}
const existingIdx = changeOrder.value.findIndex(c => c.field === key);
const oldNorm =
oldVal === null || oldVal === undefined || oldVal === '-'
? null
: oldVal;
const newNorm = newVal === null || newVal === undefined ? null : newVal;
if (oldNorm === newNorm) continue;
if (
oldNorm !== null &&
newNorm !== null &&
!isNaN(Number(oldNorm)) &&
!isNaN(Number(newNorm)) &&
Number(oldNorm) === Number(newNorm)
)
continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm)
: oldNorm === null
? '空'
: String(oldNorm);
const newDisplay = isSelect
? resolveSelectLabel(key, newNorm)
: newNorm === null
? '空'
: String(newNorm);
const entry = {
field: key,
label: fieldLabelMap[key] || key,
oldValue: oldDisplay,
newValue: newDisplay
};
if (existingIdx >= 0) changeOrder.value[existingIdx] = entry;
else changeOrder.value.push(entry);
} else {
changeOrder.value = changeOrder.value.filter(c => c.field !== key);
}
}
},
{ deep: true }
);
// record
const isInitLoading = ref(false);
watch(
() => props.record,
newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
// bhdx
const bhdxArr = converted.bhdx
? String(converted.bhdx)
.split(',')
.map((s: string) => s.trim())
.filter(Boolean)
: [];
formData.value = {
...converted,
bhdx: bhdxArr.length > 0 ? bhdxArr : undefined
};
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
},
{ deep: true }
);
// record code
watch([baseNameOptions, engInfoOptions, fishOptions], () => {
const original = originalRecord.value;
for (const key in newData) {
const oldVal = original[key];
const newVal = newData[key];
if (oldVal !== newVal) {
const existingIdx = changeOrder.value.findIndex(c => c.field === key);
const oldNorm = oldVal === null || oldVal === undefined || oldVal === '-' ? null : oldVal;
const newNorm = newVal === null || newVal === undefined ? null : newVal;
if (oldNorm === newNorm) continue;
if (oldNorm !== null && newNorm !== null && !isNaN(Number(oldNorm)) && !isNaN(Number(newNorm)) && Number(oldNorm) === Number(newNorm)) continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect ? resolveSelectLabel(key, oldNorm) : oldNorm === null ? '空' : String(oldNorm);
const newDisplay = isSelect ? resolveSelectLabel(key, newNorm) : newNorm === null ? '空' : String(newNorm);
const entry = { field: key, label: fieldLabelMap[key] || key, oldValue: oldDisplay, newValue: newDisplay };
if (existingIdx >= 0) changeOrder.value[existingIdx] = entry;
else changeOrder.value.push(entry);
} else {
changeOrder.value = changeOrder.value.filter(c => c.field !== key);
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
}, { deep: true });
watch(() => props.record, newRecord => {
if (newRecord) {
const converted = { ...newRecord };
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
}
}, { deep: true });
originalLabels.value = labels;
});
const loadEngOptions = async (baseId?: string) => {
engLoading.value = true;
try {
const params = baseId ? { baseId } : {};
const res = await getEngInfoDropdown(params);
engInfoOptions.value = (res.data || []).map((item: any) => ({ label: item.ennm, value: item.stcd }));
engInfoOptions.value = (res.data || []).map((item: any) => ({
label: item.ennm,
value: item.stcd
}));
} catch (error) {
console.error('获取电站列表失败:', error);
} finally {
@ -220,30 +465,44 @@ const loadEngOptions = async (baseId?: string) => {
}
};
const loadDropdownData = () => {
baseNameOptions.value = jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({ label: item.wbsName, value: item.wbsCode }));
};
watch(() => formData.value?.baseId, (newBaseId) => {
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});
watch(() => props.open, val => {
if (val) {
loadDropdownData();
if (props.isAdd) { formData.value = {}; originalRecord.value = {}; changeOrder.value = []; loadEngOptions(); }
watch(
() => formData.value?.baseId,
newBaseId => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
}
});
);
watch(
() => props.open,
val => {
if (val) {
if (props.isAdd) {
formData.value = {};
originalRecord.value = {};
changeOrder.value = [];
loadEngOptions();
}
getFishzy();
}
}
);
const handleOk = async () => {
try {
await formRef.value?.validateFields();
if (!props.isAdd && changeOrder.value.length === 0) { message.info('未检测到任何修改'); return; }
if (!props.isAdd && changeOrder.value.length === 0) {
message.info('未检测到任何修改');
return;
}
confirmModalVisible.value = true;
} catch (error) { console.error('验证失败:', error); }
} catch (error) {
console.error('验证失败:', error);
}
};
const handleConfirmSubmit = async (source: string) => {
@ -253,10 +512,16 @@ const handleConfirmSubmit = async (source: string) => {
let res: any;
if (props.isAdd) {
Object.assign(engInfo, formData.value);
// bhdx
if (Array.isArray(engInfo.bhdx)) engInfo.bhdx = engInfo.bhdx.join(',');
res = await addFhInfo({ engInfo, source: source.trim() || '新增' });
} else {
engInfo.stcd = formData.value.stcd;
changeOrder.value.forEach(item => { engInfo[item.field] = formData.value[item.field]; });
changeOrder.value.forEach(item => {
engInfo[item.field] = formData.value[item.field];
});
// bhdx
if (Array.isArray(engInfo.bhdx)) engInfo.bhdx = engInfo.bhdx.join(',');
res = await updateFhInfo({ engInfo, source: source.trim() || '编辑' });
}
if (res?.code == 0 || res?.success) {
@ -264,11 +529,22 @@ const handleConfirmSubmit = async (source: string) => {
confirmModalVisible.value = false;
visible.value = false;
emit('success');
} else { message.error(res?.msg || (props.isAdd ? '新增失败' : '编辑失败')); }
} catch (error) { message.error('提交失败,请重试'); }
finally { confirmLoading.value = false; }
} else {
message.error(res?.msg || (props.isAdd ? '新增失败' : '编辑失败'));
}
} catch (error) {
message.error('提交失败,请重试');
} finally {
confirmLoading.value = false;
}
};
const handleConfirmCancel = () => { confirmModalVisible.value = false; };
const handleCancel = () => { visible.value = false; confirmModalVisible.value = false; formRef.value?.resetFields(); };
const handleConfirmCancel = () => {
confirmModalVisible.value = false;
};
const handleCancel = () => {
visible.value = false;
confirmModalVisible.value = false;
formRef.value?.resetFields();
};
</script>

View File

@ -62,7 +62,7 @@ const columns = ref<any[]>([
{ key: 'stcd', title: '栖息地站码', dataIndex: 'stcd', visible: true, width: 320, fixed: 'left', ellipsis: true },
{ key: 'baseName', title: '水电基地', dataIndex: 'baseName', visible: true, width: 120, ellipsis: true },
{ key: 'ennm', title: '所属电站', dataIndex: 'ennm', visible: true, width: 150, ellipsis: true },
{ key: 'bhdx', title: '保护对象', dataIndex: 'bhdx', visible: true, width: 120, ellipsis: true },
{ key: 'bhdxName', title: '保护对象', dataIndex: 'bhdxName', visible: true, width: 240, ellipsis: true },
{ key: 'bhhl', title: '保护河流', dataIndex: 'bhhl', visible: true, width: 120, ellipsis: true },
{ key: 'bhhd', title: '保护河段', dataIndex: 'bhhd', visible: true, width: 240, ellipsis: true },
{ key: 'bhfw', title: '保护范围', dataIndex: 'bhfw', visible: true, width: 120, ellipsis: true },

View File

@ -188,6 +188,8 @@
<a-textarea
v-model:value="formData.introduce"
placeholder="请输入简介"
:maxlength="1000"
show-count
:rows="2"
/>
</a-form-item>
@ -197,6 +199,8 @@
<a-textarea
v-model:value="formData.remark"
placeholder="请输入备注"
:maxlength="150"
show-count
:rows="2"
/>
</a-form-item>
@ -215,7 +219,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addVaInfo, updateVaInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -243,6 +247,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -254,7 +259,7 @@ const formRules = ref<any>({
const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
@ -270,18 +275,16 @@ const fieldLabelMap: Record<string, string> = {
stnm: '救助站名称',
sttp: '测站类型',
stlc: '站址',
lgtd: '经度(°)',
lttd: '纬度(°)',
baseId: '水电基地',
rstcd: '所属电站',
place: '地点',
area: '面积',
area: '面积(km²)',
bhfs: '保护方式',
bhyy: '保护原因',
bhdx: '保护对象',
usfl: '是否启用',
jcdt: '建成日期',
inv: '投资',
inv: '投资(亿元)',
introduce: '简介',
remark: '备注'
};
@ -317,6 +320,16 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
const keyword = inputValue || '';
@ -337,8 +350,16 @@ watch(
if (oldNorm === newNorm) continue;
if (oldNorm !== null && newNorm !== null && !isNaN(Number(oldNorm)) && !isNaN(Number(newNorm)) && Number(oldNorm) === Number(newNorm)) continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect ? resolveSelectLabel(key, oldNorm) : oldNorm === null ? '空' : String(oldNorm);
const newDisplay = isSelect ? resolveSelectLabel(key, newNorm) : newNorm === null ? '空' : String(newNorm);
const oldDisplay = isSelect
? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm))
: oldNorm === null
? '空'
: String(oldNorm);
const newDisplay = isSelect
? resolveSelectLabel(key, newNorm)
: newNorm === null
? '空'
: String(newNorm);
const entry = { field: key, label: fieldLabelMap[key] || key, oldValue: oldDisplay, newValue: newDisplay };
if (existingIdx >= 0) changeOrder.value[existingIdx] = entry;
else changeOrder.value.push(entry);
@ -350,14 +371,56 @@ watch(
{ deep: true }
);
watch(() => props.record, newRecord => {
if (newRecord) {
const converted = { ...newRecord };
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
const isInitLoading = ref(false);
watch(
() => props.record,
newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
},
{ deep: true }
);
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
}, { deep: true });
);
const loadEngOptions = async (baseId?: string) => {
engLoading.value = true;
@ -381,23 +444,27 @@ const loadDropdownData = () => {
}).then(res => {
sttpOptions.value = (res.data?.data || []).map((item: any) => ({ label: item.sttpName, value: item.sttpCode }));
});
baseNameOptions.value = jidiSelectEventStore.jidiData.filter((item: any) => item.wbsCode !== 'all').map((item: any) => ({ label: item.wbsName, value: item.wbsCode }));
// baseNameOptions computed
};
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});
watch(() => props.open, val => {
if (val) {
loadDropdownData();
if (props.isAdd) {
formData.value = {};
originalRecord.value = {};
changeOrder.value = [];
loadEngOptions();
}
loadDropdownData();
}
});

View File

@ -55,12 +55,12 @@
</a-col>
<a-col :span="8">
<a-form-item label="开工日期" name="swdt">
<a-date-picker v-model:value="formData.swdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择开工日期" style="width: 100%" />
<a-date-picker v-model:value="formData.swdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" :disabled-date="disabledSwdtDate" placeholder="请选择开工日期" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="建成日期" name="jcdt">
<a-date-picker v-model:value="formData.jcdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择建成日期" style="width: 100%" />
<a-date-picker v-model:value="formData.jcdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" :disabled-date="disabledJcdtDate" placeholder="请选择建成日期" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8">
@ -110,7 +110,8 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import dayjs from 'dayjs';
import { message } from 'ant-design-vue';
import { addEqInfo, updateEqInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -130,6 +131,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -142,7 +144,7 @@ const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const engLoading = ref(false);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData.filter((item: any) => item.wbsCode !== 'all').map((item: any) => ({ label: item.wbsName, value: item.wbsCode }))
);
@ -178,11 +180,33 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
return label.includes(inputValue || '');
};
//
const disabledSwdtDate = (current: any) => {
if (!formData.value.jcdt) return false;
return current && current > dayjs(formData.value.jcdt).endOf('day');
};
//
const disabledJcdtDate = (current: any) => {
if (!formData.value.swdt) return false;
return current && current < dayjs(formData.value.swdt).startOf('day');
};
watch(() => formData.value, newData => {
const original = originalRecord.value;
for (const key in newData) {
@ -195,7 +219,7 @@ watch(() => formData.value, newData => {
if (oldNorm === newNorm) continue;
if (oldNorm !== null && newNorm !== null && !isNaN(Number(oldNorm)) && !isNaN(Number(newNorm)) && Number(oldNorm) === Number(newNorm)) continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect ? resolveSelectLabel(key, oldNorm) : oldNorm === null ? '空' : String(oldNorm);
const oldDisplay = isSelect ? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm)) : oldNorm === null ? '空' : String(oldNorm);
const newDisplay = isSelect ? resolveSelectLabel(key, newNorm) : newNorm === null ? '空' : String(newNorm);
const entry = { field: key, label: fieldLabelMap[key] || key, oldValue: oldDisplay, newValue: newDisplay };
if (existingIdx >= 0) changeOrder.value[existingIdx] = entry;
@ -206,15 +230,54 @@ watch(() => formData.value, newData => {
}
}, { deep: true });
// record
const isInitLoading = ref(false);
watch(() => props.record, newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
}, { deep: true });
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
// baseId
const loadEngOptions = async (baseId?: string) => {
engLoading.value = true;
@ -235,11 +298,15 @@ const loadDropdownData = () => {
}).then(res => {
sttpOptions.value = (res.data?.data || []).map((item: any) => ({ label: item.sttpName, value: item.sttpCode }));
});
baseNameOptions.value = jidiSelectEventStore.jidiData.filter((item: any) => item.wbsCode !== 'all').map((item: any) => ({ label: item.wbsName, value: item.wbsCode }));
// store computed
};
//
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -51,7 +51,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addVdInfo, updateVdInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -71,6 +71,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -82,8 +83,10 @@ const formRules = ref<any>({
const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
jidiSelectEventStore.jidiData.filter((item: any) => item.wbsCode !== 'all').map((item: any) => ({ label: item.wbsName, value: item.wbsCode }))
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({ label: item.wbsName, value: item.wbsCode }))
);
const engLoading = ref(false);
@ -113,6 +116,16 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
return label.includes(inputValue || '');
@ -130,7 +143,7 @@ watch(() => formData.value, newData => {
if (oldNorm === newNorm) continue;
if (oldNorm !== null && newNorm !== null && !isNaN(Number(oldNorm)) && !isNaN(Number(newNorm)) && Number(oldNorm) === Number(newNorm)) continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect ? resolveSelectLabel(key, oldNorm) : oldNorm === null ? '空' : String(oldNorm);
const oldDisplay = isSelect ? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm)) : oldNorm === null ? '空' : String(oldNorm);
const newDisplay = isSelect ? resolveSelectLabel(key, newNorm) : newNorm === null ? '空' : String(newNorm);
const entry = { field: key, label: fieldLabelMap[key] || key, oldValue: oldDisplay, newValue: newDisplay };
if (existingIdx >= 0) changeOrder.value[existingIdx] = entry;
@ -141,15 +154,54 @@ watch(() => formData.value, newData => {
}
}, { deep: true });
// record
const isInitLoading = ref(false);
watch(() => props.record, newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
}, { deep: true });
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
// baseId
const loadEngOptions = async (baseId?: string) => {
engLoading.value = true;
@ -170,11 +222,15 @@ const loadDropdownData = () => {
}).then(res => {
sttpOptions.value = (res.data?.data || []).map((item: any) => ({ label: item.sttpName, value: item.sttpCode }));
});
baseNameOptions.value = jidiSelectEventStore.jidiData.filter((item: any) => item.wbsCode !== 'all').map((item: any) => ({ label: item.wbsName, value: item.wbsCode }));
// store computed
};
//
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -125,6 +125,8 @@
<a-textarea
v-model:value="formData.introduce"
placeholder="请输入简介"
:maxlength="1000"
show-count
:rows="3"
/>
</a-form-item>
@ -134,6 +136,8 @@
<a-textarea
v-model:value="formData.remark"
placeholder="请输入备注"
:maxlength="150"
show-count
:rows="2"
/>
</a-form-item>
@ -152,7 +156,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addWeInfo, updateWeInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -180,6 +184,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -192,7 +197,7 @@ const formRules = ref<any>({
const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
@ -242,6 +247,16 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
const keyword = inputValue || '';
@ -274,7 +289,7 @@ watch(
continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? resolveSelectLabel(key, oldNorm)
? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm))
: oldNorm === null
? '空'
: String(oldNorm);
@ -303,19 +318,57 @@ watch(
);
// record
const isInitLoading = ref(false);
watch(
() => props.record,
newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
},
{ deep: true }
);
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
// baseId
const loadEngOptions = async (baseId?: string) => {
engLoading.value = true;
@ -351,17 +404,15 @@ const loadDropdownData = () => {
value: item.sttpCode
}));
});
// store
baseNameOptions.value = jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}));
// store computed
};
//
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -147,7 +147,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addWtInfo, updateWtInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -175,6 +175,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -187,7 +188,7 @@ const formRules = ref<any>({
const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
@ -241,6 +242,16 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
const keyword = inputValue || '';
@ -273,7 +284,7 @@ watch(
continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? resolveSelectLabel(key, oldNorm)
? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm))
: oldNorm === null
? '空'
: String(oldNorm);
@ -302,19 +313,57 @@ watch(
);
// record
const isInitLoading = ref(false);
watch(
() => props.record,
newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
},
{ deep: true }
);
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
const loadEngOptions = async (baseId?: string) => {
engLoading.value = true;
try {
@ -349,16 +398,14 @@ const loadDropdownData = () => {
value: item.sttpCode
}));
});
// store
baseNameOptions.value = jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}));
// store computed
};
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -177,7 +177,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addWqInfo, updateWqInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -206,6 +206,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -219,7 +220,7 @@ const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const wwqtgOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
@ -282,6 +283,16 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
const keyword = inputValue || '';
@ -314,7 +325,7 @@ watch(
continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? resolveSelectLabel(key, oldNorm)
? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm))
: oldNorm === null
? '空'
: String(oldNorm);
@ -343,19 +354,57 @@ watch(
);
// record
const isInitLoading = ref(false);
watch(
() => props.record,
newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
},
{ deep: true }
);
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions, wwqtgOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
const loadEngOptions = async (baseId?: string) => {
engLoading.value = true;
try {
@ -399,15 +448,14 @@ const loadDropdownData = () => {
}));
}
});
baseNameOptions.value = jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}));
// store computed
};
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -176,6 +176,8 @@
<a-textarea
v-model:value="formData.introduce"
placeholder="请输入简介"
:maxlength="1000"
show-count
:rows="2"
/>
</a-form-item>
@ -185,6 +187,8 @@
<a-textarea
v-model:value="formData.remark"
placeholder="请输入备注"
:maxlength="150"
show-count
:rows="2"
/>
</a-form-item>
@ -203,7 +207,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addSonarInfo, updateSonarInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -231,18 +235,20 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
stcd: [{ required: true, message: '请输入站码', trigger: 'blur' }],
stnm: [{ required: true, message: '请输入站名', trigger: 'blur' }],
sttp: [{ required: true, message: '请选择监控类别', trigger: 'change' }]
sttp: [{ required: true, message: '请选择监控类别', trigger: 'change' }],
mntp: [{ required: true, message: '请输入监控类型', trigger: 'blur' }],
});
const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
@ -304,6 +310,16 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
const keyword = inputValue || '';
@ -335,7 +351,7 @@ watch(
continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? resolveSelectLabel(key, oldNorm)
? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm))
: oldNorm === null
? '空'
: String(oldNorm);
@ -363,17 +379,52 @@ watch(
{ deep: true }
);
watch(
() => props.record,
newRecord => {
if (newRecord) {
const converted = { ...newRecord };
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// record
const isInitLoading = ref(false);
watch(() => props.record, newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
},
{ deep: true }
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
}, { deep: true });
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
const loadEngOptions = async (baseId?: string) => {
@ -408,15 +459,14 @@ const loadDropdownData = () => {
value: item.sttpCode
}));
});
baseNameOptions.value = jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}));
// baseNameOptions computed
};
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -179,6 +179,8 @@
<a-textarea
v-model:value="formData.introduce"
placeholder="请输入简介"
:maxlength="1000"
show-count
:rows="2"
/>
</a-form-item>
@ -188,6 +190,8 @@
<a-textarea
v-model:value="formData.remark"
placeholder="请输入备注"
:maxlength="150"
show-count
:rows="2"
/>
</a-form-item>
@ -206,7 +210,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addDwInfo, updateDwInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -234,6 +238,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -246,7 +251,7 @@ const formRules = ref<any>({
const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
@ -310,6 +315,16 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
const keyword = inputValue || '';
@ -342,7 +357,7 @@ watch(
continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? resolveSelectLabel(key, oldNorm)
? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm))
: oldNorm === null
? '空'
: String(oldNorm);
@ -371,19 +386,57 @@ watch(
);
// record
const isInitLoading = ref(false);
watch(
() => props.record,
newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
},
{ deep: true }
);
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
const loadEngOptions = async (baseId?: string) => {
engLoading.value = true;
try {
@ -418,15 +471,14 @@ const loadDropdownData = () => {
value: item.sttpCode
}));
});
baseNameOptions.value = jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}));
// store computed
};
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -187,6 +187,8 @@
<a-textarea
v-model:value="formData.introduce"
placeholder="请输入简介"
:maxlength="1000"
show-count
:rows="2"
/>
</a-form-item>
@ -196,6 +198,8 @@
<a-textarea
v-model:value="formData.remark"
placeholder="请输入备注"
:maxlength="150"
show-count
:rows="2"
/>
</a-form-item>
@ -214,7 +218,7 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import { addOtteInfo, updateOtteInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -242,6 +246,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -254,13 +259,10 @@ const formRules = ref<any>({
const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}))
.map((item: any) => ({ label: item.wbsName, value: item.wbsCode }))
);
const engLoading = ref(false);
@ -325,6 +327,16 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
const keyword = inputValue || '';
@ -356,7 +368,7 @@ watch(
continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect
? resolveSelectLabel(key, oldNorm)
? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm))
: oldNorm === null
? '空'
: String(oldNorm);
@ -384,19 +396,58 @@ watch(
{ deep: true }
);
// record
const isInitLoading = ref(false);
watch(
() => props.record,
newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
},
{ deep: true }
);
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
const loadEngOptions = async (baseId?: string) => {
engLoading.value = true;
try {
@ -429,15 +480,14 @@ const loadDropdownData = () => {
value: item.sttpCode
}));
});
baseNameOptions.value = jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({
label: item.wbsName,
value: item.wbsCode
}));
// store computed
};
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -57,12 +57,12 @@
</a-col>
<a-col :span="8">
<a-form-item label="开工日期" name="swdt">
<a-date-picker v-model:value="formData.swdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择开工日期" style="width: 100%" />
<a-date-picker v-model:value="formData.swdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择开工日期" :disabled-date="disabledSwdtDate" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="建成日期" name="jcdt">
<a-date-picker v-model:value="formData.jcdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择建成日期" style="width: 100%" />
<a-date-picker v-model:value="formData.jcdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择建成日期" :disabled-date="disabledJcdtDate" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8">
@ -123,7 +123,8 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import dayjs from 'dayjs';
import { message } from 'ant-design-vue';
import { addFbInfo, updateFbInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -143,6 +144,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -154,7 +156,7 @@ const formRules = ref<any>({
const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({ label: item.wbsName, value: item.wbsCode }))
@ -189,11 +191,32 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
return label.includes(inputValue || '');
};
//
const disabledSwdtDate = (current: any) => {
if (!formData.value.jcdt) return false;
return current && current > dayjs(formData.value.jcdt).endOf('day');
};
//
const disabledJcdtDate = (current: any) => {
if (!formData.value.swdt) return false;
return current && current < dayjs(formData.value.swdt).startOf('day');
};
watch(() => formData.value, newData => {
const original = originalRecord.value;
for (const key in newData) {
@ -206,7 +229,7 @@ watch(() => formData.value, newData => {
if (oldNorm === newNorm) continue;
if (oldNorm !== null && newNorm !== null && !isNaN(Number(oldNorm)) && !isNaN(Number(newNorm)) && Number(oldNorm) === Number(newNorm)) continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect ? resolveSelectLabel(key, oldNorm) : oldNorm === null ? '空' : String(oldNorm);
const oldDisplay = isSelect ? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm)) : oldNorm === null ? '空' : String(oldNorm);
const newDisplay = isSelect ? resolveSelectLabel(key, newNorm) : newNorm === null ? '空' : String(newNorm);
const entry = { field: key, label: fieldLabelMap[key] || key, oldValue: oldDisplay, newValue: newDisplay };
if (existingIdx >= 0) changeOrder.value[existingIdx] = entry;
@ -217,15 +240,54 @@ watch(() => formData.value, newData => {
}
}, { deep: true });
// record
const isInitLoading = ref(false);
watch(() => props.record, newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
}, { deep: true });
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
const loadEngOptions = async (baseId?: string) => {
engLoading.value = true;
try {
@ -245,13 +307,15 @@ const loadDropdownData = () => {
}).then(res => {
sttpOptions.value = (res.data?.data || []).map((item: any) => ({ label: item.sttpName, value: item.sttpCode }));
});
baseNameOptions.value = jidiSelectEventStore.jidiData
.filter((item: any) => item.wbsCode !== 'all')
.map((item: any) => ({ label: item.wbsName, value: item.wbsCode }));
// store computed
};
//
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -50,12 +50,12 @@
</a-col>
<a-col :span="12">
<a-form-item label="开工日期" name="swdt">
<a-date-picker v-model:value="formData.swdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择开工日期" style="width: 100%" />
<a-date-picker v-model:value="formData.swdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" :disabled-date="disabledSwdtDate" placeholder="请选择开工日期" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="建成日期" name="jcdt">
<a-date-picker v-model:value="formData.jcdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择建成日期" style="width: 100%" />
<a-date-picker v-model:value="formData.jcdt" format="YYYY-MM-DD" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择建成日期" style="width: 100%" :disabled-date="disabledJcdtDate" />
</a-form-item>
</a-col>
<a-col :span="12">
@ -81,7 +81,8 @@
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { ref, computed, watch, nextTick } from 'vue';
import dayjs from 'dayjs';
import { message } from 'ant-design-vue';
import { addVpInfo, updateVpInfo } from '@/api/DataQueryMenuModule';
import { getEngInfoDropdown } from '@/api/select';
@ -101,6 +102,7 @@ const formRef = ref();
const confirmLoading = ref(false);
const formData = ref<any>({});
const originalRecord = ref<any>({});
const originalLabels = ref<Record<string, string>>({});
const confirmModalVisible = ref(false);
const formRules = ref<any>({
@ -113,14 +115,14 @@ const engInfoOptions = ref<any[]>([]);
const sttpOptions = ref<any[]>([]);
const engLoading = ref(false);
const baseNameOptions = ref<any[]>(
const baseNameOptions = computed(() =>
jidiSelectEventStore.jidiData.filter((item: any) => item.wbsCode !== 'all').map((item: any) => ({ label: item.wbsName, value: item.wbsCode }))
);
const fieldLabelMap: Record<string, string> = {
stcd: '植物园编码', stnm: '植物园名称', stlc: '站址', sttp: '测站类型',
baseId: '水电基地', rstcd: '所属电站', swdt: '开工日期', jcdt: '建成日期',
bhfs: '保护方式', area: '面积(km²)', inv: '投资(亿元)',
bhfs: '保护方式', area: '面积(km²)', inv: '投资(亿元)',
lgtd: '经度(°)', lttd: '纬度(°)'
};
@ -143,11 +145,33 @@ const resolveSelectLabel = (field: string, value: any): string => {
return String(value);
};
// rstcd record ennm
const resolveOriginalLabel = (field: string): string => {
const original = originalRecord.value;
if (field === 'rstcd') {
const ennm = original.ennm || original.rstcdName;
if (ennm) return String(ennm);
}
return resolveSelectLabel(field, original[field]);
};
const filterOption = (inputValue: string, option: any) => {
const label = option.label || option.value;
return label.includes(inputValue || '');
};
//
const disabledSwdtDate = (current: any) => {
if (!formData.value.jcdt) return false;
return current && current > dayjs(formData.value.jcdt).endOf('day');
};
//
const disabledJcdtDate = (current: any) => {
if (!formData.value.swdt) return false;
return current && current < dayjs(formData.value.swdt).startOf('day');
};
watch(() => formData.value, newData => {
const original = originalRecord.value;
for (const key in newData) {
@ -160,7 +184,7 @@ watch(() => formData.value, newData => {
if (oldNorm === newNorm) continue;
if (oldNorm !== null && newNorm !== null && !isNaN(Number(oldNorm)) && !isNaN(Number(newNorm)) && Number(oldNorm) === Number(newNorm)) continue;
const isSelect = !!selectOptionsMap[key];
const oldDisplay = isSelect ? resolveSelectLabel(key, oldNorm) : oldNorm === null ? '空' : String(oldNorm);
const oldDisplay = isSelect ? (originalLabels.value[key] ?? resolveSelectLabel(key, oldNorm)) : oldNorm === null ? '空' : String(oldNorm);
const newDisplay = isSelect ? resolveSelectLabel(key, newNorm) : newNorm === null ? '空' : String(newNorm);
const entry = { field: key, label: fieldLabelMap[key] || key, oldValue: oldDisplay, newValue: newDisplay };
if (existingIdx >= 0) changeOrder.value[existingIdx] = entry;
@ -171,15 +195,54 @@ watch(() => formData.value, newData => {
}
}, { deep: true });
// record
const isInitLoading = ref(false);
watch(() => props.record, newRecord => {
if (newRecord) {
isInitLoading.value = true;
const converted = { ...newRecord };
// "-" null date-picker Invalid Date
for (const key in converted) {
if (converted[key] === '-') {
converted[key] = null;
}
}
originalRecord.value = { ...converted };
formData.value = { ...converted };
changeOrder.value = [];
// rstcd diff
loadEngOptions(converted.baseId || undefined);
// select label
const labels: Record<string, string> = {};
for (const key in converted) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
// true
nextTick(() => {
isInitLoading.value = false;
});
}
}, { deep: true });
// record code
watch(
[baseNameOptions, engInfoOptions, sttpOptions],
() => {
const original = originalRecord.value;
if (!original || Object.keys(original).length === 0) return;
const labels: Record<string, string> = {};
for (const key in original) {
if (selectOptionsMap[key]) {
labels[key] = resolveOriginalLabel(key);
}
}
originalLabels.value = labels;
}
);
const loadEngOptions = async (baseId?: string) => {
engLoading.value = true;
try {
@ -199,11 +262,15 @@ const loadDropdownData = () => {
}).then(res => {
sttpOptions.value = (res.data?.data || []).map((item: any) => ({ label: item.sttpName, value: item.sttpCode }));
});
baseNameOptions.value = jidiSelectEventStore.jidiData.filter((item: any) => item.wbsCode !== 'all').map((item: any) => ({ label: item.wbsName, value: item.wbsCode }));
// store computed
};
//
watch(() => formData.value?.baseId, (newBaseId) => {
// record record watch
if (isInitLoading.value) {
return;
}
formData.value.rstcd = undefined;
loadEngOptions(newBaseId || undefined);
});

View File

@ -15,6 +15,7 @@
format="YYYY-MM-DD"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="起始时间"
:allow-clear="false"
:showToday="false"
>
<template #renderExtraFooter>
@ -33,6 +34,7 @@
<a-form-item-rest>
<a-date-picker
class="w-[120px]"
:allow-clear="false"
v-model:value="jcdt.max"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD HH:mm:ss"

View File

@ -119,7 +119,7 @@ const tableScrollX = computed(() =>
//
const columnsManual: any[] = [
{
key: 'stnm',
key: 'ennm',
title: '电站名称',
dataIndex: 'stnm',
visible: true,
@ -261,9 +261,9 @@ const columnsManual: any[] = [
//
const columnsAuto: any[] = [
{
key: 'stnm',
key: 'ennm',
title: '电站名称',
dataIndex: 'stnm',
dataIndex: 'ennm',
visible: true,
width: 200,
sort: true,

View File

@ -14,6 +14,7 @@
v-model:value="jcdt.min"
:format="timeFormat"
value-format="YYYY-MM-DD HH:mm:ss"
:allow-clear="false"
:picker="timePicker"
:showTime="timeShowTime"
placeholder="起始时间"
@ -40,6 +41,7 @@
:format="timeFormat"
value-format="YYYY-MM-DD HH:mm:ss"
:picker="timePicker"
:allow-clear="false"
:showTime="timeShowTime"
:disabledDate="disabledEndDate"
placeholder="结束时间"

View File

@ -363,6 +363,7 @@ const displayColumns = computed(() => {
});
const onSearchFinish = async (values: any) => {
// debugger
currentSearchParams.value = values;
await nextTick();
initTable(values);
@ -438,7 +439,7 @@ const initTable = (values: any) => {
: null,
values.rstcd
? {
field: 'rstcd',
field: 'stcd',
operator: 'eq',
dataType: 'string',
value: values.rstcd

View File

@ -16,6 +16,7 @@
value-format="YYYY-MM-DD HH:mm:ss"
:picker="timePicker"
:showTime="timeShowTime"
:allow-clear="false"
placeholder="起始时间"
:showToday="false"
:showNow="false"
@ -42,6 +43,7 @@
:picker="timePicker"
:showTime="timeShowTime"
:disabledDate="disabledEndDate"
:allow-clear="false"
placeholder="结束时间"
:showToday="false"
:showNow="false"

View File

@ -593,8 +593,7 @@ const transformData = (data: any) => {
})
.reverse();
const total = data?.data?.data?.[0]?.total || 0;
const total = data?.data?.total || 0;
tableData.value = formattedData;
//

View File

@ -17,6 +17,7 @@
:picker="timePicker"
:showTime="timeShowTime"
placeholder="起始时间"
:allow-clear="false"
:showToday="false"
:showNow="false"
>
@ -43,6 +44,7 @@
:showTime="timeShowTime"
:disabledDate="disabledEndDate"
placeholder="结束时间"
:allow-clear="false"
:showToday="false"
:showNow="false"
>

View File

@ -5,7 +5,7 @@ export default {
</script>
<script setup lang="ts">
import { onMounted, reactive, ref, nextTick } from 'vue';
import { onMounted, reactive, ref, nextTick, watch } from 'vue';
import { ElMessage, ElMessageBox, FormRules } from 'element-plus';
import Sortable from 'sortablejs';
import { useAppStore } from '@/store/modules/app';
@ -31,6 +31,17 @@ const treedata: any = ref([]);
const treeRef = ref();
const treeId = ref('');
const defaultProps = { label: 'dictName' };
//
const treeFilterText = ref('');
function filterNode(value: string, data: any) {
if (!value) return true;
return data.dictName?.includes(value);
}
watch(treeFilterText, (val) => {
treeRef.value?.filter(val);
});
//
const title = ref('');
const dialogdict = ref(false);
@ -432,6 +443,12 @@ const total = ref();
/>
新增字典</el-button
>
<el-input
v-model="treeFilterText"
placeholder="请输入关键字过滤"
clearable
style="margin-bottom: 10px"
/>
<el-tree
v-loading="treeloading"
ref="treeRef"
@ -446,9 +463,10 @@ const total = ref();
draggable
:highlight-current="true"
:props="defaultProps"
:filter-node-method="filterNode"
@node-click="handleNodeClick"
@node-drop="treenodeDrop"
style="height: calc(100vh - 254px); overflow: auto"
style="height: calc(100vh - 304px); overflow: auto"
>
<template #default="{ node, data }">
<span class="custom-tree-node">

View File

@ -13,7 +13,7 @@ import {
addDept,
renewDept,
deleDept,
assignmentPer,
permissionAssignmentGrouped,
setMenuById,
setOrgscope,
postOrgscope
@ -28,7 +28,8 @@ const tree = ref();
const loading = ref(false);
function gettableData() {
let params = {
rolename: input.value
rolename: input.value,
tenantId: '2'
};
loading.value = true;
listRolePages(params)
@ -115,7 +116,8 @@ function confirmClick(formEl: any) {
const params = {
rolename: info.value.rolename,
level: info.value.level,
description: info.value.description
description: info.value.description,
tenantId:'2'
};
addDept(params).then(() => {
gettableData();
@ -126,7 +128,8 @@ function confirmClick(formEl: any) {
rolename: info.value.rolename,
level: info.value.level,
description: info.value.description,
id: info.value.id
id: info.value.id,
tenantId:'2'
};
renewDept(params).then(() => {
gettableData();
@ -274,12 +277,13 @@ function assignment(row: any) {
rowid.value = row.id;
accessVisible.value = true;
const params = {
roleId: rowid.value
roleId: rowid.value,
tenantId: '2'
};
assignmentPer(params).then((res: any) => {
accessdata.value = res;
permissionAssignmentGrouped(params).then((res: any) => {
accessdata.value = res[0]?.menus || [];
let ids: any = [];
menuChange(res, ids);
menuChange(res[0]?.menus, ids);
nextTick(() => {
tree.value.setCheckedKeys(ids);
});

View File

@ -51,6 +51,14 @@ export function assignmentPer (queryParams:any){
params: queryParams
});
}
//获取分配权限(改动之后)
export function permissionAssignmentGrouped (queryParams:any){
return request({
url:'/system/menu/permissionAssignmentGrouped' ,
method: 'post',
params: queryParams
});
}
//发出分配权限
export function setMenuById (queryParams:any){
return request({

View File

@ -47,7 +47,7 @@ const basicSearchRef = ref<any>();
const btnLoading = ref<boolean>(false);
const initSearchData = {
rvcd: 'all',
reachcd: 'all',
stcd: null,
reportMonth: dayjs().subtract(1, 'month').format('YYYY-MM')
};
@ -57,7 +57,7 @@ const searchData = ref<any>({ ...initSearchData });
const searchList: any = computed(() => [
{
type: 'waterStation',
name: 'rvcd',
name: 'reachcd',
label: '流域',
fieldProps: {
allowClear: true
@ -86,7 +86,7 @@ const onValuesChange = (changedValues: any, allValues: any) => {
searchData.value = { ...searchData.value, ...allValues };
if (
Object.keys(changedValues)[0] == 'rstcd' ||
Object.keys(changedValues)[0] == 'rvcd'
Object.keys(changedValues)[0] == 'reachcd'
) {
const formInstance = basicSearchRef.value?.formData;
formInstance.stcd = null;

View File

@ -353,11 +353,11 @@ const handleDetailSearchFinish = (values: any) => {
dataType: 'date',
value: values.strdt[1] + ' 23:59:59'
},
values.rvcd !== 'all' && {
values.reachcd !== 'all' && {
field: 'basinCode',
operator: 'eq',
dataType: 'string',
value: values.rvcd
value: values.reachcd
},
values.rstcd && {
field: 'stationCode',

View File

@ -35,7 +35,7 @@ const localTypeDate = ref<string>(null);
const basicSearchRef = ref<any>();
const initSearchData = {
rvcd: "all",
reachcd: "all",
stcd: null,
rstcd: null,
ftp: null,
@ -52,7 +52,7 @@ const searchData = ref<any>({ ...initSearchData });
const searchList: any = computed(() => [
{
type: "waterStation",
name: "rvcd",
name: "reachcd",
label: "流域",
fieldProps: {
allowClear: true,
@ -121,7 +121,7 @@ const onValuesChange = (changedValues: any, allValues: any) => {
if (
Object.keys(changedValues)[0] == "rstcd" ||
Object.keys(changedValues)[0] == "baseId" ||
Object.keys(changedValues)[0] == "rvcd"
Object.keys(changedValues)[0] == "reachcd"
) {
const formInstance = basicSearchRef.value?.formData;
formInstance.stcd = null;

View File

@ -315,11 +315,11 @@ const handleSearchFinish = (values: any) => {
dataType: 'string',
value: values.rstcd
},
values.rvcd !== 'all' && {
values.reachcd !== 'all' && {
field: 'rvcd',
operator: 'eq',
dataType: 'string',
value: values.rvcd
value: values.reachcd
}
].filter(Boolean);

View File

@ -886,11 +886,17 @@ const handleSearchFinish = (values: any) => {
value: values.rstcd
},
values.reachcd !== 'all' && {
field: 'reachcd',
field: 'rvcd',
operator: 'eq',
dataType: 'string',
value: values.reachcd
}
},
// values.rvcd !== 'all' && {
// field: 'reachcd',
// operator: 'eq',
// dataType: 'string',
// value: values.reachcd
// }
// values.baseId !== "all" && {
// field: "baseId",
// operator: "eq",

View File

@ -30,7 +30,7 @@ const localTypeDate = ref<string>(null);
const basicSearchRef = ref<any>();
const initSearchData = {
rvcd: 'all',
reachcd: 'all',
stcd: null,
rstcd: null
// strdt: [
@ -44,7 +44,7 @@ const searchData = ref<any>({ ...initSearchData });
const searchList: any = computed(() => [
{
type: 'waterStation',
name: 'rvcd',
name: 'reachcd',
label: '流域',
fieldProps: {
allowClear: true
@ -74,7 +74,7 @@ const onValuesChange = (changedValues: any, allValues: any) => {
searchData.value = { ...searchData.value, ...allValues };
if (
Object.keys(changedValues)[0] == 'rstcd' ||
Object.keys(changedValues)[0] == 'rvcd'
Object.keys(changedValues)[0] == 'reachcd'
) {
const formInstance = basicSearchRef.value?.formData;
formInstance.stcd = null;

View File

@ -361,11 +361,11 @@ const handleSearchFinish = (values: any) => {
dataType: 'string',
value: values.status
},
values.rvcd !== 'all' && {
values.reachcd !== 'all' && {
field: 'rvcd',
operator: 'eq',
dataType: 'string',
value: values.rvcd
value: values.reachcd
},
values.stcd && {
field: 'stcd',
@ -605,11 +605,11 @@ const handleDetailSearchFinish = (values: any) => {
dataType: 'string',
value: values.rstcd
},
values.rvcd !== 'all' && {
values.reachcd !== 'all' && {
field: 'rvcd',
operator: 'eq',
dataType: 'string',
value: values.rvcd
value: values.reachcd
},
approvalId.value && {
field: 'approvalId', //

View File

@ -61,7 +61,7 @@ const emit = defineEmits<{
// initSearchData
const initSearchData = {
rvcd: "all",
reachcd: "all",
stcd: "",
status: "",
};
@ -71,7 +71,7 @@ const searchData = ref<any>({ ...initSearchData });
const searchList: any = computed(() => [
{
type: "waterStation",
name: "rvcd",
name: "reachcd",
label: "流域",
fieldProps: {
allowClear: true,

View File

@ -1,23 +1,23 @@
<script lang="ts">
export default {
name: "role",
name: 'role'
};
</script>
<script setup lang="ts">
import { onMounted, ref, nextTick } from "vue";
import { ElForm, ElMessage, ElMessageBox } from "element-plus";
import { onMounted, ref, nextTick } from 'vue';
import { ElForm, ElMessage, ElMessageBox } from 'element-plus';
import {
listRolePages,
isvaildTo,
addDept,
renewDept,
deleDept,
assignmentPer,
permissionAssignmentGrouped,
setMenuById,
setOrgscope,
postOrgscope,
} from "@/api/role";
postOrgscope
} from '@/api/role';
//
const tableData: any = ref([]);
const multipleSelection = ref([]);
@ -29,10 +29,11 @@ const loading = ref(false);
function gettableData() {
let params = {
rolename: input.value,
tenantId: '4'
};
loading.value = true;
listRolePages(params)
.then((result) => {
.then(result => {
tableData.value = result;
loading.value = false;
})
@ -46,26 +47,26 @@ function handleSelectionChange(val: any) {
}
function switchChange(row: any) {
const elMessage = ref();
if (row.isvaild == "0") {
elMessage.value = "确定设置该角色为无效吗?";
} else if (row.isvaild == "1") {
elMessage.value = "确定设置该角色为有效吗?";
if (row.isvaild == '0') {
elMessage.value = '确定设置该角色为无效吗?';
} else if (row.isvaild == '1') {
elMessage.value = '确定设置该角色为有效吗?';
}
ElMessageBox.confirm(elMessage.value, "提示信息", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
ElMessageBox.confirm(elMessage.value, '提示信息', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
let params = {
isvaild: row.isvaild,
id: row.id,
id: row.id
};
isvaildTo(params).then(() => {
gettableData();
ElMessage({
type: "success",
message: "改变成功",
type: 'success',
message: '改变成功'
});
});
})
@ -75,35 +76,35 @@ function switchChange(row: any) {
}
const infoForm = ref();
//
const input = ref("");
const input = ref('');
//
const title = ref("");
const title = ref('');
const info: any = ref({
rolename: "",
level: "2",
description: "",
rolename: '',
level: '2',
description: ''
});
const faultList: any = [
{
value: "1",
label: "超级管理员",
value: '1',
label: '超级管理员'
},
{
value: "2",
label: "系统管理员",
value: '2',
label: '系统管理员'
},
{
value: "3",
label: "一般用户",
},
value: '3',
label: '一般用户'
}
];
const dialogVisible = ref(false);
function addClick() {
title.value = "新增角色";
title.value = '新增角色';
info.value = {
rolename: "",
level: "2",
description: "",
rolename: '',
level: '2',
description: ''
};
dialogVisible.value = true;
}
@ -116,6 +117,7 @@ function confirmClick(formEl: any) {
rolename: info.value.rolename,
level: info.value.level,
description: info.value.description,
tenantId: '4'
};
addDept(params).then(() => {
gettableData();
@ -127,6 +129,7 @@ function confirmClick(formEl: any) {
level: info.value.level,
description: info.value.description,
id: info.value.id,
tenantId: '4'
};
renewDept(params).then(() => {
gettableData();
@ -150,12 +153,12 @@ function handleClose() {
}
//-rules
const rules = ref({
rolename: [{ required: true, message: "请输入角色名称", trigger: "blur" }],
level: [{ required: true, message: "请选择角色级别", trigger: "change" }],
rolename: [{ required: true, message: '请输入角色名称', trigger: 'blur' }],
level: [{ required: true, message: '请选择角色级别', trigger: 'change' }]
});
//
function editrole(row: any) {
title.value = "修改角色";
title.value = '修改角色';
info.value = JSON.parse(JSON.stringify(row));
dialogVisible.value = true;
}
@ -163,9 +166,9 @@ function editrole(row: any) {
const businessVisible = ref(false);
function businessclick() {
// businessVisible.value = true;
ElMessageBox.confirm("此模块允许用户进行定制。", "提示信息", {
confirmButtonText: "确定",
type: "warning",
ElMessageBox.confirm('此模块允许用户进行定制。', '提示信息', {
confirmButtonText: '确定',
type: 'warning'
}).then(() => {
businessVisible.value = false;
});
@ -178,14 +181,14 @@ function businessclick() {
//
const organizeVisible = ref(false);
const deptdata = ref();
const roleIda = ref("");
const roleIda = ref('');
function organizeclick(row: any) {
organizeVisible.value = true;
roleIda.value = row.id;
const params = {
roleId: row.id,
roleId: row.id
};
setOrgscope(params).then((res) => {
setOrgscope(params).then(res => {
deptdata.value = res;
});
}
@ -194,7 +197,9 @@ function accessCheckAllChange(indexone: any) {
for (var j = 0; j < deptdata.value[indexone].children.length; j++) {
Arrayall.value.push(deptdata.value[indexone].children[j].orgname);
}
deptdata.value[indexone].array = deptdata.value[indexone].checkinfo ? Arrayall : [];
deptdata.value[indexone].array = deptdata.value[indexone].checkinfo
? Arrayall
: [];
deptdata.value[indexone].bool = false;
}
function accessCheckedCitiesChanges(indexone: any) {
@ -216,31 +221,31 @@ function organizesubmit() {
});
const params = {
id: roleIda.value,
orgscope: allid.value.toString(),
orgscope: allid.value.toString()
};
postOrgscope(params).then(() => {
ElMessage({
type: "success",
message: "组织范围修改成功",
type: 'success',
message: '组织范围修改成功'
});
organizeVisible.value = false;
});
}
//
function delrole(row: any) {
ElMessageBox.confirm("确定删除此角色吗?", "删除提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
ElMessageBox.confirm('确定删除此角色吗?', '删除提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = {
id: row.id,
id: row.id
};
deleDept(params).then(() => {
gettableData();
ElMessage({
type: "success",
message: "删除成功",
type: 'success',
message: '删除成功'
});
});
});
@ -253,8 +258,8 @@ const DefaultDeployment: any = ref([]);
//id
const Passparameter: any = ref([]);
const defaultProps = {
children: "children",
label: "name",
children: 'children',
label: 'name'
};
const rowid = ref();
function menuChange(data: any, ids: any) {
@ -273,12 +278,12 @@ function assignment(row: any) {
accessVisible.value = true;
const params = {
roleId: rowid.value,
code: '4'
tenantId: '4'
};
assignmentPer(params).then((res: any) => {
accessdata.value = res;
permissionAssignmentGrouped(params).then((res: any) => {
accessdata.value = res[0]?.menus || [];
let ids: any = [];
menuChange(res, ids);
menuChange(res[0]?.menus, ids);
nextTick(() => {
tree.value.setCheckedKeys(ids);
});
@ -287,42 +292,44 @@ function assignment(row: any) {
//
function currentChecked(_nodeObj: any, SelectedObj: any) {
Passparameter.value = SelectedObj.checkedKeys.concat(SelectedObj.halfCheckedKeys);
Passparameter.value = SelectedObj.checkedKeys.concat(
SelectedObj.halfCheckedKeys
);
}
// --
function accesssubmit() {
const parans = {
id: rowid.value,
menuIds: Passparameter.value.toString(),
menuIds: Passparameter.value.toString()
};
setMenuById(parans).then(() => {
accessVisible.value = false;
gettableData();
ElMessage({
type: "success",
message: "修改成功",
type: 'success',
message: '修改成功'
});
});
}
//
function delClick() {
ElMessageBox.confirm("确定删除已选择角色吗?", "删除提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
ElMessageBox.confirm('确定删除已选择角色吗?', '删除提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let id = [] as any[];
multipleSelection.value.forEach((item: any) => {
id.push(item.id);
});
let params = {
id: id.join(","),
id: id.join(',')
};
deleDept(params).then(() => {
gettableData();
ElMessage({
message: "删除成功",
type: "success",
message: '删除成功',
type: 'success'
});
});
});
@ -333,14 +340,32 @@ function dateFormat(row: any) {
var date = new Date(daterc);
var year = date.getFullYear();
var month =
date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
var day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
var minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
date.getMonth() + 1 < 10
? '0' + (date.getMonth() + 1)
: date.getMonth() + 1;
date.getMonth() + 1 < 10
? '0' + (date.getMonth() + 1)
: date.getMonth() + 1;
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();
var minutes =
date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
var seconds =
date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
//
return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
return (
year +
'-' +
month +
'-' +
day +
' ' +
hours +
':' +
minutes +
':' +
seconds
);
}
}
@ -369,13 +394,20 @@ onMounted(() => {
style="width: 200px"
clearable
/>
<el-button type="primary" style="margin-left: 10px" @click="gettableData"
<el-button
type="primary"
style="margin-left: 10px"
@click="gettableData"
>搜索</el-button
>
</div>
<div>
<el-button v-hasPerm="['add:role']" type="primary" @click="addClick">
<img src="@/assets/MenuIcon/jscz_xz.png" alt="" style="margin-right: 3px" />
<img
src="@/assets/MenuIcon/jscz_xz.png"
alt=""
style="margin-right: 3px"
/>
新增</el-button
>
<el-button
@ -399,12 +431,24 @@ onMounted(() => {
:header-cell-style="{
background: 'rgb(250 250 250)',
color: '#383838',
height: '50px',
height: '50px'
}"
>
<el-table-column type="selection" width="50" align="center"></el-table-column>
<el-table-column prop="rolecode" label="角色编号" width="100"></el-table-column>
<el-table-column prop="rolename" label="角色名称" width="180"></el-table-column>
<el-table-column
type="selection"
width="50"
align="center"
></el-table-column>
<el-table-column
prop="rolecode"
label="角色编号"
width="100"
></el-table-column>
<el-table-column
prop="rolename"
label="角色名称"
width="180"
></el-table-column>
<el-table-column prop="level" label="角色级别" width="116">
<template #default="scope">
<span v-show="scope.row.level == '1'">超级管理员</span>
@ -417,7 +461,12 @@ onMounted(() => {
label="角色描述"
min-width="100"
></el-table-column>
<el-table-column prop="isvaild" label="是否有效" align="center" width="120">
<el-table-column
prop="isvaild"
label="是否有效"
align="center"
width="120"
>
<template #default="scope">
<el-switch
v-model="scope.row.isvaild"
@ -426,7 +475,9 @@ onMounted(() => {
active-value="1"
inactive-value="0"
></el-switch>
<span v-if="scope.row.isvaild == 1" style="color: #0099ff">有效</span>
<span v-if="scope.row.isvaild == 1" style="color: #0099ff"
>有效</span
>
<span v-else style="color: #d7d7d7">无效</span>
</template>
</el-table-column>
@ -538,7 +589,9 @@ onMounted(() => {
"
>
<el-button @click="handleClose"> </el-button>
<el-button type="primary" @click="confirmClick(infoForm)"> </el-button>
<el-button type="primary" @click="confirmClick(infoForm)"
> </el-button
>
</span>
</el-form>
</el-dialog>
@ -586,9 +639,12 @@ onMounted(() => {
@change="accessCheckedCitiesChanges(indexone)"
style="margin-left: 20px"
>
<el-checkbox v-for="k in item.children" :key="k.id" :label="k.orgname">{{
k.orgname
}}</el-checkbox>
<el-checkbox
v-for="k in item.children"
:key="k.id"
:label="k.orgname"
>{{ k.orgname }}</el-checkbox
>
</el-checkbox-group>
</div>
</div>
@ -682,7 +738,7 @@ onMounted(() => {
display: inline-block;
width: 120px;
font-size: 14px;
font-family: "微软雅黑";
font-family: '微软雅黑';
font-weight: 400;
font-style: normal;
color: #787878;

View File

@ -51,6 +51,14 @@ export function assignmentPer (queryParams:any){
params: queryParams
});
}
//获取分配权限(改动之后)
export function permissionAssignmentGrouped (queryParams:any){
return request({
url:'/system/menu/permissionAssignmentGrouped' ,
method: 'post',
params: queryParams
});
}
//发出分配权限
export function setMenuById (queryParams:any){
return request({

View File

@ -95,9 +95,9 @@ const columns = [
},
{
title: '创建人',
key: 'recordUser',
dataIndex: 'recordUser',
width: 150
key: 'recordUserName',
dataIndex: 'recordUserName',
width: 100
},
{
title: '创建时间',

View File

@ -13,11 +13,12 @@ import {
addDept,
renewDept,
deleDept,
assignmentPer,
permissionAssignmentGrouped,
setMenuById,
setOrgscope,
postOrgscope
} from '@/api/role';
import { getDictItemsByCode } from '@/api/dict';
//
const tableData: any = ref([]);
const multipleSelection = ref([]);
@ -28,7 +29,8 @@ const tree = ref();
const loading = ref(false);
function gettableData() {
let params = {
rolename: input.value
rolename: input.value,
tenantId:tenValue.value,
};
loading.value = true;
listRolePages(params)
@ -115,7 +117,8 @@ function confirmClick(formEl: any) {
const params = {
rolename: info.value.rolename,
level: info.value.level,
description: info.value.description
description: info.value.description,
tenantId:tenValue.value
};
addDept(params).then(() => {
gettableData();
@ -126,7 +129,8 @@ function confirmClick(formEl: any) {
rolename: info.value.rolename,
level: info.value.level,
description: info.value.description,
id: info.value.id
id: info.value.id,
tenantId:tenValue.value
};
renewDept(params).then(() => {
gettableData();
@ -274,12 +278,13 @@ function assignment(row: any) {
rowid.value = row.id;
accessVisible.value = true;
const params = {
roleId: rowid.value
roleId: rowid.value,
tenantId:tenValue.value
};
assignmentPer(params).then((res: any) => {
accessdata.value = res;
permissionAssignmentGrouped(params).then((res: any) => {
accessdata.value = res[0]?.menus || [];
let ids: any = [];
menuChange(res, ids);
menuChange(res[0]?.menus, ids);
nextTick(() => {
tree.value.setCheckedKeys(ids);
});
@ -364,9 +369,13 @@ function dateFormat(row: any) {
);
}
}
let tenValue = ref('1')
let tenOption = ref([])
onMounted(() => {
gettableData();
getDictItemsByCode({ dictCode: 'PLATFORM_TENANT' }).then(res => {
tenOption.value = res.data;
});
});
</script>
@ -390,6 +399,15 @@ onMounted(() => {
style="width: 200px"
clearable
/>
<el-select v-model="tenValue" placeholder=" " style="width: 320px;margin-left: 10px">
<el-option
v-for="item in tenOption"
:key="item.itemCode"
:label="item.dictName"
:value="item.itemCode"
/>
<!-- PLATFORM_TENANT -->
</el-select>
<el-button
type="primary"
style="margin-left: 10px"