Merge pull request '下单国家和省份不一致校验' (#3) from master-dev into master

Reviewed-on: http://git.xdadan.loc/tanex/emis-oms-frontend/pulls/3
This commit is contained in:
wuteng 2025-10-09 17:35:25 +08:00
commit 7c6dd75648
2 changed files with 166 additions and 6 deletions

View File

@ -0,0 +1,114 @@
<template>
<!-- style="width:100%" -->
<el-select
style="width:100%"
filterable
clearable
v-model="svalue"
no-data-text=""
:disabled="disabled"
auto-complete="off"
:placeholder="placeholder"
@change="onChange"
@click.native="onClick"
>
<el-option v-for="item in optionItems" :key="item.regionCode" :label="item.regionName" :value="item.regionCode" />
</el-select>
</template>
<script>
import { listSimpleEmisRegion } from "@/api/oms/emisRegion";
export default {
name: "ProvincePicker",
props: {
value: {
type: String,
required: false
},
countryCode: {
type: String,
required: false
},
placeholder: {
type: String,
required: false
},
disabled: {
type: Boolean,
required: false,
default:false
},
},
data() {
return {
svalue: this.value,
optionItems: [],
// 缺省值
defaultItems: null,
};
},
watch: {
value(newVal,oldVal) {
if (newVal !== this.svalue) {
this.svalue = newVal;
this.queryData(null, newVal).then(() => {
// 当异步数据加载完成后,手动触发一次回调
const currentItem = this.optionItems.find(item => item.regionCode === this.svalue);
this.$emit("onChange", currentItem);
});
}
},
countryCode(newVal, oldVal) {
if(newVal!=oldVal){
this.defaultItems=null;
}
}
},
created() {
if(this.svalue!=null){
this.queryData(null,this.svalue);
}
},
methods: {
onClick(){
// 第一次点击时需要初始化
if(!this.defaultItems){
this.queryData(null,null);
}else{
this.optionItems = [...this.defaultItems];
}
},
onChange() {
this.$emit("input", this.svalue);
const currentItem = this.optionItems.find(item => item.regionCode === this.svalue);
this.$emit("onChange", currentItem);
},
queryData(val,key) {
this.optionItems =[];
let queryParams = {
pageNum:1,
pageSize:100,
countryCode:this.countryCode,
regionCode:key,
regionType:1
};
return listSimpleEmisRegion(queryParams).then(response => {
this.optionItems = response.rows;
// 初始值存储
if(key==null && val==null){
this.defaultItems=[...this.optionItems]
}
});
},
}
};
</script>

View File

@ -87,7 +87,7 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item :label="$t('发货地区')" prop="sender.province" > <el-form-item :label="$t('发货地区')" prop="sender.province" >
<div style="display:inline-flex"> <div style="display:inline-flex">
<province-picker1 v-model="form.sender.province" :countryCode="form.sender.country" @onChange="handleCalcSendSite"></province-picker1> <province-picker1 v-model="form.sender.province" :countryCode="form.sender.country" @onChange="onHandleProvinceChange"></province-picker1>
<city-picker1 v-model="form.sender.city" :parentCode="form.sender.province" style="margin-left:5px" @onChange="handleCalcSendSite"></city-picker1> <city-picker1 v-model="form.sender.city" :parentCode="form.sender.province" style="margin-left:5px" @onChange="handleCalcSendSite"></city-picker1>
<district-picker1 v-model="form.sender.county" :parentCode="form.sender.city" style="margin-left:5px" @onChange="handleCalcSendSite"></district-picker1> <district-picker1 v-model="form.sender.county" :parentCode="form.sender.city" style="margin-left:5px" @onChange="handleCalcSendSite"></district-picker1>
</div> </div>
@ -158,7 +158,7 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item :label="$t('收货地区')" prop="reciever.province"> <el-form-item :label="$t('收货地区')" prop="reciever.province">
<div style="display:inline-flex"> <div style="display:inline-flex">
<ProvincePicker2 v-model="form.reciever.province" :countryCode="form.reciever.country" @onChange="handleCalcDestSite" ></ProvincePicker2> <ProvincePicker2 v-model="form.reciever.province" :countryCode="form.reciever.country" @onChange="onHandleRecieverProvinceChange" ></ProvincePicker2>
<city-picker2 v-model="form.reciever.city" :parentCode="form.reciever.province" style="margin-left:5px" @onChange="handleCalcDestSite" ></city-picker2> <city-picker2 v-model="form.reciever.city" :parentCode="form.reciever.province" style="margin-left:5px" @onChange="handleCalcDestSite" ></city-picker2>
<district-picker2 v-model="form.reciever.county" :parentCode="form.reciever.city" style="margin-left:5px" @onChange="handleCalcDestSite" ></district-picker2> <district-picker2 v-model="form.reciever.county" :parentCode="form.reciever.city" style="margin-left:5px" @onChange="handleCalcDestSite" ></district-picker2>
</div> </div>
@ -818,12 +818,12 @@ import TransProductPicker from '@/views/oms/EmisBaseTools/TransProductPicker.vue
import CountryPicker0 from '@/views/oms/EmisBaseTools/CountryPicker.vue'; import CountryPicker0 from '@/views/oms/EmisBaseTools/CountryPicker.vue';
import CountryPicker1 from '@/views/oms/EmisBaseTools/CountryPicker.vue'; import CountryPicker1 from '@/views/oms/EmisBaseTools/CountryPicker.vue';
import ProvincePicker1 from '@/views/oms/EmisBaseTools/ProvincePicker.vue'; import ProvincePicker1 from '@/views/oms/EmisBaseTools/ProvincePicker1.vue';
import CityPicker1 from '@/views/oms/EmisBaseTools/CityPicker.vue'; import CityPicker1 from '@/views/oms/EmisBaseTools/CityPicker.vue';
import DistrictPicker1 from '@/views/oms/EmisBaseTools/DistrictPicker.vue'; import DistrictPicker1 from '@/views/oms/EmisBaseTools/DistrictPicker.vue';
import CountryPicker2 from '@/views/oms/EmisBaseTools/CountryPicker.vue'; import CountryPicker2 from '@/views/oms/EmisBaseTools/CountryPicker.vue';
import ProvincePicker2 from '@/views/oms/EmisBaseTools/ProvincePicker.vue'; import ProvincePicker2 from '@/views/oms/EmisBaseTools/ProvincePicker1.vue';
import CityPicker2 from '@/views/oms/EmisBaseTools/CityPicker.vue'; import CityPicker2 from '@/views/oms/EmisBaseTools/CityPicker.vue';
import DistrictPicker2 from '@/views/oms/EmisBaseTools/DistrictPicker.vue'; import DistrictPicker2 from '@/views/oms/EmisBaseTools/DistrictPicker.vue';
@ -910,6 +910,30 @@ dicts: ['emis_qujian_fangshi','emis_declare_mode','emis_customs_clear',
'emis_tab_packing_type','emis_tab_dispatch_mode','emis_payment_type', 'emis_tab_packing_type','emis_tab_dispatch_mode','emis_payment_type',
'emis_calc_fee_type','emis_print_type'], 'emis_calc_fee_type','emis_print_type'],
data() { data() {
//校验寄件国家地区国家和省份是否匹配
var checkSenderCountryProvince = (rule, value, callback) => {
if (this.form.sender.country && this.senderCountryCode) {
if (this.form.sender.country != this.senderCountryCode) {
callback(new Error('寄件国家和省份不一致'));
} else {
callback();
}
} else {
callback();
}
}
//校验收件国家地区国家和省份是否匹配
var checkRecieverCountryProvince = (rule, value, callback) => {
if (this.form.reciever.country && this.recieverCountryCode) {
if (this.form.reciever.country != this.recieverCountryCode) {
callback(new Error('收件国家和省份不一致'));
} else {
callback();
}
} else {
callback();
}
}
return { return {
activeNames:['1','2','3','4','5'], activeNames:['1','2','3','4','5'],
billCode:null, billCode:null,
@ -940,6 +964,8 @@ data() {
} }
}, },
lastBillCode: '', // 手动缓存上一次的billCode lastBillCode: '', // 手动缓存上一次的billCode
senderCountryCode:null, // 寄件人省份国家
recieverCountryCode:null, // 收件人 省份国家
// 表单校验 // 表单校验
rules: { rules: {
// billCode: [ // billCode: [
@ -956,7 +982,8 @@ data() {
{ required: true, message: "收货人手机号不能为空", trigger: ["blur",'change'] } { required: true, message: "收货人手机号不能为空", trigger: ["blur",'change'] }
], ],
country: [ country: [
{ required: true, message: "收货人国家不能为空", trigger: ["blur",'change'] } { required: true, message: "收货人国家不能为空", trigger: ["blur",'change'] },
{ validator: checkRecieverCountryProvince, trigger: ['blur', 'change'] }
], ],
province: [ province: [
{ required: true, message: "收货省不能为空", trigger: ["blur",'change'] } { required: true, message: "收货省不能为空", trigger: ["blur",'change'] }
@ -982,7 +1009,8 @@ data() {
{ required: true, message: "寄件人手机号不能为空", trigger: ["blur",'change'] } { required: true, message: "寄件人手机号不能为空", trigger: ["blur",'change'] }
], ],
country: [ country: [
{ required: true, message: "寄件人国家不能为空", trigger: ["blur",'change'] } { required: true, message: "寄件人国家不能为空", trigger: ["blur",'change'] },
{ validator: checkSenderCountryProvince, trigger: ['blur', 'change'] }
], ],
province: [ province: [
{ required: true, message: "寄件省不能为空", trigger: ["blur",'change'] } { required: true, message: "寄件省不能为空", trigger: ["blur",'change'] }
@ -1838,6 +1866,15 @@ methods: {
handleCalcSendSite(){ handleCalcSendSite(){
this.calcSendSite(); this.calcSendSite();
}, },
// 发货地址省份发生变化
onHandleProvinceChange(val){
this.senderCountryCode=val.countryCode;
this.calcSendSite();
// 省份选择后,强制校验国家是否匹配
this.$nextTick(() => {
this.$refs.form.validateField("sender.country");
});
},
calcSendSite(){ calcSendSite(){
console.log("===>this.form.pickupMethod===>",this.form.pickupMethod); console.log("===>this.form.pickupMethod===>",this.form.pickupMethod);
@ -1864,6 +1901,15 @@ methods: {
handleCalcDestSite(){ handleCalcDestSite(){
this.calcDestSite(); this.calcDestSite();
}, },
// 接收地址省份发生变化
onHandleRecieverProvinceChange(val){
this.recieverCountryCode=val.countryCode;
this.calcDestSite();
// 省份选择后,强制校验国家是否匹配
this.$nextTick(() => {
this.$refs.form.validateField("reciever.country");
});
},
calcDestSite(){ calcDestSite(){
let queryParams = { let queryParams = {
province:this.form.reciever.province, province:this.form.reciever.province,