You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1177 lines
42 KiB
1177 lines
42 KiB
<template> |
|
<el-dialog |
|
title="生产监控" |
|
append-to-body |
|
:modelValue="openShow" |
|
width="30%" |
|
@close="closeDialog" |
|
fullscreen |
|
> |
|
<el-descriptions title="订单信息"> |
|
<template #extra> |
|
<el-button type="primary" @click="refreshData" :loading="refreshLoading">刷新</el-button> |
|
</template> |
|
</el-descriptions> |
|
<div class="order-box"> |
|
<div |
|
class="order-item" |
|
v-for="(item, index) in displayOrderItems" |
|
:key="index" |
|
:class="{ 'expand-item': item.isExpandBtn }" |
|
> |
|
<!-- 展开按钮 --> |
|
<template v-if="item.isExpandBtn"> |
|
<el-button type="text" @click="toggleOrderInfo" class="expand-btn"> |
|
{{ orderInfoExpanded ? '收起 ▲' : '展开更多 ▼' }} |
|
</el-button> |
|
</template> |
|
<template v-else> |
|
{{ item.label }}: |
|
<span |
|
v-if="item.clickable" |
|
style="cursor: pointer; font-weight: 500" |
|
@dblclick="item.clickHandler" |
|
>{{ item.value }}</span |
|
> |
|
<span v-else-if="item.style" :style="item.style">{{ item.value }}</span> |
|
<span v-else>{{ item.value }}</span> |
|
</template> |
|
</div> |
|
|
|
<!-- 展开/收起按钮 --> |
|
<div class="order-item" style="width: 100%; text-align: center" v-if="orderInfoExpanded"> |
|
<el-button type="text" @click="toggleOrderInfo" class="expand-btn"> |
|
{{ orderInfoExpanded ? '收起 ▲' : '展开更多 ▼' }} |
|
</el-button> |
|
</div> |
|
</div> |
|
<el-descriptions title="工序信息"> </el-descriptions> |
|
<div v-loading="processSelectLoading"> |
|
<div class="scrollContent"> |
|
<div ref="pointView" class="scrollBox"> |
|
<!-- --> |
|
<div |
|
v-for="(item, index) in detailsForm.planList" |
|
:key="item.id" |
|
:class="[ |
|
'production-process-item', |
|
index === 0 ? 'production-left-item-box' : '', |
|
{ selected: selectedItemId === item.id }, |
|
]" |
|
@click="selectItem(item)" |
|
class="production-process-item" |
|
:style="{ borderColor: getProcessBgColor(item.status) }" |
|
> |
|
<!-- 工序号和工序名称 --> |
|
<div |
|
class="production-process-title" |
|
:style="{ background: getProcessBgColor(item.status) }" |
|
> |
|
<div style="display: flex; align-items: center" :title="'工序号和工序名字'"> |
|
<div>{{ item.orders + '-' + item.ppsName }}</div> |
|
</div> |
|
<!-- 1 是 0否 --> |
|
<el-icon style="font-size: 16px; margin-left: 5px" v-if="item.mainProcess == 1"> |
|
<Star /> |
|
</el-icon> |
|
</div> |
|
<div |
|
class="process_content" |
|
:style="{ background: getProcessVerticalGradient(item.status) }" |
|
> |
|
<!-- 加工班组 --> |
|
<div class="flex-row" :title="'班组'"> |
|
<span class="icon-text" |
|
><el-icon><User /></el-icon>班组:</span |
|
> |
|
<span v-if="item.makeTeam" class="icon-text"> |
|
{{ item.makeTeam }} |
|
</span> |
|
</div> |
|
<!-- 接收人 --> |
|
<div class="flex-row" :title="'接收人'"> |
|
<span class="icon-text"> |
|
<el-icon><User /></el-icon>接收人:</span |
|
> |
|
<span class="icon-text"> |
|
{{ item.status != 1 && item.receiveManName ? item.receiveManName : '-' }} |
|
</span> |
|
</div> |
|
<!-- 计划加工人 --> |
|
<div class="flex-row" v-if="item.planWorkMan != ''" :title="'计划加工人'"> |
|
<span class="icon-text" |
|
><el-icon><User /></el-icon>计划加工人:</span |
|
> |
|
<span class="icon-text"> |
|
{{ item.planWorkMan }} |
|
</span> |
|
</div> |
|
<!-- 报工人/报工数量 --> |
|
<div class="flex-row" :title="'报工人和数量'"> |
|
<span class="icon-text" |
|
><el-icon><User /></el-icon>报工人/数量:</span |
|
> |
|
<span v-if="item.workManName" class="icon-text"> |
|
{{ item.workManName }}/{{ item.workQty }} |
|
</span> |
|
<span v-else class="icon-text">-</span> |
|
</div> |
|
<!-- 额定工时-实际工时 --> |
|
<div class="flex-row" :title="'额定工时-实际工时'"> |
|
<span class="icon-text"> |
|
<el-icon><Odometer /></el-icon>额定/实际工时(min):</span |
|
> |
|
<span class="icon-text"> {{ item.hourQuota }}/{{ item.hourActual }} </span> |
|
</div> |
|
<!-- 计划开始-计划结束 --> |
|
<div class="flex-row" :title="'计划开始'"> |
|
<span class="icon-text"> |
|
<el-icon><Odometer /></el-icon>计划开始:</span |
|
> |
|
<span class="icon-text"> |
|
{{ item.planStartTime }} |
|
</span> |
|
</div> |
|
<div class="flex-row" :title="'计划结束'"> |
|
<span class="icon-text"> |
|
<el-icon><Odometer /></el-icon>计划结束:</span |
|
> |
|
<span class="icon-text"> |
|
{{ item.planEndTime }} |
|
</span> |
|
</div> |
|
<!-- 实际开始-实际结束 --> |
|
<div class="flex-row" :title="'实际开始'"> |
|
<span class="icon-text"> |
|
<el-icon><Edit /></el-icon>实际开始:</span |
|
> |
|
<span class="icon-text">{{ item.factStartTime || '-' }}</span> |
|
</div> |
|
<div class="flex-row" :title="'实际结束'"> |
|
<span class="icon-text"> |
|
<el-icon><Edit /></el-icon>实际结束:</span |
|
> |
|
<span style="color: #1990ff" class="icon-text"> {{ item.factEndTime || '-' }}</span> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
<div class="details-box" v-if="selectedItemId && selectedItemInfo.status > 1"> |
|
<div class="details-box-item"> |
|
<div class="de-title">工序详情</div> |
|
<el-descriptions :column="4" border label-width="100" class="fixed-descriptions"> |
|
<el-descriptions-item label="接收数量" :span="1">{{ |
|
processDetails.qualifiedQty |
|
}}</el-descriptions-item> |
|
<el-descriptions-item label="计划开始" :span="1">{{ |
|
selectedItemInfo.planStartTime |
|
}}</el-descriptions-item> |
|
<el-descriptions-item label="计划结束" :span="1">{{ |
|
selectedItemInfo.planEndTime |
|
}}</el-descriptions-item> |
|
<el-descriptions-item label="接收人" :span="1">{{ |
|
processDetails.receiveName |
|
}}</el-descriptions-item> |
|
<el-descriptions-item label="实际开始" :span="1">{{ |
|
selectedItemInfo.factStartTime |
|
}}</el-descriptions-item> |
|
<el-descriptions-item label="实际结束" :span="1">{{ |
|
selectedItemInfo.factEndTime |
|
}}</el-descriptions-item> |
|
<el-descriptions-item label="试验数量" :span="1">{{ |
|
processDetails.testQty |
|
}}</el-descriptions-item> |
|
<el-descriptions-item label="消耗数量" :span="1">{{ |
|
processDetails.lossQty |
|
}}</el-descriptions-item> |
|
<el-descriptions-item label="报废数量" :span="1">{{ |
|
processDetails.scrapQty |
|
}}</el-descriptions-item> |
|
</el-descriptions> |
|
</div> |
|
<div |
|
class="details-box-item" |
|
v-if="processDetails.mrList && processDetails.mrList.length >= 0" |
|
> |
|
<div class="de-title">加工记录</div> |
|
<el-table |
|
:data="processDetails.mrList" |
|
:sequence="false" |
|
:no-page="false" |
|
:export-excel="false" |
|
border |
|
> |
|
<el-table-column label="操作工" align="center" prop="worker" min-width="150" /> |
|
<el-table-column label="加工时间" align="center" prop="makeTime" min-width="150" /> |
|
<el-table-column label="合格数量" align="center" prop="workQty" min-width="150" /> |
|
<el-table-column label="报废数量" align="center" prop="scrapQty" min-width="150" /> |
|
<el-table-column label="备注" align="center" prop="memo" min-width="150" /> |
|
</el-table> |
|
</div> |
|
<div |
|
class="details-box-item" |
|
v-if="processDetails.trialItemList && processDetails.trialItemList.length > 0" |
|
> |
|
<div class="de-title">转试记录</div> |
|
<el-table :data="processDetails.trialItemList" border> |
|
<el-table-column label="试验信息" align="center" prop="testName" /> |
|
<el-table-column label="转试人" align="center" prop="testUser" /> |
|
<el-table-column label="转试时间" align="center" prop="testTime" /> |
|
<el-table-column label="试验状态" align="center" prop="testStatus" /> |
|
</el-table> |
|
</div> |
|
<div |
|
class="details-box-item" |
|
v-if="processDetails.slotList && processDetails.slotList.length > 0" |
|
> |
|
<div class="de-title">同槽信息</div> |
|
<el-table :data="processDetails.slotList" border> |
|
<el-table-column label="同槽编号" align="center" prop="mtuCode" /> |
|
<el-table-column label="零件号" align="center" prop="partCode" /> |
|
<el-table-column label="批次号" align="center" prop="batchNo" /> |
|
<el-table-column label="数量" align="center" prop="qua" /> |
|
<el-table-column label="生产标识" align="center" prop="prodIdent" /> |
|
<el-table-column label="面积" align="center" prop="area" /> |
|
<el-table-column label="总面积" align="center" prop="totalArea" /> |
|
</el-table> |
|
</div> |
|
<div |
|
class="details-box-item" |
|
v-if="processDetails.mtuList && processDetails.mtuList.length > 0" |
|
> |
|
<div class="de-title">设备使用详情</div> |
|
<el-table |
|
:data="processDetails.mtuList" |
|
:sequence="false" |
|
:no-page="false" |
|
:export-excel="false" |
|
border |
|
> |
|
<el-table-column label="挂具编号" align="center" prop="rsCode" /> |
|
<el-table-column label="飞靶编号" align="center" prop="fsCode" /> |
|
<el-table-column label="设备编码" align="center" prop="deviceCode" /> |
|
<el-table-column label="挂次号" align="center" prop="hangNum" min-width="150" /> |
|
</el-table> |
|
</div> |
|
<div class="linediv details-box-item" v-if="processDetails.prWorkCheck != null"> |
|
<div class="de-title">检验记录</div> |
|
<el-descriptions :column="4" label-width="100" class="fixed-descriptions" border> |
|
<el-descriptions-item label="检验数量"> |
|
{{ processDetails.checkQty }} |
|
</el-descriptions-item> |
|
<el-descriptions-item label="合格数量"> |
|
{{ processDetails.qualifiedQty }} |
|
</el-descriptions-item> |
|
<el-descriptions-item label="不合格数量"> |
|
{{ processDetails.unqualifiedQty }} |
|
</el-descriptions-item> |
|
<el-descriptions-item label="消耗数量"> |
|
{{ processDetails.lossQty }} |
|
</el-descriptions-item> |
|
<el-descriptions-item label="报废数量"> |
|
{{ processDetails.scrapQty }} |
|
</el-descriptions-item> |
|
<el-descriptions-item label="返工数量"> |
|
{{ processDetails.reworkQty }} |
|
</el-descriptions-item> |
|
<el-descriptions-item label="备注"> |
|
{{ processDetails.checkMemo }} |
|
</el-descriptions-item> |
|
</el-descriptions> |
|
</div> |
|
<div |
|
class="details-box-item" |
|
v-if="processDetails.itemList && processDetails.itemList.length > 0" |
|
> |
|
<div class="de-title">检验项</div> |
|
<el-table |
|
:ref="'myTable'" |
|
:sequence="false" |
|
:no-page="false" |
|
:export-excel="false" |
|
border |
|
:data="processDetails.itemList" |
|
> |
|
<el-table-column label="项目编号" prop="itemCode" align="center" width="130"> |
|
</el-table-column> |
|
<el-table-column label="项目" prop="itemName" align="center" width="150" /> |
|
<el-table-column |
|
label="标准" |
|
prop="standardName" |
|
align="center" |
|
show-overflow-tooltip |
|
/> |
|
<el-table-column label="测试值" align="center" width="120"> |
|
<template #default="scope"> |
|
<div> |
|
<el-popover |
|
v-if="scope.row.itemName&&scope.row.itemName === '厚度检测'" |
|
transition="el-zoom-in-bottom" |
|
offset="100" |
|
placement="top" |
|
trigger="hover" |
|
> |
|
<el-table :data="scope.row.itemDetailList" border> |
|
<el-table-column label="编号" width="80" align="center" property="tools" /> |
|
<el-table-column |
|
label="参数1名称" |
|
property="gaugeValue1" |
|
align="right" |
|
width="80" |
|
/> |
|
<el-table-column |
|
label="参数1数值" |
|
property="gaugeValue2" |
|
align="right" |
|
width="80" |
|
/> |
|
<el-table-column |
|
label="参数2名称" |
|
property="gaugeValue3" |
|
align="right" |
|
width="80" |
|
/> |
|
<el-table-column |
|
label="参数2数值" |
|
property="gaugeValue4" |
|
align="right" |
|
width="80" |
|
/> |
|
<el-table-column |
|
label="参数3名称" |
|
property="gaugeValue5" |
|
align="right" |
|
width="80" |
|
/> |
|
<el-table-column |
|
label="参数3数值" |
|
property="gaugeValue6" |
|
align="right" |
|
width="80" |
|
/> |
|
</el-table> |
|
<span>测试值</span> |
|
</el-popover> |
|
<el-popover |
|
v-else-if="scope.row.itemDetailList.length > 0" |
|
transition="el-zoom-in-bottom" |
|
offset="100" |
|
placement="top" |
|
trigger="hover" |
|
@show="loadDetail(scope.row.wpiId)" |
|
> |
|
<el-table :data="scope.row.itemDetailList" border> |
|
<el-table-column |
|
label="镀前镀后" |
|
width="80" |
|
align="center" |
|
property="testType" |
|
/> |
|
<el-table-column |
|
label="尺寸" |
|
width="120" |
|
align="center" |
|
property="ruleSize" |
|
/> |
|
<el-table-column label="量具" width="80" align="center" property="tools" /> |
|
<el-table-column |
|
label="测试值1" |
|
property="gaugeValue1" |
|
align="right" |
|
width="80" |
|
/> |
|
<el-table-column |
|
label="测试值2" |
|
property="gaugeValue2" |
|
align="right" |
|
width="80" |
|
/> |
|
<el-table-column |
|
label="测试值3" |
|
property="gaugeValue3" |
|
align="right" |
|
width="80" |
|
/> |
|
<el-table-column |
|
label="测试值4" |
|
property="gaugeValue4" |
|
align="right" |
|
width="80" |
|
/> |
|
<el-table-column |
|
label="测试值5" |
|
property="gaugeValue5" |
|
align="right" |
|
width="80" |
|
/> |
|
<el-table-column |
|
label="测试值6" |
|
property="gaugeValue6" |
|
align="right" |
|
width="80" |
|
/> |
|
<el-table-column |
|
label="测试值7" |
|
property="gaugeValue7" |
|
align="right" |
|
width="80" |
|
/> |
|
<el-table-column |
|
label="测试值8" |
|
property="gaugeValue8" |
|
align="right" |
|
width="80" |
|
/> |
|
</el-table> |
|
<el-button slot="reference">测试值</el-button> |
|
</el-popover> |
|
<span v-else>{{ scope.row.checkValue }}</span> |
|
</div> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="试验数量" property="testQty" align="center" width="70" /> |
|
<el-table-column label="消耗数量" property="lossQty" align="center" width="70" /> |
|
<el-table-column label="检验数量" property="checkQty" align="center" width="70" /> |
|
<el-table-column label="检验结果" property="checkResult" align="center" width="80" /> |
|
<el-table-column label="检验人" property="checkMan" align="center" width="90" /> |
|
<el-table-column label="检验时间" property="checkDate" align="center" width="160" /> |
|
</el-table> |
|
</div> |
|
<div |
|
class="details-box-item" |
|
v-if=" |
|
processDetails.printType == 1 && |
|
processDetails.dsRbFilePreserveSlotList && |
|
processDetails.dsRbFilePreserveSlotList.length > 0 |
|
" |
|
> |
|
<div class="de-title"> |
|
过程质量记录 |
|
<!-- <el-button type="text" @click="syncData()" v-loading="syncLoading" |
|
>手动同步记录</el-button |
|
> --> |
|
</div> |
|
<preserve-slot-list :slot-list="processDetails.dsRbFilePreserveSlotList" /> |
|
</div> |
|
<div style="width: 950px"> |
|
<template v-if="selectedItemInfo.ppsName == '玻璃封接清洗'"> |
|
<template v-if="processDetails.prList != null && processDetails.prList.length > 0"> |
|
<el-table :data="[processDetails.prList[0]]" border> |
|
<el-table-column label="清洗开始时间" align="center" property="inDate" /> |
|
<el-table-column label="清洗结束时间" align="center" property="outDate" /> |
|
<el-table-column label="温度(℃)" align="center" property="tempSlot" /> |
|
<el-table-column label="操作者" align="center" property="createMan" /> |
|
</el-table> |
|
</template> |
|
<template v-if="processDetails.prList != null && processDetails.prList.length > 1"> |
|
<el-table :data="[processDetails.prList[1]]" border> |
|
<el-table-column label="烘干开始时间" align="center" property="inDate" /> |
|
<el-table-column label="烘干结束时间" align="center" property="outDate" /> |
|
<el-table-column label="烘箱温度(℃)" align="center" property="tempSlot" /> |
|
<el-table-column label="操作者" align="center" property="createMan" /> |
|
<el-table-column label="设备编号" align="center" property="deviceId" /> |
|
</el-table> |
|
</template> |
|
</template> |
|
<!-- 如果当前工序是 玻璃封接退火 --> |
|
<template v-if="selectedItemInfo.ppsName == '玻璃封接退火'"> |
|
<el-table :data="processDetails.prList" border> |
|
<el-table-column label="数量" align="center" property="dataThree" /> |
|
<el-table-column label="入炉时间" align="center" property="inDate" /> |
|
<el-table-column label="保温开始时间" align="center" property="dataThirteen" /> |
|
<el-table-column label="退火温度" align="center" property="tempSlot" /> |
|
<el-table-column label="保温结束时间" align="center" property="dataTwelve" /> |
|
<el-table-column label="最小真空度(Pa)" align="center" property="dataFourteen" /> |
|
<el-table-column label="出炉时间" align="center" property="outDate" /> |
|
<el-table-column label="操作者" align="center" property="createMan" /> |
|
<el-table-column label="设备编号" align="center" property="deviceId" /> |
|
</el-table> |
|
</template> |
|
<!-- 如果当前工序是 玻璃封接预氧化(箱式炉) --> |
|
<template v-if="selectedItemInfo.ppsName == '玻璃封接预氧化(箱式炉)'"> |
|
<el-table :data="processDetails.prList" border> |
|
<el-table-column label="数量" align="center" property="dataThree" /> |
|
<el-table-column label="入炉时间" align="center" property="inDate" /> |
|
<el-table-column label="保温开始时间" align="center" property="dataThirteen" /> |
|
<el-table-column label="保温温度" align="center" property="tempSlot" /> |
|
<el-table-column label="保温结束时间" align="center" property="dataTwelve" /> |
|
<el-table-column label="操作者" align="center" property="createMan" /> |
|
<el-table-column label="设备编号" align="center" property="deviceId" /> |
|
</el-table> |
|
</template> |
|
<!-- 如果当前工序是 玻璃封接预氧化(链式炉) --> |
|
<template v-if="selectedItemInfo.ppsName == '玻璃封接预氧化(链式炉)'"> |
|
<el-table :data="processDetails.prList" border> |
|
<el-table-column label="数量" align="center" property="dataThree" /> |
|
<el-table-column label="湿氮预氧化温度(℃)" align="center" property="tempSlot" /> |
|
<el-table-column label="露点" align="center" property="dataEleven" /> |
|
<el-table-column label="入炉时间" align="center" property="inDate" /> |
|
<el-table-column label="出炉时间" align="center" property="outDate" /> |
|
<el-table-column label="链速" align="center" property="vSpeed" /> |
|
<el-table-column label="操作者" align="center" property="createMan" /> |
|
<el-table-column label="设备编号" align="center" property="deviceId" /> |
|
</el-table> |
|
</template> |
|
<!-- 如果当前工序是 玻璃封接(链式炉) --> |
|
<template v-if="selectedItemInfo.ppsName == '玻璃封接(链式炉)'"> |
|
<el-table :data="processDetails.prList" border> |
|
<el-table-column label="数量" align="center" property="dataThree" /> |
|
<el-table-column label="封接温度(℃)" align="center" property="tempSlot" /> |
|
<el-table-column label="入炉时间" align="center" property="inDate" /> |
|
<el-table-column label="出炉时间" align="center" property="outDate" /> |
|
<el-table-column label="链速" align="center" property="vSpeed" /> |
|
<el-table-column label="操作者" align="center" property="createMan.userName" /> |
|
<el-table-column label="设备编号" align="center" property="deviceId" /> |
|
</el-table> |
|
</template> |
|
</div> |
|
</div> |
|
<div |
|
class="details-box details-box-item" |
|
v-if="selectedItemId && selectedItemInfo.status == 1" |
|
> |
|
<el-empty description="暂无加工、检验记录!"></el-empty> |
|
</div> |
|
</div> |
|
|
|
<!-- <el-collapse v-model="activeName"> |
|
<el-collapse-item title="订单信息" name="1"> |
|
<template #title="{ isActive }"> 订单信息 </template> |
|
</el-collapse-item> |
|
<el-collapse-item title="工序信息" name="2" > |
|
</el-collapse-item> |
|
</el-collapse> --> |
|
</el-dialog> |
|
</template> |
|
<script> |
|
import { updateProcess } from '../../api/flowManagement/index'; |
|
import contentView from './processView.vue'; |
|
import preserveSlotList from './preserveSlotList.vue'; |
|
import MoveElement from '@/utils/moveElement.js'; |
|
import { getOrderDetail, getPlanDetail } from '../../api/workRate/index'; |
|
|
|
export default { |
|
props: { |
|
showDialog: { |
|
type: Boolean, |
|
default: false, |
|
}, |
|
rowItem: { |
|
type: Object, |
|
default: () => {}, |
|
}, |
|
}, |
|
components: { |
|
contentView, |
|
preserveSlotList, |
|
}, |
|
computed: { |
|
// 订单信息列表 |
|
orderItems() { |
|
// 获取优先级样式 |
|
const getPriorityStyle = importance => { |
|
if (importance == 1) { |
|
return 'color: green'; |
|
} else if (importance == 2 || importance == 3) { |
|
return 'color: red'; |
|
} else { |
|
return 'color: rgb(251, 170, 8)'; |
|
} |
|
}; |
|
return [ |
|
{ label: '车间订单号', value: this.detailsForm.woCode || '' }, |
|
{ label: '流程卡号', value: this.detailsForm.cardNo || '' }, |
|
{ |
|
label: '零件号', |
|
value: this.detailsForm.partCode || '', |
|
clickable: true, |
|
clickHandler: () => this.openDocLink(this.detailsForm.dsPart), |
|
}, |
|
{ label: '批次号', value: this.detailsForm.batchNo || '' }, |
|
{ label: '订单数量', value: this.detailsForm.ypQty || '' }, |
|
{ label: '状态', value: this.detailsForm.curStatus || '' }, |
|
{ |
|
label: '优先级', |
|
value: this.detailsForm.priority || '', |
|
style: getPriorityStyle(this.detailsForm.priority), |
|
}, |
|
{ |
|
label: '调度员', |
|
value: this.detailsForm.dispatcher === null ? '' : this.detailsForm.dispatcher, |
|
}, |
|
{ label: '订单下达', value: this.detailsForm.sendDownTime || '' }, |
|
{ label: '生产数量', value: this.detailsForm.makeQty || '' }, |
|
{ label: '零件名称', value: this.detailsForm.dsPart?.partName || '' }, |
|
{ label: '产品型号', value: this.detailsForm.dsPart?.productType || '' }, |
|
{ label: '硬度', value: this.detailsForm.dsPart?.hardness || '' }, |
|
{ label: '计划完工', value: this.detailsForm.planEndDate || '' }, |
|
{ |
|
label: '需求交期', |
|
value: this.detailsForm.priority === 4 ? this.detailsForm.demandDate : '', |
|
}, |
|
{ label: '镀种', value: this.detailsForm.dsPart?.plate || '' }, |
|
{ label: '面积 (dm²)', value: this.detailsForm.dsPart?.area || '' }, |
|
{ label: '材料', value: this.detailsForm.dsPart?.material || '' }, |
|
{ label: '生产标识', value: this.detailsForm.prodIdent || '' }, |
|
{ label: '镀后入库', value: this.detailsForm.putStoreTime || '' }, |
|
{ label: '标记要求', value: this.detailsForm.dsPart?.signMemo || '' }, |
|
{ label: '关键信息', value: this.detailsForm.dsPart?.cruxMemo || '' }, |
|
{ label: '试验数量', value: this.detailsForm.testQty || '' }, |
|
{ label: '消耗数量', value: this.detailsForm.lossQty || '' }, |
|
{ |
|
label: '是否印字', |
|
value: |
|
this.detailsForm.yieldType != 1 |
|
? this.detailsForm.dsPart?.isPrint == 1 |
|
? '否' |
|
: this.detailsForm.dsPart?.isPrint == 2 |
|
? '单' |
|
: '双' |
|
: '', |
|
}, |
|
{ label: '工艺路线', value: this.detailsForm.dsPart?.craftWay || '' }, |
|
{ |
|
label: '返工单号', |
|
value: this.detailsForm.curStatus == 19 ? this.detailsForm.qcReworkCode || '' : '', |
|
clickable: this.detailsForm.curStatus == 19, |
|
clickHandler: () => this.openClient(this.detailsForm.qcReworkCode), |
|
}, |
|
{ |
|
label: '涂色标个数', |
|
value: this.detailsForm.yieldType == 1 ? this.detailsForm.dsPart?.tsbNum : '', |
|
}, |
|
{ |
|
label: '涂色带个数', |
|
value: this.rowItem.yieldType == 1 ? this.detailsForm.dsPart?.tsdNum || '' : '', |
|
}, |
|
{ |
|
label: '涂箭头个数', |
|
value: this.rowItem.yieldType == 1 ? this.detailsForm.dsPart?.tjtNum || '' : '', |
|
}, |
|
{ label: '产品系列', value: this.detailsForm.dsPart?.productSeries || '' }, |
|
{ label: '工作订单备注', value: this.detailsForm.poMemo || '' }, |
|
{ |
|
label: '会议要求周期', |
|
value: this.detailsForm.priority === 4 ? this.detailsForm.meetCycle : '', |
|
}, |
|
{ |
|
label: '审理单号', |
|
value: this.detailsForm.reworkCode || '', |
|
clickable: true, |
|
clickHandler: () => this.openQcSheet(this.detailsForm.reworkCode), |
|
}, |
|
]; |
|
}, |
|
// 控制显示的订单项 |
|
displayOrderItems() { |
|
if (this.orderInfoExpanded) { |
|
// 展开时显示全部 |
|
// this.orderItems.forEach(item => { |
|
// item.isExpandBtn = true; // 重置所有按钮的显示状态 |
|
// }); |
|
return this.orderItems; |
|
} else { |
|
// 收起时显示前 9 个,第 10 个位置显示"展开更多"按钮 |
|
const items = this.orderItems.slice(0, 9); |
|
return [ |
|
...items, |
|
{ |
|
label: '', |
|
value: '', |
|
isExpandBtn: true, // 标记为展开按钮 |
|
}, |
|
]; |
|
} |
|
}, |
|
}, |
|
data() { |
|
return { |
|
refreshLoading:false, |
|
processSelectLoading: false, |
|
selectedItemId: null, |
|
selectedItemInfo: {}, |
|
// rowItem: {}, |
|
activeName: '1', |
|
openShow: false, |
|
dsPart: {}, |
|
height: 0, |
|
craftList: [], //工序列表 |
|
color: { |
|
1: '#707070', |
|
2: '#22ac38', |
|
3: '#22ac38', |
|
5: '#00b7ee', |
|
}, |
|
checkItemShow: true, |
|
makeRecShow: true, |
|
mtuShow: true, |
|
detailsForm: {}, |
|
statusColorMap: { |
|
1: 'rgba(108, 117, 125,1)', // 未开始 |
|
2: 'rgba(40, 167, 69, 1)', // 已接收 |
|
3: 'rgba(40, 167, 69, 1)', // 已报工 |
|
4: 'rgba(40, 167, 69, 1)', // 检验中 |
|
5: 'rgba(40, 76, 137, 1)', // 已完成 |
|
}, |
|
statusTextMap: { |
|
1: '未开始', |
|
2: '已接收', |
|
3: '已报工', |
|
4: '检验中', |
|
5: '已完成', |
|
}, |
|
processDetails: {}, //工序详情 |
|
orderInfoExpanded: false, |
|
}; |
|
}, |
|
mounted() { |
|
this.openShow = this.showDialog; |
|
this.height = document.body.clientHeight - 100; |
|
console.log(this.rowItem, 'rowItem'); |
|
|
|
this.getOrderDetail(); |
|
this.$nextTick(() => { |
|
const el = this.$refs.pointView; |
|
if (el) { |
|
new MoveElement(el); |
|
} |
|
}); |
|
}, |
|
methods: { |
|
refreshData() { |
|
this.refreshLoading = true |
|
this.getOrderDetail(); |
|
setTimeout(() => { |
|
this.refreshLoading = false |
|
}, 500); |
|
}, |
|
// 切换订单信息展开/收起 |
|
toggleOrderInfo() { |
|
this.orderInfoExpanded = !this.orderInfoExpanded; |
|
}, |
|
// 同步数据 |
|
syncData() { |
|
this.syncLoading = true; |
|
const { slotList = [] } = this.jsonObj.workPlan || {}; |
|
const { mtuList = [] } = this.jsonObj || {}; |
|
// 1. 同槽编号:取第一个非空 mtuCode 即可(因为都一样) |
|
let mtnCode = ''; |
|
if (slotList && slotList.length > 0) { |
|
mtnCode = slotList[0].mtuCode || ''; |
|
} |
|
|
|
// 2. 设备使用情况:找第一个 equipmentCard.deviceCode 和 hangNum 都有值的项 |
|
let deviceCode = ''; |
|
let hangNum = ''; |
|
const validMtu = mtuList.find(item => item.equipmentCard?.deviceCode && item.hangNum != null); |
|
if (validMtu) { |
|
deviceCode = validMtu.equipmentCard.deviceCode; |
|
hangNum = validMtu.hangNum; |
|
} |
|
if (mtnCode != '' && deviceCode != '' && hangNum != '') { |
|
this.$ajax |
|
.get( |
|
`/qcProduceRun/getNewDataByParams?deviceCode=${deviceCode}&hangNum=${hangNum}&mtnCode=${mtnCode}` |
|
) |
|
.then(res => { |
|
if (this.$ifAjax(res)) { |
|
this.$message.success('数据同步成功!'); |
|
this.syncLoading = false; |
|
this.getMrAndWc(this.itemInfo.item, this.itemInfo.index); |
|
} |
|
}); |
|
} |
|
|
|
// TODO: 根据业务需要,将这些值用于后续操作(如保存、传参等) |
|
}, |
|
objectSpanMethod({ row, column, rowIndex, columnIndex }) { |
|
if (columnIndex === 0) { |
|
const _row = this.processDetails.itemList[rowIndex]; |
|
const _col = _row > 0 ? 1 : 0; |
|
return { |
|
rowspan: _row, |
|
colspan: _col, |
|
}; |
|
} |
|
}, |
|
// 获取背景渐变色 |
|
getProcessGradientColor(status) { |
|
const colors = this.statusColorMap[status] || this.statusColorMap[1]; |
|
return `linear-gradient(90deg, ${colors[0]} 0%, ${colors[1]} 100%)`; |
|
}, |
|
// 获取背景颜色 |
|
getProcessBgColor(status) { |
|
return this.statusColorMap[status]; |
|
}, |
|
// 获取内容垂直渐变色 |
|
getProcessVerticalGradient(status) { |
|
const color = this.statusColorMap[status]; |
|
// 将状态颜色的透明度降低到 0.3-0.5 |
|
|
|
const lightColor = color.replace(/rgba?\(([^)]+)\)/, (match, rgb) => { |
|
const values = rgb.split(',').map(v => parseFloat(v.trim())); |
|
if (values.length === 4) { |
|
// rgb 转 rgba,添加透明度 |
|
return `rgba(${values[0]}, ${values[1]}, ${values[2]}, 0.2)`; |
|
} |
|
return match; |
|
}); |
|
|
|
return `linear-gradient(180deg, rgba(255, 255, 255, 0.5) 0%, ${lightColor} 100%)`; |
|
}, |
|
// 获取状态文本 |
|
getStatusText(status) { |
|
return this.statusTextMap[status] || '-'; |
|
}, |
|
getOrderDetail() { |
|
let query_ = { |
|
woId: this.rowItem.woId, |
|
partCode: this.rowItem.partCode, |
|
}; |
|
getOrderDetail(query_).then(res => { |
|
this.detailsForm = res.data.data; |
|
// 获取详情后,自动选中第一个状态为 2、3、4 的工序 |
|
this.$nextTick(() => { |
|
this.autoSelectProcess(); |
|
}); |
|
}); |
|
}, |
|
// 自动选中第一个状态为 2、3、4 的工序 |
|
autoSelectProcess() { |
|
if (!this.detailsForm.planList || this.detailsForm.planList.length === 0) { |
|
return; |
|
} |
|
|
|
// 定义需要选中的状态:2-已接收,3-已报工,4-检验中 |
|
const targetStatus = [2, 3, 4]; |
|
|
|
// 查找第一个符合条件的工序 |
|
const targetItem = this.detailsForm.planList.find(item => targetStatus.includes(item.status)); |
|
|
|
if (targetItem) { |
|
// 选中该工序 |
|
this.selectItem(targetItem); |
|
// this.messageAlter(targetItem); |
|
console.log('自动选中状态为' + targetItem.status + '的工序:', targetItem.ppsName); |
|
} else { |
|
// 如果没有符合条件的,选中第一个工序 |
|
const firstItem = this.detailsForm.planList[0]; |
|
if (firstItem) { |
|
this.selectItem(firstItem); |
|
console.log('未找到状态为 2、3、4 的工序,默认选中第一个:', firstItem.ppsName); |
|
} |
|
} |
|
}, |
|
selectItem(item) { |
|
this.selectedItemId = item.id; |
|
this.selectedItemInfo = item; |
|
this.processSelectLoading = true; |
|
// 触发工序详情获取 |
|
this.getProcessDetail(item); |
|
}, |
|
// 获取工序详情 |
|
async getProcessDetail() { |
|
let query_ = { |
|
wpId: this.selectedItemId, |
|
}; |
|
getPlanDetail(query_) |
|
.then(res => { |
|
this.processDetails = res.data.data; |
|
this.processSelectLoading = false; |
|
}) |
|
.catch(err => { |
|
this.processSelectLoading = false; |
|
}); |
|
}, |
|
// 双击零件跳转 |
|
openDocLink(info) { |
|
if (info.url != '') { |
|
window.open(info.url); |
|
} |
|
}, |
|
// 优先级样式 |
|
importanceColor(importance) { |
|
if (importance == 1) { |
|
return 'color: green'; |
|
} else if (importance == 2 || importance == 3) { |
|
return 'color: red'; |
|
} else { |
|
return 'color: rgb(251, 170, 8)'; |
|
} |
|
}, |
|
// 返工单号 |
|
openClient(qcReworkCode) { |
|
if (qcReworkCode) { |
|
this.reviewFormMess = { |
|
reworkCode: qcReworkCode, |
|
queryType: true, |
|
}; |
|
} |
|
this.reviewFormMessOpen = true; |
|
}, |
|
// 审理单号 |
|
openQcSheet(rsCode) { |
|
if (rsCode) { |
|
this.qcSheet = { |
|
rsCode: rsCode, |
|
queryType: true, |
|
}; |
|
} |
|
this.qcSheetOpen = true; |
|
}, |
|
closeDialog() { |
|
this.openShow = false; |
|
this.$emit('closeDialog'); |
|
}, |
|
}, |
|
}; |
|
</script> |
|
<style lang="scss" scoped> |
|
i { |
|
font-style: normal; |
|
} |
|
.order-box { |
|
margin: 10px 0 10px 0; |
|
padding: 0 10px; |
|
display: flex; |
|
flex-wrap: wrap; |
|
.order-item { |
|
width: 20%; |
|
margin-bottom: 10px; |
|
} |
|
// 展开按钮项样式 |
|
.expand-item { |
|
width: 100%; |
|
text-align: left; |
|
margin-top: 5px; |
|
} |
|
} |
|
.expand-btn { |
|
font-size: 13px; |
|
color: #409eff; |
|
padding: 5px 10px; |
|
|
|
&:hover { |
|
color: #66b1ff; |
|
} |
|
} |
|
:deep(.el-collapse-item__header) { |
|
background-color: rgb(246, 248, 252); |
|
border-bottom: 1px solid #ebeef5; |
|
height: 36px; |
|
font-size: 14px; |
|
} |
|
:deep(.el-collapse-item__title) { |
|
height: 36px; |
|
line-height: 36px; |
|
padding-left: 14px; |
|
} |
|
:deep(.el-collapse-item__content) { |
|
padding-bottom: 10px; |
|
} |
|
:deep(.el-collapse-item__wrap) { |
|
border-bottom: 0; |
|
} |
|
|
|
.scrollContent { |
|
height: 300px; |
|
width: 100%; |
|
overflow: hidden; |
|
position: relative; |
|
.el-scrollbar__wrap { |
|
height: 160px; |
|
margin-bottom: 0px !important; |
|
margin-right: -5px !important; |
|
|
|
ul { |
|
margin-right: 10px; |
|
} |
|
} |
|
|
|
.box-right { |
|
position: absolute; |
|
right: 0; |
|
top: 0; |
|
width: 80px; |
|
background: #fff; |
|
height: 158px; |
|
text-align: center; |
|
} |
|
|
|
.scroll-container { |
|
padding-right: 80px; |
|
} |
|
} |
|
|
|
.scrollBox { |
|
white-space: nowrap; |
|
position: absolute; |
|
width: 80%; |
|
margin-top: 20px; |
|
.right-content { |
|
width: 200px; |
|
height: 158px; |
|
display: inline-block; |
|
} |
|
& > ul { |
|
width: 200px; |
|
min-height: 207px; |
|
display: inline-block; |
|
border: 1px solid rgb(140, 140, 140); |
|
margin-left: 5px; |
|
& > li { |
|
width: 100%; |
|
padding: 0 10px; |
|
line-height: 25px; |
|
font-size: 12px; |
|
span { |
|
width: 100%; |
|
} |
|
.cardBoxText { |
|
cursor: pointer; |
|
display: block; |
|
width: 60px; |
|
word-break: keep-all; |
|
overflow: hidden; |
|
text-overflow: ellipsis; |
|
line-height: 30px; |
|
i { |
|
display: block; |
|
float: left; |
|
&:nth-child(2) { |
|
margin-top: 6px; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
.details-box { |
|
width: calc(100% - 28px); |
|
|
|
// |
|
// border:1px solid #ebeef5; |
|
|
|
margin: 0 auto 0; |
|
height: auto; |
|
// margin-left: 5px; |
|
.details-box-item { |
|
box-shadow: 0px 0px 6px 1px rgba(22, 44, 71, 0.16); |
|
padding: 5px 10px 20px 10px; |
|
border-radius: 6px 6px 6px 6px; |
|
margin-bottom: 15px; |
|
} |
|
} |
|
|
|
.production-process-item { |
|
border: 1px solid #284c89; |
|
width: 220px; |
|
min-height: 170px; |
|
display: inline-block; |
|
margin-left: 15px; |
|
.production-left-item-box { |
|
margin-top: 0 !important; |
|
} |
|
.production-process-title { |
|
display: flex; |
|
align-items: center; |
|
border-bottom: 1px solid rgb(140, 140, 140); |
|
padding-left: 10px; |
|
padding-right: 10px; |
|
color: #fff; |
|
font-weight: 500; |
|
} |
|
|
|
.flex-row { |
|
// margin-bottom: 14px; |
|
display: flex; |
|
// justify-content: space-between; |
|
align-items: center; |
|
line-height: 25px; |
|
padding-left: 10px; |
|
padding-right: 10px; |
|
// margin-bottom: 16px; |
|
.icon-text { |
|
display: flex; |
|
align-items: center; |
|
gap: 6px; |
|
font-size: 12px !important; |
|
|
|
.el-icon { |
|
display: inline-flex; |
|
vertical-align: middle; |
|
font-size: 14px; |
|
margin-top: 2px; // 微调图标位置 |
|
} |
|
} |
|
} |
|
} |
|
/* 选中时的放大效果 */ |
|
.production-process-item.selected { |
|
transform: scale(1.05); /* 放大10% */ |
|
z-index: 10; |
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); /* */ |
|
transition: all 0.3s ease; |
|
} |
|
|
|
/* 确保容器允许溢出 */ |
|
.scrollBox { |
|
overflow: visible; /* 避免放大时被裁剪 */ |
|
position: relative; |
|
} |
|
|
|
/* 可选:未选中项降低透明度(突出选中项) */ |
|
.production-process-item:not(.selected) { |
|
opacity: 0.8; |
|
transition: opacity 0.3s ease; |
|
} |
|
|
|
:deep(.fixed-descriptions) { |
|
.el-descriptions__body { |
|
td { |
|
&:nth-child(odd) { |
|
// 标签列 |
|
width: 100px; |
|
min-width: 100px; |
|
} |
|
&:nth-child(even) { |
|
// 内容列 |
|
width: 150px; |
|
min-width: 150px; |
|
max-width: 150px; |
|
text-align: left; |
|
overflow: hidden; |
|
text-overflow: ellipsis; |
|
white-space: nowrap; |
|
} |
|
} |
|
} |
|
} |
|
.de-title { |
|
font-weight: bold; |
|
margin-bottom: 5px; |
|
} |
|
|
|
.expand-btn { |
|
font-size: 13px; |
|
color: #409eff; |
|
padding: 5px 10px; |
|
|
|
&:hover { |
|
color: #66b1ff; |
|
} |
|
} |
|
|
|
.order-box { |
|
margin: 10px 0 10px 0; |
|
padding: 0 10px; |
|
display: flex; |
|
flex-wrap: wrap; |
|
.order-item { |
|
width: 20%; |
|
margin-bottom: 10px; |
|
} |
|
} |
|
</style>
|
|
|