Commit 31e26b72 by qinjianhui

Merge branch 'dev' into 'master'

Dev

See merge request !145
parents 64ba7141 8eaf66bb
...@@ -70,6 +70,15 @@ export interface ILogisticsCompany { ...@@ -70,6 +70,15 @@ export interface ILogisticsCompany {
basicType: number // int(11) basicType: number // int(11)
} }
export interface LogisticsWayData {
id: number
name: string
code: string
status: boolean
createTime: string
updateTime: string
}
interface ILogisticsParams { interface ILogisticsParams {
logType: string logType: string
relaId: number | string relaId: number | string
...@@ -148,6 +157,15 @@ export function getUniuniList() { ...@@ -148,6 +157,15 @@ export function getUniuniList() {
}, },
) )
} }
// 根据物流公司筛选物流方式
export function getLogisticsWayListByCompanyId(companyId: number) {
return axios.get<never, BaseRespData<LogisticsWayData[]>>(
'logisticsWay/getUsableWaysByCompanyId',
{
params: { companyId },
},
)
}
// 获取tictok物流承运商 // 获取tictok物流承运商
export function getTiktokCarrier() { export function getTiktokCarrier() {
return axios.get<never, BaseRespData<{ name: string; id: string,typeCode:string,label:string }[]>>( return axios.get<never, BaseRespData<{ name: string; id: string,typeCode:string,label:string }[]>>(
......
...@@ -246,9 +246,9 @@ export function productionQueryApi(id: number, podJomallOrderCnId: number) { ...@@ -246,9 +246,9 @@ export function productionQueryApi(id: number, podJomallOrderCnId: number) {
}, },
) )
} }
export function printProductionOrderApi(orderIds: number[]) { export function printProductionOrderApi(url: string, orderIds: number[]) {
return axios.post<never, BaseRespData<string>>( return axios.post<never, BaseRespData<string>>(
'factory/podJomallOrderProductCn/printProducePdf', url,
orderIds, orderIds,
) )
} }
...@@ -639,10 +639,10 @@ export function updateToWaitShipmentApi(params: { ...@@ -639,10 +639,10 @@ export function updateToWaitShipmentApi(params: {
} }
//创建物流订单 //创建物流订单
export function createLogisticsOrdersApi(orderIds: (string | number)[]) { export function createLogisticsOrdersApi(orderIdList: (string | number)[], logisticsWayId: number | null) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
`factory/podJomallOrderCn/createLogisticsOrders`, `factory/podJomallOrderCn/createLogisticsOrders`,
orderIds, { orderIdList, logisticsWayId },
) )
} }
...@@ -791,3 +791,11 @@ export function updateProductOutOfStockApi(params: { ...@@ -791,3 +791,11 @@ export function updateProductOutOfStockApi(params: {
params, params,
) )
} }
// 打印普胚生产单
export function printNormalProducePdf(orderIds: number[]) {
return axios.post<never, BaseRespData<string>>(
'factory/podJomallOrderProductCn/printNormalProducePdf',
orderIds,
)
}
...@@ -179,9 +179,9 @@ export function productionQueryApi(id: number, podJomallOrderUsId: number) { ...@@ -179,9 +179,9 @@ export function productionQueryApi(id: number, podJomallOrderUsId: number) {
}, },
) )
} }
export function printProductionOrderApi(orderIds: number[]) { export function printProductionOrderApi(url: string, orderIds: number[]) {
return axios.post<never, BaseRespData<string>>( return axios.post<never, BaseRespData<string>>(
'factory/podJomallOrderProductUs/printProducePdf', url,
orderIds, orderIds,
) )
} }
......
...@@ -121,11 +121,7 @@ ...@@ -121,11 +121,7 @@
style="display: flex; margin-left: 10px" style="display: flex; margin-left: 10px"
> >
<div class="text-green"> <div class="text-green">
{{ {{ statisticData?.compareYesterdayShipmentOrderNum }}
statisticData?.compareYesterdayShipmentOrderNum.toFixed(
2,
)
}}
</div> </div>
<div class="up-icon-green"></div> <div class="up-icon-green"></div>
</div> </div>
...@@ -134,7 +130,7 @@ ...@@ -134,7 +130,7 @@
{{ {{
Math.abs( Math.abs(
statisticData?.compareYesterdayShipmentOrderNum || 0, statisticData?.compareYesterdayShipmentOrderNum || 0,
).toFixed(2) )
}} }}
</div> </div>
<div class="down-icon-red"></div> <div class="down-icon-red"></div>
......
...@@ -757,6 +757,26 @@ const handleSelectionChange = (val: PodUsOrderListData[]) => { ...@@ -757,6 +757,26 @@ const handleSelectionChange = (val: PodUsOrderListData[]) => {
selection.value = val selection.value = val
} }
// 修改行样式方法
const getRowStyle = ({ row }: { row: PodUsOrderListData }) => {
// 如果行被选中,设置背景色为 #fdf6ec
if (selection.value.some((item) => item.id === row.id)) {
return {
backgroundColor: '#fdf6ec',
}
}
return {
backgroundColor: '',
}
}
// 获取行类名方法
const getRowClassName = ({ row }: { row: PodUsOrderListData }) => {
return selection.value.some((item) => item.id === row.id)
? 'row-selected'
: ''
}
/** /**
* @description: 页面添加回车监听 * @description: 页面添加回车监听
*/ */
...@@ -802,7 +822,7 @@ onMounted(() => { ...@@ -802,7 +822,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<split-div otherSize="35"> <split-div other-size="35">
<template #top> <template #top>
<el-card> <el-card>
<ElForm <ElForm
...@@ -1099,14 +1119,14 @@ onMounted(() => { ...@@ -1099,14 +1119,14 @@ onMounted(() => {
</ElFormItem> </ElFormItem>
<ElFormItem> <ElFormItem>
<span> <span>
<ElButton link @click="resetSearchForm" style="font-size: 12px" <ElButton link style="font-size: 12px" @click="resetSearchForm"
><span title="重置查询条件">重置</span></ElButton ><span title="重置查询条件">重置</span></ElButton
> >
</span> </span>
</ElFormItem> </ElFormItem>
<ElFormItem> <ElFormItem>
<span> <span>
<ElButton type="primary" @click="search" ref="searchBtnRef" <ElButton ref="searchBtnRef" type="primary" @click="search"
>查询</ElButton >查询</ElButton
> >
</span> </span>
...@@ -1136,7 +1156,8 @@ onMounted(() => { ...@@ -1136,7 +1156,8 @@ onMounted(() => {
:serial-numberable="true" :serial-numberable="true"
:selectionable="true" :selectionable="true"
:paginated-data="tableData" :paginated-data="tableData"
highlight-current-row :row-style="getRowStyle"
:row-class-name="getRowClassName"
@row-click="rowClick" @row-click="rowClick"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
...@@ -1172,9 +1193,9 @@ onMounted(() => { ...@@ -1172,9 +1193,9 @@ onMounted(() => {
</div> </div>
<div class="pagination"> <div class="pagination">
<el-pagination <el-pagination
size="small"
v-model:current-page="pagination.currentPage" v-model:current-page="pagination.currentPage"
v-model:page-size="pagination.pageSize" v-model:page-size="pagination.pageSize"
size="small"
:page-sizes="[50, 100, 150, 200]" :page-sizes="[50, 100, 150, 200]"
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper"
:total="pagination.total" :total="pagination.total"
...@@ -1363,4 +1384,13 @@ onMounted(() => { ...@@ -1363,4 +1384,13 @@ onMounted(() => {
width: 75px; width: 75px;
} }
} }
// 确保选中行的背景色在 hover 时也保持
:deep(.el-table__body) {
.el-table__row.row-selected:hover {
td {
background-color: #fdf6ec !important;
}
}
}
</style> </style>
...@@ -772,6 +772,27 @@ const handleSelectionChange = (val: PodCnOrderListData[]) => { ...@@ -772,6 +772,27 @@ const handleSelectionChange = (val: PodCnOrderListData[]) => {
selection.value = val selection.value = val
} }
// 修改行样式方法
const getRowStyle = ({ row }: { row: PodCnOrderListData }) => {
// 如果行被选中,设置背景色为 #fdf6ec
if (selection.value.some((item) => item.id === row.id)) {
return {
backgroundColor: '#fdf6ec',
}
}
return {
backgroundColor: '',
}
}
// 获取行类名方法
const getRowClassName = ({ row }: { row: PodCnOrderListData }) => {
return selection.value.some((item) => item.id === row.id)
? 'row-selected'
: ''
}
const handleRadioGroupClick = (event: Event) => { const handleRadioGroupClick = (event: Event) => {
const target = event.target as HTMLElement const target = event.target as HTMLElement
const radioButton = target.closest('.el-radio-button') const radioButton = target.closest('.el-radio-button')
...@@ -855,7 +876,7 @@ onMounted(() => { ...@@ -855,7 +876,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<split-div otherSize="35"> <split-div other-size="35">
<template #top> <template #top>
<el-card> <el-card>
<ElForm <ElForm
...@@ -1180,14 +1201,14 @@ onMounted(() => { ...@@ -1180,14 +1201,14 @@ onMounted(() => {
</ElFormItem> </ElFormItem>
<ElFormItem> <ElFormItem>
<span> <span>
<ElButton link @click="resetSearchForm" style="font-size: 12px" <ElButton link style="font-size: 12px" @click="resetSearchForm"
><span title="重置查询条件">重置</span></ElButton ><span title="重置查询条件">重置</span></ElButton
> >
</span> </span>
</ElFormItem> </ElFormItem>
<ElFormItem> <ElFormItem>
<span> <span>
<ElButton type="primary" @click="search" ref="searchBtnRef" <ElButton ref="searchBtnRef" type="primary" @click="search"
>查询</ElButton >查询</ElButton
> >
</span> </span>
...@@ -1225,7 +1246,8 @@ onMounted(() => { ...@@ -1225,7 +1246,8 @@ onMounted(() => {
:serial-numberable="true" :serial-numberable="true"
:selectionable="true" :selectionable="true"
:paginated-data="tableData" :paginated-data="tableData"
highlight-current-row :row-style="getRowStyle"
:row-class-name="getRowClassName"
@row-click="rowClick" @row-click="rowClick"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
...@@ -1268,9 +1290,9 @@ onMounted(() => { ...@@ -1268,9 +1290,9 @@ onMounted(() => {
</div> </div>
<div class="pagination"> <div class="pagination">
<el-pagination <el-pagination
size="small"
v-model:current-page="pagination.currentPage" v-model:current-page="pagination.currentPage"
v-model:page-size="pagination.pageSize" v-model:page-size="pagination.pageSize"
size="small"
:page-sizes="[50, 100, 150, 200]" :page-sizes="[50, 100, 150, 200]"
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper"
:total="pagination.total" :total="pagination.total"
...@@ -1459,4 +1481,13 @@ onMounted(() => { ...@@ -1459,4 +1481,13 @@ onMounted(() => {
width: 75px; width: 75px;
} }
} }
// 确保选中行的背景色在 hover 时也保持
:deep(.el-table__body) {
.el-table__row.row-selected:hover {
td {
background-color: #fdf6ec !important;
}
}
}
</style> </style>
...@@ -269,7 +269,7 @@ ...@@ -269,7 +269,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, nextTick, ref, watch, defineProps, defineEmits } from 'vue' import { computed, nextTick, ref, watch } from 'vue'
import useLodop from '@/utils/hooks/useLodop' import useLodop from '@/utils/hooks/useLodop'
import TableView from '@/components/TableView.vue' import TableView from '@/components/TableView.vue'
import { OrderData, ProductList, IorderItem } from '@/types/api/podMakeOrder' import { OrderData, ProductList, IorderItem } from '@/types/api/podMakeOrder'
...@@ -499,14 +499,12 @@ async function barcodeInput() { ...@@ -499,14 +499,12 @@ async function barcodeInput() {
console.log('pending', pending) console.log('pending', pending)
await submitInspection(pending, async () => { await submitInspection(pending, async () => {
await inputActive()
await getPackingData(code)
noObj.value = {} noObj.value = {}
}) })
} else { }
await inputActive() await inputActive()
await getPackingData(code) await getPackingData(code)
}
isLock.value = false isLock.value = false
} }
async function submitInspection(objs?: OrderData, callback?: () => void) { async function submitInspection(objs?: OrderData, callback?: () => void) {
...@@ -525,12 +523,10 @@ async function submitInspection(objs?: OrderData, callback?: () => void) { ...@@ -525,12 +523,10 @@ async function submitInspection(objs?: OrderData, callback?: () => void) {
ElMessage.success(res.message) ElMessage.success(res.message)
coverImage.value = '' coverImage.value = ''
testingData.value = {} testingData.value = {}
await inputActive()
isLock.value = false isLock.value = false
callback?.() callback?.()
} catch (e) { } catch (e) {
console.error(e) console.error(e)
await inputActive()
isLock.value = false isLock.value = false
} }
} }
...@@ -591,7 +587,7 @@ async function getPackingData(code: string) { ...@@ -591,7 +587,7 @@ async function getPackingData(code: string) {
async function printFile(data: OrderData) { async function printFile(data: OrderData) {
// await props.printOrderOne(data) // await props.printOrderOne(data)
await printOrderOne(data) await printOrderOne(data)
noObj.value[data.id!] = data noObj.value[data.id as number] = data
await inputActive() await inputActive()
} }
function printOrderOne(item: OrderData): Promise<void> { function printOrderOne(item: OrderData): Promise<void> {
......
<template>
<el-dialog
v-model="createLogisticDialogVisible"
:close-on-click-modal="false"
title="创建物流订单"
>
<div style="display: flex; align-items: center; gap: 20px">
<span style="font-weight: 500">是否自动匹配物流方式</span>
<el-radio-group v-model="isAutoMatch">
<el-radio :value="false"></el-radio>
<el-radio :value="true"></el-radio>
</el-radio-group>
</div>
<div
v-if="!isAutoMatch && logisticCompanyList.length > 0"
style="margin: 10px; border: 1px solid #e0e0e0; display: flex"
>
<div
style="
display: flex;
flex-direction: column;
width: 200px;
font-weight: 500;
"
>
<div
v-for="item in logisticCompanyList"
:key="item.id"
class="logistic-company-item"
:class="{
'selected-logistic-company':
selectedLogisticCompany?.id === item.id,
}"
@click="selectLogisticCompany(item)"
>
{{ item.name }}
</div>
</div>
<div
style="
width: 100%;
min-height: 220px;
display: flex;
justify-content: center;
align-items: flex-start;
"
>
<div
v-if="logisticsWayList.length > 0"
style="
padding: 0 10px;
width: 100%;
display: flex;
align-items: center;
"
>
<el-radio-group v-model="logisticsWayId">
<el-radio
v-for="item in logisticsWayList"
:key="item.id"
:value="item.id"
style="width: 200px; height: 40px"
>
{{ item.name }}
</el-radio>
</el-radio-group>
</div>
<el-empty v-else description="暂无数据" :image-size="80" />
</div>
</div>
<template #footer>
<el-button @click="cancelDialog"> 取消 </el-button>
<el-button type="primary" @click="confirmDialog"> 确定 </el-button>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import {
getLogisticsCompanyList,
ILogisticsCompany,
getLogisticsWayListByCompanyId,
LogisticsWayData,
} from '@/api/logistics'
import { createLogisticsOrdersApi } from '@/api/podCnOrder'
const createLogisticDialogVisible = ref(false)
const isAutoMatch = ref(false)
const logisticCompanyList = ref<ILogisticsCompany[]>([])
const selectedLogisticCompany = ref<ILogisticsCompany | null>(null)
const logisticsWayList = ref<LogisticsWayData[]>([])
const logisticsWayId = ref<number | null>(null)
const orderIdList = ref<(string | number)[]>([])
const cancelDialog = () => {
logisticsWayList.value = []
logisticCompanyList.value = []
selectedLogisticCompany.value = null
logisticsWayId.value = null
orderIdList.value = []
isAutoMatch.value = false
createLogisticDialogVisible.value = false
}
// 获取物流公司列表
const getLogisticsCompanyListFn = async () => {
const { data } = await getLogisticsCompanyList()
logisticCompanyList.value = data as unknown as ILogisticsCompany[]
if (logisticCompanyList.value.length > 0) {
selectedLogisticCompany.value = logisticCompanyList.value[0]
await getLogisticsWayListFn(selectedLogisticCompany.value.id)
}
}
// 获取物流方式列表
const getLogisticsWayListFn = async (id: number) => {
const { data } = await getLogisticsWayListByCompanyId(id)
logisticsWayList.value = data
}
// 选择物流公司
const selectLogisticCompany = async (item: ILogisticsCompany) => {
selectedLogisticCompany.value = item
await getLogisticsWayListFn(item.id)
}
const confirmDialog = async () => {
await createLogisticsOrdersApi(orderIdList.value, logisticsWayId.value)
.then((res) => {
emits('show-result', res.data)
})
.finally(() => {
logisticsWayList.value = []
logisticCompanyList.value = []
selectedLogisticCompany.value = null
logisticsWayId.value = null
orderIdList.value = []
isAutoMatch.value = false
createLogisticDialogVisible.value = false
})
}
const showDialog = async (ids: (string | number)[]) => {
await getLogisticsCompanyListFn()
orderIdList.value = ids
createLogisticDialogVisible.value = true
}
const emits = defineEmits<{
(
e: 'show-result',
data: Array<{
id: string | number
status: boolean
factoryOrderNumber?: string
message: string
}>,
): void
}>()
defineExpose({
showDialog,
})
watch(isAutoMatch, (newVal) => {
if (newVal) {
getLogisticsCompanyListFn()
}
})
</script>
<style lang="scss" scoped>
.logistic-company-item {
padding: 10px 10px;
cursor: pointer;
&:hover {
background-color: #f0f0f0;
}
}
.selected-logistic-company {
background-color: #f0f0f0;
}
</style>
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
label-width="70px" label-width="70px"
> >
<!-- 批量下载 --> <!-- 批量下载 -->
<ElFormItem label="创建时间" v-if="status === 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status === 'BATCH_DOWNLOAD'" label="创建时间">
<el-date-picker <el-date-picker
v-model="timeRange" v-model="timeRange"
:teleported="false" :teleported="false"
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
> >
</el-date-picker> </el-date-picker>
</ElFormItem> </ElFormItem>
<ElFormItem label="创建人" v-if="status === 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status === 'BATCH_DOWNLOAD'" label="创建人">
<ElSelect <ElSelect
v-model="searchForm.employeeId" v-model="searchForm.employeeId"
placeholder="请选择" placeholder="请选择"
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
></ElOption> ></ElOption>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="工艺类型" v-if="status === 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status === 'BATCH_DOWNLOAD'" label="工艺类型">
<ElSelect <ElSelect
v-model="searchForm.craftType" v-model="searchForm.craftType"
placeholder="请选择" placeholder="请选择"
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
></ElOption> ></ElOption>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="下载状态" v-if="status === 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status === 'BATCH_DOWNLOAD'" label="下载状态">
<ElSelect <ElSelect
v-model="searchForm.downloadStatus" v-model="searchForm.downloadStatus"
placeholder="下载状态" placeholder="下载状态"
...@@ -78,7 +78,7 @@ ...@@ -78,7 +78,7 @@
></ElOption> ></ElOption>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="排版状态" v-if="status === 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status === 'BATCH_DOWNLOAD'" label="排版状态">
<ElSelect <ElSelect
v-model="searchForm.syntheticStatus" v-model="searchForm.syntheticStatus"
placeholder="排版状态" placeholder="排版状态"
...@@ -94,7 +94,7 @@ ...@@ -94,7 +94,7 @@
></ElOption> ></ElOption>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="自动排版" v-if="status === 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status === 'BATCH_DOWNLOAD'" label="自动排版">
<ElSelect <ElSelect
v-model="searchForm.automaticComposing" v-model="searchForm.automaticComposing"
placeholder="自动排版" placeholder="自动排版"
...@@ -111,7 +111,7 @@ ...@@ -111,7 +111,7 @@
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="仓库" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="仓库">
<ElSelect <ElSelect
v-model="searchForm.warehouseId" v-model="searchForm.warehouseId"
clearable clearable
...@@ -127,7 +127,7 @@ ...@@ -127,7 +127,7 @@
></el-option> ></el-option>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="平台" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="平台">
<ElSelect <ElSelect
v-model="searchForm.platform" v-model="searchForm.platform"
value-key="" value-key=""
...@@ -153,7 +153,7 @@ ...@@ -153,7 +153,7 @@
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="工艺" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="工艺">
<LogisticsWaySelect <LogisticsWaySelect
v-model="searchForm.craftCode" v-model="searchForm.craftCode"
:company-list="craftList" :company-list="craftList"
...@@ -162,7 +162,7 @@ ...@@ -162,7 +162,7 @@
start-placeholder="请选择工艺名称" start-placeholder="请选择工艺名称"
></LogisticsWaySelect> ></LogisticsWaySelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="库存SKU" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="库存SKU">
<ElInput <ElInput
v-model.trim="searchForm.thirdSkuCode" v-model.trim="searchForm.thirdSkuCode"
placeholder="库存SKU" placeholder="库存SKU"
...@@ -170,7 +170,7 @@ ...@@ -170,7 +170,7 @@
style="width: 180px" style="width: 180px"
></ElInput> ></ElInput>
</ElFormItem> </ElFormItem>
<ElFormItem label="款号" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="款号">
<ElInput <ElInput
v-model.trim="searchForm.supplierProductNo" v-model.trim="searchForm.supplierProductNo"
placeholder="款号" placeholder="款号"
...@@ -186,7 +186,7 @@ ...@@ -186,7 +186,7 @@
style="width: 150px" style="width: 150px"
/> />
</ElFormItem> </ElFormItem>
<ElFormItem label="生产单号" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="生产单号">
<ElInput <ElInput
v-model.trim="searchForm.factorySubOrderNumber" v-model.trim="searchForm.factorySubOrderNumber"
placeholder="生产单号" placeholder="生产单号"
...@@ -194,7 +194,7 @@ ...@@ -194,7 +194,7 @@
style="width: 150px" style="width: 150px"
/> />
</ElFormItem> </ElFormItem>
<ElFormItem label="店铺单号" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="店铺单号">
<ElInput <ElInput
v-model.trim="searchForm.shopNumber" v-model.trim="searchForm.shopNumber"
placeholder="店铺单号" placeholder="店铺单号"
...@@ -202,7 +202,7 @@ ...@@ -202,7 +202,7 @@
style="width: 150px" style="width: 150px"
/> />
</ElFormItem> </ElFormItem>
<ElFormItem label="尺码类型" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="尺码类型">
<ElSelect <ElSelect
v-model="searchForm.sizeType" v-model="searchForm.sizeType"
clearable clearable
...@@ -218,7 +218,7 @@ ...@@ -218,7 +218,7 @@
></el-option> ></el-option>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="排序方式" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="排序方式">
<el-select <el-select
v-model="searchForm.order" v-model="searchForm.order"
clearable clearable
...@@ -229,7 +229,7 @@ ...@@ -229,7 +229,7 @@
<el-option value="asc" label="按创建时间从旧到新"></el-option> <el-option value="asc" label="按创建时间从旧到新"></el-option>
</el-select> </el-select>
</ElFormItem> </ElFormItem>
<ElFormItem label="印刷" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="印刷">
<el-radio-group <el-radio-group
v-model="searchForm.customizedQuantity" v-model="searchForm.customizedQuantity"
@click.stop="(e: Event) => handleRadioGroupClick(e)" @click.stop="(e: Event) => handleRadioGroupClick(e)"
...@@ -239,7 +239,7 @@ ...@@ -239,7 +239,7 @@
<el-radio-button label="normal">普品</el-radio-button> <el-radio-button label="normal">普品</el-radio-button>
</el-radio-group> </el-radio-group>
</ElFormItem> </ElFormItem>
<ElFormItem label="数量" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="数量">
<el-radio-group <el-radio-group
v-model="searchForm.multi" v-model="searchForm.multi"
@click.stop="(e: Event) => handleMultiRadioGroupClick(e)" @click.stop="(e: Event) => handleMultiRadioGroupClick(e)"
...@@ -253,8 +253,8 @@ ...@@ -253,8 +253,8 @@
</el-radio-group> </el-radio-group>
</ElFormItem> </ElFormItem>
<ElFormItem <ElFormItem
label="标签"
v-if="status == 'TO_BE_REPLENISHMENT' || status == 'PICKING'" v-if="status == 'TO_BE_REPLENISHMENT' || status == 'PICKING'"
label="标签"
> >
<ElSelect <ElSelect
v-model="searchForm.outOfStock" v-model="searchForm.outOfStock"
...@@ -702,14 +702,14 @@ ...@@ -702,14 +702,14 @@
单件打单 单件打单
</ElButton> </ElButton>
</span> </span>
<span <!-- <span
v-if="status === 'WAIT_SHIPMENT' && isSuperFactory" v-if="status === 'WAIT_SHIPMENT' && isSuperFactory"
class="item" class="item"
> >
<ElButton type="danger" @click="printSuperPodOrder"> <ElButton type="danger" @click="printSuperPodOrder">
超级播种墙配货 超级播种墙配货
</ElButton> </ElButton>
</span> </span> -->
<span v-if="status === 'CREATE_LOGISTICS'" class="item"> <span v-if="status === 'CREATE_LOGISTICS'" class="item">
<ElButton type="warning" @click="logisticsToPicking"> <ElButton type="warning" @click="logisticsToPicking">
转至待排单 转至待排单
...@@ -753,7 +753,7 @@ ...@@ -753,7 +753,7 @@
selection.length === 0 || selection.length === 0 ||
selection.some((item) => item.shipmentType !== 1) selection.some((item) => item.shipmentType !== 1)
" "
@click="getOrderByIdApi('createLogisticsOrder')" @click="handleCreateLogistic()"
>创建物流订单</ElDropdownItem >创建物流订单</ElDropdownItem
> >
<ElDropdownItem <ElDropdownItem
...@@ -847,6 +847,11 @@ ...@@ -847,6 +847,11 @@
<span v-if="['WAIT_SHIPMENT'].includes(status)" class="item"> <span v-if="['WAIT_SHIPMENT'].includes(status)" class="item">
<ElButton type="primary" @click="printNormal"> 普货拣货 </ElButton> <ElButton type="primary" @click="printNormal"> 普货拣货 </ElButton>
</span> </span>
<span v-if="['WAIT_SHIPMENT'].includes(status)" class="item">
<ElButton type="primary" @click="printNormalProductionOrder">
打印普胚生产单
</ElButton>
</span>
<span <span
v-if=" v-if="
status === 'STOCK_OUT' || status === 'STOCK_OUT' ||
...@@ -931,6 +936,13 @@ ...@@ -931,6 +936,13 @@
</template> </template>
</ElDropdown> </ElDropdown>
</span> </span>
<span v-if="['COMPLETE'].includes(status)" class="item">
<ElButton
type="warning"
@click="getOrderByIdApi('getTrackingNumber')"
>获取跟踪号</ElButton
>
</span>
<span <span
v-if="['WAIT_TRACK', 'COMPLETE', 'IN_TRANSIT'].includes(status)" v-if="['WAIT_TRACK', 'COMPLETE', 'IN_TRANSIT'].includes(status)"
class="item" class="item"
...@@ -1121,6 +1133,7 @@ ...@@ -1121,6 +1133,7 @@
:paginated-data="tableData" :paginated-data="tableData"
:cell-style="onCellStyle" :cell-style="onCellStyle"
:row-style="getRowStyle" :row-style="getRowStyle"
:row-class-name="getRowClassName"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<template #serialNumber="{ row, index }"> <template #serialNumber="{ row, index }">
...@@ -1797,7 +1810,9 @@ ...@@ -1797,7 +1810,9 @@
> >
<span class="operate-item"> <span class="operate-item">
<ElButton <ElButton
:disabled="!row.url && !row.tiffUrl" :disabled="
(!row.url && !row.tiffUrl) || row.enableArrange === false
"
link link
type="primary" type="primary"
@click="handleDownload(row)" @click="handleDownload(row)"
...@@ -1821,7 +1836,7 @@ ...@@ -1821,7 +1836,7 @@
type="primary" type="primary"
@click="printPickingOrderItem(row, 1)" @click="printPickingOrderItem(row, 1)"
> >
打印拣货单 拣货单
</ElButton> </ElButton>
</span> </span>
<span class="operate-item"> <span class="operate-item">
...@@ -1830,19 +1845,19 @@ ...@@ -1830,19 +1845,19 @@
type="primary" type="primary"
@click="printPickingOrderItem(row, 2)" @click="printPickingOrderItem(row, 2)"
> >
打印生产单 生产单
</ElButton> </ElButton>
</span> </span>
<span class="operate-item"> <span class="operate-item">
<ElButton <ElButton
:disabled="row.productNum > 50" :disabled="row.productNum > 50 || row.enableArrange === false"
link link
type="warning" type="warning"
:loading="reComposingLoadingMap[row.id]" :loading="reComposingLoadingMap[row.id]"
@click="showArrange(1, row)" @click="showArrange(1, row)"
> >
新排版
</ElButton> </ElButton>
</span> </span>
<span class="operate-item"> <span class="operate-item">
...@@ -2073,6 +2088,17 @@ ...@@ -2073,6 +2088,17 @@
</template> </template>
<template #operations> <template #operations>
<div <div
v-if="
(cardItem?.productMark === 'custom_normal' ||
cardItem?.productMark === 'normal') &&
(status == 'TO_BE_ARRANGE' || status == 'PICKING')
"
class="customizedQuantity"
:title="`类型:${getProductMarkt(cardItem?.productMark)}面`"
>
{{ getProductMarkt(cardItem?.productMark) }}
</div>
<div
v-if="cardItem?.customizedQuantity" v-if="cardItem?.customizedQuantity"
class="customizedQuantity" class="customizedQuantity"
:title="`类型:${getQuantityText( :title="`类型:${getQuantityText(
...@@ -2765,6 +2791,11 @@ ...@@ -2765,6 +2791,11 @@
} }
" "
></ChangeWayDialog> ></ChangeWayDialog>
<CreateLogisticDialog
ref="createLogisticDialogRef"
:row-data="currentItem"
@show-result="handleShowResult"
/>
<print-warehouse-sku-tag ref="printWarehouseSkuDialogRef" /> <print-warehouse-sku-tag ref="printWarehouseSkuDialogRef" />
<weight-dialog <weight-dialog
ref="weightDialogRef" ref="weightDialogRef"
...@@ -2848,6 +2879,7 @@ import { ...@@ -2848,6 +2879,7 @@ import {
batchDownloadRecomposingApi, batchDownloadRecomposingApi,
getCustomTagListCnApi, getCustomTagListCnApi,
printNormalPdf, printNormalPdf,
printNormalProducePdf,
changeLogisticsApi, changeLogisticsApi,
getEmployeeListApi, getEmployeeListApi,
allErpCodeListApi, allErpCodeListApi,
...@@ -2857,6 +2889,7 @@ import { ...@@ -2857,6 +2889,7 @@ import {
// import { logisticsCompanyAllCodelist } from '@/api/logistics.ts' // import { logisticsCompanyAllCodelist } from '@/api/logistics.ts'
import { BaseRespData } from '@/types/api' import { BaseRespData } from '@/types/api'
import ChangeWayDialog from './components/ChangeWayDialog.vue' import ChangeWayDialog from './components/ChangeWayDialog.vue'
import CreateLogisticDialog from './components/CreateLogisticDialog.vue'
import UpdateAddress from './components/updateAddress.vue' import UpdateAddress from './components/updateAddress.vue'
import { useEnterKeyTrigger } from '@/utils/hooks/useEnterKeyTrigger.ts' import { useEnterKeyTrigger } from '@/utils/hooks/useEnterKeyTrigger.ts'
...@@ -2896,7 +2929,7 @@ import RightClickMenu from '@/components/RightClickMenu.vue' ...@@ -2896,7 +2929,7 @@ import RightClickMenu from '@/components/RightClickMenu.vue'
import ResultInfo from './components/ResultInfo.vue' import ResultInfo from './components/ResultInfo.vue'
import { isArray, isString } from '@/utils/validate' import { isArray, isString } from '@/utils/validate'
import platformJson from '../../../json/platform.json' import platformJson from '../../../json/platform.json'
import useUserStore from '@/store/user' // import useUserStore from '@/store/user'
import BigNumber from 'bignumber.js' import BigNumber from 'bignumber.js'
import { import {
useRouter, useRouter,
...@@ -2920,9 +2953,9 @@ declare global { ...@@ -2920,9 +2953,9 @@ declare global {
} }
} }
const userStore = useUserStore() // const userStore = useUserStore()
const isSuperFactory: boolean = userStore.user?.factory.dropShipping || false // const isSuperFactory: boolean = userStore.user?.factory.dropShipping || false
const tabsNav = ref<Tab[]>() const tabsNav = ref<Tab[]>()
const isAuto = ref(true) const isAuto = ref(true)
...@@ -2930,6 +2963,7 @@ const printWarehouseSkuDialogRef = ref() ...@@ -2930,6 +2963,7 @@ const printWarehouseSkuDialogRef = ref()
const weightDialogRef = ref() const weightDialogRef = ref()
const updateCustomDeclarationInfoDialogRef = ref() const updateCustomDeclarationInfoDialogRef = ref()
const updateCustomDeclarationInfoDialogVisible = ref(false) const updateCustomDeclarationInfoDialogVisible = ref(false)
const createLogisticDialogRef = ref()
const calculatedPrice = (item: ProductList) => { const calculatedPrice = (item: ProductList) => {
const templatePrice = new BigNumber(item.templatePrice || 0) const templatePrice = new BigNumber(item.templatePrice || 0)
const craftPrice = new BigNumber(item.craftPrice || 0) const craftPrice = new BigNumber(item.craftPrice || 0)
...@@ -3295,6 +3329,42 @@ const printNormal = async () => { ...@@ -3295,6 +3329,42 @@ const printNormal = async () => {
window.open(filePath + res.message) window.open(filePath + res.message)
} }
const printNormalProductionOrder = async () => {
const orderIds: number[] = []
if (!selection.value.length) {
return ElMessage.warning('请选择订单')
}
selection.value.forEach((s) => {
s.productList &&
s.productList.forEach((p) => {
if (p.productMark === 'normal' || p.productMark === 'custom_normal') {
orderIds.push(p.id)
}
})
})
if (!orderIds.length) {
ElMessage.warning('暂无可打印的普胚生产单')
return
}
const loading = ElLoading.service({
fullscreen: true,
text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)',
})
try {
const res = await printNormalProducePdf(orderIds)
if (res.code !== 200) return
ElMessage.success('操作成功')
window.open(filePath + res.message)
} catch (e) {
console.error(e)
} finally {
loading.close()
}
}
const completeDelivery = async () => { const completeDelivery = async () => {
if (selection.value.length === 0) { if (selection.value.length === 0) {
return ElMessage.warning('请选择订单') return ElMessage.warning('请选择订单')
...@@ -3803,7 +3873,7 @@ const tableColumns = computed(() => { ...@@ -3803,7 +3873,7 @@ const tableColumns = computed(() => {
{ {
label: '操作', label: '操作',
slot: 'operate', slot: 'operate',
width: 350, width: 260,
align: 'center', align: 'center',
fixed: 'right', fixed: 'right',
prop: 'operate', prop: 'operate',
...@@ -4450,8 +4520,12 @@ const printProductionOrder = async () => { ...@@ -4450,8 +4520,12 @@ const printProductionOrder = async () => {
text: '操作中...', text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)', background: 'rgba(0, 0, 0, 0.3)',
}) })
const url =
status.value === 'TO_BE_REPLENISHMENT'
? 'factory/podJomallOrderProductCn/replenishmentPrintProducePdf'
: 'factory/podJomallOrderProductCn/printProducePdf'
try { try {
const res = await printProductionOrderApi(orderIds) const res = await printProductionOrderApi(url, orderIds)
if (res.code !== 200) return if (res.code !== 200) return
ElMessage.success('操作成功') ElMessage.success('操作成功')
window.open(filePath + res.message) window.open(filePath + res.message)
...@@ -4807,7 +4881,33 @@ const showArrange = async (type: number, data?: PodCnOrderListData) => { ...@@ -4807,7 +4881,33 @@ const showArrange = async (type: number, data?: PodCnOrderListData) => {
if (type === 1 || type === 3) { if (type === 1 || type === 3) {
typesettingRow.value = data typesettingRow.value = data
} else if (type === 2) { } else if (type === 2) {
const ALLOWED_PRODUCT_MARKS = ['custom_normal', 'normal']
const selectedIds = cardSelection.value.map((item) => item.id) const selectedIds = cardSelection.value.map((item) => item.id)
const isProductMark = cardSelection.value.find((item) =>
ALLOWED_PRODUCT_MARKS.includes(item.productMark as string),
)
if (isProductMark) {
const bool = cardSelection.value.every((item) =>
ALLOWED_PRODUCT_MARKS.includes(item.productMark as string),
)
if (!bool) {
return await ElMessageBox.confirm(
'无法排单,你选择的生产单包含多种商品类型,排单不支持多种商品类型混排,请选择同一类型的商品对应的生产单后再试!',
'错误提示',
{
confirmButtonText: '确定',
type: 'warning',
},
)
} else {
await ElMessageBox.confirm('确认对所选择的生产单进行排单?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
return arrangeFinish()
}
}
if (selectedIds.length === 0) { if (selectedIds.length === 0) {
return ElMessage({ return ElMessage({
...@@ -4927,13 +5027,13 @@ const podDistributionOrderShow = async () => { ...@@ -4927,13 +5027,13 @@ const podDistributionOrderShow = async () => {
podDistributionOrderVisible.value = true podDistributionOrderVisible.value = true
} }
const superPodOrderVisible = ref(false) const superPodOrderVisible = ref(false)
const printSuperPodOrder = async () => { // const printSuperPodOrder = async () => {
const lodop = getCLodop(null, null) // const lodop = getCLodop(null, null)
if (!lodop) return // if (!lodop) return
sheetPrinter.value = lodop.GET_PRINTER_NAME(0) // sheetPrinter.value = lodop.GET_PRINTER_NAME(0)
superPodOrderVisible.value = true // superPodOrderVisible.value = true
} // }
/** /**
* @description: 创建物流、获取跟踪号、获取打印面单、更改物流、取消物流订单 * @description: 创建物流、获取跟踪号、获取打印面单、更改物流、取消物流订单
...@@ -4950,10 +5050,7 @@ const getOrderByIdApi = async (type: string) => { ...@@ -4950,10 +5050,7 @@ const getOrderByIdApi = async (type: string) => {
Fn: (orderIds: (string | number)[]) => Promise<BaseRespData<never>> Fn: (orderIds: (string | number)[]) => Promise<BaseRespData<never>>
} }
} = { } = {
createLogisticsOrder: {
message: '创建物流订单',
Fn: createLogisticsOrdersApi,
},
getTrackingNumber: { getTrackingNumber: {
message: '获取跟踪号', message: '获取跟踪号',
Fn: getTrackingNumberApi, Fn: getTrackingNumberApi,
...@@ -5401,13 +5498,27 @@ const onFastRefresh = () => { ...@@ -5401,13 +5498,27 @@ const onFastRefresh = () => {
} }
// // 修改行样式方法 // // 修改行样式方法
const getRowStyle = ({ row }: { row: PodCnOrderListData }) => { const getRowStyle = ({ row }: { row: PodCnOrderListData }) => {
// 如果行在补货成功列表中,设置绿色背景
if (stockOutSuccessIds.value.includes(row.id)) { if (stockOutSuccessIds.value.includes(row.id)) {
return { return {
backgroundColor: '#f0f9eb', backgroundColor: '#f0f9eb',
color: '#67c23a', color: '#67c23a',
} }
} }
return {} // 如果行被选中,设置背景色为 #fdf6ec
if (selection.value.some((item) => item.id === row.id)) {
return {
backgroundColor: '#fdf6ec',
}
}
return {
backgroundColor: '',
}
}
// 获取行类名方法
const getRowClassName = ({ row }: { row: PodCnOrderListData }) => {
return selection.value.some((item) => item.id === row.id) ? 'row-selected' : ''
} }
const warehouseList = ref<WarehouseListData[]>([]) const warehouseList = ref<WarehouseListData[]>([])
const loadWarehouseList = async () => { const loadWarehouseList = async () => {
...@@ -5792,6 +5903,12 @@ function getQuantityText(qty: number) { ...@@ -5792,6 +5903,12 @@ function getQuantityText(qty: number) {
if (!qty || qty <= 0) return '' if (!qty || qty <= 0) return ''
return Math.floor(qty) === 1 ? '单' : '多' return Math.floor(qty) === 1 ? '单' : '多'
} }
function getProductMarkt(productMark: string) {
if (!productMark) return ''
if (productMark === 'custom_normal') return 'CB'
if (productMark === 'normal') return 'G'
return ''
}
const handleMark = (mark: string) => { const handleMark = (mark: string) => {
switch (mark) { switch (mark) {
...@@ -5885,6 +6002,26 @@ const handleStockOut = async (row: PodCnOrderListData) => { ...@@ -5885,6 +6002,26 @@ const handleStockOut = async (row: PodCnOrderListData) => {
}) })
} }
// 创建物流订单
const handleCreateLogistic = () => {
const ids = selection.value.map((item) => item.id)
nextTick(() => {
createLogisticDialogRef.value?.showDialog(ids)
})
}
const handleShowResult = (data: Array<{
id: string | number
status: boolean
factoryOrderNumber?: string
message: string
}>) => {
resultInfo.value = data || []
if (resultInfo.value.length > 0) {
resultRefs.value?.showDialog()
}
}
const getNewImageFn = (img: string) => { const getNewImageFn = (img: string) => {
try { try {
if (img.startsWith('http')) return img if (img.startsWith('http')) return img
...@@ -6372,6 +6509,15 @@ const onUpdateCustomsDeclarationInfo = () => { ...@@ -6372,6 +6509,15 @@ const onUpdateCustomsDeclarationInfo = () => {
width: 75px; width: 75px;
} }
} }
// 确保选中行的背景色在 hover 时也保持
:deep(.el-table__body) {
.el-table__row.row-selected:hover {
td {
background-color: #fdf6ec !important;
}
}
}
</style> </style>
<style lang="scss"> <style lang="scss">
.customize-select-style { .customize-select-style {
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
inline inline
> >
<!-- 批量下载 --> <!-- 批量下载 -->
<ElFormItem label="创建时间" v-if="status === 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status === 'BATCH_DOWNLOAD'" label="创建时间">
<el-date-picker <el-date-picker
v-model="timeRange" v-model="timeRange"
:teleported="false" :teleported="false"
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
> >
</el-date-picker> </el-date-picker>
</ElFormItem> </ElFormItem>
<ElFormItem label="创建人" v-if="status === 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status === 'BATCH_DOWNLOAD'" label="创建人">
<ElSelect <ElSelect
v-model="searchForm.employeeId" v-model="searchForm.employeeId"
placeholder="请选择" placeholder="请选择"
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
></ElOption> ></ElOption>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="工艺类型" v-if="status === 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status === 'BATCH_DOWNLOAD'" label="工艺类型">
<ElSelect <ElSelect
v-model="searchForm.craftType" v-model="searchForm.craftType"
placeholder="请选择" placeholder="请选择"
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
></ElOption> ></ElOption>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="下载状态" v-if="status === 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status === 'BATCH_DOWNLOAD'" label="下载状态">
<ElSelect <ElSelect
v-model="searchForm.downloadStatus" v-model="searchForm.downloadStatus"
placeholder="下载状态" placeholder="下载状态"
...@@ -78,7 +78,7 @@ ...@@ -78,7 +78,7 @@
></ElOption> ></ElOption>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="排版状态" v-if="status === 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status === 'BATCH_DOWNLOAD'" label="排版状态">
<ElSelect <ElSelect
v-model="searchForm.syntheticStatus" v-model="searchForm.syntheticStatus"
placeholder="排版状态" placeholder="排版状态"
...@@ -94,7 +94,7 @@ ...@@ -94,7 +94,7 @@
></ElOption> ></ElOption>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="自动排版" v-if="status === 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status === 'BATCH_DOWNLOAD'" label="自动排版">
<ElSelect <ElSelect
v-model="searchForm.automaticComposing" v-model="searchForm.automaticComposing"
placeholder="自动排版" placeholder="自动排版"
...@@ -111,7 +111,7 @@ ...@@ -111,7 +111,7 @@
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<!-- <div> --> <!-- <div> -->
<ElFormItem label="仓库" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="仓库">
<ElSelect <ElSelect
v-model="searchForm.warehouseId" v-model="searchForm.warehouseId"
clearable clearable
...@@ -128,7 +128,7 @@ ...@@ -128,7 +128,7 @@
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="工艺" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="工艺">
<LogisticsWaySelect <LogisticsWaySelect
v-model="searchForm.craftCode" v-model="searchForm.craftCode"
:company-list="craftList" :company-list="craftList"
...@@ -137,7 +137,7 @@ ...@@ -137,7 +137,7 @@
start-placeholder="请选择工艺名称" start-placeholder="请选择工艺名称"
></LogisticsWaySelect> ></LogisticsWaySelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="库存SKU" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="库存SKU">
<ElInput <ElInput
v-model.trim="searchForm.thirdSkuCode" v-model.trim="searchForm.thirdSkuCode"
placeholder="库存SKU" placeholder="库存SKU"
...@@ -145,7 +145,7 @@ ...@@ -145,7 +145,7 @@
style="width: 180px" style="width: 180px"
></ElInput> ></ElInput>
</ElFormItem> </ElFormItem>
<ElFormItem label="款号" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="款号">
<ElInput <ElInput
v-model="searchForm.supplierProductNo" v-model="searchForm.supplierProductNo"
placeholder="款号" placeholder="款号"
...@@ -161,7 +161,7 @@ ...@@ -161,7 +161,7 @@
style="width: 150px" style="width: 150px"
/> />
</ElFormItem> </ElFormItem>
<ElFormItem label="生产单号" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="生产单号">
<ElInput <ElInput
v-model="searchForm.factorySubOrderNumber" v-model="searchForm.factorySubOrderNumber"
placeholder="生产单号" placeholder="生产单号"
...@@ -169,7 +169,7 @@ ...@@ -169,7 +169,7 @@
style="width: 150px" style="width: 150px"
/> />
</ElFormItem> </ElFormItem>
<ElFormItem label="店铺单号" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="店铺单号">
<ElInput <ElInput
v-model="searchForm.shopNumber" v-model="searchForm.shopNumber"
placeholder="店铺单号" placeholder="店铺单号"
...@@ -177,7 +177,7 @@ ...@@ -177,7 +177,7 @@
style="width: 150px" style="width: 150px"
/> />
</ElFormItem> </ElFormItem>
<ElFormItem label="尺码类型" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="尺码类型">
<ElSelect <ElSelect
v-model="searchForm.sizeType" v-model="searchForm.sizeType"
clearable clearable
...@@ -193,7 +193,7 @@ ...@@ -193,7 +193,7 @@
></el-option> ></el-option>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="平台" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="平台">
<ElSelect <ElSelect
v-model="searchForm.platform" v-model="searchForm.platform"
value-key="" value-key=""
...@@ -219,7 +219,7 @@ ...@@ -219,7 +219,7 @@
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<!-- </div> --> <!-- </div> -->
<ElFormItem label="印刷" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="印刷">
<el-radio-group <el-radio-group
v-model="searchForm.customizedQuantity" v-model="searchForm.customizedQuantity"
@click.stop="(e: Event) => handleRadioGroupClick(e)" @click.stop="(e: Event) => handleRadioGroupClick(e)"
...@@ -229,7 +229,7 @@ ...@@ -229,7 +229,7 @@
<el-radio-button label="normal">普品</el-radio-button> <el-radio-button label="normal">普品</el-radio-button>
</el-radio-group> </el-radio-group>
</ElFormItem> </ElFormItem>
<ElFormItem label="数量" v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="数量">
<el-radio-group <el-radio-group
v-model="searchForm.multi" v-model="searchForm.multi"
@click.stop="(e: Event) => handleMultiRadioGroupClick(e)" @click.stop="(e: Event) => handleMultiRadioGroupClick(e)"
...@@ -243,8 +243,8 @@ ...@@ -243,8 +243,8 @@
</el-radio-group> </el-radio-group>
</ElFormItem> </ElFormItem>
<ElFormItem <ElFormItem
label="标签"
v-if="status == 'TO_BE_REPLENISHMENT' || status == 'PICKING'" v-if="status == 'TO_BE_REPLENISHMENT' || status == 'PICKING'"
label="标签"
> >
<ElSelect <ElSelect
v-model="searchForm.outOfStock" v-model="searchForm.outOfStock"
...@@ -263,10 +263,10 @@ ...@@ -263,10 +263,10 @@
</ElFormItem> </ElFormItem>
<ElFormItem> <ElFormItem>
<ElPopover <ElPopover
v-if="status !== 'BATCH_DOWNLOAD'"
placement="bottom" placement="bottom"
width="600" width="600"
trigger="click" trigger="click"
v-if="status !== 'BATCH_DOWNLOAD'"
> >
<ElForm <ElForm
ref="searchFormPopoverRef" ref="searchFormPopoverRef"
...@@ -491,8 +491,8 @@ ...@@ -491,8 +491,8 @@
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem <ElFormItem
label="拦截订单"
v-if="status !== 'CANCEL' && status !== 'INTERCEPTED'" v-if="status !== 'CANCEL' && status !== 'INTERCEPTED'"
label="拦截订单"
> >
<ElSelect <ElSelect
v-model="searchForm.blocking" v-model="searchForm.blocking"
...@@ -1210,6 +1210,7 @@ ...@@ -1210,6 +1210,7 @@
:cell-style="onCellStyle" :cell-style="onCellStyle"
:cell-class-name="onCellClassName" :cell-class-name="onCellClassName"
:row-style="getRowStyle" :row-style="getRowStyle"
:row-class-name="getRowClassName"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<template #serialNumber="{ row, index }"> <template #serialNumber="{ row, index }">
...@@ -1983,7 +1984,7 @@ ...@@ -1983,7 +1984,7 @@
class="operate-box-vertical" class="operate-box-vertical"
> >
<el-link <el-link
:disabled="row.isUpload" :disabled="row.isUpload || row.enableArrange === false"
underline="never" underline="never"
type="success" type="success"
@click="uploadFile(row)" @click="uploadFile(row)"
...@@ -1997,7 +1998,7 @@ ...@@ -1997,7 +1998,7 @@
<Loading /> <Loading />
</el-icon> </el-icon>
<el-link <el-link
:disabled="!row.prnUrl" :disabled="!row.prnUrl || row.enableArrange === false"
style="margin-left: 8px" style="margin-left: 8px"
underline="never" underline="never"
:title="fileName(row)" :title="fileName(row)"
...@@ -2051,7 +2052,9 @@ ...@@ -2051,7 +2052,9 @@
</span> </span>
<span class="operate-item"> <span class="operate-item">
<ElButton <ElButton
:disabled="!row.url && !row.tiffUrl" :disabled="
(!row.url && !row.tiffUrl) || row.enableArrange === false
"
link link
type="primary" type="primary"
@click="handleDownload(row)" @click="handleDownload(row)"
...@@ -2064,7 +2067,7 @@ ...@@ -2064,7 +2067,7 @@
</span> </span>
<span class="operate-item"> <span class="operate-item">
<ElButton <ElButton
:disabled="row.productNum > 50" :disabled="row.productNum > 50 || row.enableArrange === false"
link link
title="重新排版" title="重新排版"
type="warning" type="warning"
...@@ -2336,6 +2339,17 @@ ...@@ -2336,6 +2339,17 @@
</template> </template>
<template #operations> <template #operations>
<div <div
v-if="
(cardItem?.productMark === 'custom_normal' ||
cardItem?.productMark === 'normal') &&
(status == 'TO_BE_ARRANGE' || status == 'PICKING')
"
class="customizedQuantity"
:title="`类型:${getProductMarkt(cardItem?.productMark)}面`"
>
{{ getProductMarkt(cardItem?.productMark) }}
</div>
<div
v-if="cardItem?.customizedQuantity" v-if="cardItem?.customizedQuantity"
class="customizedQuantity" class="customizedQuantity"
:title="`类型:${getQuantityText( :title="`类型:${getQuantityText(
...@@ -3142,7 +3156,7 @@ ...@@ -3142,7 +3156,7 @@
<uploadBox <uploadBox
v-if="status === 'BATCH_DOWNLOAD'" v-if="status === 'BATCH_DOWNLOAD'"
:uploadList="uploadList" :upload-list="uploadList"
></uploadBox> ></uploadBox>
</template> </template>
<script setup lang="tsx"> <script setup lang="tsx">
...@@ -3264,7 +3278,7 @@ import { ...@@ -3264,7 +3278,7 @@ import {
CircleCheckFilled, CircleCheckFilled,
} from '@element-plus/icons-vue' } from '@element-plus/icons-vue'
import { Column, ElFormItem, ElMessage } from 'element-plus' import { Column, ElFormItem, ElMessage } from 'element-plus'
import { computed, onMounted, ref, nextTick, reactive } from 'vue' import { computed, onMounted, ref, nextTick, reactive, h } from 'vue'
import FastProduction from './FastProduction.vue' import FastProduction from './FastProduction.vue'
import { filePath } from '@/api/axios' import { filePath } from '@/api/axios'
import PodMakeOrder from './PodMakeOrder.vue' import PodMakeOrder from './PodMakeOrder.vue'
...@@ -4824,37 +4838,6 @@ const assignOrder = async () => { ...@@ -4824,37 +4838,6 @@ const assignOrder = async () => {
currentOrderIds.value = selection.value.map((item) => item.id) currentOrderIds.value = selection.value.map((item) => item.id)
exceptionDialogVisible.value = true exceptionDialogVisible.value = true
} }
// const handleExceptionOrder = async () => {
// if (selection.value.length === 0) {
// return ElMessage.warning('请选择数据')
// }
// try {
// await showConfirm('确定处理异常吗?', {
// confirmButtonText: '确认',
// cancelButtonText: '取消',
// type: 'warning',
// })
// } catch {
// return
// }
// const orderIds = selection.value.map((item) => item.id)
// const loading = ElLoading.service({
// fullscreen: true,
// text: '操作中...',
// background: 'rgba(0, 0, 0, 0.3)',
// })
// try {
// const res = await handleExceptionOrderApi(orderIds)
// if (res.code !== 200) return
// ElMessage.success('操作成功')
// search()
// loadTabData()
// } catch (e) {
// console.error(e)
// } finally {
// loading.close()
// }
// }
const printProductionOrder = async ( const printProductionOrder = async (
type: 1 | 2, type: 1 | 2,
item: PodUsOrderListData | null, item: PodUsOrderListData | null,
...@@ -4870,8 +4853,12 @@ const printProductionOrder = async ( ...@@ -4870,8 +4853,12 @@ const printProductionOrder = async (
text: '操作中...', text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)', background: 'rgba(0, 0, 0, 0.3)',
}) })
const url =
status.value === 'TO_BE_REPLENISHMENT'
? 'factory/podJomallOrderProductUs/replenishmentPrintProducePdf'
: 'factory/podJomallOrderProductUs/printProducePdf'
try { try {
const res = await printProductionOrderApi(orderIds) const res = await printProductionOrderApi(url, orderIds)
if (res.code !== 200) return if (res.code !== 200) return
ElMessage.success('操作成功') ElMessage.success('操作成功')
window.open(filePath + res.message) window.open(filePath + res.message)
...@@ -5317,43 +5304,67 @@ const showArrange = async (type: number, data?: PodUsOrderListData) => { ...@@ -5317,43 +5304,67 @@ const showArrange = async (type: number, data?: PodUsOrderListData) => {
offset: window.innerHeight / 2, offset: window.innerHeight / 2,
}) })
} }
const bool = hasDifferentCraftCodeWithSet(cardSelection.value)
if (bool) { // 是否全是cb和g类
try { const allCBOrG = cardSelection.value.every(
await ElMessageBox.confirm( (item) =>
'选中排单的生产单存在多个工艺类型, 是否继续排单?', item.productMark === 'custom_normal' || item.productMark === 'normal',
)
// 是否全是cp类
const allCP = cardSelection.value.every(
(item) =>
item.productMark !== 'custom_normal' && item.productMark !== 'normal',
)
// cb和g类排单
if (allCBOrG) {
ElMessageBox.confirm('确认对所选择生产单进行排单?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
isAuto.value = false
submitTypesetting()
})
} else if (allCP) {
typesettingVisible.value = true
} else {
// 不支持混排
await ElMessageBox.alert(
h('p', null, [
h('span', null, '无法排单。'),
h('br'),
h(
'span',
null,
'原因:你选择的生产单包含多种商品类型,排单不支持多种商品类型混排,请选择同一类型的商品对应的生产单后再试!',
),
]),
'提示', '提示',
{ {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}, },
) )
return
typesettingVisible.value = true
} catch (error) {
return (typesettingVisible.value = false)
}
} }
} }
typesettingVisible.value = true
} }
function hasDifferentCraftCodeWithSet(items: ProductList[]) { // function hasDifferentCraftCodeWithSet(items: ProductList[]) {
if (items.length <= 1) return false // if (items.length <= 1) return false
const seen = new Set() // const seen = new Set()
for (const item of items) { // for (const item of items) {
if (seen.has(item.craftType)) { // if (seen.has(item.craftType)) {
if (seen.size > 1) return true // if (seen.size > 1) return true
} else { // } else {
seen.add(item.craftType) // seen.add(item.craftType)
if (seen.size > 1) return true // if (seen.size > 1) return true
} // }
} // }
return false // return false
} // }
const arrangeFinish = async () => { const arrangeFinish = async () => {
const loading = ElLoading.service({ const loading = ElLoading.service({
...@@ -6157,13 +6168,27 @@ const onFastRefresh = () => { ...@@ -6157,13 +6168,27 @@ const onFastRefresh = () => {
} }
// // 修改行样式方法 // // 修改行样式方法
const getRowStyle = ({ row }: { row: PodUsOrderListData }) => { const getRowStyle = ({ row }: { row: PodUsOrderListData }) => {
// 如果行在补货成功列表中,设置绿色背景
if (stockOutSuccessIds.value.includes(row.id)) { if (stockOutSuccessIds.value.includes(row.id)) {
return { return {
backgroundColor: '#f0f9eb', backgroundColor: '#f0f9eb',
color: '#67c23a', color: '#67c23a',
} }
} }
return {} // 如果行被选中,设置背景色为 #fdf6ec
if (selection.value.some((item) => item.id === row.id)) {
return {
backgroundColor: '#fdf6ec',
}
}
return {
backgroundColor: '',
}
}
// 获取行类名方法
const getRowClassName = ({ row }: { row: PodUsOrderListData }) => {
return selection.value.some((item) => item.id === row.id) ? 'row-selected' : ''
} }
const warehouseList = ref<WarehouseListData[]>([]) const warehouseList = ref<WarehouseListData[]>([])
const loadWarehouseList = async () => { const loadWarehouseList = async () => {
...@@ -6551,6 +6576,12 @@ function getQuantityText(qty: number) { ...@@ -6551,6 +6576,12 @@ function getQuantityText(qty: number) {
if (!qty || qty <= 0) return '' if (!qty || qty <= 0) return ''
return Math.floor(qty) === 1 ? '单' : '多' return Math.floor(qty) === 1 ? '单' : '多'
} }
function getProductMarkt(productMark: string) {
if (!productMark) return ''
if (productMark === 'custom_normal') return 'CB'
if (productMark === 'normal') return 'G'
return ''
}
const dialogVisible = ref(false) const dialogVisible = ref(false)
const dialogImageUrl = ref('') const dialogImageUrl = ref('')
...@@ -7292,6 +7323,15 @@ useRouter().beforeEach((to, from, next) => { ...@@ -7292,6 +7323,15 @@ useRouter().beforeEach((to, from, next) => {
width: 75px; width: 75px;
} }
} }
// 确保选中行的背景色在 hover 时也保持
:deep(.el-table__body) {
.el-table__row.row-selected:hover {
td {
background-color: #fdf6ec !important;
}
}
}
</style> </style>
<style lang="scss"> <style lang="scss">
.customize-select-style { .customize-select-style {
......
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