feat:产品入库-关联任务单改成关联生产计划

main
黄伟杰 1 week ago
parent c853bdbe55
commit c9a9af0bf7

@ -843,8 +843,8 @@ export default {
relatedOrder: 'Related Order', relatedOrder: 'Related Order',
relatedRepairOrder: 'Related Repair Order', relatedRepairOrder: 'Related Repair Order',
relatedMaintainRecord: 'Related Maintenance Record', relatedMaintainRecord: 'Related Maintenance Record',
relatedTask: 'Related Task', relatedTask: 'Related Production Plan',
taskOrder: 'Task Order', taskOrder: 'Production Plan',
palletCode: 'Pallet Code', palletCode: 'Pallet Code',
availablePallets: 'Available Pallets', availablePallets: 'Available Pallets',
selectedPallets: 'Selected Pallets', selectedPallets: 'Selected Pallets',
@ -864,7 +864,7 @@ export default {
packageItemCount: 'Package Item Count', packageItemCount: 'Package Item Count',
selectRelatedRepairOrder: 'Select Repair Order', selectRelatedRepairOrder: 'Select Repair Order',
selectRelatedMaintainRecord: 'Select Maintenance Record', selectRelatedMaintainRecord: 'Select Maintenance Record',
selectTaskOrder: 'Select Task Order', selectTaskOrder: 'Select Production Plan',
selectPalletCode: 'Select Pallet Code', selectPalletCode: 'Select Pallet Code',
inputUnitType: 'Unit Input Type', inputUnitType: 'Unit Input Type',
inputCount: 'Purchase Unit Quantity', inputCount: 'Purchase Unit Quantity',
@ -887,7 +887,7 @@ export default {
placeholderOutboundPurpose: 'Please select outbound purpose', placeholderOutboundPurpose: 'Please select outbound purpose',
placeholderRelatedRepairOrder: 'Please select related repair order', placeholderRelatedRepairOrder: 'Please select related repair order',
placeholderRelatedMaintainRecord: 'Please select related maintenance record', placeholderRelatedMaintainRecord: 'Please select related maintenance record',
placeholderTaskOrder: 'Please select task order', placeholderTaskOrder: 'Please select production plan',
placeholderPalletCode: 'Please select pallet code', placeholderPalletCode: 'Please select pallet code',
placeholderInputUnitType: 'Please select', placeholderInputUnitType: 'Please select',
placeholderCode: 'Please enter code', placeholderCode: 'Please enter code',
@ -895,7 +895,7 @@ export default {
validatorWarehouseRequired: 'Warehouse is required', validatorWarehouseRequired: 'Warehouse is required',
validatorAreaRequired: 'Please select area', validatorAreaRequired: 'Please select area',
validatorProductRequired: 'Product is required', validatorProductRequired: 'Product is required',
validatorTaskRequired: 'Task order is required', validatorTaskRequired: 'Production plan is required',
validatorPalletRequired: 'Pallet code is required', validatorPalletRequired: 'Pallet code is required',
validatorPackageCountRequired: 'Package count is required and must be greater than 0', validatorPackageCountRequired: 'Package count is required and must be greater than 0',
validatorOutboundPurposeRequired: 'Outbound purpose is required', validatorOutboundPurposeRequired: 'Outbound purpose is required',
@ -4816,6 +4816,7 @@ export default {
tablePlanStartTimeColumn: 'Plan Start Time', tablePlanStartTimeColumn: 'Plan Start Time',
tablePlanEndTimeColumn: 'Plan End Time', tablePlanEndTimeColumn: 'Plan End Time',
tableStatusColumn: 'Status', tableStatusColumn: 'Status',
tableRemarkColumn: 'Remark',
tableIsZjColumn: 'Inspected', tableIsZjColumn: 'Inspected',
tableOperateColumn: 'Operate', tableOperateColumn: 'Operate',

@ -843,8 +843,8 @@ export default {
relatedOrder: '关联单据', relatedOrder: '关联单据',
relatedRepairOrder: '关联维修单', relatedRepairOrder: '关联维修单',
relatedMaintainRecord: '关联保养记录', relatedMaintainRecord: '关联保养记录',
relatedTask: '关联任务单', relatedTask: '关联生产计划',
taskOrder: '任务单', taskOrder: '生产计划',
palletCode: '托盘码', palletCode: '托盘码',
availablePallets: '可选托盘', availablePallets: '可选托盘',
selectedPallets: '已选托盘', selectedPallets: '已选托盘',
@ -864,7 +864,7 @@ export default {
packageItemCount: '每包个数', packageItemCount: '每包个数',
selectRelatedRepairOrder: '选择维修单', selectRelatedRepairOrder: '选择维修单',
selectRelatedMaintainRecord: '选择保养记录', selectRelatedMaintainRecord: '选择保养记录',
selectTaskOrder: '选择任务单', selectTaskOrder: '选择生产计划',
selectPalletCode: '选择托盘码', selectPalletCode: '选择托盘码',
inputUnitType: '单位输入方式', inputUnitType: '单位输入方式',
inputCount: '采购单位数量', inputCount: '采购单位数量',
@ -887,7 +887,7 @@ export default {
placeholderOutboundPurpose: '请选择出库用途', placeholderOutboundPurpose: '请选择出库用途',
placeholderRelatedRepairOrder: '请选择关联维修单', placeholderRelatedRepairOrder: '请选择关联维修单',
placeholderRelatedMaintainRecord: '请选择关联保养记录', placeholderRelatedMaintainRecord: '请选择关联保养记录',
placeholderTaskOrder: '请选择任务单', placeholderTaskOrder: '请选择生产计划',
placeholderPalletCode: '请选择托盘码', placeholderPalletCode: '请选择托盘码',
placeholderInputUnitType: '请选择', placeholderInputUnitType: '请选择',
placeholderCode: '请输入编码', placeholderCode: '请输入编码',
@ -895,7 +895,7 @@ export default {
validatorWarehouseRequired: '仓库不能为空', validatorWarehouseRequired: '仓库不能为空',
validatorAreaRequired: '请选择库区', validatorAreaRequired: '请选择库区',
validatorProductRequired: '产品不能为空', validatorProductRequired: '产品不能为空',
validatorTaskRequired: '任务单不能为空', validatorTaskRequired: '生产计划不能为空',
validatorPalletRequired: '托盘码不能为空', validatorPalletRequired: '托盘码不能为空',
validatorPackageCountRequired: '包数不能为空且必须大于0', validatorPackageCountRequired: '包数不能为空且必须大于0',
validatorOutboundPurposeRequired: '出库用途不能为空', validatorOutboundPurposeRequired: '出库用途不能为空',
@ -4665,6 +4665,7 @@ export default {
tablePlanStartTimeColumn: '计划开始时间', tablePlanStartTimeColumn: '计划开始时间',
tablePlanEndTimeColumn: '计划结束时间', tablePlanEndTimeColumn: '计划结束时间',
tableStatusColumn: '状态', tableStatusColumn: '状态',
tableRemarkColumn: '备注',
tableIsZjColumn: '是否检验', tableIsZjColumn: '是否检验',
tableOperateColumn: '操作', tableOperateColumn: '操作',

@ -316,14 +316,31 @@
<div class="task-select-dialog"> <div class="task-select-dialog">
<div class="task-select-dialog__section-title">{{ t('ErpStock.Item.selectTaskOrder') }}</div> <div class="task-select-dialog__section-title">{{ t('ErpStock.Item.selectTaskOrder') }}</div>
<el-form :model="taskQueryParams" :inline="true" class="-mb-15px"> <el-form :model="taskQueryParams" :inline="true" class="-mb-15px">
<el-form-item :label="t('ProductionPlan.Task.searchCodeLabel')"> <el-form-item :label="t('ProductionPlan.Plan.searchCodeLabel')">
<el-input <el-input
v-model="taskQueryParams.code" v-model="taskQueryParams.code"
clearable clearable
:placeholder="t('ProductionPlan.Task.searchCodePlaceholder')" :placeholder="t('ProductionPlan.Plan.searchCodePlaceholder')"
@keyup.enter="handleTaskDialogQuery" @keyup.enter="handleTaskDialogQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="t('ProductionPlan.Plan.tableStatusColumn')">
<el-select
v-model="taskQueryParams.status"
clearable
filterable
:placeholder="t('common.selectText')"
class="!w-160px"
@change="handleTaskDialogQuery"
>
<el-option
v-for="item in planStatusOptions"
:key="item.value"
:label="item.label"
:value="String(item.value)"
/>
</el-select>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleTaskDialogQuery"> <el-button type="primary" @click="handleTaskDialogQuery">
<Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }} <Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}
@ -343,15 +360,18 @@
<el-radio v-model="selectedTaskId" :label="row.id">&nbsp;</el-radio> <el-radio v-model="selectedTaskId" :label="row.id">&nbsp;</el-radio>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('ProductionPlan.Task.tableCodeColumn')" prop="code" min-width="160" /> <el-table-column :label="t('ProductionPlan.Plan.tableCodeColumn')" prop="code" min-width="160" />
<el-table-column :label="t('ProductionPlan.Task.tableOrderDateColumn')" prop="orderDate" :formatter="dateFormatter2" min-width="120" /> <el-table-column :label="t('ProductionPlan.Plan.tableTaskCodeColumn')" prop="taskCode" min-width="140" />
<el-table-column :label="t('ProductionPlan.Task.tableDeliveryDateColumn')" prop="deliveryDate" :formatter="dateFormatter2" min-width="120" /> <el-table-column :label="t('ProductionPlan.Plan.tableProductColumn')" prop="productName" min-width="160" />
<el-table-column :label="t('ProductionPlan.Task.tableStatusColumn')" prop="status" min-width="100"> <el-table-column :label="t('ProductionPlan.Plan.tablePlanNumberColumn')" prop="planNumber" min-width="100" />
<el-table-column :label="t('ProductionPlan.Plan.tableStatusColumn')" prop="status" min-width="100">
<template #default="{ row }"> <template #default="{ row }">
<dict-tag :type="DICT_TYPE.MES_TASK_STATUS" :value="row.status" /> <dict-tag :type="DICT_TYPE.MES_PLAN_STATUS" :value="row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="t('ProductionPlan.Task.tableRemarkColumn')" prop="remark" min-width="160" /> <el-table-column :label="t('ProductionPlan.Plan.tablePlanStartTimeColumn')" prop="planStartTime" :formatter="dateFormatter2" min-width="140" />
<el-table-column :label="t('ProductionPlan.Plan.tablePlanEndTimeColumn')" prop="planEndTime" :formatter="dateFormatter2" min-width="140" />
<el-table-column :label="t('ProductionPlan.Plan.tableRemarkColumn')" prop="remark" min-width="160" />
</el-table> </el-table>
<div class="product-dialog-pagination"> <div class="product-dialog-pagination">
<Pagination <Pagination
@ -368,7 +388,7 @@
row-key="productId" row-key="productId"
:stripe="true" :stripe="true"
:show-overflow-tooltip="true" :show-overflow-tooltip="true"
empty-text="请先选择任务单" empty-text="请先选择生产计划"
@row-click="handleTaskProductDialogRowClick" @row-click="handleTaskProductDialogRowClick"
> >
<el-table-column width="55" align="center"> <el-table-column width="55" align="center">
@ -557,12 +577,12 @@ import { ProductApi, ProductVO } from '@/api/erp/product/product'
import { WarehouseApi, WarehouseVO } from '@/api/erp/stock/warehouse' import { WarehouseApi, WarehouseVO } from '@/api/erp/stock/warehouse'
import { WarehouseAreaApi, WarehouseAreaVO } from '@/api/erp/stock/warehousearea' import { WarehouseAreaApi, WarehouseAreaVO } from '@/api/erp/stock/warehousearea'
import { StockApi } from '@/api/erp/stock/stock' import { StockApi } from '@/api/erp/stock/stock'
import { TaskApi, TaskVO } from '@/api/mes/task' import { PlanApi, PlanVO } from '@/api/mes/plan'
import { PalletApi, PalletVO } from '@/api/erp/stock/pallet' import { PalletApi, PalletVO } from '@/api/erp/stock/pallet'
import { SupplierApi } from '@/api/erp/purchase/supplier' import { SupplierApi } from '@/api/erp/purchase/supplier'
import PalletForm from '../../pallet/PalletForm.vue' import PalletForm from '../../pallet/PalletForm.vue'
import SupplierForm from '../../../purchase/supplier/SupplierForm.vue' import SupplierForm from '../../../purchase/supplier/SupplierForm.vue'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
import { dateFormatter2 } from '@/utils/formatTime' import { dateFormatter2 } from '@/utils/formatTime'
import { erpPriceMultiply } from '@/utils' import { erpPriceMultiply } from '@/utils'
@ -646,12 +666,13 @@ const supplierQueryParams = reactive({
const taskDialogVisible = ref(false) const taskDialogVisible = ref(false)
const taskDialogLoading = ref(false) const taskDialogLoading = ref(false)
const taskSchemeLoading = ref(false) const taskSchemeLoading = ref(false)
const taskDialogList = ref<TaskVO[]>([]) const taskDialogList = ref<PlanVO[]>([])
const taskDialogTotal = ref(0) const taskDialogTotal = ref(0)
const taskQueryParams = reactive({ const taskQueryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
code: undefined code: undefined,
status: '1'
}) })
const selectedTaskId = ref<number>() const selectedTaskId = ref<number>()
const selectedTaskProductId = ref<number>() const selectedTaskProductId = ref<number>()
@ -678,6 +699,7 @@ const palletFormRef = ref()
const palletStatusOptions = computed(() => const palletStatusOptions = computed(() =>
getIntDictOptions(DICT_TYPE.STORAGE_PALLET_STATUS).filter((dict) => Number(dict.value) !== 3) getIntDictOptions(DICT_TYPE.STORAGE_PALLET_STATUS).filter((dict) => Number(dict.value) !== 3)
) )
const planStatusOptions = computed(() => getStrDictOptions(DICT_TYPE.MES_PLAN_STATUS))
const availablePalletList = computed(() => { const availablePalletList = computed(() => {
const selectedIds = new Set(selectedPalletRows.value.map((item) => item.id)) const selectedIds = new Set(selectedPalletRows.value.map((item) => item.id))
return palletDialogList.value.filter((item) => !selectedIds.has(item.id)) return palletDialogList.value.filter((item) => !selectedIds.has(item.id))
@ -1090,10 +1112,11 @@ const openTaskSelectDialog = async (row: any) => {
taskProductDialogList.value = getTaskProductOptions(row) taskProductDialogList.value = getTaskProductOptions(row)
taskQueryParams.pageNo = 1 taskQueryParams.pageNo = 1
taskQueryParams.code = undefined taskQueryParams.code = undefined
taskQueryParams.status = '1'
taskDialogVisible.value = true taskDialogVisible.value = true
await getTaskDialogList() await getTaskDialogList()
if (row.taskId) { if (row.taskId) {
await loadTaskProductDialogList({ id: row.taskId, code: row.taskCode } as TaskVO) await loadTaskProductDialogList({ id: row.taskId, code: row.taskCode, productId: row.productId, productName: row.productName } as PlanVO)
} }
} }
@ -1105,7 +1128,10 @@ const handleTaskInputClick = (row: any) => {
const getTaskDialogList = async () => { const getTaskDialogList = async () => {
taskDialogLoading.value = true taskDialogLoading.value = true
try { try {
const data = await TaskApi.getTaskPage(taskQueryParams) const data = await PlanApi.getPlanPage({
...taskQueryParams,
status: taskQueryParams.status || undefined
})
taskDialogList.value = data?.list || [] taskDialogList.value = data?.list || []
taskDialogTotal.value = data?.total || 0 taskDialogTotal.value = data?.total || 0
} finally { } finally {
@ -1122,7 +1148,7 @@ const handleTaskDialogQuery = () => {
getTaskDialogList() getTaskDialogList()
} }
const handleTaskDialogRowClick = async (row: TaskVO) => { const handleTaskDialogRowClick = async (row: PlanVO) => {
selectedTaskId.value = row.id selectedTaskId.value = row.id
selectedTaskProductId.value = undefined selectedTaskProductId.value = undefined
await loadTaskProductDialogList(row) await loadTaskProductDialogList(row)
@ -1131,7 +1157,7 @@ const handleTaskDialogRowClick = async (row: TaskVO) => {
const confirmTaskSelect = async () => { const confirmTaskSelect = async () => {
if (props.disabled) return if (props.disabled) return
const task = taskDialogList.value.find((item) => item.id === selectedTaskId.value) const task = taskDialogList.value.find((item) => item.id === selectedTaskId.value)
|| ({ id: selectedTaskData.value?.taskId, code: selectedTaskData.value?.taskName } as TaskVO) || ({ id: selectedTaskData.value?.taskId, code: selectedTaskData.value?.taskName } as PlanVO)
const product = taskProductDialogList.value.find((item) => item.productId === selectedTaskProductId.value) const product = taskProductDialogList.value.find((item) => item.productId === selectedTaskProductId.value)
const data = selectedTaskData.value const data = selectedTaskData.value
if (!task || !product || !data || !currentSelectRow.value) return if (!task || !product || !data || !currentSelectRow.value) return
@ -1140,12 +1166,36 @@ const confirmTaskSelect = async () => {
taskDialogVisible.value = false taskDialogVisible.value = false
} }
const loadTaskProductDialogList = async (task: TaskVO) => { const loadTaskProductDialogList = async (task: PlanVO) => {
taskSchemeLoading.value = true taskSchemeLoading.value = true
try { try {
const data = await TaskApi.getTaskDefaultPackagingSchemes(task.id) const productId = task.productId ?? currentSelectRow.value?.productId
const product = productId ? await ProductApi.getProduct(productId) : undefined
const productOption = product
? {
...product,
productId: product.id,
productCode: product.barCode,
productName: product.name,
taskDetailIds: task.taskDetailId
}
: {
productId: task.productId,
productCode: undefined,
productName: task.productName,
taskDetailIds: task.taskDetailId,
packagingSchemes: []
}
const data = {
taskId: task.id,
taskName: task.code,
products: productOption.productId ? [productOption] : []
}
selectedTaskData.value = data selectedTaskData.value = data
taskProductDialogList.value = Array.isArray(data?.products) ? data.products : [] taskProductDialogList.value = data.products
if (data.products.length === 1) {
selectedTaskProductId.value = data.products[0].productId
}
} finally { } finally {
taskSchemeLoading.value = false taskSchemeLoading.value = false
} }
@ -1155,7 +1205,7 @@ const handleTaskProductDialogRowClick = (row: any) => {
selectedTaskProductId.value = row.productId selectedTaskProductId.value = row.productId
} }
const fillRowByTask = (row: any, task: TaskVO, data: any) => { const fillRowByTask = (row: any, task: PlanVO, data: any) => {
const products = Array.isArray(data?.products) ? data.products : [] const products = Array.isArray(data?.products) ? data.products : []
row.relateTask = true row.relateTask = true
row.relatedTask = undefined row.relatedTask = undefined

Loading…
Cancel
Save