|
@@ -63,6 +63,7 @@
|
|
|
<!-- 列表 -->
|
|
|
<ContentWrap>
|
|
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
|
|
+ <el-table-column label="bom节点" align="center" prop="bomNodeId" v-if="false"/>
|
|
|
<el-table-column label="设备编码" align="center" prop="deviceCode" />
|
|
|
<el-table-column label="设备名称" align="center" prop="deviceName" />
|
|
|
<el-table-column label="累计运行时间(H)" align="center" prop="totalRunTime" :formatter="erpPriceTableColumnFormatter"/>
|
|
@@ -74,6 +75,7 @@
|
|
|
v-model="scope.row.mileageRule"
|
|
|
:active-value="0"
|
|
|
:inactive-value="1"
|
|
|
+ :disabled="true"
|
|
|
/>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
@@ -83,6 +85,7 @@
|
|
|
v-model="scope.row.runningTimeRule"
|
|
|
:active-value="0"
|
|
|
:inactive-value="1"
|
|
|
+ :disabled="true"
|
|
|
/>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
@@ -92,6 +95,7 @@
|
|
|
v-model="scope.row.naturalDateRule"
|
|
|
:active-value="0"
|
|
|
:inactive-value="1"
|
|
|
+ :disabled="true"
|
|
|
/>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
@@ -108,11 +112,43 @@
|
|
|
配置
|
|
|
</el-button>
|
|
|
</div>
|
|
|
+ <div style="margin-left: 12px">
|
|
|
+ <el-button
|
|
|
+ link
|
|
|
+ type="primary"
|
|
|
+ @click="openMaterialForm(scope.row)"
|
|
|
+ >
|
|
|
+ 选择物料
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ <div style="margin-left: 12px">
|
|
|
+ <el-button
|
|
|
+ link
|
|
|
+ type="primary"
|
|
|
+ @click="handleView(scope.row.bomNodeId)"
|
|
|
+ >
|
|
|
+ 物料详情
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
</ContentWrap>
|
|
|
+
|
|
|
+ <!-- 选择的物料列表 -->
|
|
|
+ <ContentWrap>
|
|
|
+ <el-table v-loading="false" :data="materialList" :stripe="true" :show-overflow-tooltip="true" v-if="false">
|
|
|
+ <el-table-column label="bom节点" align="center" prop="bomNodeId" />
|
|
|
+ <el-table-column label="物料编码" align="center" prop="materialCode" />
|
|
|
+ <el-table-column label="物料名称" align="center" prop="materialName" />
|
|
|
+ <el-table-column label="单位" align="center" prop="unit" />
|
|
|
+ <el-table-column label="单价(CNY/元)" align="center" prop="unitPrice" :formatter="erpPriceTableColumnFormatter"/>
|
|
|
+ <el-table-column label="消耗数量" align="center" prop="quantity" />
|
|
|
+ <el-table-column label="总库存数量" align="center" prop="totalInventoryQuantity" />
|
|
|
+ </el-table>
|
|
|
+ </ContentWrap>
|
|
|
+
|
|
|
</ContentWrap>
|
|
|
<ContentWrap>
|
|
|
<el-form>
|
|
@@ -140,6 +176,7 @@
|
|
|
:precision="2"
|
|
|
:min="0"
|
|
|
controls-position="right"
|
|
|
+ :disabled="true"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<!-- 推迟公里数 -->
|
|
@@ -166,6 +203,7 @@
|
|
|
:precision="1"
|
|
|
:min="0"
|
|
|
controls-position="right"
|
|
|
+ :disabled="true"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<!-- 推迟时长 -->
|
|
@@ -193,6 +231,7 @@
|
|
|
placeholder="选择日期"
|
|
|
format="YYYY-MM-DD"
|
|
|
value-format="YYYY-MM-DD"
|
|
|
+ :disabled="true"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<!-- 推迟自然日期 -->
|
|
@@ -219,6 +258,7 @@
|
|
|
:precision="2"
|
|
|
:min="0"
|
|
|
controls-position="right"
|
|
|
+ :disabled="true"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
@@ -231,6 +271,7 @@
|
|
|
:precision="2"
|
|
|
:min="0"
|
|
|
controls-position="right"
|
|
|
+ :disabled="true"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
@@ -243,6 +284,7 @@
|
|
|
:precision="1"
|
|
|
:min="0"
|
|
|
controls-position="right"
|
|
|
+ :disabled="true"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
@@ -255,6 +297,7 @@
|
|
|
:precision="1"
|
|
|
:min="0"
|
|
|
controls-position="right"
|
|
|
+ :disabled="true"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
@@ -266,6 +309,7 @@
|
|
|
v-model="configDialog.form.nextNaturalDate"
|
|
|
:min="0"
|
|
|
controls-position="right"
|
|
|
+ :disabled="true"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
@@ -277,6 +321,7 @@
|
|
|
v-model="configDialog.form.naturalDatePeriodLead"
|
|
|
:min="0"
|
|
|
controls-position="right"
|
|
|
+ :disabled="true"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
@@ -285,7 +330,15 @@
|
|
|
<el-button type="primary" @click="saveConfig">保存</el-button>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
-
|
|
|
+ <!-- 表单弹窗:添加/修改 -->
|
|
|
+ <WorkOrderMaterial ref="materialFormRef" @choose="selectChoose" />
|
|
|
+ <!-- 抽屉组件 展示已经选择的物料 并编辑物料消耗 -->
|
|
|
+ <MaterialListDrawer
|
|
|
+ :model-value="drawerVisible"
|
|
|
+ @update:model-value="val => drawerVisible = val"
|
|
|
+ :node-id="currentBomNodeId"
|
|
|
+ :materials="materialList.filter(item => item.bomNodeId === currentBomNodeId)"
|
|
|
+ />
|
|
|
</template>
|
|
|
<script setup lang="ts">
|
|
|
import { IotMaintainApi, IotMaintainVO } from '@/api/pms/maintain'
|
|
@@ -293,8 +346,10 @@ import { IotDeviceApi, IotDeviceVO } from '@/api/pms/device'
|
|
|
import * as UserApi from '@/api/system/user'
|
|
|
import { useUserStore } from '@/store/modules/user'
|
|
|
import { ref } from 'vue'
|
|
|
+import type { ComponentPublicInstance } from 'vue'
|
|
|
import { IotMaintenanceBomApi, IotMaintenanceBomVO } from '@/api/pms/iotmaintenancebom'
|
|
|
import { IotMainWorkOrderBomApi, IotMainWorkOrderBomVO } from '@/api/pms/iotmainworkorderbom'
|
|
|
+import { IotMainWorkOrderBomMaterialApi, IotMainWorkOrderBomMaterialVO } from '@/api/pms/iotmainworkorderbommaterial'
|
|
|
import { IotMaintenancePlanApi, IotMaintenancePlanVO } from '@/api/pms/maintenance'
|
|
|
import { IotMainWorkOrderApi, IotMainWorkOrderVO } from '@/api/pms/iotmainworkorder'
|
|
|
import { useTagsViewStore } from '@/store/modules/tagsView'
|
|
@@ -303,6 +358,8 @@ import MainPlanDeviceList from "@/views/pms/maintenance/MainPlanDeviceList.vue";
|
|
|
import * as DeptApi from "@/api/system/dept";
|
|
|
import {erpPriceTableColumnFormatter} from "@/utils";
|
|
|
import dayjs from 'dayjs'
|
|
|
+import MaterialListDrawer from "@/views/pms/iotmainworkorder/SelectedMaterialDrawer.vue";
|
|
|
+import WorkOrderMaterial from "@/views/pms/iotmainworkorder/WorkOrderMaterial.vue";
|
|
|
|
|
|
/** 保养计划 表单 */
|
|
|
defineOptions({ name: 'IotMainWorkOrderBom' })
|
|
@@ -314,12 +371,16 @@ const { currentRoute, push } = useRouter()
|
|
|
const deptUsers = ref<UserApi.UserVO[]>([]) // 用户列表
|
|
|
const dept = ref() // 当前登录人所属部门对象
|
|
|
const configFormRef = ref() // 配置弹出框对象
|
|
|
+const bomNodeId = ref() // 最新的bomNodeId
|
|
|
const dialogTitle = ref('') // 弹窗的标题
|
|
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
|
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
|
|
const deviceLabel = ref('') // 表单的类型:create - 新增;update - 修改
|
|
|
-// const list = ref<IotMaintenanceBomVO[]>([]) // 设备bom关联列表的数据
|
|
|
+const drawerVisible = ref<boolean>(false)
|
|
|
+const currentBomNodeId = ref() // 当前选中的bom节点
|
|
|
+const showDrawer = ref()
|
|
|
const list = ref<IotMainWorkOrderBomVO[]>([]) // 保养工单bom关联列表的数据
|
|
|
+const materialList = ref<IotMainWorkOrderBomMaterialVO[]>([]) // 保养工单bom关联物料列表
|
|
|
const deviceIds = ref<number[]>([]) // 已经选择的设备id数组
|
|
|
const { params, name } = useRoute() // 查询参数
|
|
|
const id = params.id
|
|
@@ -338,6 +399,12 @@ const formRules = reactive({
|
|
|
})
|
|
|
const formRef = ref() // 表单 Ref
|
|
|
|
|
|
+interface MaterialFormExpose {
|
|
|
+ open: (deptId: number, bomNodeId: number) => void
|
|
|
+}
|
|
|
+
|
|
|
+const materialFormRef = ref<MaterialFormExpose>();
|
|
|
+
|
|
|
// 新增配置相关状态
|
|
|
const configDialog = reactive({
|
|
|
visible: false,
|
|
@@ -393,6 +460,45 @@ const openConfigDialog = (row: IotMainWorkOrderBomVO) => {
|
|
|
configDialog.visible = true
|
|
|
}
|
|
|
|
|
|
+// const materialFormRef = ref()
|
|
|
+const openMaterialForm = (row: any) => {
|
|
|
+ bomNodeId.value = row.bomNodeId;
|
|
|
+ console.log('这是一个对象:', row.bomNodeId)
|
|
|
+ materialFormRef.value.open(formData.value.deptId, bomNodeId.value)
|
|
|
+}
|
|
|
+
|
|
|
+const selectChoose = (selectedMaterial) => {
|
|
|
+ selectedMaterial.bomNodeId = bomNodeId.value
|
|
|
+ // 关联 bomNodeId
|
|
|
+ const processedMaterials = selectedMaterial.map(material => ({
|
|
|
+ ...material,
|
|
|
+ bomNodeId: bomNodeId.value // 统一关联当前行的 bomNodeId
|
|
|
+ }));
|
|
|
+
|
|
|
+ // 避免重复添加
|
|
|
+ processedMaterials.forEach(newMaterial => {
|
|
|
+ // 检查是否已存在相同 bomNodeId + materialCode 的条目
|
|
|
+ const isExist = materialList.value.some(item =>
|
|
|
+ item.bomNodeId === bomNodeId.value &&
|
|
|
+ item.materialCode === newMaterial.materialCode
|
|
|
+ );
|
|
|
+
|
|
|
+ if (!isExist) {
|
|
|
+ materialList.value.push(newMaterial);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ console.log('选择完成的数据:', JSON.stringify(selectedMaterial))
|
|
|
+ console.log('添加到本地列表的数据:', materialList.value)
|
|
|
+}
|
|
|
+
|
|
|
+/** 查看已经选择的物料 并编辑 */
|
|
|
+const handleView = (nodeId) => {
|
|
|
+ currentBomNodeId.value = nodeId
|
|
|
+ drawerVisible.value = true
|
|
|
+ // showDrawer.value.openDrawer()
|
|
|
+ console.log('当前bom节点:', currentBomNodeId.value)
|
|
|
+}
|
|
|
+
|
|
|
// 保存配置
|
|
|
const saveConfig = () => {
|
|
|
(configFormRef.value as any).validate((valid: boolean) => {
|
|
@@ -464,16 +570,22 @@ const submitForm = async () => {
|
|
|
// 校验表单
|
|
|
await formRef.value.validate()
|
|
|
// 校验表格数据
|
|
|
- const isValid = validateTableData()
|
|
|
- if (!isValid) return
|
|
|
+ // const isValid = validateTableData()
|
|
|
+ // if (!isValid) return
|
|
|
// 提交请求
|
|
|
formLoading.value = true
|
|
|
try {
|
|
|
const data = {
|
|
|
- mainPlan: formData.value,
|
|
|
- mainPlanBom: list.value
|
|
|
+ mainWorkOrder: formData.value,
|
|
|
+ mainWorkOrderBom: list.value,
|
|
|
+ mainWorkOrderMaterials: materialList.value
|
|
|
}
|
|
|
- if (formType.value === 'create') {
|
|
|
+ debugger
|
|
|
+ await IotMainWorkOrderApi.fillWorkOrder(data)
|
|
|
+ message.success(t('common.createSuccess'))
|
|
|
+ close()
|
|
|
+
|
|
|
+ /* if (formType.value === 'create') {
|
|
|
await IotMaintenancePlanApi.createIotMaintenancePlan(data)
|
|
|
message.success(t('common.createSuccess'))
|
|
|
close()
|
|
@@ -481,7 +593,7 @@ const submitForm = async () => {
|
|
|
await IotMaintainApi.updateIotMaintain(data)
|
|
|
message.success(t('common.updateSuccess'))
|
|
|
close()
|
|
|
- }
|
|
|
+ } */
|
|
|
// 发送操作成功的事件
|
|
|
emit('success')
|
|
|
} finally {
|
|
@@ -619,7 +731,7 @@ const resetForm = () => {
|
|
|
formRef.value?.resetFields()
|
|
|
}
|
|
|
onMounted(async () => {
|
|
|
- console.log('id-'+id)
|
|
|
+ materialList.value = []
|
|
|
const deptId = useUserStore().getUser.deptId
|
|
|
// 查询当前登录人所属部门名称
|
|
|
dept.value = await DeptApi.getDept(deptId)
|
|
@@ -629,15 +741,11 @@ onMounted(async () => {
|
|
|
// if (id){
|
|
|
try{
|
|
|
formType.value = 'update'
|
|
|
- // const iotMaintain = await IotMaintainApi.getIotMaintain(id);
|
|
|
- // deviceLabel.value = iotMaintain.deviceName
|
|
|
- // formData.value = iotMaintain
|
|
|
// 查询保养工单 主表数据
|
|
|
const workOrder = await IotMainWorkOrderApi.getIotMainWorkOrder(id);
|
|
|
formData.value = workOrder
|
|
|
// 查询保养工单 明细数据
|
|
|
const data = await IotMainWorkOrderBomApi.getWorkOrderBOMs(queryParams);
|
|
|
- console.log('这是个数组:', data)
|
|
|
list.value = []
|
|
|
if (Array.isArray(data)) {
|
|
|
list.value = data.map(item => ({
|
|
@@ -650,12 +758,6 @@ onMounted(async () => {
|
|
|
console.error('数据加载失败:', error)
|
|
|
message.error('数据加载失败,请重试')
|
|
|
}
|
|
|
- /* } else {
|
|
|
- formType.value = 'create';
|
|
|
- const { wsCache } = useCache()
|
|
|
- const userInfo = wsCache.get(CACHE_KEY.USER)
|
|
|
- formData.value.responsiblePerson = userInfo.user.id;
|
|
|
- } */
|
|
|
})
|
|
|
|
|
|
</script>
|