管道气线

This commit is contained in:
‘huanghaiixia’
2025-10-27 15:24:17 +08:00
parent 231ba89c53
commit fc3e7c10b7
16 changed files with 297 additions and 81 deletions

View File

@ -35,7 +35,7 @@ export async function getTreeData(params: LngBRegionPageParams, mode: ErrorMessa
/** /**
* @description: 分节点查询LngBRegion树 * @description: 分节点查询LngBRegion树
*/ */
export async function getTreeChild(params: LngBRegionPageParams, mode: ErrorMessageMode = 'modal') { export async function getAreaList(params: LngBRegionPageParams, mode: ErrorMessageMode = 'modal') {
return defHttp.get<LngBRegionPageResult>( return defHttp.get<LngBRegionPageResult>(
{ {
url: Api.TreeChild, url: Api.TreeChild,

View File

@ -14,6 +14,7 @@ enum Api {
Disable= '/mdm/pipelineGgasLine/disable', Disable= '/mdm/pipelineGgasLine/disable',
DataLog = '/mdm/pipelineGgasLine/datalog', DataLog = '/mdm/pipelineGgasLine/datalog',
lNGStation = '/mdm/lNGStation/list'
} }
/** /**
@ -119,4 +120,18 @@ export async function disableLngBPngLine(ids: string[], mode: ErrorMessageMode =
errorMessageMode: mode, errorMessageMode: mode,
}, },
); );
}
/**
* @description: 获取LNG气源地数据
*/
export async function getIngStation(params: LngBPngLinePageParams, mode: ErrorMessageMode = 'modal') {
return defHttp.get<boolean>(
{
url: Api.lNGStation,
params
},
{
errorMessageMode: mode,
},
);
} }

View File

@ -27,6 +27,7 @@ import SelectUserV2 from './components/SelectUserV2.vue';
import SelectUserShowTree from './components/SelectUserShowTree.vue'; import SelectUserShowTree from './components/SelectUserShowTree.vue';
import CommonInfo from './components/CommonInfo.vue'; import CommonInfo from './components/CommonInfo.vue';
import SelectArea from './components/SelectArea.vue'; import SelectArea from './components/SelectArea.vue';
import SelectAreaCascader from './components/SelectAreaCascader.vue';
import AutoCodeRule from './components/AutoCodeRule.vue'; import AutoCodeRule from './components/AutoCodeRule.vue';
import MoneyChineseInput from './components/MoneyChineseInput.vue'; import MoneyChineseInput from './components/MoneyChineseInput.vue';
import Image from './components/Image.vue'; import Image from './components/Image.vue';
@ -108,6 +109,7 @@ componentMap.set('User', SelectUserV2);
componentMap.set('UserTree', SelectUserShowTree); componentMap.set('UserTree', SelectUserShowTree);
componentMap.set('Info', CommonInfo); componentMap.set('Info', CommonInfo);
componentMap.set('Area', SelectArea); componentMap.set('Area', SelectArea);
componentMap.set('AreaCascader', SelectAreaCascader);
componentMap.set('SubForm', SubForm); componentMap.set('SubForm', SubForm);
componentMap.set('Button', Button); componentMap.set('Button', Button);
componentMap.set('SelectMap', SelectMap); componentMap.set('SelectMap', SelectMap);

View File

@ -0,0 +1,187 @@
<template>
<Cascader v-model:value="emitData" :options="options" :load-data="loadData" change-on-select @change="handleChange" :displayRender="handleRenderDisplay">
<template #suffixIcon v-if="loading">
<LoadingOutlined spin />
</template>
<template #notFoundContent v-if="loading">
<span>
<LoadingOutlined spin class="mr-1" />
{{ t('component.form.apiSelectNotFound') }}
</span>
</template>
</Cascader>
</template>
<script lang="ts" setup>
import { ref, unref, watch } from 'vue';
import { Cascader } from 'ant-design-vue';
import { get, omit } from 'lodash-es';
import { LoadingOutlined } from '@ant-design/icons-vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { getAreaList } from '/@/api/mdm/CountryRegion';
interface Option {
value: string;
label: string;
loading?: boolean;
isLeaf?: boolean;
children?: Option[];
}
const props = defineProps({
value: String,
excludeType: String
});
const emit = defineEmits(['change', 'defaultChange', 'update:value']);
const apiData = ref<any[]>([]);
const options = ref<Option[]>([]);
const loading = ref<boolean>(false);
const emitData = ref<any[]>([]);
const isChange = ref(false);
const labelField = 'name';
const valueField = 'id';
const childrenField = 'children';
const resultField = 'data';
const asyncFetchParamKey = 'pid';
const { t } = useI18n();
watch(
() => props.value,
async (val, oldVal) => {
if (!val && !!oldVal && val !== oldVal) {
//重置
emitData.value = [];
return;
}
//选择时不重复请求接口
if (isChange.value) return;
if (val) {
emitData.value = val.split(',');
} else {
emitData.value = [];
}
await initialFetch();
},
{
immediate: true
}
);
watch(
apiData,
(data) => {
options.value = generatorOptions(data);
if (emitData.value.length > 1) {
getParentNodes(emitData.value, options.value);
}
},
{ deep: true }
);
function generatorOptions(options: any[]): Option[] {
return options.reduce((prev, next: Recordable) => {
if (next) {
const value = next[valueField];
const item = {
...omit(next, [labelField, valueField]),
...next,
label: next[labelField],
value: `${value}`,
isLeaf: !next.hasChild
};
const children = Reflect.get(next, childrenField);
if (children) {
Reflect.set(item, childrenField, generatorOptions(children));
}
prev.push(item);
}
return prev;
}, [] as Option[]);
}
async function initialFetch() {
apiData.value = [];
loading.value = true;
try {
const res = await getAreaList({ pid: '', excludeType:props.excludeType });
if (Array.isArray(res)) {
apiData.value = res;
return;
}
if (resultField) {
apiData.value = get(res, resultField) || [];
}
} catch (error) {
console.warn(error);
} finally {
loading.value = false;
}
}
async function loadData(selectedOptions: Option[]) {
const targetOption = selectedOptions[selectedOptions.length - 1];
targetOption.loading = true;
try {
const res = await getAreaList({
[asyncFetchParamKey]: Reflect.get(targetOption, 'id'),
excludeType:props.excludeType
});
if (Array.isArray(res)) {
const children = generatorOptions(res);
targetOption.children = children;
return;
}
if (resultField) {
const children = generatorOptions(get(res, resultField) || []);
targetOption.children = children;
}
} catch (e) {
console.error(e);
} finally {
targetOption.loading = false;
}
}
//数据回显
function getParentNodes(ids: any[], tree: any[]) {
ids.forEach((id) => {
tree.forEach(async (item: any) => {
if (item.code === id) {
item.children = [];
const res = await getAreaList({ pid: item.id,excludeType:props.excludeType });
item.children = res.map((child) => {
return {
...child,
label: child.name,
value: child.id,
isLeaf: !child.hasChild
};
});
getParentNodes(ids, item.children);
}
});
});
}
function handleChange(keys) {
isChange.value = true;
if (!keys) {
emit('change', keys);
return;
}
emit('change', keys.join(','));
emit('update:value', keys?.join(','));
emitData.value = props.value === undefined ? keys : emitData.value;
}
function handleRenderDisplay({ labels, selectedOptions }) {
if (unref(emitData).length === selectedOptions.length) {
return labels.join(` / `);
}
}
</script>

View File

@ -130,6 +130,7 @@ export type ComponentType =
| 'UserTree' | 'UserTree'
| 'Info' | 'Info'
| 'Area' | 'Area'
| 'AreaCascader'
| 'SubForm' | 'SubForm'
| 'DicSelect' | 'DicSelect'
| 'DbSelect' | 'DbSelect'

View File

@ -32,6 +32,7 @@ import SelectUser from './components/SelectUser.vue';
import CommonInfo from './components/CommonInfo.vue'; import CommonInfo from './components/CommonInfo.vue';
import SelectArea from './components/SelectArea.vue'; import SelectArea from './components/SelectArea.vue';
// import SelectArea from './components/SelectArea.vue'; // import SelectArea from './components/SelectArea.vue';
import SelectAreaCascader from './components/SelectAreaCascader.vue';
import { BasicUpload } from '/@/components/Upload'; import { BasicUpload } from '/@/components/Upload';
import { StrengthMeter } from '/@/components/StrengthMeter'; import { StrengthMeter } from '/@/components/StrengthMeter';
@ -69,7 +70,7 @@ componentMap.set('Dept', SelectDepartment);
componentMap.set('User', SelectUser); componentMap.set('User', SelectUser);
componentMap.set('Info', CommonInfo); componentMap.set('Info', CommonInfo);
componentMap.set('Area', SelectArea); componentMap.set('Area', SelectArea);
componentMap.set('AreaCascader', SelectAreaCascader);
componentMap.set('DatePicker', DatePicker); componentMap.set('DatePicker', DatePicker);
componentMap.set('MonthPicker', DatePicker.MonthPicker); componentMap.set('MonthPicker', DatePicker.MonthPicker);
componentMap.set('RangePicker', DatePicker.RangePicker); componentMap.set('RangePicker', DatePicker.RangePicker);

View File

@ -248,4 +248,5 @@ export type ComponentType =
| 'User' | 'User'
| 'Info' | 'Info'
| 'Area' | 'Area'
| 'Text'; | 'AreaCascader'
| 'Text'

View File

@ -21,7 +21,7 @@
title: '表名', title: '表名',
dataIndex: 'tableName', dataIndex: 'tableName',
key: 'tableName', key: 'tableName',
width: 100, width: 130,
ellipsis: true, ellipsis: true,
sorter: true sorter: true
}, },
@ -29,7 +29,7 @@
title: '属性名称', title: '属性名称',
dataIndex: 'name', dataIndex: 'name',
key: 'name', key: 'name',
width: 100, width: 130,
ellipsis: true, ellipsis: true,
sorter: true sorter: true
@ -38,7 +38,7 @@
title: '操作类型', title: '操作类型',
dataIndex: 'operationType', dataIndex: 'operationType',
key: 'operationType', key: 'operationType',
width: 80, width: 100,
sorter: true, sorter: true,
customRender: ({ record }) => { customRender: ({ record }) => {
let text = record.operationType let text = record.operationType
@ -52,7 +52,7 @@
title: '原数据', title: '原数据',
dataIndex: 'oldValue', dataIndex: 'oldValue',
key: 'oldValue', key: 'oldValue',
width: 150, // width: 150,
ellipsis: true, ellipsis: true,
sorter: true sorter: true
}, },
@ -60,7 +60,7 @@
title: '新数据', title: '新数据',
dataIndex: 'newValue', dataIndex: 'newValue',
key: 'newValue', key: 'newValue',
width: 150, // width: 150,
ellipsis: true, ellipsis: true,
sorter: true sorter: true
}, },
@ -75,7 +75,7 @@
title: '操作IP', title: '操作IP',
dataIndex: 'operationIp', dataIndex: 'operationIp',
key: 'operationIp', key: 'operationIp',
width: 150, width: 120,
sorter: true sorter: true
}, },
{ {

View File

@ -616,6 +616,7 @@ export function buildAppComponentType(type: string): AppComponentType {
return AppComponentType.select; return AppComponentType.select;
case 'area': case 'area':
case 'areacascader':
case 'cascader': case 'cascader':
return AppComponentType.cascader; return AppComponentType.cascader;

View File

@ -44,13 +44,6 @@
let customFormEventConfigs=[]; let customFormEventConfigs=[];
onMounted(async () => { onMounted(async () => {
const treeData = await getTreeData({})
formProps.schemas?.forEach(v => {
if (v.field == 'regionCode') {
v.componentProps.options = treeData
}
})
console.log(formProps.schemas, 667)
try { try {
// 合并渲染覆盖配置中的字段配置、表单事件配置 // 合并渲染覆盖配置中的字段配置、表单事件配置
await mergeCustomFormRenderConfig(); await mergeCustomFormRenderConfig();
@ -125,7 +118,7 @@
async function setFormDataFromId(rowId, skipUpdate) { async function setFormDataFromId(rowId, skipUpdate) {
try { try {
let record = await getLngBBank(rowId); let record = await getLngBBank(rowId);
record = {...record, regionCode: (record.regionCode || []).split(',')} record = {...record}
if (skipUpdate) { if (skipUpdate) {
return record; return record;
} }
@ -158,7 +151,7 @@
try { try {
values[RowKey] = rowId; values[RowKey] = rowId;
state.formModel = values; state.formModel = values;
let saveVal = await updateLngBBank({...values, regionCode: (values.regionCode||[]).join(',')}); let saveVal = await updateLngBBank({...values});
await submitFormEvent(customFormEventConfigs, state.formModel, await submitFormEvent(customFormEventConfigs, state.formModel,
systemFormRef.value, systemFormRef.value,
formProps.schemas); //表单事件:提交表单 formProps.schemas); //表单事件:提交表单
@ -169,7 +162,7 @@
async function add(values) { async function add(values) {
try { try {
state.formModel = values; state.formModel = values;
let saveVal = await addLngBBank({...values, regionCode: (values.regionCode||[]).join(',')}); let saveVal = await addLngBBank({...values});
await submitFormEvent(customFormEventConfigs, state.formModel, await submitFormEvent(customFormEventConfigs, state.formModel,
systemFormRef.value, systemFormRef.value,
formProps.schemas); //表单事件:提交表单 formProps.schemas); //表单事件:提交表单

View File

@ -329,58 +329,33 @@ export const formProps: FormProps = {
}, },
}, },
{ {
key: '4', key: '1485b829c80a493bb55f37d1c839ccc9',
field: 'regionCode', field: 'regionCode',
label: '所属国家/地区', label: '所属国家/地区',
type: 'cascader', type: 'areacascader',
component: 'Cascader', component: 'AreaCascader',
colProps: { span: 8 }, colProps: { span: 8 },
defaultValue: [],
componentProps: { componentProps: {
options: [ width: '100%',
// { span: '',
// value: 'zhejiang', labelWidthMode: 'fix',
// label: '浙江省', labelFixWidth: 120,
// children: [ responsive: false,
// { respNewRow: false,
// value: 'hangzhou', placeholder: '请选择区域',
// label: '杭州市', showLabel: true,
// children: [ disabled: false,
// { allowClear: true,
// value: 'xihu', clearable: false,
// label: '西湖区', required: false,
// }, rules: [],
// ], events: {},
// }, isShow: true,
// ], style: { width: '100%' },
// } fieldNames: {label: 'fullName', value: 'code', children: 'children'},
], excludeType: 'CONTINENT'
fieldNames: {label: 'fullName', value: 'code', children: 'children'}, }
width: '100%', },
span: '',
defaultValue: '',
labelWidthMode: 'fix',
labelFixWidth: 120,
responsive: false,
respNewRow: false,
placeholder: '请选择',
maxlength: null,
prefix: '',
suffix: '',
addonBefore: '',
addonAfter: '',
disabled: false,
allowClear: false,
showLabel: true,
required: false,
rules: [],
events: {},
isSave: false,
isShow: true,
scan: false,
style: { width: '100%' },
},
},
{ {
key: '6461a5e152124abca28bd2114dd577e6', key: '6461a5e152124abca28bd2114dd577e6',
field: 'swift', field: 'swift',
@ -519,15 +494,16 @@ export const formProps: FormProps = {
}, },
{ {
key: '8', key: '8',
field: 'soft', field: 'sort',
label: '显示顺序', label: '显示顺序',
type: 'input', type: 'input',
component: 'InputNumber', component: 'InputNumber',
colProps: { span: 8 }, colProps: { span: 8 },
defaultValue: '', defaultValue: null,
componentProps: { componentProps: {
width: '100%', width: '100%',
span: '', span: '',
min:0,
defaultValue: '', defaultValue: '',
labelWidthMode: 'fix', labelWidthMode: 'fix',
labelFixWidth: 120, labelFixWidth: 120,

View File

@ -236,13 +236,13 @@ export const formProps: FormProps = {
colProps: { span: 8 }, colProps: { span: 8 },
defaultValue: null, defaultValue: null,
componentProps: { componentProps: {
min:0,
labelWidthMode: 'fix', labelWidthMode: 'fix',
labelFixWidth: 120, labelFixWidth: 120,
responsive: false, responsive: false,
width: '100%', width: '100%',
span: '', span: '',
defaultValue: null, defaultValue: null,
min: 0,
max: null, max: null,
step: 1, step: 1,
maxlength: null, maxlength: null,

View File

@ -7,10 +7,10 @@
/> />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref,onBeforeMount,onMounted } from 'vue'; import { reactive, ref,onBeforeMount,onMounted,watch } from 'vue';
import { formProps, formEventConfigs ,formConfig} from './config'; import { formProps, formEventConfigs ,formConfig} from './config';
import SimpleForm from '/@/components/SimpleForm/src/SimpleForm.vue'; import SimpleForm from '/@/components/SimpleForm/src/SimpleForm.vue';
import { addLngBPngLine, getLngBPngLine, updateLngBPngLine, deleteLngBPngLine } from '/@/api/mdm/PipelineGgasLine'; import { addLngBPngLine, getLngBPngLine, updateLngBPngLine, deleteLngBPngLine, getIngStation } from '/@/api/mdm/PipelineGgasLine';
import { cloneDeep } from 'lodash-es'; import { cloneDeep } from 'lodash-es';
import { FormDataProps } from '/@/components/Designer/src/types'; import { FormDataProps } from '/@/components/Designer/src/types';
import { usePermission } from '/@/hooks/web/usePermission'; import { usePermission } from '/@/hooks/web/usePermission';
@ -33,7 +33,9 @@
default: FromPageType.MENU, default: FromPageType.MENU,
}, },
}); });
const systemFormRef = ref(); const systemFormRef = ref({
});
const data: { formDataProps: FormDataProps } = reactive({ const data: { formDataProps: FormDataProps } = reactive({
formDataProps: {schemas:[]} as FormDataProps, formDataProps: {schemas:[]} as FormDataProps,
}); });
@ -43,7 +45,43 @@
let customFormEventConfigs=[]; let customFormEventConfigs=[];
watch(
() => getFormModel(),
(newVal) => {
if (newVal.ownSign === 'Y') {
data.formDataProps.schemas?.forEach(v => {
if (v.field === 'staCodeLng') {
v.componentProps.disabled = false
v.componentProps.required = true
}
})
} else {
data.formDataProps.schemas?.forEach(v => {
if (v.field === 'staCodeLng') {
v.componentProps.disabled = true
v.componentProps.required = false
}
})
}
},
{ deep: true }
);
onMounted(async () => { onMounted(async () => {
const a = await getIngStation({ownSign :'Y', valid : 'Y'})
const b = a.map(v => {
return {
label: v.fullName,
value: v.code
}
})
formProps.schemas?.forEach(v => {
if (v.field === 'staCodeLng') {
v.componentProps.staticOptions = b
}
})
try { try {
// 合并渲染覆盖配置中的字段配置、表单事件配置 // 合并渲染覆盖配置中的字段配置、表单事件配置
await mergeCustomFormRenderConfig(); await mergeCustomFormRenderConfig();

View File

@ -348,11 +348,11 @@ export const formProps: FormProps = {
disabled: false, disabled: false,
mode: '', mode: '',
staticOptions: [ staticOptions: [
{ key: 1, label: 'Option 1', value: 'Option 1' }, // { key: 1, label: 'Option 1', value: 'Option 1' },
{ key: 2, label: 'Option 2', value: 'Option 2' }, // { key: 2, label: 'Option 2', value: 'Option 2' },
{ key: 3, label: 'Option 3', value: 'Option 3' }, // { key: 3, label: 'Option 3', value: 'Option 3' },
], ],
defaultSelect: 'Option 1', defaultSelect: '',
datasourceType: 'staticData', datasourceType: 'staticData',
labelField: 'label', labelField: 'label',
valueField: 'value', valueField: 'value',
@ -376,14 +376,14 @@ export const formProps: FormProps = {
type: 'number', type: 'number',
component: 'InputNumber', component: 'InputNumber',
colProps: { span: 8 }, colProps: { span: 8 },
defaultValue: 0, defaultValue: null,
componentProps: { componentProps: {
labelWidthMode: 'fix', labelWidthMode: 'fix',
labelFixWidth: 120, labelFixWidth: 120,
responsive: false, responsive: false,
width: '100%', width: '100%',
span: '', span: '',
defaultValue: 0, defaultValue: null,
step: 1, step: 1,
disabled: false, disabled: false,
showLabel: true, showLabel: true,
@ -391,6 +391,7 @@ export const formProps: FormProps = {
required: false, required: false,
subTotal: false, subTotal: false,
isShow: true, isShow: true,
min:0,
rules: [], rules: [],
events: {}, events: {},
style: { width: '100%' }, style: { width: '100%' },

View File

@ -289,7 +289,7 @@ export const formProps: FormProps = {
width: '100%', width: '100%',
span: '', span: '',
defaultValue: null, defaultValue: null,
min: null, min: 0,
max: null, max: null,
step: 1, step: 1,
maxlength: null, maxlength: null,

View File

@ -30,7 +30,7 @@
} from 'vue'; } from 'vue';
const modalVisible = ref(false); const modalVisible = ref(false);
const logId = ref('') const logId = ref('')
const logPath = ref('/mdm/TaxRate/datalog'); const logPath = ref('/mdm/taxRate/datalog');
import { DataLog } from '/@/components/pcitc'; import { DataLog } from '/@/components/pcitc';
import { Modal } from 'ant-design-vue'; import { Modal } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'; import { ExclamationCircleOutlined } from '@ant-design/icons-vue';