@ -1,14 +1,13 @@
< template >
< Dialog :title ="dialogTitle" v-model ="dialogVisible" >
< Dialog :title ="dialogTitle" v-model ="dialogVisible" width="1000px" >
< el -form
ref = "formRef"
: model = "formData"
: rules = "formRules"
label - width = "1 1 0px"
label - width = "1 2 0px"
v - loading = "formLoading"
>
< div class = "section-title" > 计划 < / div >
< el -form -item :label ="t('ProductionPlan.Plan.dialogTaskLabel')" prop = "taskId" >
< el -form -item :label ="t('ProductionPlan.Plan.dialogTaskLabel')" prop = "taskId" >
< el -select
disabled
v - model = "formData.taskId"
@ -17,15 +16,10 @@
: placeholder = "t('ProductionPlan.Plan.dialogTaskPlaceholder')"
@ change = "handleTaskChange"
>
< el -option
v - for = "item in taskList"
: key = "item.id"
: label = "item.code"
: value = "item.id"
/ >
< el -option v -for = " item in taskList " :key ="item.id" :label ="item.code" :value ="item.id" / >
< / e l - s e l e c t >
< / e l - f o r m - i t e m >
< el -form -item :label ="t('ProductionPlan.Plan.dialogTaskDetailLabel')" prop = "task Id">
< el -form -item :label ="t('ProductionPlan.Plan.dialogTaskDetailLabel')" prop = "taskDetailId" >
< el -select
disabled
v - model = "formData.taskDetailId"
@ -37,72 +31,89 @@
< el -option
v - for = "item in taskDetailList"
: key = "item.id"
: label = " item.productName+'-未计划:'+(item.number-item.planNumber) "
: label = " `${item.productName}-${t('ProductionPlan.Plan.dialogTaskDetailUnplannedPrefix')}${Number(item.number || 0) - Number(item.planNumber || 0)}` "
: value = "item.id"
/ >
< / e l - s e l e c t >
< / e l - f o r m - i t e m >
< el -form -item prop = "code" >
< template # label >
< span >
{ { t ( 'ProductionPlan.Plan.dialogCodeLabel' ) } }
< el -tooltip :content ="t('ProductionPlan.Plan.dialogCodeTooltip')" placement = "top" >
< Icon icon = "ep:question-filled" / >
< / e l - t o o l t i p >
< / span >
< / template >
< el -row :gutter ="10" class = "!w-full" >
< el -col :xs ="24" :sm ="18" :md ="16" :lg ="14" :xl ="12" >
< el -input
: disabled = "formData.isCode == true || formType === 'update'"
v - model = "formData.code"
: placeholder = "t('ProductionPlan.Plan.dialogCodePlaceholder')"
/ >
< / e l - c o l >
< el -col :xs ="24" :sm ="6" :md ="4" :lg ="3" :xl ="2" >
< div >
< el -switch
v - model = "formData.isCode"
: disabled = "formType === 'update'"
/ >
< / div >
< / e l - c o l >
< / e l - r o w >
< / e l - f o r m - i t e m >
< el -form -item label = "交货日期" >
< template # label >
< span >
{ { t ( 'ProductionPlan.Plan.dialogCodeLabel' ) } }
< el -tooltip :content ="t('ProductionPlan.Plan.dialogCodeTooltip')" placement = "top" >
< Icon icon = "ep:question-filled" / >
< / e l - t o o l t i p >
< / span >
< / template >
< el -row :gutter ="10" class = "!w-full" >
< el -col :xs ="24" :sm ="18" :md ="16" :lg ="14" :xl ="12" >
< el -input
: disabled = "formData.isCode === true || formType === 'update'"
v - model = "formData.code"
: placeholder = "t('ProductionPlan.Plan.dialogCodePlaceholder')"
/ >
< / e l - c o l >
< el -col :xs ="24" :sm ="6" :md ="4" :lg ="3" :xl ="2" >
< el -switch v -model = " formData.isCode " : disabled = "formType === 'update'" / >
< / e l - c o l >
< / e l - r o w >
< / e l - f o r m - i t e m >
< el -form -item :label ="t('ProductionPlan.Plan.dialogDeliveryDateLabel')" >
< el -input :model-value ="deliveryDateText" disabled / >
< / e l - f o r m - i t e m >
<!-- < el -form -item label = "产品" prop = "productId" > -- >
<!-- < el -select - - >
<!-- : disabled = 'editDisable' -- >
<!-- v - model = "formData.productId" -- >
<!-- clearable -- >
<!-- filterable -- >
<!-- placeholder = "请选择产品" -- >
<!-- class = "!w-1/1" -- >
<!-- > -- >
<!-- < el -option - - >
<!-- v - for = "item in productList" -- >
<!-- : key = "item.id" -- >
<!-- : label = "item.name" -- >
<!-- : value = "item.id" -- >
<!-- / > - - >
<!-- < / e l - s e l e c t > - - >
<!-- < / e l - f o r m - i t e m > - - >
< el -form -item label = "设备" prop = "deviceId" >
< el -form -item :label ="t('ProductionPlan.Plan.dialogProcessRouteLabel')" prop = "processRouteId" >
< el -input
: model - value = "deviceDisplayText"
placeholder = "点击选择设备"
readonly
@ click = "openDeviceSelectDialog"
: model - value = "processRouteDisplayName"
disabled
: placeholder = "t('ProductionPlan.Plan.dialogProcessRouteEmptyText')"
/ >
< / e l - f o r m - i t e m >
< el -form -item :label ="t('ProductionPlan.Plan.dialogProcessRouteItemsLabel')" >
< el -table
: data = "formData.processRouteItems"
border
size = "small"
row - key = "processRouteItemId"
class = "process-route-items-table"
: empty - text = "t('ProductionPlan.Plan.dialogProcessRouteEmptyText')"
>
< el -table -column :label ="t('ProductionPlan.Plan.routeItemSortColumn')" prop = "sort" width = "70" align = "center" / >
< el -table -column
: label = "t('ProductionPlan.Plan.routeItemParameterCodeColumn')"
prop = "processParameterCode"
min - width = "140"
align = "center"
/ >
< el -table -column
: label = "t('ProductionPlan.Plan.routeItemParameterNameColumn')"
prop = "processParameterName"
min - width = "160"
align = "center"
/ >
< el -table -column :label ="t('ProductionPlan.Plan.routeItemRemarkColumn')" prop = "remark" min -width = " 140 " align = "center" / >
< el -table -column :label ="t('ProductionPlan.Plan.routeItemDeviceColumn')" min -width = " 240 " align = "center" >
< template # default = "scope" >
< el -input
: model - value = "getRouteItemDeviceDisplay(scope.row)"
: placeholder = "t('ProductionPlan.Plan.routeItemDevicePlaceholder')"
readonly
clearable
@ click = "openDeviceSelectDialog(scope.row)"
@ clear = "clearRouteItemDevice(scope.row)"
>
< template # append >
< el -button @click.stop ="openDeviceSelectDialog(scope.row)" >
{ { t ( 'ProductionPlan.Plan.routeItemDeviceSelectButton' ) } }
< / e l - b u t t o n >
< / template >
< / e l - i n p u t >
< / template >
< / e l - t a b l e - c o l u m n >
< / e l - t a b l e >
< / e l - f o r m - i t e m >
< el -form -item :label ="t('ProductionPlan.Plan.dialogPlanNumberLabel')" prop = "planNumber" >
< el -input v -model = " formData.planNumber " / >
< el -input v -model = " formData.planNumber " / >
< / e l - f o r m - i t e m >
<!-- < el -form -item label = "热压数量" prop = "reyaNumber" >
< el -input v -model = " formData.reyaNumber " / >
< / e l - f o r m - i t e m > - - >
< el -form -item :label ="t('ProductionPlan.Plan.dialogPlanStartLabel')" prop = "planStartTime" >
< el -date -picker
v - model = "formData.planStartTime"
@ -123,48 +134,36 @@
@ change = "handlePlanEndTimeChange"
/ >
< / e l - f o r m - i t e m >
< el -form -item label = "最晚开工时间 " prop = "latestStartTime" >
< el -form -item :label ="t('ProductionPlan.Plan.dialogLatestStartLabel') " prop = "latestStartTime" >
< el -date -picker
v - model = "formData.latestStartTime"
type = "datetime"
value - format = "x"
: disabled - date = "latestStartDisabledDate"
placeholder = "请选择最晚开工时间 "
: placeholder = "t('ProductionPlan.Plan.dialogLatestStartPlaceholder') "
class = "!w-full"
/ >
< / e l - f o r m - i t e m >
<!-- < el -form -item label = "班别" prop = "groupType" >
< el -radio -group v-model ="formData.groupType" >
< el -radio
v - for = "dict in getIntDictOptions(DICT_TYPE.MES_GROUP_TYPE)"
: key = "dict.value"
: label = "dict.value"
>
{ { dict . label } }
< / e l - r a d i o >
< / e l - r a d i o - g r o u p >
< / e l - f o r m - i t e m > - - >
< el -form -item :label ="t('ProductionPlan.Plan.dialogRemarkLabel')" prop = "remark" >
< el -input type = "textarea" v -model = " formData.remark " :placeholder ="t('ProductionPlan.Plan.dialogRemarkPlaceholder')" / >
< / e l - f o r m - i t e m >
< div class = "section-title" > 领料 < / div >
< el -form -item label = "领料人" prop = "workerId" >
< el -select v-model ="formData.workerId" clearable filterable placeholder="请选择领料人" >
< el -option v -for = " item in workerList " :key ="item.id" :label ="item.nickname" :value ="item.id" / >
< / e l - s e l e c t >
< / e l - f o r m - i t e m >
< el -form -item label = "是否计算损耗" prop = "isCalculateLoss" >
< el -switch v -model = " formData.isCalculateLoss " / >
< el -input
type = "textarea"
v - model = "formData.remark"
: placeholder = "t('ProductionPlan.Plan.dialogRemarkPlaceholder')"
/ >
< / e l - f o r m - i t e m >
< / e l - f o r m >
< template # footer >
< el -button @click ="submitForm" type = "primary" :disabled ="formLoading" > { { t ( 'ProductionPlan.Plan.dialogSubmitButtonText' ) } } < / e l - b u t t o n >
< el -button @ click = "dialogVisible = false" > { { t ( 'ProductionPlan.Plan.dialogCancelButtonText' ) } } < / e l - b u t t o n >
< el -button @click ="submitForm" type = "primary" :disabled ="formLoading" >
{ { t ( 'ProductionPlan.Plan.dialogSubmitButtonText' ) } }
< / e l - b u t t o n >
< el -button @ click = "dialogVisible = false" >
{ { t ( 'ProductionPlan.Plan.dialogCancelButtonText' ) } }
< / e l - b u t t o n >
< / template >
< / Dialog >
< TableSelectDialog
ref = "deviceSelectDialogRef"
title = "选择设备 "
: title = "t('ProductionPlan.Plan.selectDeviceDialogTitle') "
: columns = "deviceColumns"
: fetch - api = "fetchDeviceLedgerPage"
selection - type = "single"
@ -172,58 +171,40 @@
@ confirm = "handleDeviceSelectConfirm"
/ >
< / template >
< script setup lang = "ts" >
< script setup lang = "ts" >
import dayjs from 'dayjs'
import { PlanApi , Plan VO } from '@/api/mes/plan'
import { PlanApi , Plan ProcessRouteItemVO, Plan VO } from '@/api/mes/plan'
import { TaskApi , TaskDetailVO , TaskVO } from '@/api/mes/task'
import { DeviceLedgerApi , DeviceLedgerVO } from '@/api/mes/deviceledger'
import { DeviceLedgerApi } from '@/api/mes/deviceledger'
import { ErpProductCategoryProcessRouteItemRespVO , ProductApi } from '@/api/erp/product/product'
import TableSelectDialog from '@/components/TableSelectDialog/TableSelectDialog.vue'
import * as UserApi from '@/api/system/user'
/** 生产计划 表单 */
defineOptions ( { name : 'PlanForm' } )
const taskList = ref < TaskVO [ ] > ( [ ] ) / / 用 户 列 表
const taskDetailList = ref < TaskDetailVO [ ] > ( [ ] ) / / 用 户 列 表
const workerList = ref < UserApi .UserVO [ ] > ( [ ] )
const deviceSelectDialogRef = ref ( )
const selectedDeviceRows = ref < DeviceLedgerVO [ ] > ( [ ] )
type PlanFormData = Partial < PlanVO > & {
isCode ? : boolean
finishDate ? : string | number
deliveryDate ? : string | number
processRouteItems ? : PlanProcessRouteItemVO [ ]
}
const taskList = ref < TaskVO [ ] > ( [ ] )
const taskDetailList = ref < TaskDetailVO [ ] > ( [ ] )
const maxUnplannedNumber = ref < number | undefined > ( undefined )
const { t } = useI18n ( ) / / 国 际 化
const message = useMessage ( ) / / 消 息 弹 窗
const dialogVisible = ref ( false ) / / 弹 窗 的 是 否 展 示
const dialogTitle = ref ( '' ) / / 弹 窗 的 标 题
const formLoading = ref ( false ) / / 表 单 的 加 载 中 : 1 ) 修 改 时 的 数 据 加 载 ; 2 ) 提 交 的 按 钮 禁 用
const formType = ref ( '' ) / / 表 单 的 类 型 : c r e a t e - 新 增 ; u p d a t e - 修 改
const formData = ref ( {
id : undefined ,
code : undefined ,
productId : undefined ,
taskDetailId : undefined ,
taskId : undefined ,
planNumber : undefined ,
reyaNumber : undefined ,
finishNumber : undefined ,
status : undefined ,
planStartTime : undefined ,
planEndTime : undefined ,
startTime : undefined ,
endTime : undefined ,
productionManagerId : undefined ,
remark : undefined ,
groupType : undefined ,
isEnable : undefined ,
deviceId : undefined ,
deviceName : undefined ,
workerId : undefined ,
isCode : undefined ,
latestStartTime : undefined ,
finishDate : undefined ,
deliveryDate : undefined ,
isCalculateLoss : true
} )
const { t } = useI18n ( )
const message = useMessage ( )
const dialogVisible = ref ( false )
const dialogTitle = ref ( '' )
const formLoading = ref ( false )
const formType = ref ( '' )
const formData = ref < PlanFormData > ( { } )
const formRef = ref ( )
const deviceSelectDialogRef = ref ( )
const activeRouteItemRow = ref < PlanProcessRouteItemVO > ( )
const deliveryDateText = computed ( ( ) => {
const sourceValue = formData . value . finishDate || formData . value . deliveryDate
if ( ! sourceValue ) return ''
@ -231,33 +212,21 @@ const deliveryDateText = computed(() => {
if ( ! value . isValid ( ) ) return String ( sourceValue )
return value . format ( 'YYYY-MM-DD' )
} )
const deviceDisplayText = computed ( ( ) => {
if ( selectedDeviceRows . value . length ) {
return selectedDeviceRows . value
. map ( ( item : any ) => item . deviceName || item . name || item . code || ` ID: ${ item . id } ` )
. join ( '、' )
}
if ( formData . value . deviceName ) return String ( formData . value . deviceName )
return ''
const processRouteDisplayName = computed ( ( ) => {
if ( ! formData . value . processRouteId ) return ''
return formData . value . processRouteName || String ( formData . value . processRouteId )
} )
const deviceColumns = [
{ label : '设备编号' , prop : 'deviceCode' , minWidth : 140 } ,
{ label : '设备名称' , prop : 'deviceName' , minWidth : 160 } ,
{ label : '设备型号' , prop : 'deviceModel' , minWidth : 140 } ,
{ label : '所属车间' , prop : 'workshopName' , minWidth : 140 }
]
const latestStartDisabledDate = ( date : Date ) => {
if ( ! formData . value . finishDate ) return false
const deliveryDate = dayjs ( formData . value . finishDate )
if ( ! deliveryDate . isValid ( ) ) return false
return dayjs ( date ) . startOf ( 'day' ) . valueOf ( ) > deliveryDate . startOf ( 'day' ) . valueOf ( )
}
const validateLatestStartTime = ( _rule : any , value : any , callback : ( error ? : Error ) => void ) => {
if ( ! value ) {
callback ( )
return
}
if ( ! formData . value . finishDate ) {
if ( ! value || ! formData . value . finishDate ) {
callback ( )
return
}
@ -268,11 +237,12 @@ const validateLatestStartTime = (_rule: any, value: any, callback: (error?: Erro
return
}
if ( latestStart . startOf ( 'day' ) . valueOf ( ) > deliveryDate . startOf ( 'day' ) . valueOf ( ) ) {
callback ( new Error ( '最晚开工时间不能晚于交货日期' ) )
callback ( new Error ( t ( 'ProductionPlan.Plan.validatorLatestStartAfterDelivery' ) ) )
return
}
callback ( )
}
const validatePlanStartTime = ( _rule : any , value : any , callback : ( error ? : Error ) => void ) => {
if ( ! value || ! formData . value . planEndTime ) {
callback ( )
@ -285,11 +255,12 @@ const validatePlanStartTime = (_rule: any, value: any, callback: (error?: Error)
return
}
if ( startTime > endTime ) {
callback ( new Error ( '计划开始时间不能晚于计划结束时间' ) )
callback ( new Error ( t ( 'ProductionPlan.Plan.validatorPlanStartBeforeEnd' ) ) )
return
}
callback ( )
}
const validatePlanEndTime = ( _rule : any , value : any , callback : ( error ? : Error ) => void ) => {
if ( ! value || ! formData . value . planStartTime ) {
callback ( )
@ -302,11 +273,12 @@ const validatePlanEndTime = (_rule: any, value: any, callback: (error?: Error) =
return
}
if ( endTime < startTime ) {
callback ( new Error ( '计划结束时间不能早于计划开始时间' ) )
callback ( new Error ( t ( 'ProductionPlan.Plan.validatorPlanEndAfterStart' ) ) )
return
}
callback ( )
}
const getSelectedTaskDetailUnplanned = ( ) => {
const detail = taskDetailList . value . find (
( item : any ) => Number ( item . id ) === Number ( formData . value . taskDetailId )
@ -317,11 +289,13 @@ const getSelectedTaskDetailUnplanned = () => {
if ( ! Number . isFinite ( total ) || ! Number . isFinite ( planned ) ) return undefined
return Math . max ( total - planned , 0 )
}
const getPlanNumberLimit = ( ) => {
const detailUnplanned = getSelectedTaskDetailUnplanned ( )
if ( detailUnplanned !== undefined ) return detailUnplanned
return maxUnplannedNumber . value
}
const validatePlanNumber = ( _rule : any , value : any , callback : ( error ? : Error ) => void ) => {
if ( value === undefined || value === null || value === '' ) {
callback ( )
@ -329,16 +303,17 @@ const validatePlanNumber = (_rule: any, value: any, callback: (error?: Error) =>
}
const currentPlanNumber = Number ( value )
if ( ! Number . isFinite ( currentPlanNumber ) ) {
callback ( new Error ( '计划数量必须为数字' ) )
callback ( new Error ( t ( 'ProductionPlan.Plan.validatorPlanNumberNumeric' ) ) )
return
}
const planNumberLimit = getPlanNumberLimit ( )
if ( planNumberLimit !== undefined && currentPlanNumber > planNumberLimit ) {
callback ( new Error ( ` 计划数量不能大于未计划数量( ${ planNumberLimit } ) ` ) )
callback ( new Error ( t ( 'ProductionPlan.Plan.validatorPlanNumberLimit' , { limit : planNumberLimit } ) ) )
return
}
callback ( )
}
const formRules = reactive ( {
taskDetailId : [ { required : true , message : t ( 'ProductionPlan.Plan.validatorTaskDetailRequired' ) , trigger : 'blur' } ] ,
taskId : [ { required : true , message : t ( 'ProductionPlan.Plan.validatorTaskRequired' ) , trigger : 'blur' } ] ,
@ -346,7 +321,6 @@ const formRules = reactive({
{ required : true , message : t ( 'ProductionPlan.Plan.validatorPlanNumberRequired' ) , trigger : 'blur' } ,
{ validator : validatePlanNumber , trigger : [ 'blur' , 'change' ] }
] ,
/ / r e y a N u m b e r : [ { r e q u i r e d : t r u e , m e s s a g e : t ( ' P r o d u c t i o n P l a n . P l a n . v a l i d a t o r R e y a N u m b e r R e q u i r e d ' ) , t r i g g e r : ' b l u r ' } ] ,
planStartTime : [
{ required : true , message : t ( 'ProductionPlan.Plan.validatorPlanStartRequired' ) , trigger : 'blur' } ,
{ validator : validatePlanStartTime , trigger : 'change' }
@ -355,31 +329,38 @@ const formRules = reactive({
{ required : true , message : t ( 'ProductionPlan.Plan.validatorPlanEndRequired' ) , trigger : 'blur' } ,
{ validator : validatePlanEndTime , trigger : 'change' }
] ,
deviceId : [ { required : true , message : '请选择设备' , trigger : 'change' } ] ,
latestStartTime : [
{ required : true , message : '请选择最晚开工时间' , trigger : 'blur' } ,
{ required : true , message : t ( 'ProductionPlan.Plan.validatorLatestStartRequired' ) , trigger : 'blur' } ,
{ validator : validateLatestStartTime , trigger : 'change' }
]
} )
const formRef = ref ( ) / / 表 单 R e f
const deviceColumns = [
{ label : t ( 'ProductionPlan.Plan.deviceColumnCode' ) , prop : 'deviceCode' , minWidth : 140 } ,
{ label : t ( 'ProductionPlan.Plan.deviceColumnName' ) , prop : 'deviceName' , minWidth : 160 } ,
{ label : t ( 'ProductionPlan.Plan.deviceColumnModel' ) , prop : 'deviceModel' , minWidth : 140 } ,
{ label : t ( 'ProductionPlan.Plan.deviceColumnWorkshop' ) , prop : 'workshopName' , minWidth : 140 }
]
const fetchDeviceLedgerPage = ( params : Record < string , any > ) => {
console . log ( '11' , taskDetailList . value [ 0 ] )
return DeviceLedgerApi . getDeviceLedgerPage ( {
... params ,
isScheduled : 1 ,
productId : taskDetailList . value [ 0 ] . productId
isScheduled : 1
} )
}
const openDeviceSelectDialog = ( ) => {
const rows = selectedDeviceRows . value . length
? selectedDeviceRows . value . map ( ( item : any ) => ( { ... item , id : Number ( item . id ) } ) )
: formData . value . deviceId
const getRouteItemDeviceDisplay = ( row : PlanProcessRouteItemVO ) => {
if ( ! row ? . deviceId ) return ''
return row . deviceName || String ( row . deviceId )
}
const openDeviceSelectDialog = ( row : PlanProcessRouteItemVO ) => {
activeRouteItemRow . value = row
const rows = row . deviceId
? [
{
id : Number ( formData . value . deviceId ) ,
deviceName : formData . value . deviceName
id : Number ( row . deviceId ) ,
deviceName : row . deviceName
}
]
: [ ]
@ -388,78 +369,117 @@ const openDeviceSelectDialog = () => {
const handleDeviceSelectConfirm = ( payload : { ids : ( number | string ) [ ] ; rows : any [ ] } ) => {
const row = payload . rows ? . [ 0 ]
if ( ! row ) return
if ( ! row || ! activeRouteItemRow . value ) return
const deviceId = Number ( row . id )
if ( ! Number . isFinite ( deviceId ) ) return
formData . value . deviceId = deviceId
formData . value . deviceName = row . deviceName || row . name || row . code || ` 设备ID: ${ deviceId } `
selectedDeviceRows . value = [ row ]
activeRouteItemRow . value . deviceId = deviceId
activeRouteItemRow . value . deviceName = row . deviceName || row . name || row . code || ` ID: ${ deviceId } `
}
const clearRouteItemDevice = ( row : PlanProcessRouteItemVO ) => {
row . deviceId = undefined
row . deviceName = undefined
}
const syncFinishDateByTaskDetail = ( ) => {
const detail = taskDetailList . value . find ( ( item : any ) => Number ( item . id ) === Number ( formData . value . taskDetailId ) )
const detail = taskDetailList . value . find ( ( item : any ) => Number ( item . id ) === Number ( formData . value . taskDetailId ) ) as any
formData . value . finishDate = detail ? . finishDate || detail ? . deliveryDate || undefined
formData . value . deliveryDate = detail ? . deliveryDate || formData . value . deliveryDate
}
/** 打开弹窗 */
const open = async ( type : string , id ? : number ,
taskId ? : number , productId ? : number , number ? : number , taskDetailId ? : string ,
taskDeliveryDate ? : string | number ) => {
const normalizeProcessRouteItems = ( items ? : Array < ErpProductCategoryProcessRouteItemRespVO | PlanProcessRouteItemVO > ) => {
if ( ! Array . isArray ( items ) ) return [ ]
return items . map ( ( item , index ) => ( {
id : ( item as any ) . id ,
categoryId : ( item as any ) . categoryId ,
processRouteId : ( item as any ) . processRouteId ,
processRouteItemId : ( item as any ) . processRouteItemId || ( item as any ) . id ,
sort : item . sort || index + 1 ,
processParameterId : item . processParameterId ,
processParameterCode : item . processParameterCode ,
processParameterName : item . processParameterName ,
remark : item . remark ,
deviceId : ( item as any ) . deviceId ,
deviceName : ( item as any ) . deviceName
} ) )
}
const loadProductProcessRoute = async ( productId ? : number | string ) => {
formData . value . processRouteId = undefined
formData . value . processRouteName = undefined
formData . value . processRouteItems = [ ]
if ( ! productId ) return
const data = await ProductApi . getProductProcessRoute ( productId )
formData . value . processRouteId = data ? . processRouteId
formData . value . processRouteName = data ? . processRouteName
formData . value . processRouteItems = normalizeProcessRouteItems ( data ? . processRouteItems )
}
const open = async (
type : string ,
id ? : number ,
taskId ? : number ,
productId ? : number ,
number ? : number ,
taskDetailId ? : string ,
taskDeliveryDate ? : string | number
) => {
dialogVisible . value = true
dialogTitle . value = t ( 'action.' + type )
formType . value = type
resetForm ( )
maxUnplannedNumber . value = number !== undefined ? Math . max ( Number ( number ) , 0 ) : undefined
formData . value . deliveryDate = taskDeliveryDate || undefined
if ( taskId ) {
formData . value . taskId = taskId
taskDetailList . value = await TaskApi . getTaskDetailListByTaskId ( formData . value . taskId )
if ( taskDetailId ) {
const taskDetails = taskDetailList . value . filter ( item => item . id === taskDetailId )
if ( taskDetails && taskDetails . length > 0 && taskDetails [ 0 ] . id ) {
formData . value . taskDetailId = taskDetails [ 0 ] . id
formData . value . finishDate = ( taskDetails [ 0 ] as any ) . finishDate || undefined
formData . value . deliveryDate = ( taskDetails [ 0 ] as any ) . deliveryDate || taskDeliveryDate || undefined
}
}
}
if ( productId )
formData . value . productId = productId
if ( number ) {
formData . value . planNumber = number
formData . value . reyaNumber = number
}
/ / 修 改 时 , 设 置 数 据
if ( id ) {
formLoading . value = true
try {
formData . value = await PlanApi . getPlan ( id )
if ( formData . value . deviceId ) {
selectedDeviceRows . value = [
{
id : Number ( formData . value . deviceId ) ,
deviceName : formData . value . deviceName
} as DeviceLedgerVO
]
formLoading . value = true
try {
maxUnplannedNumber . value = number !== undefined ? Math . max ( Number ( number ) , 0 ) : undefined
formData . value . deliveryDate = taskDeliveryDate || undefined
if ( productId ) {
formData . value . productId = productId
}
if ( ! id ) {
await loadProductProcessRoute ( productId )
}
if ( taskId ) {
formData . value . taskId = taskId
taskDetailList . value = await TaskApi . getTaskDetailListByTaskId ( formData . value . taskId )
if ( taskDetailId ) {
const taskDetails = taskDetailList . value . filter ( ( item ) => String ( item . id ) === String ( taskDetailId ) )
if ( taskDetails ? . [ 0 ] ? . id ) {
formData . value . taskDetailId = taskDetails [ 0 ] . id
formData . value . finishDate = ( taskDetails [ 0 ] as any ) . finishDate || undefined
formData . value . deliveryDate = ( taskDetails [ 0 ] as any ) . deliveryDate || taskDeliveryDate || undefined
}
}
}
if ( number ) {
formData . value . planNumber = number
formData . value . reyaNumber = number
}
if ( ! taskList . value . length ) {
taskList . value = await TaskApi . getPlanTaskList ( )
}
if ( id ) {
const data = await PlanApi . getPlan ( id )
formData . value = {
... data ,
isCode : data . isCode ? ? false ,
processRouteItems : normalizeProcessRouteItems ( ( data as any ) . processRouteItems )
}
} finally {
formLoading . value = false
}
} finally {
formLoading . value = false
}
taskList . value = await TaskApi . getPlanTaskList ( )
workerList . value = await UserApi . getSimpleUserList ( )
}
defineExpose ( { open } ) / / 提 供 o p e n 方 法 , 用 于 打 开 弹 窗
defineExpose ( { open } )
/** 提交表单 */
const emit = defineEmits ( [ 'success' ] ) / / 定 义 s u c c e s s 事 件 , 用 于 操 作 成 功 后 的 回 调
const emit = defineEmits ( [ 'success' ] )
const submitForm = async ( ) => {
/ / 校 验 表 单
await formRef . value . validate ( )
/ / 提 交 请 求
formLoading . value = true
try {
const data = formData . value as unknown as PlanVO
const data = {
... formData . value ,
processRouteItems : normalizeProcessRouteItems ( formData . value . processRouteItems )
} as unknown as PlanVO
if ( formType . value === 'create' ) {
await PlanApi . createPlan ( data )
message . success ( t ( 'common.createSuccess' ) )
@ -468,14 +488,12 @@ const submitForm = async () => {
message . success ( t ( 'common.updateSuccess' ) )
}
dialogVisible . value = false
/ / 发 送 操 作 成 功 的 事 件
emit ( 'success' )
} finally {
formLoading . value = false
}
}
/** 重置表单 */
const resetForm = ( ) => {
formData . value = {
id : undefined ,
@ -484,6 +502,7 @@ const resetForm = () => {
taskDetailId : undefined ,
taskId : undefined ,
planNumber : 0 ,
reyaNumber : undefined ,
finishNumber : 0 ,
status : undefined ,
planStartTime : undefined ,
@ -494,52 +513,42 @@ const resetForm = () => {
remark : undefined ,
groupType : undefined ,
isEnable : undefined ,
deviceId : undefined ,
deviceName : undefined ,
isPreProduction : 0 ,
isCode : true ,
latestStartTime : undefined ,
finishDate : undefined ,
deliveryDate : undefined ,
isCalculateLoss : true
isCode : true ,
latestStartTime : undefined ,
finishDate : undefined ,
deliveryDate : undefined ,
processRouteId : undefined ,
processRouteName : undefined ,
processRouteItems : [ ]
}
maxUnplannedNumber . value = undefined
selectedDeviceRows . value = [ ]
formRef . value ? . resetFields ( )
}
/** 任务单变化 */
const handleTaskChange = async ( ) => {
taskDetailList . value = await TaskApi . getTaskDetailListByTaskId ( formData . value . taskId )
const handleTaskChange = async ( ) => {
taskDetailList . value = await TaskApi . getTaskDetailListByTaskId ( formData . value . taskId )
formData . value . taskDetailId = undefined
formData . value . finishDate = undefined
formRef . value ? . validateField ( 'planNumber' )
}
/** 明细变化 */
const handleTaskDetailChange = async ( ) => {
const handleTaskDetailChange = async ( ) => {
syncFinishDateByTaskDetail ( )
formRef . value ? . validateField ( 'planNumber' )
}
const handlePlanStartTimeChange = ( ) => {
formRef . value ? . validateField ( [ 'planStartTime' , 'planEndTime' ] )
}
const handlePlanEndTimeChange = ( ) => {
formRef . value ? . validateField ( [ 'planStartTime' , 'planEndTime' ] )
}
< / script >
< style scoped >
. section - title {
font - size : 16 px ;
font - weight : 600 ;
color : # 303133 ;
margin : 16 px 0 12 px ;
padding - left : 10 px ;
border - left : 3 px solid # 409 eff ;
}
. section - title : first - child {
margin - top : 0 ;
. process - route - items - table {
width : 100 % ;
}
< / style >