|
|
|
|
@ -43,35 +43,27 @@
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item :label="t('ProductionPlan.Task.detailDialogProjectLabel')" prop="projectName">
|
|
|
|
|
<el-input v-model="formData.projectName" :placeholder="t('ProductionPlan.Task.detailDialogProjectPlaceholder')" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item :label="t('ProductionPlan.Task.detailDialogPackageSizeLabel')" prop="packageSize">
|
|
|
|
|
<el-input-number
|
|
|
|
|
v-model="formData.packageSize"
|
|
|
|
|
:min="0"
|
|
|
|
|
class="!w-1/1"
|
|
|
|
|
:placeholder="t('ProductionPlan.Task.detailDialogPackageSizePlaceholder')"
|
|
|
|
|
<el-form-item :label="t('ProductionPlan.Task.detailDialogPlacementRuleLabel')" prop="placementRule">
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="formData.placementRule"
|
|
|
|
|
:placeholder="t('ProductionPlan.Task.detailDialogPlacementRulePlaceholder')"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item :label="t('ProductionPlan.Task.detailDialogPackageNumberLabel')" prop="packageNumber">
|
|
|
|
|
<el-input-number
|
|
|
|
|
v-model="formData.packageNumber"
|
|
|
|
|
:min="0"
|
|
|
|
|
disabled
|
|
|
|
|
class="!w-1/1"
|
|
|
|
|
:placeholder="t('ProductionPlan.Task.detailDialogPackageNumberPlaceholder')"
|
|
|
|
|
<el-form-item :label="t('ProductionPlan.Task.detailDialogPackagingSchemeLabel')" prop="packagingSchemeId">
|
|
|
|
|
<el-input
|
|
|
|
|
:model-value="displayPackagingSchemeName"
|
|
|
|
|
readonly
|
|
|
|
|
clearable
|
|
|
|
|
:placeholder="t('ProductionPlan.Task.detailDialogPackagingSchemePlaceholder')"
|
|
|
|
|
@click="openPackagingSchemeDialog"
|
|
|
|
|
@clear="handlePackagingSchemeClear"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item :label="t('ProductionPlan.Task.detailFormDeliveryDateLabel')" prop="finishDate">
|
|
|
|
|
<el-date-picker
|
|
|
|
|
@ -83,26 +75,6 @@
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<!-- <el-col :span="8">
|
|
|
|
|
<el-form-item :label="t('ProductionPlan.Task.detailDialogBoxingDateLabel')" prop="boxingDate">
|
|
|
|
|
<el-date-picker
|
|
|
|
|
v-model="formData.boxingDate"
|
|
|
|
|
type="date"
|
|
|
|
|
value-format="x"
|
|
|
|
|
:placeholder="t('ProductionPlan.Task.detailDialogBoxingDatePlaceholder')"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="8">
|
|
|
|
|
<el-form-item :label="t('ProductionPlan.Task.detailDialogArriveDateLabel')" prop="arriveDate">
|
|
|
|
|
<el-date-picker
|
|
|
|
|
v-model="formData.arriveDate"
|
|
|
|
|
type="date"
|
|
|
|
|
value-format="x"
|
|
|
|
|
:placeholder="t('ProductionPlan.Task.detailDialogArriveDatePlaceholder')"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col> -->
|
|
|
|
|
</el-row>
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
@ -118,6 +90,85 @@
|
|
|
|
|
</el-row>
|
|
|
|
|
</el-form>
|
|
|
|
|
|
|
|
|
|
<Dialog
|
|
|
|
|
:title="t('ProductionPlan.Task.detailDialogPackagingSchemeTitle')"
|
|
|
|
|
v-model="packagingSchemeDialogVisible"
|
|
|
|
|
:appendToBody="true"
|
|
|
|
|
width="1200px"
|
|
|
|
|
>
|
|
|
|
|
<el-form
|
|
|
|
|
ref="packagingSchemeQueryFormRef"
|
|
|
|
|
:model="packagingSchemeQueryParams"
|
|
|
|
|
:inline="true"
|
|
|
|
|
class="-mb-15px"
|
|
|
|
|
>
|
|
|
|
|
<el-form-item :label="t('ErpStock.PackagingScheme.code')" prop="code">
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="packagingSchemeQueryParams.code"
|
|
|
|
|
:placeholder="t('ErpStock.PackagingScheme.placeholderCode')"
|
|
|
|
|
clearable
|
|
|
|
|
class="!w-220px"
|
|
|
|
|
@keyup.enter="handlePackagingSchemeQuery"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item :label="t('ErpStock.PackagingScheme.name')" prop="name">
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="packagingSchemeQueryParams.name"
|
|
|
|
|
:placeholder="t('ErpStock.PackagingScheme.placeholderName')"
|
|
|
|
|
clearable
|
|
|
|
|
class="!w-220px"
|
|
|
|
|
@keyup.enter="handlePackagingSchemeQuery"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item>
|
|
|
|
|
<el-button @click="handlePackagingSchemeQuery">
|
|
|
|
|
<Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button @click="resetPackagingSchemeQuery">
|
|
|
|
|
<Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}
|
|
|
|
|
</el-button>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
<el-table
|
|
|
|
|
ref="packagingSchemeTableRef"
|
|
|
|
|
v-loading="packagingSchemeLoading"
|
|
|
|
|
:data="packagingSchemeList"
|
|
|
|
|
:row-key="(row) => row.id"
|
|
|
|
|
:stripe="true"
|
|
|
|
|
:show-overflow-tooltip="true"
|
|
|
|
|
@row-click="handlePackagingSchemeRowClick"
|
|
|
|
|
@row-dblclick="confirmPackagingSchemeSelect"
|
|
|
|
|
>
|
|
|
|
|
<el-table-column width="55" align="center">
|
|
|
|
|
<template #default="{ row }">
|
|
|
|
|
<el-radio
|
|
|
|
|
v-model="packagingSchemeSelectedId"
|
|
|
|
|
:label="row.id"
|
|
|
|
|
@change="handlePackagingSchemeRadioChange(row)"
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
</el-radio>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column :label="t('ErpStock.PackagingScheme.code')" prop="code" minWidth="160" />
|
|
|
|
|
<el-table-column :label="t('ErpStock.PackagingScheme.name')" prop="name" minWidth="160" />
|
|
|
|
|
<el-table-column :label="t('ErpStock.PackagingScheme.packageQuantity')" prop="packageQuantity" minWidth="120" />
|
|
|
|
|
<el-table-column :label="t('ErpStock.PackagingScheme.palletPackageQuantity')" prop="palletPackageQuantity" minWidth="120" />
|
|
|
|
|
<el-table-column :label="t('ErpStock.PackagingScheme.palletTotalQuantity')" prop="palletTotalQuantity" minWidth="120" />
|
|
|
|
|
</el-table>
|
|
|
|
|
<div class="task-packaging-pagination flex justify-end mt-15px mb-10px">
|
|
|
|
|
<Pagination
|
|
|
|
|
:total="packagingSchemeTotal"
|
|
|
|
|
v-model:page="packagingSchemeQueryParams.pageNo"
|
|
|
|
|
v-model:limit="packagingSchemeQueryParams.pageSize"
|
|
|
|
|
@pagination="getPackagingSchemeList"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<template #footer>
|
|
|
|
|
<el-button type="primary" @click="confirmPackagingSchemeSelect">{{ t('common.ok') }}</el-button>
|
|
|
|
|
<el-button @click="packagingSchemeDialogVisible = false">{{ t('common.cancel') }}</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</Dialog>
|
|
|
|
|
|
|
|
|
|
<template #footer>
|
|
|
|
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">{{ t('ProductionPlan.Task.detailDialogSubmitButtonText') }}</el-button>
|
|
|
|
|
@ -127,18 +178,17 @@
|
|
|
|
|
</template>
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
import { TaskApi } from '@/api/mes/task'
|
|
|
|
|
import { ProductUnitApi, ProductUnitVO } from '@/api/erp/product/unit'
|
|
|
|
|
import {ProductApi, ProductVO} from "@/api/erp/product/product";
|
|
|
|
|
import { PackagingSchemeApi, PackagingSchemeVO } from '@/api/erp/stock/packagingScheme'
|
|
|
|
|
|
|
|
|
|
const unitList = ref<ProductUnitVO[]>([]) // 产品单位列表
|
|
|
|
|
const productList = ref<ProductVO[]>([]) // 产品列表
|
|
|
|
|
const { t } = useI18n() // 国际化
|
|
|
|
|
const message = useMessage() // 消息弹窗
|
|
|
|
|
const productList = ref<ProductVO[]>([]) // product list
|
|
|
|
|
const { t } = useI18n()
|
|
|
|
|
const message = useMessage()
|
|
|
|
|
|
|
|
|
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
|
|
|
|
const dialogTitle = ref('') // 弹窗的标题
|
|
|
|
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
|
|
|
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改;detail 修改
|
|
|
|
|
const dialogVisible = ref(false)
|
|
|
|
|
const dialogTitle = ref('')
|
|
|
|
|
const formLoading = ref(false)
|
|
|
|
|
const formType = ref('')
|
|
|
|
|
const disabled = computed(() => formType.value === 'detail')
|
|
|
|
|
const formData = ref({
|
|
|
|
|
id: undefined,
|
|
|
|
|
@ -147,11 +197,11 @@ const formData = ref({
|
|
|
|
|
unitName: undefined,
|
|
|
|
|
taskId: undefined,
|
|
|
|
|
number: undefined,
|
|
|
|
|
packageSize: undefined,
|
|
|
|
|
projectName: undefined,
|
|
|
|
|
placementRule: undefined,
|
|
|
|
|
packagingSchemeId: undefined,
|
|
|
|
|
packagingSchemeName: undefined,
|
|
|
|
|
techRequirements: undefined,
|
|
|
|
|
remark: undefined,
|
|
|
|
|
packageNumber: undefined,
|
|
|
|
|
finishDate: undefined,
|
|
|
|
|
boxingDate: undefined,
|
|
|
|
|
arriveDate: undefined,
|
|
|
|
|
@ -177,19 +227,37 @@ const formRules = reactive({
|
|
|
|
|
unitId: [{ required: true, message: t('ProductionPlan.Task.validatorDetailUnitIdRequired'), trigger: 'blur' }],
|
|
|
|
|
taskId: [{ required: true, message: t('ProductionPlan.Task.validatorDetailTaskIdRequired'), trigger: 'blur' }],
|
|
|
|
|
number: [{ required: true, message: t('ProductionPlan.Task.validatorDetailNumberRequired'), trigger: 'blur' }],
|
|
|
|
|
packageSize: [],
|
|
|
|
|
finishDate: [{ validator: validateFinishDate, trigger: ['change', 'blur'] }]
|
|
|
|
|
})
|
|
|
|
|
const formRef = ref() // 表单 Ref
|
|
|
|
|
const formRef = ref() // form Ref
|
|
|
|
|
|
|
|
|
|
const packagingSchemeDialogVisible = ref(false)
|
|
|
|
|
const packagingSchemeLoading = ref(false)
|
|
|
|
|
const packagingSchemeList = ref<PackagingSchemeVO[]>([])
|
|
|
|
|
const packagingSchemeTotal = ref(0)
|
|
|
|
|
const packagingSchemeSelectedId = ref<number>()
|
|
|
|
|
const packagingSchemeSelectedRow = ref<PackagingSchemeVO>()
|
|
|
|
|
const packagingSchemeTableRef = ref()
|
|
|
|
|
const packagingSchemeQueryFormRef = ref()
|
|
|
|
|
const packagingSchemeQueryParams = reactive({
|
|
|
|
|
pageNo: 1,
|
|
|
|
|
pageSize: 10,
|
|
|
|
|
code: undefined,
|
|
|
|
|
name: undefined,
|
|
|
|
|
status: 0
|
|
|
|
|
})
|
|
|
|
|
const displayPackagingSchemeName = computed(() => {
|
|
|
|
|
if (!formData.value.packagingSchemeId) return ''
|
|
|
|
|
const selected = packagingSchemeList.value.find((item) => item.id === formData.value.packagingSchemeId)
|
|
|
|
|
return selected?.name || formData.value.packagingSchemeName || ''
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
/** 打开弹窗 */
|
|
|
|
|
const open = async (type: string, id?: number, taskId: number) => {
|
|
|
|
|
dialogVisible.value = true
|
|
|
|
|
dialogTitle.value = t('action.' + type)
|
|
|
|
|
formType.value = type
|
|
|
|
|
resetForm()
|
|
|
|
|
formData.value.taskId = taskId
|
|
|
|
|
// 修改时,设置数据
|
|
|
|
|
if (id) {
|
|
|
|
|
formLoading.value = true
|
|
|
|
|
try {
|
|
|
|
|
@ -201,28 +269,20 @@ const open = async (type: string, id?: number, taskId: number) => {
|
|
|
|
|
formLoading.value = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 产品单位
|
|
|
|
|
//unitList.value = await ProductUnitApi.getProductUnitSimpleList()
|
|
|
|
|
// unitList.value= [
|
|
|
|
|
// {
|
|
|
|
|
// id: 5,
|
|
|
|
|
// name: '个',
|
|
|
|
|
// },
|
|
|
|
|
// ]
|
|
|
|
|
// formData.value.unitId = 5
|
|
|
|
|
productList.value = await ProductApi.getMesProductSimpleList({ categoryType: 1 })
|
|
|
|
|
}
|
|
|
|
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
|
|
|
|
defineExpose({ open })
|
|
|
|
|
|
|
|
|
|
/** 提交表单 */
|
|
|
|
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
|
|
|
|
const emit = defineEmits(['success'])
|
|
|
|
|
const submitForm = async () => {
|
|
|
|
|
// 校验表单
|
|
|
|
|
await formRef.value.validate()
|
|
|
|
|
// 提交请求
|
|
|
|
|
formLoading.value = true
|
|
|
|
|
try {
|
|
|
|
|
const data = formData.value
|
|
|
|
|
const data = { ...formData.value }
|
|
|
|
|
delete (data as any).packagingSchemeName
|
|
|
|
|
delete (data as any).projectName
|
|
|
|
|
delete (data as any).packageSize
|
|
|
|
|
delete (data as any).packageNumber
|
|
|
|
|
if (formType.value === 'create') {
|
|
|
|
|
await TaskApi.createTaskDetail(data)
|
|
|
|
|
message.success(t('common.createSuccess'))
|
|
|
|
|
@ -231,29 +291,12 @@ const submitForm = async () => {
|
|
|
|
|
message.success(t('common.updateSuccess'))
|
|
|
|
|
}
|
|
|
|
|
dialogVisible.value = false
|
|
|
|
|
// 发送操作成功的事件
|
|
|
|
|
emit('success')
|
|
|
|
|
} finally {
|
|
|
|
|
formLoading.value = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 监听数量和每包数量变化,自动计算打包数量 */
|
|
|
|
|
watch(
|
|
|
|
|
() => [formData.value.number, formData.value.packageSize],
|
|
|
|
|
([number, packageSize]) => {
|
|
|
|
|
if (!number && number !== 0) {
|
|
|
|
|
formData.value.packageNumber = undefined
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if (!packageSize || packageSize === 0) {
|
|
|
|
|
formData.value.packageNumber = number
|
|
|
|
|
} else {
|
|
|
|
|
formData.value.packageNumber = Math.ceil(number / packageSize)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
/** 处理产品变更 */
|
|
|
|
|
const onChangeProduct = (productId) => {
|
|
|
|
|
const product = productList.value.find((item) => item.id === productId)
|
|
|
|
|
@ -263,6 +306,70 @@ const onChangeProduct = (productId) => {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const getPackagingSchemeList = async () => {
|
|
|
|
|
packagingSchemeLoading.value = true
|
|
|
|
|
try {
|
|
|
|
|
const data = await PackagingSchemeApi.getPackagingSchemePage(packagingSchemeQueryParams)
|
|
|
|
|
packagingSchemeList.value = data.list || []
|
|
|
|
|
packagingSchemeTotal.value = data.total || 0
|
|
|
|
|
} finally {
|
|
|
|
|
packagingSchemeLoading.value = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const openPackagingSchemeDialog = async () => {
|
|
|
|
|
packagingSchemeDialogVisible.value = true
|
|
|
|
|
packagingSchemeQueryParams.pageNo = 1
|
|
|
|
|
packagingSchemeQueryParams.code = undefined
|
|
|
|
|
packagingSchemeQueryParams.name = undefined
|
|
|
|
|
packagingSchemeSelectedId.value = formData.value.packagingSchemeId
|
|
|
|
|
packagingSchemeSelectedRow.value = undefined
|
|
|
|
|
await getPackagingSchemeList()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handlePackagingSchemeQuery = () => {
|
|
|
|
|
packagingSchemeQueryParams.pageNo = 1
|
|
|
|
|
getPackagingSchemeList()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const resetPackagingSchemeQuery = () => {
|
|
|
|
|
packagingSchemeQueryFormRef.value?.resetFields()
|
|
|
|
|
handlePackagingSchemeQuery()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handlePackagingSchemeRowClick = (row: PackagingSchemeVO) => {
|
|
|
|
|
packagingSchemeSelectedId.value = row.id
|
|
|
|
|
packagingSchemeSelectedRow.value = row
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handlePackagingSchemeRadioChange = (row: PackagingSchemeVO) => {
|
|
|
|
|
packagingSchemeSelectedRow.value = row
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const confirmPackagingSchemeSelect = (row?: PackagingSchemeVO) => {
|
|
|
|
|
const scheme = row?.id
|
|
|
|
|
? row
|
|
|
|
|
: packagingSchemeSelectedRow.value || packagingSchemeList.value.find((item) => item.id === packagingSchemeSelectedId.value)
|
|
|
|
|
if (!scheme) {
|
|
|
|
|
message.warning(t('ProductionPlan.Task.detailDialogPackagingSchemePlaceholder'))
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
formData.value.packagingSchemeId = scheme.id
|
|
|
|
|
formData.value.packagingSchemeName = scheme.name
|
|
|
|
|
if (!packagingSchemeList.value.some((item) => item.id === scheme.id)) {
|
|
|
|
|
packagingSchemeList.value.push(scheme)
|
|
|
|
|
}
|
|
|
|
|
packagingSchemeDialogVisible.value = false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handlePackagingSchemeClear = () => {
|
|
|
|
|
formData.value.packagingSchemeId = undefined
|
|
|
|
|
formData.value.packagingSchemeName = undefined
|
|
|
|
|
packagingSchemeSelectedId.value = undefined
|
|
|
|
|
packagingSchemeSelectedRow.value = undefined
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** ???? */
|
|
|
|
|
/** 重置表单 */
|
|
|
|
|
const resetForm = () => {
|
|
|
|
|
formData.value = {
|
|
|
|
|
@ -271,11 +378,21 @@ const resetForm = () => {
|
|
|
|
|
unitId: undefined,
|
|
|
|
|
taskId: undefined,
|
|
|
|
|
number: undefined,
|
|
|
|
|
packageSize: undefined,
|
|
|
|
|
projectName: undefined,
|
|
|
|
|
placementRule: undefined,
|
|
|
|
|
packagingSchemeId: undefined,
|
|
|
|
|
packagingSchemeName: undefined,
|
|
|
|
|
techRequirements: undefined,
|
|
|
|
|
remark: undefined
|
|
|
|
|
remark: undefined,
|
|
|
|
|
finishDate: undefined,
|
|
|
|
|
boxingDate: undefined,
|
|
|
|
|
arriveDate: undefined
|
|
|
|
|
}
|
|
|
|
|
formRef.value?.resetFields()
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
.task-packaging-pagination {
|
|
|
|
|
padding-bottom: 8px;
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|
|