调整基础数据模块

This commit is contained in:
2026-08-07 13:36:51 +08:00
parent 04ab648f5b
commit 56729c8cc9
6 changed files with 194 additions and 50 deletions
+117 -17
View File
@@ -33,8 +33,6 @@ export const createOption = () => ({
{
label: '地址名称',
prop: 'addressName',
search: true,
searchOrder: 8,
span: 24,
minWidth: 150,
showOverflowTooltip: true,
@@ -58,8 +56,6 @@ export const createOption = () => ({
prop: 'addressType',
type: 'select',
formslot: true,
search: true,
searchOrder: 7,
span: 24,
minWidth: 140,
dicData: addressTypeOptions,
@@ -76,8 +72,6 @@ export const createOption = () => ({
{
label: '详细地址',
prop: 'detailAddress',
search: true,
searchOrder: 5,
formslot: true,
type: 'textarea',
minRows: 3,
@@ -108,8 +102,6 @@ export const createOption = () => ({
{
label: '行政区划',
prop: 'regionName',
search: true,
searchOrder: 4,
display: false,
minWidth: 150,
rules: [{ required: true, message: '请选择行政区划', trigger: 'change' }],
@@ -117,8 +109,6 @@ export const createOption = () => ({
{
label: '联系人',
prop: 'contactName',
search: true,
searchOrder: 2,
minWidth: 110,
placeholder: '请输入',
maxlength: 50,
@@ -127,12 +117,14 @@ export const createOption = () => ({
{
label: '联系方式',
prop: 'contactPhone',
search: true,
searchOrder: 1,
minWidth: 130,
placeholder: '请输入',
maxlength: 20,
rules: [{ max: 20, message: '联系方式不能超过20个字', trigger: 'blur' }],
formslot: true,
rules: [
{ max: 20, message: '联系方式不能超过20个字', trigger: 'blur' },
{ pattern: /^\d*$/, message: '联系方式只能输入数字', trigger: 'blur' },
],
},
{
label: '组织',
@@ -214,8 +206,6 @@ export const createOption = () => ({
{
label: '站点编码',
prop: 'siteCode',
search: true,
searchOrder: 6,
hide: true,
addDisplay: false,
editDisplay: false,
@@ -224,11 +214,121 @@ export const createOption = () => ({
label: '组织',
prop: 'deptId',
type: 'select',
search: true,
searchOrder: 3,
hide: true,
display: false,
dicData: [],
},
// 搜索字段与表格、表单字段独立,避免筛选配置影响数据展示和编辑布局。
{
label: '地址名称',
prop: 'searchAddressName',
searchProp: 'addressName',
search: true,
searchOrder: 8,
searchPlaceholder: '请输入',
hide: true,
display: false,
addDisplay: false,
editDisplay: false,
viewDisplay: false,
},
{
label: '类型',
prop: 'searchAddressType',
searchProp: 'addressType',
type: 'select',
searchType: 'select',
search: true,
searchOrder: 7,
searchPlaceholder: '请选择',
dicData: addressTypeOptions,
hide: true,
display: false,
addDisplay: false,
editDisplay: false,
viewDisplay: false,
},
{
label: '详细地址',
prop: 'searchDetailAddress',
searchProp: 'detailAddress',
search: true,
searchOrder: 6,
searchPlaceholder: '请输入',
hide: true,
display: false,
addDisplay: false,
editDisplay: false,
viewDisplay: false,
},
{
label: '行政区划',
prop: 'searchRegionName',
searchProp: 'regionName',
search: true,
searchOrder: 5,
searchPlaceholder: '请输入',
hide: true,
display: false,
addDisplay: false,
editDisplay: false,
viewDisplay: false,
},
{
label: '站点编码',
prop: 'searchSiteCode',
searchProp: 'siteCode',
search: true,
searchOrder: 4,
searchPlaceholder: '请输入',
hide: true,
display: false,
addDisplay: false,
editDisplay: false,
viewDisplay: false,
},
{
label: '组织',
prop: 'searchDeptId',
searchProp: 'deptId',
type: 'select',
searchType: 'select',
search: true,
searchOrder: 3,
searchPlaceholder: '请选择',
dicData: [],
filterable: true,
hide: true,
display: false,
addDisplay: false,
editDisplay: false,
viewDisplay: false,
},
{
label: '联系人',
prop: 'searchContactName',
searchProp: 'contactName',
search: true,
searchOrder: 2,
searchPlaceholder: '请输入',
hide: true,
display: false,
addDisplay: false,
editDisplay: false,
viewDisplay: false,
},
{
label: '联系方式',
prop: 'searchContactPhone',
searchProp: 'contactPhone',
search: true,
searchOrder: 1,
searchPlaceholder: '请输入',
hide: true,
display: false,
addDisplay: false,
editDisplay: false,
viewDisplay: false,
},
],
});
+6 -16
View File
@@ -75,6 +75,7 @@ export const option = createCrudOption([
display: false,
addDisplay: false,
editDisabled: true,
minWidth: 180,
},
// 搜索字段与表格、表单字段独立,避免筛选配置影响数据展示和编辑布局。
{
@@ -169,31 +170,20 @@ export const option = createCrudOption([
viewDisplay: false,
},
{
label: '包装品牌',
prop: 'packageBrand',
slot: true,
minWidth: 150,
addDisplay: false,
editDisplay: false,
viewDisplay: false,
label: '包装',
prop: 'packageType',
type: 'select',
dicData: packageOptions,
minWidth: 100,
},
{
label: '品牌',
prop: 'brand',
search: false,
hide: true,
minWidth: 120,
placeholder: '请输入',
rules: textRule('品牌', 50),
},
{
label: '包装',
prop: 'packageType',
type: 'select',
dicData: packageOptions,
hide: true,
minWidth: 100,
},
{
label: '规格',
prop: 'specification',
+19 -1
View File
@@ -195,6 +195,17 @@
/>
</div>
</template>
<template #contactPhone-form>
<el-input
v-model="form.contactPhone"
:disabled="dialogReadonly"
inputmode="numeric"
maxlength="20"
placeholder="请输入"
@input="handleContactPhoneInput"
/>
</template>
</avue-crud>
<el-dialog
@@ -326,7 +337,7 @@ export default {
initDeptTree() {
getDeptTree(this.userInfo.tenantId).then(res => {
this.deptOptions = this.flattenDept(res.data.data || []);
const deptColumn = this.findColumn(this.option.column, 'deptId');
const deptColumn = this.findColumn(this.option.column, 'searchDeptId');
deptColumn.dicData = this.deptOptions;
});
},
@@ -736,6 +747,9 @@ export default {
const numberValue = Number(value);
return Number.isFinite(numberValue) ? numberValue.toFixed(6) : '';
},
handleContactPhoneInput(value) {
this.form.contactPhone = String(value || '').replace(/\D/g, '');
},
normalizeRow(row) {
const trimValue = value => String(value || '').trim();
const submitRow = {
@@ -820,6 +834,10 @@ export default {
this.$message.warning('联系方式不能超过20个字');
return false;
}
if (row.contactPhone && !/^\d+$/.test(row.contactPhone)) {
this.$message.warning('联系方式只能输入数字');
return false;
}
if (row.remark && row.remark.length > 200) {
this.$message.warning('备注不能超过200个字');
return false;
+19 -14
View File
@@ -108,14 +108,18 @@
<template #cargoCode-form>
<el-input
v-model="form.cargoCode"
:model-value="getCargoCodeSuffix()"
clearable
maxlength="20"
:maxlength="getCargoCodeMaxLength()"
show-word-limit
placeholder="请输入"
:disabled="dialogReadonly || dialogType === 'edit'"
@input="handleCargoCodeInput"
/>
>
<template v-if="getCargoCodePrefix()" #prepend>
{{ getCargoCodePrefix() }}
</template>
</el-input>
</template>
<template #cargoValue-form>
@@ -143,10 +147,6 @@
</div>
</template>
<template #packageBrand="{ row }">
{{ [row.packageType, row.brand].filter(Boolean).join(' / ') || '-' }}
</template>
<template #menu="{ row, index }">
<el-link
type="primary"
@@ -357,6 +357,14 @@ export default {
? String(this.form.secondCargoTypeCode).slice(0, 4)
: '';
},
getCargoCodeSuffix() {
const prefix = this.getCargoCodePrefix();
const cargoCode = String(this.form.cargoCode || '');
return prefix && cargoCode.startsWith(prefix) ? cargoCode.slice(prefix.length) : cargoCode;
},
getCargoCodeMaxLength() {
return 20 - this.getCargoCodePrefix().length;
},
syncCargoCodePrefix() {
const prefix = this.getCargoCodePrefix();
const current = String(this.form.cargoCode || '').replace(/\D/g, '');
@@ -369,13 +377,10 @@ export default {
},
handleCargoCodeInput(value) {
const prefix = this.getCargoCodePrefix();
const input = String(value || '').replace(/\D/g, '');
if (!prefix) {
this.form.cargoCode = input.slice(0, 20);
return;
}
const suffix = input.startsWith(prefix) ? input.slice(prefix.length) : input;
this.form.cargoCode = `${prefix}${suffix}`.slice(0, 20);
const suffix = String(value || '')
.replace(/\D/g, '')
.slice(0, this.getCargoCodeMaxLength());
this.form.cargoCode = `${prefix}${suffix}`;
},
handleCargoValueInput(value) {
const raw = String(value || '').replace(/[^\d.]/g, '');
+15 -1
View File
@@ -394,6 +394,7 @@ export default {
},
},
created() {
this.applyDefaultDeptSearch();
this.initDeptTree();
},
methods: {
@@ -434,6 +435,18 @@ export default {
defaultDeptId() {
return (this.userInfo && (this.userInfo.deptId || this.userInfo.dept_id)) || '';
},
applyDefaultDeptSearch() {
const deptId = this.defaultDeptId();
const deptColumn = this.findColumn(this.option.column, 'searchDeptId');
if (!deptId || !deptColumn) return;
deptColumn.searchValue = deptId;
this.query = { ...this.query, deptId };
this.$nextTick(() => {
if (this.$refs.crud?.searchForm) {
this.$refs.crud.searchForm.searchDeptId = deptId;
}
});
},
resetAddressQuery() {
this.addressQuery = {
addressName: '',
@@ -883,8 +896,9 @@ export default {
},
searchReset() {
this.query = {};
this.applyDefaultDeptSearch();
this.page.currentPage = 1;
this.onLoad(this.page);
this.onLoad(this.page, this.query);
},
searchChange(params, done) {
this.query = params;
+18 -1
View File
@@ -527,6 +527,7 @@ export default {
created() {
this.resetNodeRows();
this.loadProjectOptions('');
this.applyDefaultDeptSearch();
this.initDeptOptions();
},
methods: {
@@ -545,6 +546,21 @@ export default {
}
});
},
defaultDeptId() {
return (this.userInfo && (this.userInfo.deptId || this.userInfo.dept_id)) || '';
},
applyDefaultDeptSearch() {
const deptId = this.defaultDeptId();
const deptColumn = this.findColumn(this.option.column, 'searchDeptId');
if (!deptId || !deptColumn) return;
deptColumn.searchValue = deptId;
this.query = { ...this.query, deptId };
this.$nextTick(() => {
if (this.$refs.crud?.searchForm) {
this.$refs.crud.searchForm.searchDeptId = deptId;
}
});
},
flattenDept(tree, level = 0) {
return tree.flatMap(item => [
{
@@ -953,8 +969,9 @@ export default {
},
searchReset() {
this.query = {};
this.applyDefaultDeptSearch();
this.page.currentPage = 1;
this.onLoad(this.page);
this.onLoad(this.page, this.query);
},
searchChange(params, done) {
this.query = params;