Commit c85eb33d by wuqian

Merge branch 'dev'

parents 7190baff 7d2db864
...@@ -10,7 +10,14 @@ import { ...@@ -10,7 +10,14 @@ import {
} from '@/types/api/podUsOrder' } from '@/types/api/podUsOrder'
import axios from './axios' import axios from './axios'
import { PodMakeOrderData } from '@/types/api/podMakeOrder' import { PodMakeOrderData } from '@/types/api/podMakeOrder'
export interface LogisticsData {
logisticsWayName: string // 物流名称
warehouseName: string // 发货仓库
status: boolean
logisticsWayCode: string // 物流编码
partition: string // 所在分区
logisticsWayId?: number | null
}
export interface AddressInfo { export interface AddressInfo {
id?:string id?:string
receiverName: string, receiverName: string,
...@@ -23,22 +30,31 @@ export interface AddressInfo { ...@@ -23,22 +30,31 @@ export interface AddressInfo {
receiverAddress2: string, receiverAddress2: string,
receiverPostCode: string, receiverPostCode: string,
} }
// 同步收货地址
export interface LogisticsData { export function syncReceiverAddress(data: number[]) {
logisticsWayName: string // 物流名称 return axios.post<never, BaseRespData<never>>(
warehouseName: string // 发货仓库 'factory/podJomallOrderUs/syncReceiverAddress',
status: boolean data,
logisticsWayCode: string // 物流编码 )
partition: string // 所在分区 }
logisticsWayId?: number | null export function refreshAddressApi(idList: number[]) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/syncReceiverAddress',
idList,
)
} }
export function updateAddressApi(data: PodUsOrderListData) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/updateReceiverAddress',
data,
)
}
export function getOrderTabData() { export function getOrderTabData() {
return axios.get<never, BaseRespData<Tab[]>>( return axios.get<never, BaseRespData<Tab[]>>(
'/factory/podJomallOrderUs/findStateGroupList', '/factory/podJomallOrderUs/findStateGroupList',
) )
} }
export function getOrderList( export function getOrderList(
params: SearchForm, params: SearchForm,
currentPage: number, currentPage: number,
...@@ -53,14 +69,12 @@ export function getOrderList( ...@@ -53,14 +69,12 @@ export function getOrderList(
}, },
) )
} }
export function handleExceptionOrderApi(orderIds: number[]) { export function handleExceptionOrderApi(orderIds: number[]) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/processExceptionOrders', 'factory/podJomallOrderUs/processExceptionOrders',
orderIds, orderIds,
) )
} }
export function getCardOrderList( export function getCardOrderList(
params: SearchForm, params: SearchForm,
currentPage: number, currentPage: number,
...@@ -75,7 +89,6 @@ export function getCardOrderList( ...@@ -75,7 +89,6 @@ export function getCardOrderList(
}, },
) )
} }
export function confirmOrderApi( export function confirmOrderApi(
data: number[], data: number[],
productionClient: string, productionClient: string,
...@@ -92,13 +105,11 @@ export function confirmOrderApi( ...@@ -92,13 +105,11 @@ export function confirmOrderApi(
}, },
) )
} }
export function getProductionClientApi() { export function getProductionClientApi() {
return axios.get<never, BaseRespData<ProductionClient[]>>( return axios.get<never, BaseRespData<ProductionClient[]>>(
'factory/podJomallOrderUs/getProductionClientList', 'factory/podJomallOrderUs/getProductionClientList',
) )
} }
export function updateExceptionOrderApi(data: number[]) { export function updateExceptionOrderApi(data: number[]) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/updateExceptionOrders', 'factory/podJomallOrderUs/updateExceptionOrders',
...@@ -107,15 +118,6 @@ export function updateExceptionOrderApi(data: number[]) { ...@@ -107,15 +118,6 @@ export function updateExceptionOrderApi(data: number[]) {
}, },
) )
} }
// 同步收货地址
export function syncReceiverAddress(data: number[]) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/syncReceiverAddress',
data,
)
}
export function changeExceptionOrderApi( export function changeExceptionOrderApi(
url: string, url: string,
ids: number[], ids: number[],
...@@ -128,7 +130,6 @@ export function changeExceptionOrderApi( ...@@ -128,7 +130,6 @@ export function changeExceptionOrderApi(
exceptionReason: value, exceptionReason: value,
}) })
} }
export function cancelOrderApi(ids: number[], value: string) { export function cancelOrderApi(ids: number[], value: string) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/cancelOrders', 'factory/podJomallOrderUs/cancelOrders',
...@@ -138,13 +139,11 @@ export function cancelOrderApi(ids: number[], value: string) { ...@@ -138,13 +139,11 @@ export function cancelOrderApi(ids: number[], value: string) {
}, },
) )
} }
export function getOperationLogApi(id: number) { export function getOperationLogApi(id: number) {
return axios.get<never, BaseRespData<LogListData[]>>( return axios.get<never, BaseRespData<LogListData[]>>(
`factory/podJomallOrderUsLog/getPodJomallOrderUsLog?id=${id}`, `factory/podJomallOrderUsLog/getPodJomallOrderUsLog?id=${id}`,
) )
} }
export function getSubOrderBySubOrderNumber(factorySubOrderNumber: string) { export function getSubOrderBySubOrderNumber(factorySubOrderNumber: string) {
return axios.get<never, BaseRespData<ProductList>>( return axios.get<never, BaseRespData<ProductList>>(
'factory/podJomallOrderProductUs/getProductUsByFactorySubOrderNumber', 'factory/podJomallOrderProductUs/getProductUsByFactorySubOrderNumber',
...@@ -155,14 +154,12 @@ export function getSubOrderBySubOrderNumber(factorySubOrderNumber: string) { ...@@ -155,14 +154,12 @@ export function getSubOrderBySubOrderNumber(factorySubOrderNumber: string) {
}, },
) )
} }
export function downloadMaterialApi(id: number[]) { export function downloadMaterialApi(id: number[]) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderProductUs/downloadDesignImages', 'factory/podJomallOrderProductUs/downloadDesignImages',
id, id,
) )
} }
export function productionQueryApi(id: number, podJomallOrderUsId: number) { export function productionQueryApi(id: number, podJomallOrderUsId: number) {
return axios.post<never, BasePaginationData<never>>( return axios.post<never, BasePaginationData<never>>(
'factory/podJomallOrderProductUs/completeDelivery', 'factory/podJomallOrderProductUs/completeDelivery',
...@@ -172,14 +169,12 @@ export function productionQueryApi(id: number, podJomallOrderUsId: number) { ...@@ -172,14 +169,12 @@ export function productionQueryApi(id: number, podJomallOrderUsId: number) {
}, },
) )
} }
export function printProductionOrderApi(orderIds: number[]) { export function printProductionOrderApi(orderIds: number[]) {
return axios.post<never, BaseRespData<string>>( return axios.post<never, BaseRespData<string>>(
'factory/podJomallOrderUs/printProducePdf', 'factory/podJomallOrderUs/printProducePdf',
orderIds, orderIds,
) )
} }
export function printPrintOrderApi(orderIds: number[]) { export function printPrintOrderApi(orderIds: number[]) {
return axios.post<never, BaseRespData<string>>( return axios.post<never, BaseRespData<string>>(
'factory/podJomallOrderUs/printPickPdf', 'factory/podJomallOrderUs/printPickPdf',
...@@ -188,7 +183,6 @@ export function printPrintOrderApi(orderIds: number[]) { ...@@ -188,7 +183,6 @@ export function printPrintOrderApi(orderIds: number[]) {
}, },
) )
} }
export function printPickingOrderApi(orderIds: number[]) { export function printPickingOrderApi(orderIds: number[]) {
return axios.post<never, BaseRespData<string>>( return axios.post<never, BaseRespData<string>>(
'factory/podJomallOrderUs/pickingComplete', 'factory/podJomallOrderUs/pickingComplete',
...@@ -197,13 +191,11 @@ export function printPickingOrderApi(orderIds: number[]) { ...@@ -197,13 +191,11 @@ export function printPickingOrderApi(orderIds: number[]) {
}, },
) )
} }
export function stockOutCheckApi(orderIds: number[]) { export function stockOutCheckApi(orderIds: number[]) {
return axios.get<never, BaseRespData<number[]>>( return axios.get<never, BaseRespData<number[]>>(
`factory/podJomallOrderUs/replenishVerify?ids=${orderIds.join(',')}`, `factory/podJomallOrderUs/replenishVerify?ids=${orderIds.join(',')}`,
) )
} }
export function toBePickingApi(orderIds: number[]) { export function toBePickingApi(orderIds: number[]) {
return axios.get<never, BaseRespData<never>>( return axios.get<never, BaseRespData<never>>(
`factory/podJomallOrderUs/updateStockOutOrderToPicking?ids=${orderIds.join( `factory/podJomallOrderUs/updateStockOutOrderToPicking?ids=${orderIds.join(
...@@ -211,13 +203,11 @@ export function toBePickingApi(orderIds: number[]) { ...@@ -211,13 +203,11 @@ export function toBePickingApi(orderIds: number[]) {
)}`, )}`,
) )
} }
export function getOrderDetailById(id: number) { export function getOrderDetailById(id: number) {
return axios.get<never, BaseRespData<ProductList>>( return axios.get<never, BaseRespData<ProductList>>(
`factory/podJomallOrderProductUs/getProductUsById?id=${id}`, `factory/podJomallOrderProductUs/getProductUsById?id=${id}`,
) )
} }
export function getPackingDataApi( export function getPackingDataApi(
code: string, code: string,
factoryNo: number, factoryNo: number,
...@@ -236,7 +226,6 @@ export function getPackingDataApi( ...@@ -236,7 +226,6 @@ export function getPackingDataApi(
}, },
) )
} }
export function getPodBoxListApi( export function getPodBoxListApi(
factoryNo: number | string, factoryNo: number | string,
warehouseId: number | string, warehouseId: number | string,
...@@ -261,7 +250,6 @@ export function submitInspectionApi( ...@@ -261,7 +250,6 @@ export function submitInspectionApi(
}, },
) )
} }
export function clearBoxApi( export function clearBoxApi(
factoryNo: number, factoryNo: number,
box: number | null, box: number | null,
...@@ -274,13 +262,11 @@ export function clearBoxApi( ...@@ -274,13 +262,11 @@ export function clearBoxApi(
}, },
) )
} }
export function clearAllBoxApi() { export function clearAllBoxApi() {
return axios.get<never, BaseRespData<never>>( return axios.get<never, BaseRespData<never>>(
'factory/podJomallOrderUs/delPodBoxOrderDetails', 'factory/podJomallOrderUs/delPodBoxOrderDetails',
) )
} }
export function updateRemarkApi(id: number, content: string) { export function updateRemarkApi(id: number, content: string) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/addRemark', 'factory/podJomallOrderUs/addRemark',
...@@ -288,40 +274,23 @@ export function updateRemarkApi(id: number, content: string) { ...@@ -288,40 +274,23 @@ export function updateRemarkApi(id: number, content: string) {
) )
} }
export function refreshAddressApi(idList: number[]) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/syncReceiverAddress',
idList,
)
}
export function updateAddressApi(data: PodUsOrderListData) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/updateReceiverAddress',
data,
)
}
export function getLogisticsCalculation(id: number) { export function getLogisticsCalculation(id: number) {
return axios.get<never, BaseRespData<never>>( return axios.get<never, BaseRespData<never>>(
'factory/podJomallOrderUs/getLogisticsCalculation', 'factory/podJomallOrderUs/getLogisticsCalculation',
{ params: { id } }, { params: { id } },
) )
} }
export function loadWarehouseListApi() { export function loadWarehouseListApi() {
return axios.get<never, BaseRespData<WarehouseListData[]>>( return axios.get<never, BaseRespData<WarehouseListData[]>>(
'factoryWarehouseInfo/getAll', 'factoryWarehouseInfo/getAll',
) )
} }
export function refreshMaterialApi(orderIds: string) { export function refreshMaterialApi(orderIds: string) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderProductUs/refreshDesignImages ', 'factory/podJomallOrderProductUs/refreshDesignImages ',
{ orderIds }, { orderIds },
) )
} }
// 获取跟踪号 // 获取跟踪号
export function getTrackingNumberApi(orderIds: (string | number)[]) { export function getTrackingNumberApi(orderIds: (string | number)[]) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
...@@ -329,7 +298,6 @@ export function getTrackingNumberApi(orderIds: (string | number)[]) { ...@@ -329,7 +298,6 @@ export function getTrackingNumberApi(orderIds: (string | number)[]) {
orderIds, orderIds,
) )
} }
// 获取打印面单 // 获取打印面单
export function getfaceSimplexFileApi(orderIds: (string | number)[]) { export function getfaceSimplexFileApi(orderIds: (string | number)[]) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
...@@ -337,7 +305,6 @@ export function getfaceSimplexFileApi(orderIds: (string | number)[]) { ...@@ -337,7 +305,6 @@ export function getfaceSimplexFileApi(orderIds: (string | number)[]) {
orderIds, orderIds,
) )
} }
// 取消物流订单 // 取消物流订单
export function cancelLogisticsOrderApi(orderIds: (string | number)[]) { export function cancelLogisticsOrderApi(orderIds: (string | number)[]) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
...@@ -345,7 +312,6 @@ export function cancelLogisticsOrderApi(orderIds: (string | number)[]) { ...@@ -345,7 +312,6 @@ export function cancelLogisticsOrderApi(orderIds: (string | number)[]) {
orderIds, orderIds,
) )
} }
// 更改物流 // 更改物流
export function changeLogisticsApi(params: { export function changeLogisticsApi(params: {
updateByIdParam: { updateByIdParam: {
...@@ -359,7 +325,6 @@ export function changeLogisticsApi(params: { ...@@ -359,7 +325,6 @@ export function changeLogisticsApi(params: {
params, params,
) )
} }
// 创建物流 // 创建物流
export function createLogisticsOrderApi(params: { export function createLogisticsOrderApi(params: {
updateByIdParam: { updateByIdParam: {
...@@ -375,13 +340,12 @@ export function createLogisticsOrderApi(params: { ...@@ -375,13 +340,12 @@ export function createLogisticsOrderApi(params: {
} }
// 更改物流 // 更改物流
export function composingDesignImages(data: number[]) { export function composingDesignImages(data:number[]) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/composingDesignImages', 'factory/podJomallOrderUs/composingDesignImages',
data, data
) )
} }
// 转至待拣胚 // 转至待拣胚
export function updateLogisticsToPickingApi(params: { ids: string }) { export function updateLogisticsToPickingApi(params: { ids: string }) {
return axios.get<never, BaseRespData<never>>( return axios.get<never, BaseRespData<never>>(
...@@ -391,7 +355,6 @@ export function updateLogisticsToPickingApi(params: { ids: string }) { ...@@ -391,7 +355,6 @@ export function updateLogisticsToPickingApi(params: { ids: string }) {
}, },
) )
} }
//创建物流订单 //创建物流订单
export function createLogisticsOrdersApi(orderIds: (string | number)[]) { export function createLogisticsOrdersApi(orderIds: (string | number)[]) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<div class="upload-area" @click="triggerFileInput"> <div class="upload-area" @click="triggerFileInput">
<el-icon class="el-icon--upload"><UploadFilled /></el-icon> <el-icon class="el-icon--upload"><UploadFilled /></el-icon>
<div class="el-upload__text"> <div class="el-upload__text">
将文件拖到此处,或<span style="color: #409eff">点击上传</span> <span style="color: #409eff">点击上传</span>
</div> </div>
</div> </div>
<input <input
...@@ -46,7 +46,14 @@ ...@@ -46,7 +46,14 @@
<script setup lang="ts"> <script setup lang="ts">
import * as XLSX from 'xlsx' import * as XLSX from 'xlsx'
import { ref, watch, defineProps, defineEmits, computed } from 'vue' import {
ref,
watch,
defineProps,
defineEmits,
computed,
defineExpose,
} from 'vue'
import { UploadFilled, Document, Close } from '@element-plus/icons-vue' import { UploadFilled, Document, Close } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { uploadFileApi } from '@/api/common' import { uploadFileApi } from '@/api/common'
...@@ -89,7 +96,7 @@ watch( ...@@ -89,7 +96,7 @@ watch(
const triggerFileInput = () => { const triggerFileInput = () => {
if (loading.value) return if (loading.value) return
fileInputRef.value?.click() if (fileInputRef.value) fileInputRef.value?.click()
} }
const downloadFile = (path: string) => { const downloadFile = (path: string) => {
window.open(path) window.open(path)
...@@ -120,8 +127,17 @@ const onFileChange = async (e: Event) => { ...@@ -120,8 +127,17 @@ const onFileChange = async (e: Event) => {
ElMessage.error('文件大小不能超过50MB') ElMessage.error('文件大小不能超过50MB')
return return
} }
if (props.importType === 'local') { if (props.importType === 'localAndUpload') {
// 本地解析 // 本地直接获取上传内容
emit('imported', { path: file.name, data: file })
if (fileInputRef.value) {
fileInputRef.value.value = ''
}
loading.value = false
return
}
if (props.importType === 'localAndXlsx') {
// 本地解析,并自行处理xlsx数据
const reader = new FileReader() const reader = new FileReader()
reader.onload = (evt) => { reader.onload = (evt) => {
const data = evt.target?.result const data = evt.target?.result
...@@ -134,6 +150,7 @@ const onFileChange = async (e: Event) => { ...@@ -134,6 +150,7 @@ const onFileChange = async (e: Event) => {
fileList.value = [{ path: file.name, filename: file.name }] fileList.value = [{ path: file.name, filename: file.name }]
value.value = file.name || '' value.value = file.name || ''
ElMessage.success('导入成功') ElMessage.success('导入成功')
loading.value = false
} }
reader.readAsBinaryString(file) reader.readAsBinaryString(file)
if (fileInputRef.value) fileInputRef.value.value = '' if (fileInputRef.value) fileInputRef.value.value = ''
...@@ -143,7 +160,18 @@ const onFileChange = async (e: Event) => { ...@@ -143,7 +160,18 @@ const onFileChange = async (e: Event) => {
await fileUpload(file) await fileUpload(file)
if (fileInputRef.value) fileInputRef.value.value = '' if (fileInputRef.value) fileInputRef.value.value = ''
} }
const resetUpload = () => {
fileList.value = []
value.value = ''
if (fileInputRef.value) {
fileInputRef.value.value = ''
}
}
// 暴露重置方法给父组件
defineExpose({
resetUpload,
})
const fileUpload = async (file: File) => { const fileUpload = async (file: File) => {
const formData = new FormData() const formData = new FormData()
const filename = file.name const filename = file.name
......
...@@ -19,7 +19,7 @@ export interface SearchForm { ...@@ -19,7 +19,7 @@ export interface SearchForm {
endTime: string | null endTime: string | null
exceptionHandling: number | undefined exceptionHandling: number | undefined
platform: string platform: string
productionClient:string productionClient: string
} }
export interface PodUsOrderListData { export interface PodUsOrderListData {
id: number id: number
...@@ -93,6 +93,7 @@ export interface ProductList { ...@@ -93,6 +93,7 @@ export interface ProductList {
tagIds?: string tagIds?: string
isProduction?: boolean isProduction?: boolean
createTime?: string createTime?: string
startStockingTime?: string | null
updateTime?: string updateTime?: string
remark?: string | null remark?: string | null
version?: number version?: number
......
...@@ -101,6 +101,7 @@ const [editForm, resetEditForm] = useValue<AddDeclarationRuleObj>({ ...@@ -101,6 +101,7 @@ const [editForm, resetEditForm] = useValue<AddDeclarationRuleObj>({
currency: 'USD', currency: 'USD',
}) })
const { const {
loading,
currentPage, currentPage,
pageSize, pageSize,
total, total,
...@@ -466,7 +467,7 @@ const tableConfig = ref<TableColumn[]>([ ...@@ -466,7 +467,7 @@ const tableConfig = ref<TableColumn[]>([
}, },
]) ])
const loading = ref(false) // const loading = ref(false)
/** /**
* @description: 取消按钮 * @description: 取消按钮
......
...@@ -436,7 +436,7 @@ onMounted(() => { ...@@ -436,7 +436,7 @@ onMounted(() => {
}) })
async function search() { async function search() {
loading.value = true // loading.value = true
const isEqual = const isEqual =
JSON.stringify(searchForm.value) === JSON.stringify({ logisticsIdList: [] }) JSON.stringify(searchForm.value) === JSON.stringify({ logisticsIdList: [] })
try { try {
...@@ -448,7 +448,7 @@ async function search() { ...@@ -448,7 +448,7 @@ async function search() {
} catch (e) { } catch (e) {
console.log(e) console.log(e)
} finally { } finally {
loading.value = false // loading.value = false
} }
} }
...@@ -729,6 +729,7 @@ function handleSizeChange(val: number) { ...@@ -729,6 +729,7 @@ function handleSizeChange(val: number) {
} }
async function getList() { async function getList() {
loading.value = true
try { try {
const { data } = await getlogisticsQuotationPage({ const { data } = await getlogisticsQuotationPage({
...searchForm.value, ...searchForm.value,
...@@ -741,10 +742,13 @@ async function getList() { ...@@ -741,10 +742,13 @@ async function getList() {
mergeCells.value = [] mergeCells.value = []
} catch (error) { } catch (error) {
console.log(error) console.log(error)
} finally {
loading.value = false
} }
} }
const templeData = ref<LogisticsQuotation[]>([]) const templeData = ref<LogisticsQuotation[]>([])
async function getSearchList() { async function getSearchList() {
loading.value = true
try { try {
const { data } = await getlogisticsQuotationList({ const { data } = await getlogisticsQuotationList({
...searchForm.value, ...searchForm.value,
...@@ -784,6 +788,8 @@ async function getSearchList() { ...@@ -784,6 +788,8 @@ async function getSearchList() {
mergeCells.value = newMergeCells mergeCells.value = newMergeCells
} catch (error) { } catch (error) {
console.log(error) console.log(error)
} finally {
loading.value = false
} }
} }
......
...@@ -74,7 +74,7 @@ const checkAll = ref(false) ...@@ -74,7 +74,7 @@ const checkAll = ref(false)
const selectedList = ref<(string | number)[]>([]) const selectedList = ref<(string | number)[]>([])
// 显示弹窗 // 显示弹窗
const showDialog = (type: string) => { const showDialog = (type?: string) => {
console.log(type) console.log(type)
resultDialog.value = true resultDialog.value = true
......
...@@ -64,8 +64,8 @@ const submitForm = async () => { ...@@ -64,8 +64,8 @@ const submitForm = async () => {
<el-form-item label="国家" prop="receiverCountry"> <el-form-item label="国家" prop="receiverCountry">
<el-select v-model="form.receiverCountry" clearable filterable> <el-select v-model="form.receiverCountry" clearable filterable>
<el-option <el-option
v-for="it in countryList" :key="it.countryCode" :label="it.countryCode" v-for="it in countryList" :key="it.countryCode" :label="it.countryCode"
:value="it.countryCode"></el-option> :value="it.countryCode"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="省/州" prop="receiverProvince"> <el-form-item label="省/州" prop="receiverProvince">
......
...@@ -400,10 +400,16 @@ ...@@ -400,10 +400,16 @@
:close-on-click-modal="false" :close-on-click-modal="false"
> >
<div class="import-dialog"> <div class="import-dialog">
<div class="import-header">
<el-button type="primary" link @click="downloadTemplate">
<el-icon><Download /></el-icon>
下载模板
</el-button>
</div>
<div class="import-content"> <div class="import-content">
<UploadExcel <UploadExcel
v-model="importedFileUrl" v-model="importedFileUrl"
:import-type="'local'" :import-type="'localAndXlsx'"
@imported="handleLocalImport" @imported="handleLocalImport"
/> />
</div> </div>
...@@ -791,7 +797,7 @@ ...@@ -791,7 +797,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ElMessage, ElRadioGroup, ElTree } from 'element-plus' import { ElMessage, ElRadioGroup, ElTree } from 'element-plus'
import { CirclePlusFilled } from '@element-plus/icons-vue' import { CirclePlusFilled,Download } from '@element-plus/icons-vue'
import splitDiv from '@/components/splitDiv/splitDiv.vue' import splitDiv from '@/components/splitDiv/splitDiv.vue'
import { ElTable } from 'element-plus' import { ElTable } from 'element-plus'
import usePageList from '@/utils/hooks/usePageList' import usePageList from '@/utils/hooks/usePageList'
...@@ -951,6 +957,14 @@ function getStartTime() { ...@@ -951,6 +957,14 @@ function getStartTime() {
const day = date.getDate() const day = date.getDate()
return `${year}-${month}-${day} 00:00:00` return `${year}-${month}-${day} 00:00:00`
} }
const downloadTemplate = () => {
const link = document.createElement('a')
link.href = '/files/outboundOrder.xlsx'
link.download = 'outboundOrder.xlsx'
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
}
const selectSku = ref('') const selectSku = ref('')
const treeData = ref<InterWarehouseTree[]>() const treeData = ref<InterWarehouseTree[]>()
const [searchForm, resetSearchForm] = useValue<warehouseSearchForm>({}) const [searchForm, resetSearchForm] = useValue<warehouseSearchForm>({})
...@@ -1097,9 +1111,9 @@ const batchAddCommodity = async (sku: string): Promise<InterskuList[]> => { ...@@ -1097,9 +1111,9 @@ const batchAddCommodity = async (sku: string): Promise<InterskuList[]> => {
} }
} }
interface InterImportData { interface InterImportData {
warehouseSku: string; warehouseSku: string
remark?: string | null; remark?: string | null
buyStored?: string | number | null | object; // 扩大 buyStored 类型,以兼容原始数据 buyStored?: string | number | null | object // 扩大 buyStored 类型,以兼容原始数据
[propName: string]: string | number | boolean | undefined | unknown [propName: string]: string | number | boolean | undefined | unknown
} }
// 前端导入Excel // 前端导入Excel
...@@ -1122,91 +1136,108 @@ const handleLocalImport = async ({ ...@@ -1122,91 +1136,108 @@ const handleLocalImport = async ({
data: Record<string, any>[] data: Record<string, any>[]
}) => { }) => {
// 1. 将原始导入数据映射到 InterImportData[] // 1. 将原始导入数据映射到 InterImportData[]
const importedData: InterImportData[] = data.map(item => { const importedData: InterImportData[] = data
const obj: InterImportData = { warehouseSku: '' }; .map((item) => {
Object.keys(excelFieldMap).forEach(excelKey => { const obj: InterImportData = { warehouseSku: '' }
const field = excelFieldMap[excelKey]; Object.keys(excelFieldMap).forEach((excelKey) => {
const value = item[excelKey]; const field = excelFieldMap[excelKey]
const value = item[excelKey]
if (field === 'warehouseSku') { if (field === 'warehouseSku') {
obj[field] = typeof value === 'string' ? value : String(value ?? ''); obj[field] = typeof value === 'string' ? value : String(value ?? '')
} else if (field === 'remark') { } else if (field === 'remark') {
obj[field] = typeof value === 'string' ? value : (value === null || value === undefined ? null : String(value)); obj[field] =
typeof value === 'string'
? value
: value === null || value === undefined
? null
: String(value)
} else if (field === 'buyStored') { } else if (field === 'buyStored') {
// 处理 buyStored: 确保它是一个数字、数字字符串,否则设置为 null // 处理 buyStored: 确保它是一个数字、数字字符串,否则设置为 null
if (typeof value === 'number') { if (typeof value === 'number') {
obj[field] = String(value); // 将数字转换为字符串 obj[field] = String(value) // 将数字转换为字符串
} else if (typeof value === 'string' && !isNaN(Number(value))) { } else if (typeof value === 'string' && !isNaN(Number(value))) {
obj[field] = value; // 保持有效的数字字符串 obj[field] = value // 保持有效的数字字符串
} else { } else {
// 如果不是数字或有效的数字字符串,则设置为 null // 如果不是数字或有效的数字字符串,则设置为 null
obj[field] = null; obj[field] = null
} }
} else { } else {
obj[field] = value; obj[field] = value
} }
}); })
return obj; return obj
}).filter(item => item.warehouseSku); })
.filter((item) => item.warehouseSku)
if (importedData.length === 0) { if (importedData.length === 0) {
ElMessage.warning('导入数据中没有有效的商品SKU'); ElMessage.warning('导入数据中没有有效的商品SKU')
importDialogVisible.value = false; importDialogVisible.value = false
return; return
} }
// 2. 提取导入的 SKU 列表 // 2. 提取导入的 SKU 列表
const importedSkus = importedData.map(item => item.warehouseSku).join(','); const importedSkus = importedData.map((item) => item.warehouseSku).join(',')
// 3. 调用 batchAddCommodity 获取商品的完整信息并过滤掉已有的 SKU // 3. 调用 batchAddCommodity 获取商品的完整信息并过滤掉已有的 SKU
const filteredSkusList = await batchAddCommodity(importedSkus); const filteredSkusList = await batchAddCommodity(importedSkus)
if (filteredSkusList.length === 0) { if (filteredSkusList.length === 0) {
ElMessage.warning('导入的商品SKU已存在或无效'); ElMessage.warning('导入的商品SKU已存在或无效')
importedFileUrl.value = path; importedFileUrl.value = path
importDialogVisible.value = false; importDialogVisible.value = false
return; return
} }
// 4. 将备注信息合并到获取到的商品列表中 // 4. 将备注信息合并到获取到的商品列表中
const mergedProductList = filteredSkusList.map(skuItem => { const mergedProductList = filteredSkusList.map((skuItem) => {
const importedItem = importedData.find(item => item.warehouseSku === skuItem.warehouseSku); const importedItem = importedData.find(
(item) => item.warehouseSku === skuItem.warehouseSku,
let outCountValueForBigNumber: string | number = '0'; // 初始化为安全默认值 )
if (importedItem?.buyStored !== null && importedItem?.buyStored !== undefined) { let outCountValueForBigNumber: string | number = '0' // 初始化为安全默认值
if (typeof importedItem.buyStored === 'string' && !isNaN(Number(importedItem.buyStored))) {
outCountValueForBigNumber = importedItem.buyStored; if (
} else if (typeof importedItem.buyStored === 'number') { importedItem?.buyStored !== null &&
outCountValueForBigNumber = importedItem.buyStored; importedItem?.buyStored !== undefined
} else { ) {
// 如果是对象或其他意外类型,则默认为 '0' if (
outCountValueForBigNumber = '0'; typeof importedItem.buyStored === 'string' &&
} !isNaN(Number(importedItem.buyStored))
) {
outCountValueForBigNumber = importedItem.buyStored
} else if (typeof importedItem.buyStored === 'number') {
outCountValueForBigNumber = importedItem.buyStored
} else {
// 如果是对象或其他意外类型,则默认为 '0'
outCountValueForBigNumber = '0'
} }
}
const calculatedOutCount = new BigNumber(outCountValueForBigNumber).toNumber();
return { const calculatedOutCount = new BigNumber(
skuImage: skuItem.image, outCountValueForBigNumber,
warehouseSku: skuItem.warehouseSku, ).toNumber()
skuName: skuItem.skuName,
productNo: skuItem.productNumber,
locationCode: skuItem.locationCode ?? '',
locationId: skuItem.locationId ?? null,
costPrice: skuItem.price,
outCount: calculatedOutCount,
totalPrice: new BigNumber(calculatedOutCount).multipliedBy(skuItem.price ?? 0).toNumber(),
usableInventory: skuItem.usableInventory,
inventoryId: skuItem.id,
remark: importedItem?.remark ?? skuItem.remark ?? null,
} as InterProductList;
});
return {
skuImage: skuItem.image,
warehouseSku: skuItem.warehouseSku,
skuName: skuItem.skuName,
productNo: skuItem.productNumber,
locationCode: skuItem.locationCode ?? '',
locationId: skuItem.locationId ?? null,
costPrice: skuItem.price,
outCount: calculatedOutCount,
totalPrice: new BigNumber(calculatedOutCount)
.multipliedBy(skuItem.price ?? 0)
.toNumber(),
usableInventory: skuItem.usableInventory,
inventoryId: skuItem.id,
remark: importedItem?.remark ?? skuItem.remark ?? null,
} as InterProductList
})
// 5. 更新 otherPurchaseData // 5. 更新 otherPurchaseData
otherPurchaseData.value = [...otherPurchaseData.value, ...mergedProductList]; otherPurchaseData.value = [...otherPurchaseData.value, ...mergedProductList]
importedFileUrl.value = path importedFileUrl.value = path
importDialogVisible.value = false importDialogVisible.value = false
...@@ -1974,7 +2005,7 @@ $border: solid 1px #ddd; ...@@ -1974,7 +2005,7 @@ $border: solid 1px #ddd;
} }
.import-content { .import-content {
padding: 20px 0; padding-bottom: 20px;
} }
} }
......
...@@ -432,16 +432,16 @@ ...@@ -432,16 +432,16 @@
:close-on-click-modal="false" :close-on-click-modal="false"
> >
<div class="import-dialog"> <div class="import-dialog">
<!-- <div class="import-header"> <div class="import-header">
<el-button type="primary" link @click="downloadTemplate"> <el-button type="primary" link @click="downloadTemplate">
<el-icon><Download /></el-icon> <el-icon><Download /></el-icon>
下载模板 下载模板
</el-button> </el-button>
</div> --> </div>
<div class="import-content"> <div class="import-content">
<UploadExcel <UploadExcel
v-model="importedFileUrl" v-model="importedFileUrl"
:import-type="'local'" :import-type="'localAndXlsx'"
@imported="handleLocalImport" @imported="handleLocalImport"
/> />
</div> </div>
...@@ -829,7 +829,7 @@ ...@@ -829,7 +829,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ElMessage, ElRadioGroup, ElTree } from 'element-plus' import { ElMessage, ElRadioGroup, ElTree } from 'element-plus'
import { CirclePlusFilled } from '@element-plus/icons-vue' import { CirclePlusFilled,Download } from '@element-plus/icons-vue'
import splitDiv from '@/components/splitDiv/splitDiv.vue' import splitDiv from '@/components/splitDiv/splitDiv.vue'
import { ElTable } from 'element-plus' import { ElTable } from 'element-plus'
import usePageList from '@/utils/hooks/usePageList' import usePageList from '@/utils/hooks/usePageList'
...@@ -989,7 +989,14 @@ function getStartTime() { ...@@ -989,7 +989,14 @@ function getStartTime() {
const day = date.getDate() const day = date.getDate()
return `${year}-${month}-${day} 00:00:00` return `${year}-${month}-${day} 00:00:00`
} }
const downloadTemplate = () => {
const link = document.createElement('a')
link.href = '/files/warehousingEntry.xlsx'
link.download = 'warehousingEntry.xlsx'
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
}
const selectSku = ref('') const selectSku = ref('')
const treeData = ref<InterWarehouseTree[]>() const treeData = ref<InterWarehouseTree[]>()
const [searchForm, resetSearchForm] = useValue<warehouseSearchForm>({}) const [searchForm, resetSearchForm] = useValue<warehouseSearchForm>({})
...@@ -1960,7 +1967,7 @@ $border: solid 1px #ddd; ...@@ -1960,7 +1967,7 @@ $border: solid 1px #ddd;
} }
.import-content { .import-content {
padding: 20px 0; padding-bottom: 20px;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment