Commit 6d69dfe7 by linjinhong

Merge remote-tracking branch 'origin/linjinhong' into dev

parents ed2f87d9 27bd0959
......@@ -11,7 +11,18 @@ import {
} from '@/types/api/podUsOrder'
import axios from './axios'
import { PodMakeOrderData } from '@/types/api/podMakeOrder'
export interface AddressInfo {
id?: string
receiverName: string
receiverPhone: string
receiverCountry: string
receiverProvince: string
receiverCity: string
receiverDistrict: string
receiverAddress1: string
receiverAddress2: string
receiverPostCode: string
}
// 同步收货地址
export function syncReceiverAddress(data: number[]) {
return axios.post<never, BaseRespData<never>>(
......@@ -37,6 +48,7 @@ export function getOrderTabData() {
'/factory/podJomallOrderUs/findStateGroupList',
)
}
export function getOrderList(
params: SearchForm,
currentPage: number,
......@@ -51,12 +63,14 @@ export function getOrderList(
},
)
}
export function handleExceptionOrderApi(orderIds: number[]) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/processExceptionOrders',
orderIds,
)
}
export function getCardOrderList(
params: SearchForm,
currentPage: number,
......@@ -71,6 +85,7 @@ export function getCardOrderList(
},
)
}
export function confirmOrderApi(
data: number[],
productionClient: string,
......@@ -87,11 +102,13 @@ export function confirmOrderApi(
},
)
}
export function getProductionClientApi() {
return axios.get<never, BaseRespData<ProductionClient[]>>(
'factory/podJomallOrderUs/getProductionClientList',
)
}
export function updateExceptionOrderApi(data: number[]) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/updateExceptionOrders',
......@@ -100,6 +117,15 @@ export function updateExceptionOrderApi(data: number[]) {
},
)
}
// // 同步收货地址
// export function syncReceiverAddress(data: number[]) {
// return axios.post<never, BaseRespData<never>>(
// 'factory/podJomallOrderUs/syncReceiverAddress',
// data,
// )
// }
export function changeExceptionOrderApi(
url: string,
ids: number[],
......@@ -112,6 +138,7 @@ export function changeExceptionOrderApi(
exceptionReason: value,
})
}
export function cancelOrderApi(ids: number[], value: string) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/cancelOrders',
......@@ -121,11 +148,13 @@ export function cancelOrderApi(ids: number[], value: string) {
},
)
}
export function getOperationLogApi(id: number) {
return axios.get<never, BaseRespData<LogListData[]>>(
`factory/podJomallOrderUsLog/getPodJomallOrderUsLog?id=${id}`,
)
}
export function getSubOrderBySubOrderNumber(factorySubOrderNumber: string) {
return axios.get<never, BaseRespData<ProductList>>(
'factory/podJomallOrderProductUs/getProductUsByFactorySubOrderNumber',
......@@ -136,12 +165,14 @@ export function getSubOrderBySubOrderNumber(factorySubOrderNumber: string) {
},
)
}
export function downloadMaterialApi(id: number[]) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderProductUs/downloadDesignImages',
id,
)
}
export function productionQueryApi(id: number, podJomallOrderUsId: number) {
return axios.post<never, BasePaginationData<never>>(
'factory/podJomallOrderProductUs/completeDelivery',
......@@ -151,12 +182,14 @@ export function productionQueryApi(id: number, podJomallOrderUsId: number) {
},
)
}
export function printProductionOrderApi(orderIds: number[]) {
return axios.post<never, BaseRespData<string>>(
'factory/podJomallOrderUs/printProducePdf',
orderIds,
)
}
export function printPrintOrderApi(orderIds: number[]) {
return axios.post<never, BaseRespData<string>>(
'factory/podJomallOrderUs/printPickPdf',
......@@ -165,6 +198,7 @@ export function printPrintOrderApi(orderIds: number[]) {
},
)
}
export function printPickingOrderApi(orderIds: number[]) {
return axios.post<never, BaseRespData<string>>(
'factory/podJomallOrderUs/pickingComplete',
......@@ -173,11 +207,13 @@ export function printPickingOrderApi(orderIds: number[]) {
},
)
}
export function stockOutCheckApi(orderIds: number[]) {
return axios.get<never, BaseRespData<number[]>>(
`factory/podJomallOrderUs/replenishVerify?ids=${orderIds.join(',')}`,
)
}
export function toBePickingApi(orderIds: number[]) {
return axios.get<never, BaseRespData<never>>(
`factory/podJomallOrderUs/updateStockOutOrderToPicking?ids=${orderIds.join(
......@@ -185,11 +221,13 @@ export function toBePickingApi(orderIds: number[]) {
)}`,
)
}
export function getOrderDetailById(id: number) {
return axios.get<never, BaseRespData<ProductList>>(
`factory/podJomallOrderProductUs/getProductUsById?id=${id}`,
)
}
export function getPackingDataApi(
code: string,
factoryNo: number,
......@@ -208,6 +246,7 @@ export function getPackingDataApi(
},
)
}
export function getPodBoxListApi(
factoryNo: number | string,
warehouseId: number | string,
......@@ -232,6 +271,7 @@ export function submitInspectionApi(
},
)
}
export function clearBoxApi(
factoryNo: number,
box: number | null,
......@@ -244,11 +284,13 @@ export function clearBoxApi(
},
)
}
export function clearAllBoxApi() {
return axios.get<never, BaseRespData<never>>(
'factory/podJomallOrderUs/delPodBoxOrderDetails',
)
}
export function updateRemarkApi(id: number, content: string) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/addRemark',
......@@ -256,23 +298,40 @@ 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) {
return axios.get<never, BaseRespData<never>>(
'factory/podJomallOrderUs/getLogisticsCalculation',
{ params: { id } },
)
}
export function loadWarehouseListApi() {
return axios.get<never, BaseRespData<WarehouseListData[]>>(
'factoryWarehouseInfo/getAll',
)
}
export function refreshMaterialApi(orderIds: string) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderProductUs/refreshDesignImages ',
{ orderIds },
)
}
// 获取跟踪号
export function getTrackingNumberApi(orderIds: (string | number)[]) {
return axios.post<never, BaseRespData<never>>(
......@@ -280,6 +339,7 @@ export function getTrackingNumberApi(orderIds: (string | number)[]) {
orderIds,
)
}
// 获取打印面单
export function getfaceSimplexFileApi(orderIds: (string | number)[]) {
return axios.post<never, BaseRespData<never>>(
......@@ -287,6 +347,7 @@ export function getfaceSimplexFileApi(orderIds: (string | number)[]) {
orderIds,
)
}
// 取消物流订单
export function cancelLogisticsOrderApi(orderIds: (string | number)[]) {
return axios.post<never, BaseRespData<never>>(
......@@ -294,6 +355,7 @@ export function cancelLogisticsOrderApi(orderIds: (string | number)[]) {
orderIds,
)
}
// 更改物流
export function changeLogisticsApi(params: {
updateByIdParam: {
......@@ -307,6 +369,7 @@ export function changeLogisticsApi(params: {
params,
)
}
// 创建物流
export function createLogisticsOrderApi(params: {
updateByIdParam: {
......@@ -322,12 +385,13 @@ export function createLogisticsOrderApi(params: {
}
// 更改物流
export function composingDesignImages(data:number[]) {
export function composingDesignImages(data: number[]) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/composingDesignImages',
data
data,
)
}
// 转至待拣胚
export function updateLogisticsToPickingApi(params: { ids: string }) {
return axios.get<never, BaseRespData<never>>(
......@@ -337,6 +401,7 @@ export function updateLogisticsToPickingApi(params: { ids: string }) {
},
)
}
//创建物流订单
export function createLogisticsOrdersApi(orderIds: (string | number)[]) {
return axios.post<never, BaseRespData<never>>(
......@@ -344,3 +409,17 @@ export function createLogisticsOrdersApi(orderIds: (string | number)[]) {
orderIds,
)
}
//确认生产
export function confirmProductApi(orderIds: (string | number)[]) {
return axios.post<never, BaseRespData<never>>(
`factory/podJomallOrderUs/confirmProduct`,
orderIds,
)
}
//转至锐印
export function confirmProductToRiinApi(orderIds: (string | number)[]) {
return axios.post<never, BaseRespData<never>>(
`factory/podJomallOrderUs/confirmProductToRiin`,
orderIds,
)
}
......@@ -19,7 +19,7 @@ export interface SearchForm {
endTime: string | null
exceptionHandling: number | undefined
platform: string
productionClient: string
productionClient:string
}
export interface PodUsOrderListData {
id: number
......@@ -93,7 +93,6 @@ export interface ProductList {
tagIds?: string
isProduction?: boolean
createTime?: string
startStockingTime?: string | null
updateTime?: string
remark?: string | null
version?: number
......
......@@ -10,7 +10,7 @@
>
<template #ontherBtn>
<div style="margin-left: 10px; display: flex; gap: 10px">
<ElButton @click="downloadExcel" type="info" plain
<ElButton @click="downloadExcel" type="primary" plain
>下载模版</ElButton
>
......
......@@ -10,7 +10,7 @@
>
<template #ontherBtn>
<div style="margin-left: 10px; display: flex; gap: 10px">
<ElButton @click="downloadExcel" type="info" plain
<ElButton @click="downloadExcel" type="primary" plain
>下载模版</ElButton
>
......
......@@ -4,6 +4,7 @@
v-model="resultDialog"
width="600px"
:close-on-click-modal="false"
@closed="closedFn"
>
<div style="display: flex">
<el-checkbox
......@@ -24,16 +25,16 @@
<el-button type="danger" @click="resultfilter(false)">
{{ '选择异常' }}
</el-button>
<el-button type="success" @click="copyAllCode(list, 'shopNumber')">
{{ '复制店铺单号' }}
<el-button type="success" @click="copyAllCode('factoryOrderNumber')">
{{ '复制工厂订单号' }}
</el-button>
</div>
<div style="height: 50vh; overflow: auto">
<div style="margin: 15px 0"></div>
<el-checkbox-group v-model="selectedList" @change="checkChange">
<div style="display: block" v-for="(item, index) in list" :key="index">
<el-checkbox :value="item.id">
{{ '店铺编号:' + item.shopNumber + ' ' + item.message }}
<el-checkbox :value="item">
{{ '工厂订单号:' + item.factoryOrderNumber + ' ' + item.message }}
</el-checkbox>
</div>
</el-checkbox-group>
......@@ -55,7 +56,8 @@ import { copyText } from '@/utils/index'
interface IList {
id: string | number
shopNumber: string
shopNumber?: string
factoryOrderNumber?: string
message: string
status: boolean
}
......@@ -71,7 +73,7 @@ const props = withDefaults(
const resultDialog = ref(false)
const isIndeterminate = ref(false)
const checkAll = ref(false)
const selectedList = ref<(string | number)[]>([])
const selectedList = ref<IList[]>([])
// 显示弹窗
const showDialog = (type?: string) => {
......@@ -84,7 +86,7 @@ const showDialog = (type?: string) => {
// 全选状态改变
const checkAllChange = (value: boolean) => {
selectedList.value = value ? props.list.map((v) => v.id) : []
selectedList.value = value ? props.list : []
isIndeterminate.value = false
}
......@@ -98,36 +100,52 @@ const checkChange = () => {
// 确认选择
const confirm = () => {
resultDialog.value = false
emits('confirm', selectedList.value)
// emits('confirm', selectedList.value)
}
// 结果过滤
const resultfilter = (bool: boolean) => {
const arr = props.list
.filter((item) => item.status === bool)
.map((item) => item.id)
const arr = props.list.filter((item) => item.status === bool)
selectedList.value = arr
const checkedCount = arr.length
console.log(112, checkedCount)
console.log(113, props.list)
checkAll.value = checkedCount === props.list.length
isIndeterminate.value = checkedCount > 0 && checkedCount < props.list.length
}
// 复制店铺单号
const copyAllCode = (list: IList[], field: string) => {
const str = list.map((el) => el[field as keyof IList]).join(',')
const copyAllCode = (field: string) => {
if (!selectedList.value.length) {
return ElMessage.warning('请先选择数据')
}
const str = selectedList.value.map((el) => el[field as keyof IList]).join(',')
console.log('复制店铺单号', str)
copyText(str)
}
function closedFn() {
emits('confirm', selectedList.value)
}
// 监听弹窗状态
// watch(
// () => resultDialog.value,
// (v) => {
// if (v) {
// console.log(127, props.list)
// resultfilter(true)
// }
// },
// )
watch(
() => resultDialog.value,
() => props.list,
(v) => {
if (v) {
console.log(127)
if (v.length) {
console.log(127, v)
resultfilter(true)
}
},
......@@ -137,7 +155,7 @@ defineExpose({
showDialog,
})
const emits = defineEmits<{
(e: 'confirm', data: (string | number)[]): void
(e: 'confirm', data: IList[]): void
}>()
</script>
......
<script setup lang="ts">
import { defineModel } from 'vue'
import { updateAddressApi,AddressInfo } from '@/api/podUsOrder.ts'
import { updateAddressApi, AddressInfo } from '@/api/podUsOrder.ts'
const emits = defineEmits(['success'])
defineProps<{
countryList: { countryCode: string }[]
......@@ -24,10 +24,16 @@ const rules = {
receiverName: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
receiverPhone: [{ required: true, message: '请输入电话', trigger: 'blur' }],
receiverCountry: [{ required: true, message: '请输入国家', trigger: 'blur' }],
receiverProvince: [{ required: true, message: '请输入省/州', trigger: 'blur' }],
receiverProvince: [
{ required: true, message: '请输入省/州', trigger: 'blur' },
],
receiverCity: [{ required: true, message: '请输入市', trigger: 'blur' }],
receiverAddress1: [{ required: true, message: '请输入地址1', trigger: 'blur' }],
receiverPostCode: [{ required: true, message: '请输入邮政编码', trigger: 'blur' }],
receiverAddress1: [
{ required: true, message: '请输入地址1', trigger: 'blur' },
],
receiverPostCode: [
{ required: true, message: '请输入邮政编码', trigger: 'blur' },
],
}
const submitForm = async () => {
......@@ -36,12 +42,16 @@ const submitForm = async () => {
await updateAddressApi(form.value as never)
visible.value = false
emits('success')
await ElMessageBox.alert('请修改/刷新地址后取消物流重新创建物流订单、获取跟踪号、获取打印面单。', '提示', {
type: 'warning',
confirmButtonText:'确定',
cancelButtonText:'取消',
showCancelButton: true,
})
await ElMessageBox.alert(
'请修改/刷新地址后取消物流重新创建物流订单、获取跟踪号、获取打印面单。',
'提示',
{
type: 'warning',
confirmButtonText: '确定',
cancelButtonText: '取消',
showCancelButton: true,
},
)
}
})
}
......@@ -56,45 +66,78 @@ const submitForm = async () => {
>
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="姓名" prop="receiverName">
<el-input v-model="form.receiverName" clearable placeholder="请输入姓名" />
<el-input
v-model="form.receiverName"
clearable
placeholder="请输入姓名"
/>
</el-form-item>
<el-form-item label="电话" prop="receiverPhone">
<el-input v-model="form.receiverPhone" clearable placeholder="请输入电话" />
<el-input
v-model="form.receiverPhone"
clearable
placeholder="请输入电话"
/>
</el-form-item>
<el-form-item label="国家" prop="receiverCountry">
<el-select v-model="form.receiverCountry" clearable filterable>
<el-select v-model="form.receiverCountry" clearable filterable>
<el-option
v-for="it in countryList" :key="it.countryCode" :label="it.countryCode"
:value="it.countryCode"></el-option>
v-for="it in countryList"
:key="it.countryCode"
:label="it.countryCode"
:value="it.countryCode"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="省/州" prop="receiverProvince">
<el-input v-model="form.receiverProvince" clearable placeholder="请输入省/州" />
<el-input
v-model="form.receiverProvince"
clearable
placeholder="请输入省/州"
/>
</el-form-item>
<el-form-item label="市" prop="receiverCity">
<el-input v-model="form.receiverCity" clearable placeholder="请输入市" />
<el-input
v-model="form.receiverCity"
clearable
placeholder="请输入市"
/>
</el-form-item>
<el-form-item label="区/县" prop="receiverDistrict">
<el-input v-model="form.receiverDistrict" clearable placeholder="请输入区/县" />
<el-input
v-model="form.receiverDistrict"
clearable
placeholder="请输入区/县"
/>
</el-form-item>
<el-form-item label="地址1" prop="receiverAddress1">
<el-input v-model="form.receiverAddress1" clearable placeholder="请输入地址1" />
<el-input
v-model="form.receiverAddress1"
clearable
placeholder="请输入地址1"
/>
</el-form-item>
<el-form-item label="地址2" prop="receiverAddress2">
<el-input v-model="form.receiverAddress2" clearable placeholder="请输入地址2" />
<el-input
v-model="form.receiverAddress2"
clearable
placeholder="请输入地址2"
/>
</el-form-item>
<el-form-item label="邮政编码" prop="receiverPostCode">
<el-input v-model="form.receiverPostCode" clearable placeholder="请输入邮政编码" />
<el-input
v-model="form.receiverPostCode"
clearable
placeholder="请输入邮政编码"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="visible=false">取消</el-button>
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="submitForm">提交</el-button>
</template>
</el-dialog>
</template>
<style scoped lang="scss">
</style>
<style scoped lang="scss"></style>
......@@ -254,7 +254,7 @@
</ElButton>
</span>
<span v-if="status === 'TO_BE_CONFIRMED'" class="item">
<ElButton type="success" @click="confirmOrder"> 确认 </ElButton>
<ElButton type="success" @click="confirmProduct"> 确认生产 </ElButton>
</span>
<span v-if="status === 'EXCEPTION_ORDER'" class="item">
<ElButton type="success" @click="updateOrder"> 转至待确认 </ElButton>
......@@ -301,6 +301,11 @@
转为异常单
</ElButton>
</span>
<span v-if="status === 'TO_BE_CONFIRMED'" class="item">
<ElButton type="warning" @click="confirmProductToRiin">
转至锐印生产
</ElButton>
</span>
<span
v-if="status === 'TO_BE_CONFIRMED' || status === 'EXCEPTION_ORDER'"
class="item"
......@@ -721,15 +726,6 @@
{{ row.lanshouAddress }}
</span>
</div>
<div
v-if="['TO_BE_CONFIRMED', 'STOCK_OUT'].includes(status)"
class="order-detail-item"
>
<span class="order-detail-item-label">订单延期时间:</span>
<span class="order-detail-item-value red-time">
{{ calculateDelayTime(row) }}
</span>
</div>
</div>
</template>
<template #price="{ row }">
......@@ -819,23 +815,23 @@
>
操作日志
</ElButton>
</span>
<span
v-if="!row.expressSheet && row.status === 'TO_BE_CONFIRMED'"
class="operate-item"
>
<ElButton link type="primary" @click="confirm(row)">
<!-- <ElButton
v-if="!row.expressSheet && row.status === 'TO_BE_CONFIRMED'"
link
type="primary"
@click="confirm(row)"
>
确认
</ElButton>
</span>
<span
v-if="
row.shipmentType === 1 &&
['CREATE_LOGISTICS', 'WAIT_SHIPMENT'].includes(status)
"
class="operate-item"
>
<ElButton link type="primary" @click="handleUpdateAddress(row)">
</ElButton> -->
<ElButton
v-if="
row.shipmentType === 1 &&
['CREATE_LOGISTICS', 'WAIT_SHIPMENT'].includes(status)
"
link
type="primary"
@click="handleUpdateAddress(row)"
>
修改地址
</ElButton>
</span>
......@@ -959,7 +955,7 @@
{{ cardItem?.supplierProductNo }}
</span>
</div>
<div class="grid-item" title="店铺单号">
<span class="grid-item-value">
{{ cardItem?.shopNumber }}
......@@ -1292,7 +1288,6 @@
</template>
<script setup lang="ts">
import { getUserMarkList } from '@/api/common'
import { ArrowDown, WarningFilled } from '@element-plus/icons-vue'
import {
getCardOrderList,
......@@ -1325,11 +1320,12 @@ import {
createLogisticsOrdersApi,
syncReceiverAddress,
refreshAddressApi,
confirmProductApi,
confirmProductToRiinApi,
// handleExceptionOrderApi,
} from '@/api/podUsOrder'
import UpdateAddress from './components/updateAddress.vue'
import { BaseRespData } from '@/types/api'
import { getAllCountryApi } from '@/api/logistics.ts'
import UpdateAddress from './components/updateAddress.vue'
import TableView from '@/components/TableView.vue'
import {
LogListData,
......@@ -1348,7 +1344,7 @@ import { useValue } from '@/utils/hooks/useValue'
import { showConfirm } from '@/utils/ui'
import { DocumentCopy, EditPen } from '@element-plus/icons-vue'
import { Column, ElFormItem } from 'element-plus'
import { computed, onMounted, ref, nextTick, onBeforeUnmount } from 'vue'
import { computed, onMounted, ref, nextTick } from 'vue'
import FastProduction from './FastProduction.vue'
import { filePath } from '@/api/axios'
import PodMakeOrder from './PodMakeOrder.vue'
......@@ -1359,6 +1355,7 @@ import RightClickMenu from '@/components/RightClickMenu.vue'
import ResultInfo from './components/ResultInfo.vue'
import { isArray, isString } from '@/utils/validate'
import platformJson from '../../../json/platform.json'
import { getAllCountryApi } from '@/api/logistics.ts'
declare global {
interface Window {
ActiveXObject: {
......@@ -1373,14 +1370,26 @@ declare global {
responseBody?: unknown
}
}
const tabsNav = ref<Tab[]>()
const updateAddVisible = ref(false)
const tabsNav = ref<Tab[]>()
const countryList = ref([])
const resultRefs = ref<InstanceType<typeof ResultInfo> | null>(null)
const confirmDialogShow = ref(false)
const downloadLoading = ref(false)
const isChangeWay = ref(false)
const confirmData = ref([])
const logisticsWayData = ref([])
const currentRow = ref<AddressInfo>({
receiverName: '',
receiverPhone: '',
receiverCountry: '',
receiverProvince: '',
receiverCity: '',
receiverDistrict: '',
receiverAddress1: '',
receiverAddress2: '',
receiverPostCode: '',
})
const confirmSelectionData = ref<LogisticsData[]>([])
const confirmRowData = ref<ProductList | null>(null)
const status = ref('TO_BE_CONFIRMED')
......@@ -1403,18 +1412,6 @@ const [searchForm] = useValue<SearchForm>({
platform: '',
productionClient: '',
})
const countryList = ref([])
const currentRow = ref<AddressInfo>({
receiverName: '',
receiverPhone: '',
receiverCountry: '',
receiverProvince: '',
receiverCity: '',
receiverDistrict: '',
receiverAddress1: '',
receiverAddress2: '',
receiverPostCode: '',
})
const exceptionStatus = ref(1)
const userMarkList = ref<string[]>([])
const selection = ref<PodUsOrderListData[]>([])
......@@ -1473,6 +1470,20 @@ const getDateRange = (days = 0, type: 'past' | 'future' = 'past') => {
type === 'past' ? end.subtract(days, 'day') : end.add(days, 'day')
return [start.startOf('day').toDate(), end.endOf('day').toDate()]
}
const getMonthRange = (months = 0, type: 'past' | 'future' = 'past') => {
const now = dayjs()
const start =
type === 'past' ? now.subtract(months, 'month') : now.add(months, 'month')
return [start.startOf('month').toDate(), start.endOf('month').toDate()]
}
const getWeekRange = (weeks = 0, type: 'past' | 'future' = 'past') => {
const now = dayjs()
const start =
type === 'past' ? now.subtract(weeks, 'week') : now.add(weeks, 'week')
return [start.startOf('week').toDate(), start.endOf('week').toDate()]
}
const handleRefreshAddress = async (row: PodUsOrderListData) => {
try {
await showConfirm('确定刷新地址吗?', {
......@@ -1501,19 +1512,6 @@ const handleUpdateAddress = async (row: PodUsOrderListData) => {
currentRow.value = JSON.parse(JSON.stringify(row))
updateAddVisible.value = true
}
const getMonthRange = (months = 0, type: 'past' | 'future' = 'past') => {
const now = dayjs()
const start =
type === 'past' ? now.subtract(months, 'month') : now.add(months, 'month')
return [start.startOf('month').toDate(), start.endOf('month').toDate()]
}
const getWeekRange = (weeks = 0, type: 'past' | 'future' = 'past') => {
const now = dayjs()
const start =
type === 'past' ? now.subtract(weeks, 'week') : now.add(weeks, 'week')
return [start.startOf('week').toDate(), start.endOf('week').toDate()]
}
const tableColumns = computed(() => [
{
label: '商品',
......@@ -1726,12 +1724,66 @@ const handleProductionClientChange = async (v: string) => {
const downloadFacebook = async (row: string) => {
window.open(filePath + row, '_blank')
}
const confirm = async (row: ProductList) => {
confirmDialogShow.value = true
productionClientValue.value = ''
confirmRowData.value = row
confirmData.value = []
confirmSelectionData.value = []
// const confirm = async (row: ProductList) => {
// confirmDialogShow.value = true
// productionClientValue.value = ''
// confirmRowData.value = row
// confirmData.value = []
// confirmSelectionData.value = []
// }
//确认生产
async function confirmProduct() {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
}
try {
await showConfirm('确定生产吗?', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
})
const ids = selection.value.map((el) => el.id)
const { code, data } = await confirmProductApi([...ids])
if (code === 200) {
resultInfo.value = data || []
resultRefs.value?.showDialog()
}
ElMessage.success('操作成功')
// search()
// await loadTabData()
} catch {
resultInfo.value = []
return
}
}
//转至锐印
async function confirmProductToRiin() {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
}
try {
await showConfirm('确认转至锐印(Riin)生产吗?', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
})
const ids = selection.value.map((el) => el.id)
const { code, data } = await confirmProductToRiinApi([...ids])
if (code === 200) {
resultInfo.value = data || []
resultRefs.value?.showDialog()
}
ElMessage.success('操作成功')
// search()
// await loadTabData()
} catch {
resultInfo.value = []
return
}
}
const handleConfirm = async () => {
if (!productionClientValue.value) {
......@@ -1790,13 +1842,13 @@ const handleUpdateRemark = async (item: ProductList) => {
const productionClientValue = ref('')
const productionClient = ref<ProductionClient[]>()
const productionClientVisible = ref(false)
const confirmOrder = async () => {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
}
productionClientValue.value = ''
productionClientVisible.value = true
}
// const confirmOrder = async () => {
// if (selection.value.length === 0) {
// return ElMessage.warning('请选择数据')
// }
// productionClientValue.value = ''
// productionClientVisible.value = true
// }
const downloadTif = async () => {
if (!selection.value.length) {
......@@ -1876,6 +1928,7 @@ const updateOrder = async () => {
loading.close()
}
}
const assignOrder = async () => {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
......@@ -2280,6 +2333,7 @@ const getOrderByIdApi = async (type: string) => {
const resultInfo = ref([])
const resultConfim = () => {
search()
loadTabData()
}
/**
......@@ -2453,6 +2507,14 @@ const logisticsToPicking = async () => {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
}
if (
selection.value.some(
(el) =>
el.trackingNumber == null || String(el.trackingNumber).trim() === '',
)
) {
return ElMessage.warning('选中数据中有未创建物流的订单,请先创建物流')
}
try {
await ElMessageBox.confirm('确定转至待拣胚吗?', '提示', {
confirmButtonText: '确定',
......@@ -2475,8 +2537,8 @@ const logisticsToPicking = async () => {
resultInfo.value = res.data || []
resultRefs.value?.showDialog()
ElMessage.success('操作成功')
search()
loadTabData()
// search()
// loadTabData()
} catch (e) {
resultInfo.value = []
console.error(e)
......@@ -2719,56 +2781,13 @@ const refreshMaterial = async () => {
loading.close()
}
}
// 当前时间响应式变量(每60秒更新一次)
const currentTime = ref(new Date())
// 定时器实例
let timer: number | null = null
onMounted(() => {
loadTabData()
getUserMark()
loadProductionClient()
loadWarehouseList()
// 每60秒更新一次当前时间
timer = window.setInterval(() => {
currentTime.value = new Date()
}, 60000)
})
// 计算时间差(小时数)并向上取整
const calculateHoursDifference = (startDateString?: string): string => {
if (!startDateString) return '--'
try {
const startTime = new Date(startDateString)
const diffInMs = currentTime.value.getTime() - startTime.getTime()
// 转换为小时并取整:ceil向上或者round:四舍五入
const hours = Math.round(diffInMs / (1000 * 60 * 60))
return `${hours}小时`
} catch (error) {
console.error('日期解析错误:', error)
return '--'
}
}
// 根据订单状态计算延期时间
const calculateDelayTime = computed(() => (row: ProductList) => {
switch (status.value) {
case 'TO_BE_CONFIRMED':
return row.createTime ? calculateHoursDifference(row.createTime) : '--'
case 'STOCK_OUT':
return row.startStockingTime
? calculateHoursDifference(row.startStockingTime)
: '--'
default:
return '--'
}
})
onBeforeUnmount(() => {
// 组件卸载时清除定时器
if (timer) {
clearInterval(timer)
timer = null
}
})
const handleExceptionCommand = (command: number) => {
exceptionStatus.value = command
search()
......@@ -2860,10 +2879,6 @@ const handleExceptionCommand = (command: number) => {
text-overflow: ellipsis;
white-space: nowrap;
}
.red-time {
color: red;
font-weight: bold;
}
}
.card-list {
......@@ -2874,6 +2889,12 @@ const handleExceptionCommand = (command: number) => {
height: 100%;
overflow-y: auto;
}
.operate-item {
.el-button {
margin-left: 0 !important;
margin-top: 20px !important;
}
}
.tabs-node_count {
display: inline-block;
min-width: 20px;
......
......@@ -117,7 +117,7 @@
>
删除
</el-button>
<el-button type="success" @click="handleExport"> 导出 </el-button>
<el-button type="success" @click="handleExport"> 导出</el-button>
<el-button type="primary" @click="printProductTag">
打印库存SKU标签
</el-button>
......@@ -609,7 +609,7 @@
></el-input>
<el-popover placement="top-start" width="1000" trigger="click">
<div v-if="skuData.length > 0" style="height: 50vh">
<ElTable size="small" :data="skuData" height="100%" border>
<ElTable size="small" :data="filterSkuData" height="100%" border>
<ElTableColumn
show-overflow-tooltip
width="60"
......@@ -669,9 +669,9 @@
label="操作"
>
<template #default="{ row }">
<el-icon :size="32" color="#67C23A" class="cursor-pointer"
><CirclePlusFilled @click="skudblclick(row)"
/></el-icon>
<el-icon :size="32" color="#67C23A" class="cursor-pointer">
<CirclePlusFilled @click="skudblclick(row)" />
</el-icon>
</template>
</ElTableColumn>
</ElTable>
......@@ -742,7 +742,7 @@
</el-radio-group>
</el-form-item>
<el-form-item label="">
<el-checkbox v-model="exportForm.delivery"> 包含详情 </el-checkbox>
<el-checkbox v-model="exportForm.delivery"> 包含详情</el-checkbox>
</el-form-item>
</el-form>
<template #footer>
......@@ -827,7 +827,7 @@
<script setup lang="ts">
import { ElMessage, ElRadioGroup, ElTree } from 'element-plus'
import { CirclePlusFilled,Download } from '@element-plus/icons-vue'
import { CirclePlusFilled, Download } from '@element-plus/icons-vue'
import splitDiv from '@/components/splitDiv/splitDiv.vue'
import { ElTable } from 'element-plus'
import usePageList from '@/utils/hooks/usePageList'
......@@ -979,6 +979,7 @@ const pickerOptions = {
},
],
}
function getStartTime() {
const date = new Date()
const year = date.getFullYear()
......@@ -1083,6 +1084,7 @@ const printProductTag = async () => {
console.error(e)
}
}
async function handlePrintProductTag() {
const flag = printData.value.every(
(el: InterWarehousePage) => el.number && el.number != '0',
......@@ -1112,6 +1114,7 @@ async function handlePrintProductTag() {
showPrintDialog.value = false
window.open(filePath + res.message, '_blank')
}
const batchAddCommodity = async (sku: string): Promise<InterskuList[]> => {
if (!editForm.value.warehouseId) {
ElMessage.error('请选择仓库')
......@@ -1137,11 +1140,14 @@ const batchAddCommodity = async (sku: string): Promise<InterskuList[]> => {
return []
}
}
interface InterImportData {
warehouseSku: string
remark?: string | null
[key: string]: unknown
}
// 前端导入Excel
const excelFieldMap: Record<string, keyof InterProductList> = {
// SKU图片: 'skuImage',
......@@ -1545,6 +1551,12 @@ const addOtherCurrency = async () => {
upSection()
}
}
const filterSkuData = computed(() => {
const skuList = otherPurchaseData.value.map((el) => el.warehouseSku)
console.log(skuList, skuData.value)
return skuData.value.filter((el) => !skuList.includes(el.sku))
})
const addSection = async () => {
const params = { ...editForm.value }
params.productList = otherPurchaseData.value
......@@ -1607,9 +1619,10 @@ const upSection = async () => {
}
}
const addPurchaseVisible = ref(false)
const purchaseTextarea = ref(null)
const purchaseTextarea = ref('')
const addPurchase = async () => {
addPurchaseVisible.value = true
purchaseTextarea.value = ''
}
const submitPurchase = async () => {
if (!purchaseTextarea.value) {
......@@ -1744,20 +1757,24 @@ onMounted(() => {
width: 500px;
text-align: center;
}
.cursor-pointer {
cursor: pointer;
}
.header-filter-form {
:deep(.el-form-item) {
margin-right: 14px;
margin-bottom: 10px;
}
}
.product-dialog-footer {
display: flex;
justify-content: space-between;
margin: 8px 0;
}
$border: solid 1px #ddd;
.send-order-list {
......@@ -1805,10 +1822,12 @@ $border: solid 1px #ddd;
.left {
width: 160px;
:deep(.el-tree-node__content) {
height: 30px;
line-height: 30px;
}
:deep(.el-tree-node__label) {
font-size: 13px;
cursor: pointer;
......@@ -1900,6 +1919,7 @@ $border: solid 1px #ddd;
height: 5px;
background: #eff3f6;
}
.btn-list {
margin-bottom: 10px;
}
......@@ -1931,6 +1951,7 @@ $border: solid 1px #ddd;
}
}
}
.delivery-note-page {
:deep(#top) {
height: 100%;
......
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