fix task plan

main
chenshuichuan 2 years ago
parent 42760dff79
commit 20cac1cbf8

@ -127,4 +127,8 @@ export const TaskApi = {
changeStatus: async (status, id) => {
return await request.get({ url: `/mes/task/changeStatus?status=` + status +`&id=`+id})
},
// 或得生产任务单排程计划列表
generatePlanByTaskDetail: async (params) => {
return await request.get({ url: `/mes/task/generate-plan/byTaskDetail`, params })
},
}

@ -109,8 +109,8 @@ const formData = ref({
const formRules = reactive({
code: [{ required: true, message: 'BOM编码不能为空', trigger: 'blur' }],
version: [{ required: true, message: 'BOM版本不能为空', trigger: 'blur' }],
productId: [{ required: true, message: '产品ID不能为空', trigger: 'blur' }],
unitId: [{ required: true, message: '单位ID不能为空', trigger: 'blur' }],
productId: [{ required: true, message: '产品不能为空', trigger: 'blur' }],
unitId: [{ required: true, message: '单位不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
@ -179,12 +179,12 @@ const resetForm = () => {
formData.value = {
id: undefined,
code: undefined,
version: undefined,
version: '1.0',
productId: undefined,
unitId: undefined,
unitId: 5,
yieldRate: 100,
remark: undefined,
isEnable: undefined
isEnable: true
}
formRef.value?.resetFields()
}

@ -0,0 +1,163 @@
<template>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
v-loading="formLoading"
label-width="0px"
:inline-message="true"
:default-sort="{ prop: 'sort_date', order: 'descending' }"
>
<el-table :data="formData" class="-mt-10px" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" type="index" width="60" />
<el-table-column disabled label="计划编码" min-width="170">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.code`" :rules="formRules.code" class="mb-0px!">
<el-input disabled v-model="row.code" placeholder="请输入计划编码" />
</el-form-item>
</template>
</el-table-column>
<el-table-column disabled="true" label="产品" min-width="150">
<template #default="{ row, $index }">
<el-form-item v-show="false" :prop="`${$index}.productId`" :rules="formRules.productId" class="mb-0px!">
<el-input disabled v-model="row.productId" placeholder="请输入产品ID" />
</el-form-item>
<el-form-item :prop="`${$index}.productName`" :rules="formRules.productName" class="mb-0px!">
<el-input disabled v-model="row.productName" placeholder="请输入产品" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="数量" min-width="120">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.planNumber`" :rules="formRules.planNumber" class="mb-0px!">
<el-input v-model="row.planNumber" placeholder="请输入数量" />
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="sort_date" sortable label="计划开始时间" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.planStartTime`" :rules="formRules.planStartTime" class="mb-0px!">
<el-date-picker
v-model="row.planStartTime"
type="date"
value-format="x"
placeholder="选择计划开始时间"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="计划结束时间" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.planEndTime`" :rules="formRules.planEndTime" class="mb-0px!">
<el-date-picker
v-model="row.planEndTime"
type="date"
value-format="x"
placeholder="选择计划结束时间"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="备注" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" :rules="formRules.remark" class="mb-0px!">
<el-input v-model="row.remark" placeholder="" />
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="100">
<template #default="{row, $index }">
<el-button type="success" @click="handleCopy(row)" link>
<Icon icon="ep:document-copy" class="mr-5px"/>
</el-button>
<el-button type="danger" @click="handleDelete($index)" link>
<Icon icon="ep:delete" class="mr-5px"/>
</el-button>
</template>
</el-table-column>
</el-table>
</el-form>
</template>
<script setup lang="ts">
import { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { TaskApi } from '@/api/mes/task'
const props = defineProps<{
taskId: undefined // ID
}>()
const formLoading = ref(false) //
const formData = ref([])
const formRules = reactive({
productId: [{ required: true, message: '产品不能为空', trigger: 'blur' }],
taskId: [{ required: true, message: '任务单不能为空', trigger: 'blur' }],
planNumber: [{ required: true, message: '数量不能为空', trigger: 'blur' }],
planStartTime: [{ required: true, message: '计划开始时间不能为空', trigger: 'blur' }],
planEndTime: [{ required: true, message: '计划结束时间不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.taskId,
async (val) => {
// 1.
formData.value = []
// 2. val
if (!val) {
return;
}
},
{ immediate: true }
)
/** 删除按钮操作 */
const handleDelete = (index) => {
formData.value.splice(index, 1)
}
/** 表单校验 */
const validate = () => {
return formRef.value.validate()
}
/** 表单值 */
const getData = () => {
return formData.value
}
/** 表单值 */
const setData = (data) => {
formData.value = data
}
defineExpose({ validate, getData , setData})
/** 复制按钮操作 */
const handleCopy = (row) => {
const newRow = {
id: undefined,
code: undefined,
productId: undefined,
productName: undefined,
planNumber: undefined,
planStartTime: undefined,
planEndTime: undefined,
remark: undefined,
priorityNum: undefined,
isEnable: undefined,
}
newRow.code = row.code + (Math.floor(Math.random() * 10) + 1)
newRow.productId = row.productId
newRow.remark = row.remark
newRow.isEnable = row.isEnable
newRow.planStartTime = row.planStartTime
newRow.planEndTime = row.planEndTime
newRow.planNumber= row.planNumber
newRow.productName = row.productName
newRow.priorityNum = 1
formData.value.push(newRow)
}
</script>

@ -0,0 +1,177 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1300px" v-loading="formLoading">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="120px"
>
<el-row>
<el-col :span="6">
<el-form-item label="产品" prop="taskCode">
<el-input disabled v-model="formData.taskCode" placeholder="请输入"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="总数" prop="number">
<el-input disabled v-model="formData.number" placeholder="请输入"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="未完成数" prop="planNumber">
<el-input disabled v-model="formData.planNumber" placeholder="请输入"/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="计划产量" prop="productsOfPlan">
<el-input-number v-model="formData.productsOfPlan" :min="0" class="!w-1/1"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="日期" prop="planDate">
<el-date-picker
v-model="formData.planDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="dates"
placeholder="请选择排产日期"
class="!w-240px"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item>
<el-button type="success" @click="handleQuery">
<Icon icon="ep:calendar" class="mr-5px"/>
自动排产
</el-button>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item>
<el-button type="danger" @click="resetQuery">
<Icon icon="ep:delete" class="mr-5px"/>
清空结果
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- 子表的表单 -->
<el-tabs v-model="subTabsName">
<el-tab-pane label="预排产计划" name="plan">
<PlanForm ref="planFormRef" :task-id="formData.id"/>
</el-tab-pane>
<el-tab-pane label="已排产计划" name="finishPlan">
<el-text>hello</el-text>
</el-tab-pane>
</el-tabs>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import {TaskApi, TaskVO} from '@/api/mes/task'
import PlanForm from './PlanForm.vue'
import {PlanApi, PlanVO} from "@/api/mes/plan";
/** 生产任务单 表单 */
defineOptions({name: 'TaskPlanForm'})
const {t} = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formData = ref({
taskId: undefined,
taskCode: undefined,
sizeOfPlan: 0,
productsOfPlan: 20000,
planDate: [],
number: undefined,
})
const formRules = reactive({
taskId: [{required: true, message: '任务单不能为空', trigger: 'blur'}],
productsOfPlan: [{required: true, message: '单个计划生产数量不能为空', trigger: 'blur'}],
})
const formRef = ref() // Ref
/** 子表的表单 */
const subTabsName = ref('plan')
const planFormRef = ref()
/** 打开弹窗 */
const open = async (taskDetailId: number, productId: number, productName:string, num:number,finishNumber:number) => {
dialogVisible.value = true
dialogTitle.value = "产品排产:" + productName
formData.value.taskId = taskDetailId
formData.value.taskCode = productName
formData.value.number = num
formData.value.planNumber = 0
if(num){
if(finishNumber)
formData.value.planNumber = num-finishNumber
}
}
defineExpose({open}) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
try {
await planFormRef.value.validate()
} catch (e) {
subTabsName.value = 'plan'
return
}
//
formLoading.value = true
try {
//
let planList = planFormRef.value.getData()
if(planList!=undefined && planList.length > 0) {
await PlanApi.saveBatchPlan(planList)
dialogVisible.value = false
//
emit('success')
}
else message.alert("请勿提交空计划!")
} finally {
formLoading.value = false
}
}
/** 排产 */
const handleQuery = async () => {
//
formLoading.value = true
try {
const planData = await TaskApi.generatePlanByTaskDetail(formData.value)
planFormRef.value.setData(planData)
} finally {
formLoading.value = false
}
}
/** 清空列表 */
const resetQuery = () => {
planFormRef.value.setData(null)
}
</script>

@ -13,6 +13,7 @@
<el-table-column label="产品" align="center" prop="productName" width="140px" sortable/>
<el-table-column label="单位" align="center" prop="unitName" />
<el-table-column label="数量" align="center" prop="number" />
<el-table-column label="已计划" align="center" prop="planNumber" />
<el-table-column label="每包/个" align="center" prop="packageSize" />
<el-table-column label="交货日期" align="center" prop="finishDate" :formatter="dateFormatter2"/>
<el-table-column label="项目名称" align="center" prop="projectName" />
@ -25,17 +26,32 @@
</template>
</el-table-column>
<el-table-column label="订单单号" align="center" prop="saleOrderCode" />
<!-- <el-table-column label="订单单号" align="center" prop="saleOrderCode" />-->
<el-table-column label="操作" align="center" width="150px">
<el-table-column label="操作" align="center" width="250px">
<template #default="scope">
<el-button
link
@click="openFormView('detail', scope.row.id)"
v-hasPermi="['mes:task:query']"
>
详情
</el-button>
<el-button
link
type="info"
@click="openItemNeed(scope.row.productName, scope.row.productId, scope.row.number)"
>
物料
</el-button>
<el-button
v-if="props.taskStatus>1"
link
type="success"
@click="openTaskPlanForm(scope.row.id, scope.row.productId, scope.row.productName, scope.row.number, scope.row.planNumber)"
v-hasPermi="['mes:task:plan']"
>
排产
</el-button>
<el-button
link
type="primary"
@ -67,18 +83,27 @@
<TaskDetailForm ref="formRef" @success="getList" />
<!-- 表单弹窗添加/修改 -->
<TaskDetailView ref="formViewRef" @success="getList"/>
<!-- 物料列表 -->
<ItemNeedIndex ref="itemNeedFormRef" @success="getList" />
<!-- 排程弹窗 -->
<TaskPlanForm ref="taskPlanFormRef" @success="getList" />
</template>
<script setup lang="ts">
import {dateFormatter, dateFormatter2} from '@/utils/formatTime'
import { TaskApi } from '@/api/mes/task'
import TaskDetailForm from './TaskDetailForm.vue'
import TaskDetailView from './TaskDetailView.vue'
import ItemNeedIndex from "@/views/mes/bom/ItemNeedIndex.vue";
import TaskPlanForm from "@/views/mes/task/components/PlanPlan.vue";
const { t } = useI18n() //
const message = useMessage() //
const props = defineProps<{
taskId?: number // task ID
taskStatus?: number
}>()
const loading = ref(false) //
const list = ref([]) //
@ -150,4 +175,17 @@ const handleDelete = async (id: number) => {
await getList()
} catch {}
}
//
/** 物料需求 */
const itemNeedFormRef = ref()
const openItemNeed = (productName:string, productId: number, number:number) => {
number = number>0 ? number : 0;
itemNeedFormRef.value.open("product",productName, productId, number)
}
/** 单个计划排产 */
const taskPlanFormRef = ref()
const openTaskPlanForm = (taskDetailId: number, productId: number, productName:string, num:number,finishNumber:number) => {
taskPlanFormRef.value.open(taskDetailId,productId, productName, num, finishNumber )
}
</script>

@ -161,10 +161,13 @@
<TaskAddSaleForm ref="saleFormRef" @success="getList" />
<!-- 子表的列表 -->
<ContentWrap>
<el-tabs model-value="taskDetail">
<el-tab-pane label="生产任务单明细" name="taskDetail">
<TaskDetailList :task-id="currentRow.id" />
<el-tabs model-value="taskDetail" v-model="activeListName" @tab-click="handleListTabClick">
<el-tab-pane label="任务单明细" name="taskDetail">
<TaskDetailList v-if="activeListName ==='taskDetail'" :task-id="currentRow.id" :task-status="currentRow.status"/>
</el-tab-pane>
<!-- <el-tab-pane label="任务单明细进度" name="taskDetailProgress">-->
<!-- <TaskDetailList v-if="activeListName ==='taskDetailProgress'" :task-id="currentRow.id" />-->
<!-- </el-tab-pane>-->
</el-tabs>
</ContentWrap>
<!-- 物料列表 -->
@ -285,7 +288,7 @@ const openItemNeed = (taskCode:string, taskId: number) => {
}
/** tab 切换 */
let activeName = ''
let activeName = 'taskDetail'
const handleTabClick = (tab: TabsPaneContext) => {
queryParams.status = tab.paneName
handleQuery()
@ -302,4 +305,10 @@ const changeStatus = async (type:string, status: number, id: number) => {
await getList()
} catch {}
}
/** tab 切换 */
let activeListName = 'taskDetail'
const handleListTabClick = (tab: TabsPaneContext) => {
}
</script>

@ -38,7 +38,7 @@
type="success"
@click="addPlanForm(scope.row.taskId, scope.row.productId,
scope.row.totalNumber - scope.row.planNumber)"
v-hasPermi="['mes:task:update']"
v-hasPermi="['mes:task:plan']"
>
新增计划
</el-button>

@ -115,7 +115,7 @@
<el-button link type="primary" @click="openPlan(scope.row.id)" v-hasPermi="['mes:plan:query']">
查看计划
</el-button>
<el-button link v-if="scope.row.status<5" type="success" @click="openTaskPlanForm(scope.row.id, scope.row.code)" v-hasPermi="['mes:plan:query']">
<el-button link v-if="scope.row.status<5" type="success" @click="openTaskPlanForm(scope.row.id, scope.row.code)" v-hasPermi="['mes:task:plan']">
排产
</el-button>
</template>

Loading…
Cancel
Save