diff --git a/mes-module-majoys/mes-module-majoys-api/src/main/java/com/chanko/yunxi/mes/module/biz/enums/UnqualifiedNotificationAuditOpinionEnum.java b/mes-module-majoys/mes-module-majoys-api/src/main/java/com/chanko/yunxi/mes/module/biz/enums/UnqualifiedNotificationAuditOpinionEnum.java new file mode 100644 index 00000000..aad81065 --- /dev/null +++ b/mes-module-majoys/mes-module-majoys-api/src/main/java/com/chanko/yunxi/mes/module/biz/enums/UnqualifiedNotificationAuditOpinionEnum.java @@ -0,0 +1,24 @@ +package com.chanko.yunxi.mes.module.biz.enums; + +import lombok.Getter; + +/** + * 品质异常单审核意见枚举 + * @author chenxi + * @date 2024-02-26 11:25 + */ +@Getter +public enum UnqualifiedNotificationAuditOpinionEnum { + + REPAIR(1, "返修"), + CONCESSION(2, "让步接收"), + SCRAP(3, "报废"); + + private int code; + private String description; + + UnqualifiedNotificationAuditOpinionEnum(int code, String description) { + this.code = code; + this.description = description; + } +} diff --git a/mes-module-majoys/mes-module-majoys-api/src/main/java/com/chanko/yunxi/mes/module/biz/enums/UnqualifiedNotificationStatusEnum.java b/mes-module-majoys/mes-module-majoys-api/src/main/java/com/chanko/yunxi/mes/module/biz/enums/UnqualifiedNotificationStatusEnum.java index c01baa42..d6f897c2 100644 --- a/mes-module-majoys/mes-module-majoys-api/src/main/java/com/chanko/yunxi/mes/module/biz/enums/UnqualifiedNotificationStatusEnum.java +++ b/mes-module-majoys/mes-module-majoys-api/src/main/java/com/chanko/yunxi/mes/module/biz/enums/UnqualifiedNotificationStatusEnum.java @@ -3,7 +3,7 @@ package com.chanko.yunxi.mes.module.biz.enums; import lombok.Getter; /** - * 派工单状态枚举 + * 品质异常单状态枚举 * @author chenxi * @date 2024-02-26 11:25 */ diff --git a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/dataobject/projectorder/ProjectOrderSubDO.java b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/dataobject/projectorder/ProjectOrderSubDO.java index 7e33afb6..d317ea1d 100644 --- a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/dataobject/projectorder/ProjectOrderSubDO.java +++ b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/dataobject/projectorder/ProjectOrderSubDO.java @@ -158,4 +158,10 @@ public class ProjectOrderSubDO extends BaseDO { @TableField(exist = false) private String productionDate; + + @TableField(exist = false) + private Integer qualifiedQuantity; + + @TableField(exist = false) + private Integer unqualifiedQuantity; } diff --git a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/mysql/scequipment/ScEquipmentMapper.java b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/mysql/scequipment/ScEquipmentMapper.java index 83c44f27..338fc727 100644 --- a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/mysql/scequipment/ScEquipmentMapper.java +++ b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/dal/mysql/scequipment/ScEquipmentMapper.java @@ -31,7 +31,7 @@ public interface ScEquipmentMapper extends BaseMapperX { .betweenIfPresent(ScEquipmentDO::getShutdownTime, reqVO.getShutdownTime()) .eqIfPresent(ScEquipmentDO::getNum, reqVO.getNum()) .eqIfPresent(ScEquipmentDO::getStatuss, reqVO.getStatuss()) - .orderByDesc(ScEquipmentDO::getId)); + .orderByAsc(ScEquipmentDO::getId)); } @Select("CALL Down_Time(#{id}, #{startTime}, #{endTime})") diff --git a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/service/screen/ScreenServiceImpl.java b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/service/screen/ScreenServiceImpl.java index 809c0668..0617bc19 100644 --- a/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/service/screen/ScreenServiceImpl.java +++ b/mes-module-majoys/mes-module-majoys-biz/src/main/java/com/chanko/yunxi/mes/module/biz/service/screen/ScreenServiceImpl.java @@ -15,6 +15,7 @@ import com.chanko.yunxi.mes.module.biz.dal.dataobject.plansub.PlanSubDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.processdesign.ProcessDesignDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderSubDO; +import com.chanko.yunxi.mes.module.biz.dal.dataobject.scequipment.ScEquipmentDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.screen.ScreenDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDetailDO; @@ -24,6 +25,7 @@ import com.chanko.yunxi.mes.module.biz.dal.mysql.plansub.PlanSubMapper; import com.chanko.yunxi.mes.module.biz.dal.mysql.processdesign.ProcessDesignMapper; import com.chanko.yunxi.mes.module.biz.dal.mysql.projectorder.ProjectOrderMapper; import com.chanko.yunxi.mes.module.biz.dal.mysql.projectorder.ProjectOrderSubMapper; +import com.chanko.yunxi.mes.module.biz.dal.mysql.scequipment.ScEquipmentMapper; import com.chanko.yunxi.mes.module.biz.dal.mysql.screen.ScreenMapper; import com.chanko.yunxi.mes.module.biz.dal.mysql.taskdispatch.TaskDispatchDetailMapper; import com.chanko.yunxi.mes.module.biz.dal.mysql.taskdispatch.TaskDispatchMapper; @@ -47,6 +49,7 @@ import java.util.stream.Collectors; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.module.biz.enums.ErrorCodeConstants.SCREEN_NOT_EXISTS; import static com.chanko.yunxi.mes.module.biz.enums.ScreenTypeEnum.ProductionOrderState; +import static com.chanko.yunxi.mes.module.biz.enums.ScreenTypeEnum.QualifiedRateOfEachProduct; /** * 大屏数据 Service 实现类 @@ -79,6 +82,8 @@ public class ScreenServiceImpl implements ScreenService { private ProcessDesignMapper processDesignMapper; @Resource private PlanSubMapper planSubMapper; + @Resource + private ScEquipmentMapper scEquipmentMapper; @Override public Long createScreen(ScreenSaveReqVO createReqVO) { @@ -170,16 +175,24 @@ public class ScreenServiceImpl implements ScreenService { } ScreenDO productionOrderState = todayDataList.stream().filter(screenDO -> ProductionOrderState.name().equals(screenDO.getType())).findFirst().get(); + ScreenDO qualifiedRateOfEachProduct = todayDataList.stream().filter(screenDO -> QualifiedRateOfEachProduct.name().equals(screenDO.getType())).findFirst().get(); // 设置今天数据 todayDataList.forEach(screenDO -> { switch (ScreenTypeEnum.valueOf(screenDO.getType())){ case ProductionStateList: // 同时设置 生产订单状态 - buildProductionStateList(screenDO, productionOrderState); + // 同时设置 各产品合格率 + buildProductionStateList(screenDO, productionOrderState, qualifiedRateOfEachProduct); break; case QuantityOfEachProductProduced: buildQuantityOfEachProductProduced(screenDO); break; + case UtilizationRateOfEquipment: + buildUtilizationRateOfEquipment(screenDO); + break; + case EquipmentOperationState: + buildEquipmentOperationState(screenDO); + break; } }); @@ -193,6 +206,85 @@ public class ScreenServiceImpl implements ScreenService { return todayDataList; } + /** + * 包装设备运行状态 + * + * "2D": ["equipmentNo","qualifiedQuantity","qualifiedRate","overallEquipmentEffectiveness","shutdownTimes","operationState"] + * [["1#",22,33.33,44,0,"NORMAL"],["2#","门扇",44,55.55,66,2,"MALFUNCTION"],["3#","横头",66,77.77,77,4,"SHUTDOWN"]] + * + * @param screenDO + */ + private void buildEquipmentOperationState(ScreenDO screenDO) { + LinkedList resultData = new LinkedList<>(); + List scEquipmentDOList = scEquipmentMapper.selectList(new LambdaQueryWrapper(){{ + orderByAsc(ScEquipmentDO::getId); + }}); + + for (ScEquipmentDO scEquipmentDO : scEquipmentDOList) { + resultData.add(new LinkedList(){{ + add(scEquipmentDO.getNmae()); + add(scEquipmentDO.getNum()); + add(scEquipmentDO.getQualificationRate().multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_CEILING)); + add(scEquipmentDO.getOee()); + add(scEquipmentDO.getShutdownTime()); + add(scEquipmentDO.getUtilizationRate().multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_CEILING)); + }}); + } + + screenDO.setData(JSON.toJSONString(resultData)); + } + + /** + * 包装各产品合格率 + * + * "1D": ["product","qualifiedRate"] + * [["门套","门扇"],[95,98]] + * + * @param screenDO + * @param doList + */ + private void buildQualifiedRateOfEachProduct(ScreenDO screenDO, List doList) { + LinkedList resultData = new LinkedList<>(); + + LinkedList productList = new LinkedList<>(); + LinkedList rateList = new LinkedList<>(); + resultData.add(productList); + resultData.add(rateList); + + for (ProjectOrderSubDO subDO : doList) { + productList.add(subDO.getProjectSubName()); + rateList.add(new BigDecimal(100) + .subtract(new BigDecimal(subDO.getUnqualifiedQuantity()*100).divide(new BigDecimal(subDO.getAmount()))) + .setScale(2, BigDecimal.ROUND_CEILING)); + } + + screenDO.setData(JSON.toJSONString(resultData)); + } + + /** + * 包装设备利用率 + * "1D": ["equipmentNo","utilizationRate"] + * [["1#","2#","3#"],[45,35,60]] + * + * @param screenDO + */ + private void buildUtilizationRateOfEquipment(ScreenDO screenDO) { + LinkedList resultData = new LinkedList<>(); + + LinkedList equipmentNo = new LinkedList<>(); + LinkedList utilizationRate = new LinkedList<>(); + resultData.add(equipmentNo); + resultData.add(utilizationRate); + List scEquipmentDOList = scEquipmentMapper.selectList(new LambdaQueryWrapper(){{ + orderByAsc(ScEquipmentDO::getId); + }}); + for (ScEquipmentDO scEquipmentDO : scEquipmentDOList) { + equipmentNo.add(scEquipmentDO.getNmae()); + utilizationRate.add(scEquipmentDO.getUtilizationRate()); + } + screenDO.setData(JSON.toJSONString(resultData)); + } + /** * 包装各产品生产数量 * "1D": ["product","sixDaysAgo","fiveDaysAgo","fourDaysAgo","threeDaysAgo","twoDaysAgo","oneDayAgo","today"] @@ -274,18 +366,18 @@ public class ScreenServiceImpl implements ScreenService { * * @param screenDO * @param productionOrderState + * @param qualifiedRateOfEachProduct */ - private void buildProductionStateList(ScreenDO screenDO, ScreenDO productionOrderState) { + private void buildProductionStateList(ScreenDO screenDO, ScreenDO productionOrderState, ScreenDO qualifiedRateOfEachProduct) { ArrayList resultData = new ArrayList<>(16); - MPJLambdaWrapper query = new MPJLambdaWrapper<>(); - query.selectAll(TaskDispatchDO.class) + MPJLambdaWrapper query = new MPJLambdaWrapper<>(); + query.selectAll(ProjectOrderSubDO.class) .select("c.code as projectCode", "DateDiff(c.project_end_time,CURRENT_DATE) as restDays") - .select("d.name as projectSubName", "d.code as projectSubCode") - .select("b.amount", "d.unit") + .select("d.name as projectSubName", "d.code as projectSubCode", "d.unit") .select("COALESCE(sum(e.amount),0) as qualifiedQuantity") .select("COALESCE(sum(f.amount),0) as unqualifiedQuantity") .leftJoin(PlanDO.class, "a", PlanDO::getId, TaskDispatchDO::getPlanId) - .leftJoin(ProjectOrderSubDO.class, "b", ProjectOrderSubDO::getId, TaskDispatchDO::getProjectSubId) + .leftJoin(TaskDispatchDO.class, "b", TaskDispatchDO::getProjectSubId, ProjectOrderSubDO::getId) .leftJoin(ProjectOrderDO.class, "c", ProjectOrderDO::getId, ProcessDesignDO::getProjectId) .leftJoin(MaterialDO.class, "d", MaterialDO::getId, ProjectOrderSubDO::getMaterialId) .leftJoin(TaskReportDO.class, "e", Wrapper -> Wrapper.eq(TaskReportDO::getDispatchId, TaskDispatchDO::getId) @@ -293,34 +385,36 @@ public class ScreenServiceImpl implements ScreenService { .eq(TaskReportDO::getHasReport, YesOrNoEnum.Y.getCode()) ) .leftJoin(UnqualifiedNotificationDO.class, "f", Wrapper -> Wrapper.eq(UnqualifiedNotificationDO::getProjectSubId, TaskDispatchDO::getProjectSubId) - .eq(UnqualifiedNotificationDO::getNotificationStatus, UnqualifiedNotificationStatusEnum.AUDIT.getCode())) + .eq(UnqualifiedNotificationDO::getNotificationStatus, UnqualifiedNotificationStatusEnum.AUDIT.getCode()) + .eq(UnqualifiedNotificationDO::getAuditOpinion, UnqualifiedNotificationAuditOpinionEnum.SCRAP.getCode()) + ) .notIn(PlanDO::getStatus, Arrays.asList(ProjectPlanStatusEnum.COMPLETE.getCode(), ProjectPlanStatusEnum.TERMINATE.getCode())) - .orderByDesc(TaskDispatchDO::getId) - .groupBy(TaskDispatchDO::getId) + .orderByDesc(ProjectOrderSubDO::getId) + .groupBy(ProjectOrderSubDO::getId) .disableSubLogicDel(); BigDecimal sumProductionProgress = new BigDecimal(0); - List taskDispatchDOList = taskDispatchMapper.selectList(query); - taskDispatchDOList.forEach(taskDispatchDO -> { - - BigDecimal productionProgress = new BigDecimal(taskDispatchDO.getQualifiedQuantity() * 100).divide(new BigDecimal(taskDispatchDO.getAmount()), 2, BigDecimal.ROUND_CEILING); + List doList = projectOrderSubMapper.selectList(query); + for (ProjectOrderSubDO aDo : doList) { + BigDecimal productionProgress = new BigDecimal(aDo.getQualifiedQuantity() * 100).divide(new BigDecimal(aDo.getAmount()), 2, BigDecimal.ROUND_CEILING); resultData.add(new LinkedList(){{ - add(taskDispatchDO.getProjectSubCode()); - add(taskDispatchDO.getProjectSubName()); - add(taskDispatchDO.getAmount()); - add(taskDispatchDO.getQualifiedQuantity()); - add(taskDispatchDO.getRestDays()); + add(aDo.getProjectSubCode()); + add(aDo.getProjectSubName()); + add(aDo.getAmount()); + add(aDo.getQualifiedQuantity()); + add(aDo.getRestDays()); add(productionProgress); }}); - sumProductionProgress.add(sumProductionProgress); - }); + } screenDO.setData(JSON.toJSONString(resultData)); - BigDecimal completionRate = sumProductionProgress.divide(new BigDecimal(taskDispatchDOList.size()), 2, BigDecimal.ROUND_CEILING); + BigDecimal completionRate = sumProductionProgress.divide(new BigDecimal(doList.size()), 2, BigDecimal.ROUND_CEILING); BigDecimal deliveryRate = null; buildProductionOrderState(productionOrderState, completionRate, deliveryRate); + + buildQualifiedRateOfEachProduct(qualifiedRateOfEachProduct, doList); } diff --git a/mes-ui/mes-ui-admin-vue3/src/views/Login/Login.vue b/mes-ui/mes-ui-admin-vue3/src/views/Login/Login.vue index 32b8a5b7..14a7435d 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/Login/Login.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/Login/Login.vue @@ -121,7 +121,7 @@ const getEwms = async () => { // 假设你有一个DOM元素用于显示二维码 const qrCodeElement = document.getElementById('qrCodeContainer') if (qrCodeElement) { - qrCodeElement.innerHTML = `Download APK QR Code` + qrCodeElement.innerHTML = `Download APK QR Code` } } }) diff --git a/mes-ui/mes-ui-admin-vue3/src/views/biz/hlvuestyle/ScEquipmentSelect.vue b/mes-ui/mes-ui-admin-vue3/src/views/biz/hlvuestyle/ScEquipmentSelect.vue new file mode 100644 index 00000000..570b4574 --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/views/biz/hlvuestyle/ScEquipmentSelect.vue @@ -0,0 +1,137 @@ + + + diff --git a/mes-ui/mes-ui-admin-vue3/src/views/spectaculars/index.vue b/mes-ui/mes-ui-admin-vue3/src/views/spectaculars/index.vue index dca59209..1003dbb5 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/spectaculars/index.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/spectaculars/index.vue @@ -97,7 +97,7 @@ - + + + @@ -126,6 +128,7 @@ import * as echarts from 'echarts' import { ref, onMounted, onUnmounted } from 'vue' import * as EquipMaintenanceRecordApi from '@/api/biz/equipmaintenancerecord' import { getStrDictOptions, DICT_TYPE, getDictLabel, getIntDictOptions } from '@/utils/dict' +import { dateFormatter, dateFormatter2, formatDate } from '@/utils/formatTime' // 获取当前时间 var now = new Date() @@ -382,7 +385,6 @@ const tableRowClassName = ({ rowIndex }) => { #spectacularsbox { width: 100%; height: 780px; - // background-color: aqua; background: url('@/assets/imgs/BG.png') no-repeat center; } ::v-deep .el-table, @@ -401,7 +403,6 @@ const tableRowClassName = ({ rowIndex }) => { --el-table-header-text-color: rgb(54, 143, 165); --el-table-text-color: #fff; } - .chart-container { border-radius: 10px; position: relative; diff --git a/mes-ui/mes-ui-admin-vue3/src/views/spectaculars/malfunction.vue b/mes-ui/mes-ui-admin-vue3/src/views/spectaculars/malfunction.vue index f8c3222b..9b10c131 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/spectaculars/malfunction.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/spectaculars/malfunction.vue @@ -2,172 +2,120 @@
- +   - 故障分析看板 - + 故障分析看板 + - {{ formatted_date }} + {{ formatted_date }} - - - - - - - + + + + - + + + - - - 查询 - + + 查询 - -
-
- MDK251数控门框据钻机停机时间 + +
+ MDK251数控门框据钻机停机时间
- -
+ +
- MDK251数控门框据钻机故障次数 + MDK251数控门框据钻机故障次数
-