|
@@ -50,10 +50,25 @@
|
|
|
>
|
|
>
|
|
|
<a-select
|
|
<a-select
|
|
|
v-model:value="mainData.userAddressId"
|
|
v-model:value="mainData.userAddressId"
|
|
|
|
|
+ :open="mainData.openAddressPanel"
|
|
|
|
|
+ @dropdownVisibleChange="open => mainData.openAddressPanel = open"
|
|
|
style="width: 100%"
|
|
style="width: 100%"
|
|
|
placeholder="请选择收货地址"
|
|
placeholder="请选择收货地址"
|
|
|
:options="mainData.addressList"
|
|
:options="mainData.addressList"
|
|
|
- />
|
|
|
|
|
|
|
+ >
|
|
|
|
|
+ <template #dropdownRender="{ menuNode: menu }">
|
|
|
|
|
+ <v-nodes :vnodes="menu" />
|
|
|
|
|
+ <a-divider style="margin: 4px 0" />
|
|
|
|
|
+ <div style="padding: 4px 10px; text-align: center;">
|
|
|
|
|
+ <a-button type="link" @click="toAddAddress">
|
|
|
|
|
+ <template #icon>
|
|
|
|
|
+ <PlusOutlined />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <span>新增地址</span>
|
|
|
|
|
+ </a-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </a-select>
|
|
|
</a-form-item>
|
|
</a-form-item>
|
|
|
<a-form-item
|
|
<a-form-item
|
|
|
label="出货仓库"
|
|
label="出货仓库"
|
|
@@ -155,14 +170,23 @@
|
|
|
</a-flex>
|
|
</a-flex>
|
|
|
</a-flex>
|
|
</a-flex>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <AddressModal
|
|
|
|
|
+ :show-select="true"
|
|
|
|
|
+ :show-edit="true"
|
|
|
|
|
+ :open="mainData.addressOpen"
|
|
|
|
|
+ @change="changeAddressFn"
|
|
|
|
|
+ @close="mainData.addressOpen = false"
|
|
|
|
|
+ @select="selectAddressFn"
|
|
|
|
|
+ />
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="js">
|
|
<script setup lang="js">
|
|
|
import dayjs from 'dayjs';
|
|
import dayjs from 'dayjs';
|
|
|
|
|
+import AddressModal from './AddressModal.vue';
|
|
|
import { message } from 'ant-design-vue';
|
|
import { message } from 'ant-design-vue';
|
|
|
import { MinusOutlined, PlusOutlined } from '@ant-design/icons-vue';
|
|
import { MinusOutlined, PlusOutlined } from '@ant-design/icons-vue';
|
|
|
-import { ref, reactive, onMounted, computed } from 'vue';
|
|
|
|
|
|
|
+import { ref, reactive, nextTick, onMounted, computed, defineComponent } from 'vue';
|
|
|
import { ackOrder, orderBuy } from '@/api/order';
|
|
import { ackOrder, orderBuy } from '@/api/order';
|
|
|
import { getAddressList, getPickTimeList } from '@/api/user';
|
|
import { getAddressList, getPickTimeList } from '@/api/user';
|
|
|
import { useUserStore } from '@/store/user';
|
|
import { useUserStore } from '@/store/user';
|
|
@@ -189,6 +213,18 @@ const props = defineProps({
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+const VNodes = defineComponent({
|
|
|
|
|
+ props: {
|
|
|
|
|
+ vnodes: {
|
|
|
|
|
+ type: Object,
|
|
|
|
|
+ required: true,
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ render() {
|
|
|
|
|
+ return this.vnodes
|
|
|
|
|
+ }
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
const formRef = ref(null)
|
|
const formRef = ref(null)
|
|
|
const mainData = reactive({
|
|
const mainData = reactive({
|
|
|
goodsList: [],
|
|
goodsList: [],
|
|
@@ -206,7 +242,9 @@ const mainData = reactive({
|
|
|
freight: '',
|
|
freight: '',
|
|
|
isGiftGoods: false,
|
|
isGiftGoods: false,
|
|
|
isFullPieceGoods: false,
|
|
isFullPieceGoods: false,
|
|
|
- disabled: false
|
|
|
|
|
|
|
+ disabled: false,
|
|
|
|
|
+ addressOpen: false,
|
|
|
|
|
+ openAddressPanel: false
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const storageName = computed(() => {
|
|
const storageName = computed(() => {
|
|
@@ -218,10 +256,10 @@ const isCreditPay = computed(() => {
|
|
|
return userDetail.value.isCreditEnabled && (userDetail.value.availableCredit - payTotalAmount > 0)
|
|
return userDetail.value.isCreditEnabled && (userDetail.value.availableCredit - payTotalAmount > 0)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
-const fetchAddressList = async() => {
|
|
|
|
|
|
|
+const fetchAddressList = async(refresh = false) => {
|
|
|
const res = await getAddressList({
|
|
const res = await getAddressList({
|
|
|
pageNum: 1,
|
|
pageNum: 1,
|
|
|
- pageSize: 100,
|
|
|
|
|
|
|
+ pageSize: -1,
|
|
|
userId: props.userId
|
|
userId: props.userId
|
|
|
})
|
|
})
|
|
|
mainData.addressList = (res.data?.records || []).map(item => {
|
|
mainData.addressList = (res.data?.records || []).map(item => {
|
|
@@ -231,7 +269,14 @@ const fetchAddressList = async() => {
|
|
|
...item
|
|
...item
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
- mainData.userAddressId = mainData.addressList.find(item => item.defaultAddr)?.userAddressId || undefined;
|
|
|
|
|
|
|
+ if (!refresh) {
|
|
|
|
|
+ mainData.userAddressId = mainData.addressList.find(item => item.defaultAddr)?.userAddressId || undefined;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ const target = mainData.addressList.find(item => item.userAddressId === mainData.userAddressId);
|
|
|
|
|
+ if (!target) {
|
|
|
|
|
+ mainData.userAddressId = undefined;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const fetchPickTimeList = async () => {
|
|
const fetchPickTimeList = async () => {
|
|
@@ -315,7 +360,6 @@ const setDispatchTimeRange = () => {
|
|
|
]
|
|
]
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const getSendTime = () => {
|
|
const getSendTime = () => {
|
|
@@ -379,6 +423,21 @@ const formatPriceText = price => {
|
|
|
return price.toFixed(2)
|
|
return price.toFixed(2)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+const toAddAddress = () => {
|
|
|
|
|
+ mainData.openAddressPanel = false
|
|
|
|
|
+ mainData.addressOpen = true
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const changeAddressFn = () => {
|
|
|
|
|
+ fetchAddressList(true)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const selectAddressFn = row => {
|
|
|
|
|
+ fetchAddressList(true)
|
|
|
|
|
+ mainData.userAddressId = row.userAddressId
|
|
|
|
|
+ mainData.addressOpen = false
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
const checkAddress = (rule, value) => {
|
|
const checkAddress = (rule, value) => {
|
|
|
if (mainData.takeGoodsType != TakeTypeEnum.DISPATCH) return Promise.resolve()
|
|
if (mainData.takeGoodsType != TakeTypeEnum.DISPATCH) return Promise.resolve()
|
|
|
if (!value) return Promise.reject('收获地址不能为空')
|
|
if (!value) return Promise.reject('收获地址不能为空')
|