| | |
| | | </span> |
| | | </span> |
| | | </template> |
| | | 生产管理看板 |
| | | 智能工作台 |
| | | <span |
| | | class="font el-icon-setting set-title" |
| | | style="float: right" |
| | |
| | | style="font-size: 35px; font-weight: 600" |
| | | class="color_green" |
| | | > |
| | | {{ taskData.finishNumber || 0 }}{{ taskData.Order.unit }} |
| | | {{ processingStatistics(taskData).finishNumber }}{{ taskData.Order.unit }} |
| | | </dd> |
| | | </dl> |
| | | </div> |
| | |
| | | style="font-size: 35px; font-weight: 600" |
| | | class="color_green" |
| | | > |
| | | {{ taskData.Order.amount || 0 }}{{ taskData.Order.unit }} |
| | | {{ processingStatistics(taskData).totalNumber }}{{ taskData.Order.unit }} |
| | | </dd> |
| | | </dl> |
| | | </div> |
| | |
| | | text-color="#fff" |
| | | :text-inside="true" |
| | | :stroke-width="30" |
| | | :percentage=" |
| | | (taskData.Order && taskData.finishNumber != 0 && taskData.Order.amount) |
| | | ? parseInt( |
| | | (taskData.finishNumber / taskData.Order.amount) * |
| | | 100 |
| | | )>100?100:parseInt( |
| | | (taskData.finishNumber / taskData.Order.amount) * |
| | | 100 |
| | | ): 0 |
| | | " |
| | | :percentage="calculateProgress(processingStatistics(taskData))" |
| | | ></el-progress> |
| | | </el-descriptions-item> |
| | | <!-- <el-descriptions-item label="合格率" style="width: 100%"> |
| | |
| | | </div> |
| | | <div class="card_top-3"> |
| | | <span class="card-top-r-t" |
| | | >完成进度:{{ |
| | | (taskData.Order && taskData.finishNumber != 0 && taskData.Order.amount) |
| | | ? parseInt( |
| | | (taskData.finishNumber / |
| | | taskData.Order.amount) * |
| | | 100 |
| | | ) |
| | | : 0 |
| | | }}</span |
| | | >完成进度:{{calculateProgress(processingStatistics(taskData))}}</span |
| | | > |
| | | <span class="card-top-r-b"> |
| | | <el-progress |
| | |
| | | text-color="#fff" |
| | | :text-inside="true" |
| | | :stroke-width="10" |
| | | :percentage=" |
| | | (taskData.Order && taskData.finishNumber != 0) |
| | | ? parseInt( |
| | | (taskData.finishNumber / |
| | | taskData.Order.amount) * |
| | | 100 |
| | | )>100?100:parseInt( |
| | | (taskData.finishNumber / |
| | | taskData.Order.amount) * |
| | | 100 |
| | | ) |
| | | : 0 |
| | | " |
| | | :percentage="calculateProgress(processingStatistics(taskData))" |
| | | :show-text="false" |
| | | ></el-progress> |
| | | </span> |
| | |
| | | <div class="right-person-box" v-if="workers && workers.length > 0"> |
| | | <dl |
| | | class="right-small-person" |
| | | v-for="(item, index) in workers" |
| | | v-for="(item, index) in deduplicateWorkers(displayWorkers())" |
| | | :key="index" |
| | | > |
| | | <dt> |
| | |
| | | import ProcessModel from "../components/ProcessModel.vue"; |
| | | import TaskControlModal from "@/components/TaskControlModal.vue"; |
| | | import {channelNameConfig} from "@/common/constants"; |
| | | import _ from 'lodash' |
| | | export default { |
| | | components: { |
| | | TaskControlModal, |
| | |
| | | // 右侧完成 |
| | | finishShow:{}, |
| | | workers:[], |
| | | // 保存当前不同通道的值班人 |
| | | channelWorkersMap:{0:[],1:[]}, |
| | | TasksCopy:[], |
| | | Tasks: [ |
| | | { |
| | |
| | | // } |
| | | }, |
| | | methods: { |
| | | processingStatistics(taskData){ |
| | | const status = taskData?.Procedure?.Status; |
| | | // 如果status = 2 加工中, 则加工数和目标数应取轮询接口中的 finishNumber 和 totalNumber |
| | | // 如果status = 1 未开始, 目标数 取 taskData.Order.amount 加工数取 0 |
| | | // 如果status = 3 已完成, 目标数和加工数都取 amount |
| | | let finishNumber = 0; |
| | | let totalNumber = 0; |
| | | if (status === 1){ |
| | | totalNumber = taskData?.Order?.amount ?? 0 |
| | | finishNumber = 0 |
| | | }else if (status === 2){ |
| | | totalNumber = taskData?.totalNumber ?? 0 |
| | | finishNumber = taskData?.finishNumber ?? 0 |
| | | }else if (status === 3){ |
| | | totalNumber = taskData?.Order?.amount ?? 0 |
| | | finishNumber = taskData?.Order?.amount ?? 0 |
| | | } |
| | | |
| | | console.log({ |
| | | /** 目标数 */ |
| | | totalNumber: +totalNumber, |
| | | /** 加工数 */ |
| | | finishNumber: +finishNumber, |
| | | }) |
| | | |
| | | return { |
| | | /** 目标数 */ |
| | | totalNumber: +totalNumber, |
| | | /** 加工数 */ |
| | | finishNumber: +finishNumber, |
| | | } |
| | | }, |
| | | /** |
| | | * 计算生产进度 |
| | | * @param statistics |
| | | * @return {number} 进度,0~100 |
| | | */ |
| | | calculateProgress(statistics){ |
| | | if (statistics.finishNumber === statistics.totalNumber){ |
| | | return 100 |
| | | } |
| | | |
| | | const result = Math.floor(statistics.finishNumber / statistics.totalNumber * 100) |
| | | return result > 100 ? 100 : result |
| | | }, |
| | | deduplicateWorkers(workers){ |
| | | return _.uniqBy(workers,ele=>ele.workerName) |
| | | }, |
| | | updateGet(number,val){ |
| | | if(val){ |
| | | this.getTaskInfo(this.activeName,'new') |
| | |
| | | }); |
| | | }, |
| | | |
| | | /** |
| | | * 根据当前展示的是0通道还是1通道还是两个通道展示对应的值班人 |
| | | * @return {*[]} |
| | | */ |
| | | displayWorkers(){ |
| | | let showWorkers = [] |
| | | if (this.activeName===1){ |
| | | showWorkers =[...this.channelWorkersMap[0]] |
| | | }else if (this.activeName===2){ |
| | | showWorkers =[...this.channelWorkersMap[0],...this.channelWorkersMap[1]] |
| | | }else if (this.activeName===3){ |
| | | showWorkers =[...this.channelWorkersMap[1]] |
| | | }else { |
| | | return [] |
| | | } |
| | | |
| | | return showWorkers |
| | | }, |
| | | |
| | | getTaskInfo(val,info) { |
| | | this.Tasks = []; |
| | | this.TasksCopy=[] |
| | |
| | | } |
| | | } |
| | | this.workers=res.data.workers?res.data.workers:[] |
| | | |
| | | // 将值班人根据通道号分组 |
| | | const groupByChannel= _.groupBy(res.data.Tasks,ele=>ele.Channel) |
| | | const taskList0= _.first(groupByChannel[0]) |
| | | const taskList1= _.first(groupByChannel[1]) |
| | | const worker0List = taskList0?.Procedure?.procedure?.workers ?? [] |
| | | const worker1List = taskList1?.Procedure?.procedure?.workers ?? [] |
| | | this.channelWorkersMap['0'] =worker0List |
| | | this.channelWorkersMap['1'] =worker1List |
| | | |
| | | for (let i in this.TasksCopy) { |
| | | this.TasksCopy[i].procedureList = []; |
| | | this.TasksCopy[i].inputMaterials = []; |
| | | this.TasksCopy[i].outputMaterials = []; |
| | | this.TasksCopy[i].finishNumber = 0; |
| | | this.TasksCopy[i].totalNumber = 0; |
| | | this.TasksCopy[i].number=0; |
| | | this.TasksCopy[i].isUpdateIcon=false; |
| | | this.finishShow['finishShow&'+i]=false |
| | |
| | | }); |
| | | this.TasksCopy[i].Arr=res.data.Params ? res.data.Params : [] |
| | | // this.isFinsh=Number(i)+1 |
| | | this.$forceUpdate() |
| | | } |
| | | }); |
| | | } |
| | |
| | | this.setInterCard("outputMaterials", "cardBox3&" + i, i); |
| | | } |
| | | this.getProcessModelList(); |
| | | this.getStartArr() |
| | | this.cutClick(val?val:1) |
| | | if(info=='new'){ |
| | | return true; |
| | | } |
| | | this.getStartArr() |
| | | |
| | | this.getProgressInfo(); |
| | | if (!this.procInfoTimer&&!this.resprocInfoTimer) { |
| | | this.procInfoTimer = setInterval(() => { |
| | |
| | | procedureId: this.TasksCopy[i].Procedure.ID, |
| | | }).then((res) => { |
| | | if (res.code == 200) { |
| | | this.TasksCopy[i].finishNumber = res.data.finishNumber |
| | | ? res.data.finishNumber |
| | | : 0; |
| | | this.plcStatus=res.data.plcStatus?res.data.plcStatus:0 |
| | | this.TasksCopy[i].finishNumber = res.data?.finishNumber ?? 0; |
| | | this.TasksCopy[i].totalNumber = res.data?.totalNumber ?? 0; |
| | | this.plcStatus = res.data?.plcStatus ?? 0 |
| | | } |
| | | this.resprocInfoTimer=res; |
| | | }); |