<template> <el-card class="hl-card" style="position: relative"> <template #header> <span><span v-html="dialogTitle"></span>页</span> </template> <el-form ref="formRef" :model="formData" label-width="160px" v-loading="formLoading"> <el-card class="hl-card-info"> <template #header> <div class="hl-card-info-icona"></div><span class="hl-card-info-text">基础信息</span> </template> <el-row> <el-col :span="24"> <el-row> <el-col :span="6"> <el-row> <el-col :span="24"> <el-form-item label="生产任务单号" prop="taskNo"> <el-input class="!w-265px" placeholder="系统自动生成" v-model="formData.taskNo" disabled /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="项目名称" prop="projectName"> <el-input class="!w-265px" placeholder="项目名称" v-model="formData.projectName" disabled /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="BOM清单号" prop="bomCode"> <el-input class="!w-265px" placeholder="" v-model="formData.bomCode" disabled /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="80"> <el-form-item label="子项目数量" prop="projectSubNum"> <el-input disabled v-model="formData.projectSubNum" show-word-limit class="!w-265px"/> </el-form-item> </el-col> </el-row> </el-col> <el-col :span="6"> <el-row> <el-col :span="24"> <el-form-item label="生产计划单号" prop="planNo"> <el-input class="!w-265px" placeholder="生产计划单号" v-model="formData.planNo" disabled /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="项目结束日期" prop="projectEndTime"> <el-date-picker class="!w-265px" v-model="formData.projectEndTime" type="date" value-format="x" placeholder="项目结束日期" disabled /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="BOM版本号" prop="bomVersion"> <el-input class="!w-265px" placeholder="BOM版本号" v-model="formData.bomVersion" disabled> <template #append v-if="refreshStatus == 1"><el-button @click="handleReFresh" style="background-color:var(--el-color-primary); color:#fff"> <Icon icon="ep:refresh" /> </el-button></template> </el-input> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="80"> <el-form-item label="备注" prop="description"> <el-input :disabled="detailDisabled" class="!w-713px" type="textarea" v-model="formData.description" show-word-limit maxlength="200" /> </el-form-item> </el-col> </el-row> </el-col> <el-col :span="6"> <el-row> <el-col :span="24"> <el-form-item label="项目编号" prop="projectCode"> <el-input class="!w-265px" placeholder="项目编号" v-model="formData.projectCode" disabled /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="子项目名称" prop="projectSubName"> <el-input class="!w-265px" placeholder="子项目名称" v-model="formData.projectSubName" disabled /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="创建时间" prop="createTime"> <el-date-picker class="!w-265px" v-model="formData.createTime" type="date" value-format="x" placeholder="创建时间" disabled /> </el-form-item> </el-col> </el-row> </el-col> <el-col :span="6"> <el-row> <el-col :span="24"> <el-form-item label="客户名称" prop="customerName"> <el-input class="!w-265px" v-model="formData.customerName" placeholder="客户名称" disabled /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="子项目编号" prop="projectSubCode"> <el-input class="!w-265px" v-model="formData.projectSubCode" placeholder="子项目编号" disabled /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="单据状态" prop="status"> <el-select v-model="formData.status" placeholder="单据状态" clearable class="!w-265px" disabled> <el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_BOM_STATUS)" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> </el-col> </el-row> </el-col> </el-row> </el-col> </el-row> </el-card> <!-- 表格类信息 --> <el-card class="hl-card-info"> <template #header> <div class="hl-card-info-icona"></div><span class="hl-card-info-text">任务明细</span> </template> <el-row> <el-col> <el-card class="hl-incard"> <el-form ref="subFormRef" :model="formData.bomDetails" :rules="subFormRules" v-loading="formLoading" label-width="0" > <el-table :row-class-name="tableRowClassName" :data="formData.bomDetails" > <el-table-column label="序号" type="index" min-width="50px" /> <el-table-column label="变更次数" prop="bomEditStatus" max-width="60px" align="center"> <template #default="{ row}"> <el-text class="mx-1" max-width="60px">{{row.bomOperateCount==0?'无':'第'+row.bomOperateCount+'次'}}</el-text> </template> </el-table-column> <!-- <el-table-column v-if="formData.bomStatus == 2|| formData.bomStatus == 7" style="text-align: center" label="库存" prop="amount" min-width="150"> --> <el-table-column style="text-align: center" label="变更履历" max-width="70px" :show-overflow-tooltip="true" > <template #header> <span class="hl-table_header">*</span>变更履历 </template> <template #default="{ row}"> <span class="memo-content">{{ row.memo }}</span> <!-- <el-tooltip class="box-item" effect="dark" placement="top-end" :content="row.memo" > <el-button link>备注</el-button> --> <!-- </el-tooltip> --> </template> </el-table-column> <el-table-column label="零件名称" prop="materialName" max-width="80px"/> <el-table-column label="是否标准件" prop="typeName" max-width="100px" /> <el-table-column label="材质" prop="compositionName" max-width="80px"/> <el-table-column label="规格型号" prop="spec" max-width="80px"/> <el-table-column label="图号" prop="blueprintNo" max-width="50px"/> <el-table-column label="数量" prop="amount" max-width="50px"/> <el-table-column label="BOM状态" prop="bomEditStatus"> <template #default="{ row, $index }"> <el-form-item :prop="`${$index}.bomEditStatus`" class="mb-0px!"> <el-select class="!w-265px" v-model="row.bomEditStatus" disabled placeholder="下拉选择"> <el-option v-for="dicts in heliBomStatusOptions" :key="dicts.value" :label="dicts.label" :value="dicts.value" /> </el-select> </el-form-item> </template> </el-table-column> <el-table-column label="零件编码" prop="materialCode" max-width="80px"/> <el-table-column label="系统单位" prop="unit"> <template #header> <span class="hl-table_header">*</span>系统单位</template> <template #default="{ row, $index }"> <el-form-item :prop="`${$index}.unit`" class="mb-0px!"> <span v-if="row.type == '1'">{{ getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, row.unit) }}</span> <el-select disabled v-else v-model="row.unit" clearable class="!w-250px"> <el-option v-for="dict in getStrDictOptions(DICT_TYPE.HELI_MATERIAL_UNIT)" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> </template> </el-table-column> <el-table-column min-width="80px" align="center" fixed="right"> <template #header><span class="hl-table_header">*</span>负责人</template> <template #default="{ row}"> <el-select :disabled="getDisable(row.bomEditStatus)" clearable filterable v-model="row.owner" placeholder="请选择负责人" style="width: 170px"> <el-option v-for="item in ownerList" :key="item.index" :label="item.label" :value="item.id" /> </el-select> <!-- <el-form-item :prop="`${$index}.owner`" class="mb-0px!" :rules="subFormRules.owner"> <UserSelect :disabled="detailDisabled" v-model="row.owner" @update:new-value="handleSelectedUser9($index, $event)" class="!w-265px" /> </el-form-item> --> </template> </el-table-column> <el-table-column min-width="120px" align="center" fixed="right"> <template #header><span class="hl-table_header">*</span>需求完成日期</template> <template #default="{ row, $index }"> <el-form-item v-if="getDisable(row.bomEditStatus) == true" :prop="`${$index}.requireEndDate`" class="mb-0px!" > <el-date-picker :disabled="getDisable(row.bomEditStatus)" class="!w-265px" v-model="row.requireEndDate" type="date" value-format="x" placeholder="需求完成日期" /> </el-form-item> <el-form-item v-if="getDisable(row.bomEditStatus)==false" :prop="`${$index}.requireEndDate`" class="mb-0px!" :rules="subFormRules.requireEndDate"> <el-date-picker :disabled="getDisable(row.bomEditStatus)" class="!w-265px" v-model="row.requireEndDate" type="date" value-format="x" placeholder="需求完成日期" /> </el-form-item> </template> </el-table-column> </el-table> </el-form> </el-card> </el-col> </el-row> </el-card> <el-card class="hl-card-info"> <template #header> <div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span> </template> <el-row> <el-col> <el-card class="hl-incard"> <el-table :data="formData.operateLogs" class="hl-table" :style="{ height: formData.operateLogs.length > 10 ? '450px' : '' }"> <el-table-column prop="type" label="操作" align="center" width="200px"> <template #default="scope"> {{ getDictLabel(DICT_TYPE.SYSTEM_OPERATE_TYPE, scope.row.type) }} </template> </el-table-column> <el-table-column prop="userNickname" label="操作人" align="center" /> <el-table-column label="操作时间" align="center" prop="startTime" width="220" :formatter="dateFormatter" /> </el-table> </el-card> </el-col> </el-row> </el-card> </el-form> <div class="hl-footer text-center"> <el-button @click="() => router.back()" size="large">取 消</el-button> <el-button v-if="pageType != 'detail' && formData.status == 1" @click="submitForm('SAVE')" type="primary" :disabled="formLoading" size="large">保 存</el-button> <el-button v-if="pageType != 'detail' && formData.status == 1" @click="submitForm('SUBMIT')" type="success" :disabled="formLoading" size="large">提 交</el-button> <el-button v-if="pageType != 'detail' && formData.status == 2" @click="submitForm('CANCEL_SUBMIT')" type="danger" :disabled="formLoading" size="large">取消提交</el-button> </div> </el-card> </template> <script setup lang="ts"> import { inject } from 'vue' import { Search, Plus } from '@element-plus/icons-vue' import { getIntDictOptions, getStrDictOptions, getDictLabel, DICT_TYPE } from '@/utils/dict' import { betweenDay, formatDate, dateFormatter } from '@/utils/formatTime' import { getOperateLogPage } from '@/api/system/operatelog' import * as PlanTaskApi from '@/api/heli/plantask' import * as PlanTaskBomApi from '@/api/heli/plantaskbom' import UserSelect from '@/views/heli/hlvuestyle/userSelect.vue' import * as TaskDispatchApi from '@/api/heli/taskdispatch' import { get } from 'sortablejs' const reload: any = inject('reload') const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 const { query } = useRoute() const router = useRouter() const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 const formRef = ref() // 表单 const subFormRef = ref() //子表单 Ref const formData = ref({ id: undefined, active: undefined, projectId: undefined, projectPlanId: undefined, projectPlanSubId: undefined, processBomId: undefined, taskNo: undefined, planNo: undefined, projectCode: undefined, customerName: undefined, projectName: undefined, projectEndTime: undefined, projectSubCode: undefined, projectSubName: undefined, bomCode: undefined, bomVersion: undefined, createTime: undefined, description: undefined, status: undefined, operateLogs: [], bomDetails: [] }) const getDisable = (bomEditStatus)=>{ if(bomEditStatus == 1){ return true; }else{ return detailDisabled.value } } const subFormRules = reactive({ owner: [{ required: true, message: '负责人不能为空', trigger: 'blur' }], requireEndDate: [{ required: true, message: '要求完成日期不能为空', trigger: 'blur' }] }) //接收物料传递的数据 const handleSelectedMaterial = (row: any, newValue: any) => { row.materialId = newValue.id row.materialName = newValue.name row.materialCode = newValue.code row.spec = newValue.spec row.unit = newValue.unit } const heliBomStatusOptions = ref<bomEditStatusEnum[]>([ { value: 0, label: '初始' }, { value: 1, label: '删除' }, { value: 2, label: '新增' }, { value: 3, label: '增补' }, { value: 4, label: '修改' }, ]); const submitForm = async (operate) => { // 校验表单 await subFormRef.value.validate() if (operate == 'SUBMIT' && formData.value.bomDetails.length == 0) { message.alertWarning('任务明细不能为空') return } // 提交请求 formLoading.value = true try { formData.value.active = operate const data = formData.value as unknown as PlanTaskApi.PlanTaskVO data.status = operate == 'SUBMIT' ? 2 : 1 await PlanTaskApi.updatePlanTask(data) message.success(t('common.updateSuccess')) // 发送操作成功的事件 emit('success') } finally { formLoading.value = false reload() } } const handleReFresh = async () => { if(formData.value.status == 2){ message.alertWarning('请先取消提交,再点击此按钮!') return } // 提交请求 formLoading.value = true try { await PlanTaskApi.refreshPlanTaskByPlanId(formData.value.projectPlanSubId) } finally { reload() } formLoading.value = false } const refreshStatus = ref() const queryParams = reactive({ pageNo: 1, pageSize: 99, taskId: undefined }) type OwnerListType = { index: number; id: number; label: string; }; const getOwnerListThis = async (): Promise<OwnerListType[]> => { let tempList: any[]; let ownerList: OwnerListType[] = []; tempList = personList.value; if (tempList) { tempList.forEach((item, index) => { let key = Object.keys(item)[0]; let value = item[key] as string; ownerList.push({ index: index + 1, id: Number(key), label: value }); }); } return ownerList; }; const dialogTitle = ref('') const detailDisabled = ref(false) const pageType = ref('') const personList = ref([]) const ownerList = ref<OwnerListType[]>([]); onMounted(async () => { pageType.value = query.type dialogTitle.value = t('action.' + query.type) // 获取库存信息 formData.value = await PlanTaskApi.getPlanTask(query.id) // 获得bom需要更新的状态 refreshStatus.value = await PlanTaskApi.getPlanTaskBomStatus(query.id) personList.value = await TaskDispatchApi.getOwnerList(0,1); ownerList.value = await getOwnerListThis(); queryParams.taskId = query.id formData.value.bomDetails = (await PlanTaskBomApi.getPlanTaskBomPage(queryParams)).list formData.value.bomDetails.forEach((item) => { item.amount = formData.value.projectSubNum * item.amount; item.typeName = item.type == 1 ? '是' : '否' if(item.owner){ item.owner = Number(item.owner) } }) // 操作日志 let logParams = { pageNo: 1, pageSize: 99, businessId: formData.value.id, businessType: 'PLAN_TASK' } formData.value.operateLogs = (await getOperateLogPage(logParams)).list if ('detail' == query.type || formData.value.status == 2) { detailDisabled.value = true } }) const tableRowClassName = ({ row }) => { switch (row.bomEditStatus) { case 1: return 'status-1'; case 2: return 'status-2'; case 3: return 'status-3'; case 4: console.log('sss') return 'status-4'; default: return ''; } } // 责任人 const handleSelectedUser9 = (currentIndex, newValue: any) => { formData.value.bomDetails[currentIndex].owner = newValue?.id } </script> <style> a { color: #409eff; text-decoration: none; } .upload-file-uploader { margin-bottom: 10px; display: inline-block; margin-right: 20px; } .hl-card .alter-class { position: relative; border: solid 1px orange; outline: solid 1px orange; } .el-form-item__content { margin-left: 0px !important; } .status-1 { background-color: #f2f2f2 !important; } .status-2 { background-color: #90EE90 !important; } .status-3 { background-color: #BBFFFF !important; } .status-4 { background-color: #EE9A00 !important; } </style>