RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/domain/vo/StoreSilkDetailVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,55 @@ package org.dromara.qa.analy.domain.vo; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * å¨ä¸æäº§éæç» VO * ç¨äºä¿åæ¯æ¬¡ç»è®¡äº§éçå项ï¼å·æ¥/å è£ ï¼ */ @Data public class StoreSilkDetailVo implements Serializable { private static final long serialVersionUID = 1L; /** * å䏿ºå· (å¦ fs01) */ private String fsNum; /** * å¨ä¸æå· (å¦ 1) */ private String siloNum; /** * 管éå· (å¦ pipe01) */ private String pipeNum; /** * æºå°å· (å¦ 1) */ private String equNo; /** * çæ¬¡ä»£ç (1-æ©ç 2-ä¸ç) */ private String shiftCode; /** * çæ¬¡å¼å§æ¶é´ (å 嫿¥æ) */ private Date shiftStartTime; /** * çæ¬¡ç»ææ¶é´ (å 嫿¥æ) */ private Date shiftEndTime; /** * è¯¥çæ¬¡å 计ç®åºç产é */ private Double output; } RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/domain/vo/StoreSilkInfoVo.java
@@ -1,8 +1,10 @@ package org.dromara.qa.analy.domain.vo; import java.util.Date; import java.util.List; import org.dromara.qa.analy.domain.StoreSilkInfo; import org.dromara.qa.md.domain.bo.MdShiftBo; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; @@ -92,5 +94,19 @@ @ExcelProperty(value = "æåå·(æ«ä½)") private String siloid; // åºæå¼å§ç»ææ¶é´è·¨è¶ç次å表 private List<MdShiftBo> distShiftList; private Double rollerOutput; private Double packerOutput; /** * å·æ¥æºäº§éæç» */ private List<StoreSilkDetailVo> rollerDetailList; /** * å è£ æºäº§éæç» */ private List<StoreSilkDetailVo> packerDetailList; } RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/analy/service/impl/StoreSilkInfoServiceImpl.java
@@ -1,5 +1,8 @@ package org.dromara.qa.analy.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.BeanUtils; import com.fasterxml.jackson.databind.ObjectMapper; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -9,6 +12,15 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.qa.analy.domain.FeedmatchTimeData; import org.dromara.qa.analy.domain.PackerTimeData; import org.dromara.qa.analy.domain.RollerTimeData; import org.dromara.qa.analy.domain.vo.StoreSilkDetailVo; import org.dromara.qa.analy.mapper.RollerTimeDataMapper; import org.dromara.qa.md.domain.MdShift; import org.dromara.qa.md.domain.bo.MdShiftBo; import org.dromara.qa.md.mapper.MdShiftMapper; import org.dromara.qa.md.service.OracleShiftReader; import org.springframework.stereotype.Service; import org.dromara.qa.analy.domain.bo.StoreSilkInfoBo; import org.dromara.qa.analy.domain.vo.StoreSilkInfoVo; @@ -17,9 +29,16 @@ import org.dromara.qa.analy.service.IStoreSilkInfoService; import org.dromara.qa.analy.mapper.FeedmatchTimeDataMapper; import java.util.List; import java.util.Map; import java.util.Collection; import java.lang.reflect.Field; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; /** * å¨ä¸æäº§éServiceä¸å¡å±å¤ç @@ -34,6 +53,10 @@ private final StoreSilkInfoMapper baseMapper; private final FeedmatchTimeDataMapper feedmatchTimeDataMapper; private final RollerTimeDataMapper rollerTimeDataMapper; private final org.dromara.qa.analy.mapper.PackerTimeDataMapper packerTimeDataMapper; private final MdShiftMapper mdShiftMapper; private final OracleShiftReader oracleShiftReader; /** * æ¥è¯¢å¨ä¸æäº§é @@ -42,7 +65,7 @@ * @return å¨ä¸æäº§é */ @Override public StoreSilkInfoVo queryById(Long id){ public StoreSilkInfoVo queryById(Long id) { return baseMapper.selectVoById(id); } @@ -61,19 +84,426 @@ queryFeedmatchData(result); return TableDataInfo.build(result); } private void queryFeedmatchData(Page<StoreSilkInfoVo> page) { if (page == null || page.getRecords() == null || page.getRecords().isEmpty()) { return; } // æ¥è¯¢æ°éç³»ç»ç次æ¶é´ï¼ç¬ç«ä½¿ç¨ oracle æ°æ®æºï¼ List<MdShift> mdShifts = oracleShiftReader.listAll(); List<StoreSilkInfoVo> storeSilkInfoList = page.getRecords(); for (int i = 0; i < storeSilkInfoList.size(); i++) { // //å¨ä¸æ StoreSilkInfoVo storeSilkInfoVo = storeSilkInfoList.get(i); //åºæå¼å§æ¶é´ Date distimebegin = storeSilkInfoVo.getDistimebegin(); //åºæç»ææ¶é´ Date distimeend = storeSilkInfoVo.getDistimeend(); //å¨ä¸ææå· String siloid = storeSilkInfoVo.getSiloid(); if (StringUtils.isEmpty(siloid)) continue; int lastIndex = siloid.lastIndexOf("_"); String containerNum = siloid.substring(lastIndex + 1); if (StringUtils.isEmpty(containerNum)) continue; //æ ¹æ®åºæå¼å§æ¶é´æ¥è¯¢å䏿º->å¨ä¸æ->æºå°å¯¹åºå ³ç³»(feedmatch_time_data) Timestamp targetTime = new Timestamp(distimebegin.getTime() + 10 * 60 * 1000); // æ¥è¯¢åºæ10åéåçç¬¬ä¸æ¡è®°å½ï¼ä¿è¯æ°æ®åç¡®æ§ LambdaQueryWrapper<FeedmatchTimeData> lqw = new LambdaQueryWrapper<>(); lqw.ge(FeedmatchTimeData::getTime, targetTime) .le(FeedmatchTimeData::getTime, distimeend) // ä¸è½å¤§äºåºæç»ææ¶é´ .orderByAsc(FeedmatchTimeData::getTime) .last("LIMIT 1"); FeedmatchTimeData feedMatch = feedmatchTimeDataMapper.selectOne(lqw); if (feedMatch == null) { // TODO æ·»å æç¤º continue; } // feedMatch 转map TODO é转mapééªè¯keyæ¯å¦ä¼éå¤ //fsRevMapæ¯é转map key->å䏿ºå¯¹åºçå¨ä¸æå· value-> fs + åºå· Map<String, String> fsRevMap = new HashMap<>(); //pipeRevMapæ¯é转map key->æºç»å¯¹åºçå䏿ºå管é value-> pipe + åºå· Map<String, String> pipeRevMap = new HashMap<>(); Map<String, String> pipeMap = new HashMap<>(); Field[] fields = feedMatch.getClass().getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Object value = null; try { value = field.get(feedMatch); } catch (IllegalAccessException e) { throw new RuntimeException(e); } if (field.getName().startsWith("fs") && value != null) { fsRevMap.put(value.toString(), field.getName()); } else if (field.getName().startsWith("pipe") && value != null) { pipeRevMap.put(value.toString(), field.getName()); pipeMap.put(field.getName(),value.toString()); } } // æ ¹æ®å¨ä¸æå·è·åå䏿ºå· String fsNum = fsRevMap.get(containerNum); if (StringUtils.isEmpty(fsNum)) { // TODO å䏿ºå·ç©ºè¿åä¿¡æ¯ continue; } if (pipeRevMap.isEmpty()) { // TODO 管éå·ç©ºè¿åä¿¡æ¯ continue; } // Listå-> å䏿ºå¯¹åºçæºç»ï¼å¦ pipe01 pipe02 代表1#ã2#å·æ¥æºç»ï¼ List<String> pipeList = new ArrayList<>(); for (Map.Entry<String, String> entry : pipeRevMap.entrySet()) { //fsNum第ä¸ä½æ¯å䏿ºåºå· if (entry.getKey().length() > 1 && entry.getKey().startsWith(fsNum.substring(2, 3))) { pipeList.add(entry.getValue()); } } if (pipeList.isEmpty()) { //TODO æ·»å æç¤º continue; } // æ ¹æ®åºæå¼å§ç»ææ¶é´ï¼æ¥è¯¢è¯¥ææå¨åªå ä¸ªçæ¬¡ç产 List<MdShiftBo> distShiftList = calcShiftSpans(distimebegin, distimeend, mdShifts); storeSilkInfoVo.setDistShiftList(distShiftList); if (distShiftList.isEmpty()) continue; //æ¥è¯¢æ¥æåçæ¬¡å å·æ¥æºç»ç产é ZoneId zone = ZoneId.systemDefault(); // å·å 产éç»è®¡ Double rollerOutput = 0.0; Double packerOutput = 0.0; // æç»å表 List<StoreSilkDetailVo> rollerDetailList = new ArrayList<>(); List<StoreSilkDetailVo> packerDetailList = new ArrayList<>(); for (int s = 0; s < distShiftList.size(); s++) { MdShiftBo shiftBo = distShiftList.get(s); if (shiftBo.getDay() == null || StringUtils.isEmpty(shiftBo.getCode())) { continue; } String shift = shiftBo.getCode(); // è§£æç次æ¶é´ // 1. è·åçæ¬¡é ç½®çå¼å§åç»ææ¶é´å符串 (æ ¼å¼å¦ "07:30:00") String stimStr = shiftBo.getStim(); String etimStr = shiftBo.getEtim(); if (StringUtils.isEmpty(stimStr) || StringUtils.isEmpty(etimStr)) { continue; } // 2. è¡¥å ¨ç§æ°ï¼å¦æé ç½®ä» ä¸º HH:mmï¼ if (stimStr.length() == 5) stimStr += ":00"; if (etimStr.length() == 5) etimStr += ":00"; // 3. ç»åæ¥æè§£æä¸º LocalDateTime // 注æï¼shiftBo.getDay() æ¯è¯¥ç次çå½å±æ¥æ String dateStr = shiftBo.getDay().toInstant().atZone(zone).toLocalDate().toString(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime shiftStart = LocalDateTime.parse(dateStr + " " + stimStr, formatter); LocalDateTime shiftEnd = LocalDateTime.parse(dateStr + " " + etimStr, formatter); // 4. å¤çè·¨å¤©çæ¬¡ï¼å¦æ ç»ææ¶é´ <= å¼å§æ¶é´ï¼è¯´æè·¨å¤©ï¼ç»ææ¶é´é +1 天 if (!shiftEnd.isAfter(shiftStart)) { shiftEnd = shiftEnd.plusDays(1); } // è½¬æ¢ Date 对象ç¨äºæ¯è¾ï¼å ¼å®¹ç°æé»è¾ï¼ Date stimDate = Date.from(shiftStart.atZone(zone).toInstant()); Date etimDate = Date.from(shiftEnd.atZone(zone).toInstant()); // 计ç®çæ¬¡ç»æå10åéçæ¶é´ç¹ String shiftEndStr = shiftEnd.format(formatter); String tenMinBeforeShiftEnd = shiftEnd.minusMinutes(10).format(formatter); // æ ¹æ®å·æ¥æºç»åçæ¬¡è·å产éï¼pipeList = å¤å°ä¸ªæºç»ï¼ for (int j = 0; j < pipeList.size(); j++) { String pipe = pipeList.get(j); // æåæºç»å· String equNo = pipe.replaceAll("\\D+", ""); //管éå· String channel = pipeMap.get("pipe" + equNo); if (channel != null && channel.length() > 0) { channel = channel.substring(channel.length() - 1); }else { channel = ""; } //注æ4å·ç®¡é以å对åºçæºç»éè¦+1ï¼æºç»4å·ç©ºç¼ºè·³å°5å· try { int equ = Integer.parseInt(equNo); equNo = String.format("%02d", equ >= 4 ? equ + 1 : equ); } catch (Exception e) { e.printStackTrace(); // TODO æ·»å æç¤º continue; } // æ¼æ¥å·æ¥æºçkeyï¼ä¸é´ "1" ä»£è¡¨å·æ¥æºï¼æ ¼å¼ï¼ç次 + "1" + æºç»å· String key = shift + "1" + equNo; // æ¼æ¥å è£ æºçkeyï¼ä¸é´ "2" 代表å è£ æºï¼æ ¼å¼ï¼ç次 + "2" + æºç»å· String packerKey = shift + "2" + equNo; // ================= å·æ¥æºäº§éç»è®¡ ================= Double currentRollerOutput = 0.0; // 1. æ¥è¯¢çæ¬¡ç»ææ¶ç产éå¿«ç § LambdaQueryWrapper<RollerTimeData> rlqw = new LambdaQueryWrapper<>(); rlqw.le(RollerTimeData::getTime, shiftEndStr) .eq(RollerTimeData::getKey, key) .ge(RollerTimeData::getTime, tenMinBeforeShiftEnd) .orderByDesc(RollerTimeData::getTime) .isNotNull(RollerTimeData::getQty) .gt(RollerTimeData::getQty, 0) .last("LIMIT 1"); RollerTimeData rData = rollerTimeDataMapper.selectOne(rlqw); if (rData != null) { // åå§äº§éè®¾ä¸ºçæ¬¡ç»ææ¶çç´¯è®¡å¼ currentRollerOutput += rData.getQty(); // 2. å¤çâæ£å¤´âï¼åºæå¼å§æ¶é´ > çæ¬¡å¼å§æ¶é´ if (distimebegin.after(stimDate)) { LocalDateTime distBeginTime = LocalDateTime.ofInstant(distimebegin.toInstant(), zone); String distBeginStr = distBeginTime.format(formatter); String tenMinBeforeDistBegin = distBeginTime.minusMinutes(10).format(formatter); LambdaQueryWrapper<RollerTimeData> beginRlqw = new LambdaQueryWrapper<>(); beginRlqw.le(RollerTimeData::getTime, distBeginStr) .eq(RollerTimeData::getKey, key) .ge(RollerTimeData::getTime, tenMinBeforeDistBegin) .orderByDesc(RollerTimeData::getTime) .isNotNull(RollerTimeData::getQty) .gt(RollerTimeData::getQty, 0) .last("LIMIT 1"); RollerTimeData rBeginData = rollerTimeDataMapper.selectOne(beginRlqw); if (rBeginData != null) { currentRollerOutput -= rBeginData.getQty(); } } // 3. å¤çâæ£å°¾âï¼åºæç»ææ¶é´ < çæ¬¡ç»ææ¶é´ if (etimDate.after(distimeend)) { LocalDateTime distEndTime = LocalDateTime.ofInstant(distimeend.toInstant(), zone); String distEndStr = distEndTime.format(formatter); String tenMinBeforeDistEnd = distEndTime.minusMinutes(10).format(formatter); LambdaQueryWrapper<RollerTimeData> endRlqw = new LambdaQueryWrapper<>(); endRlqw.le(RollerTimeData::getTime, distEndStr) .eq(RollerTimeData::getKey, key) .ge(RollerTimeData::getTime, tenMinBeforeDistEnd) .orderByDesc(RollerTimeData::getTime) .isNotNull(RollerTimeData::getQty) .gt(RollerTimeData::getQty, 0) .last("LIMIT 1"); RollerTimeData rEndData = rollerTimeDataMapper.selectOne(endRlqw); if (rEndData != null) { double qtyDelta = rData.getQty() - rEndData.getQty(); if (qtyDelta > 0) { currentRollerOutput -= qtyDelta; } } } } // 累计æ»äº§é rollerOutput += currentRollerOutput; // è®°å½å·æ¥æºæç» if (currentRollerOutput > 0) { StoreSilkDetailVo detail = new StoreSilkDetailVo(); detail.setFsNum(fsNum.substring(2, 3)); detail.setSiloNum(containerNum); detail.setPipeNum(channel); detail.setEquNo(equNo); detail.setShiftCode(shift); detail.setShiftStartTime(stimDate); detail.setShiftEndTime(etimDate); detail.setOutput(currentRollerOutput); rollerDetailList.add(detail); } // ================= å è£ æºäº§éç»è®¡ ================= Double currentPackerOutput = 0.0; // 1. æ¥è¯¢çæ¬¡ç»ææ¶ç产éå¿«ç § LambdaQueryWrapper<PackerTimeData> plqw = new LambdaQueryWrapper<>(); plqw.le(PackerTimeData::getTime, shiftEndStr) .eq(PackerTimeData::getKey, packerKey) .ge(PackerTimeData::getTime, tenMinBeforeShiftEnd) .orderByDesc(PackerTimeData::getTime) .isNotNull(PackerTimeData::getQty) .gt(PackerTimeData::getQty, 0) .last("LIMIT 1"); PackerTimeData pData = packerTimeDataMapper.selectOne(plqw); if (pData != null) { // åå§äº§éè®¾ä¸ºçæ¬¡ç»ææ¶çç´¯è®¡å¼ currentPackerOutput += pData.getQty(); // 2. å¤çâæ£å¤´â if (distimebegin.after(stimDate)) { LocalDateTime distBeginTime = LocalDateTime.ofInstant(distimebegin.toInstant(), zone); String distBeginStr = distBeginTime.format(formatter); String tenMinBeforeDistBegin = distBeginTime.minusMinutes(10).format(formatter); LambdaQueryWrapper<PackerTimeData> beginPlqw = new LambdaQueryWrapper<>(); beginPlqw.le(PackerTimeData::getTime, distBeginStr) .eq(PackerTimeData::getKey, packerKey) .ge(PackerTimeData::getTime, tenMinBeforeDistBegin) .orderByDesc(PackerTimeData::getTime) .isNotNull(PackerTimeData::getQty) .gt(PackerTimeData::getQty, 0) .last("LIMIT 1"); PackerTimeData pBeginData = packerTimeDataMapper.selectOne(beginPlqw); if (pBeginData != null) { currentPackerOutput -= pBeginData.getQty(); } } // 3. å¤çâæ£å°¾â if (etimDate.after(distimeend)) { LocalDateTime distEndTime = LocalDateTime.ofInstant(distimeend.toInstant(), zone); String distEndStr = distEndTime.format(formatter); String tenMinBeforeDistEnd = distEndTime.minusMinutes(10).format(formatter); LambdaQueryWrapper<PackerTimeData> endPlqw = new LambdaQueryWrapper<>(); endPlqw.le(PackerTimeData::getTime, distEndStr) .eq(PackerTimeData::getKey, packerKey) .ge(PackerTimeData::getTime, tenMinBeforeDistEnd) .orderByDesc(PackerTimeData::getTime) .isNotNull(PackerTimeData::getQty) .gt(PackerTimeData::getQty, 0) .last("LIMIT 1"); PackerTimeData pEndData = packerTimeDataMapper.selectOne(endPlqw); if (pEndData != null) { double qtyDelta = pData.getQty() - pEndData.getQty(); if (qtyDelta > 0) { currentPackerOutput -= qtyDelta; } } } } // 累计æ»äº§é packerOutput += currentPackerOutput; // è®°å½å è£ æºæç» if (currentPackerOutput > 0) { StoreSilkDetailVo detail = new StoreSilkDetailVo(); detail.setFsNum(fsNum.substring(2, 3)); detail.setSiloNum(containerNum); detail.setPipeNum(channel); detail.setEquNo(equNo); detail.setShiftCode(shift); detail.setShiftStartTime(stimDate); detail.setShiftEndTime(etimDate); detail.setOutput(currentPackerOutput); packerDetailList.add(detail); } } } storeSilkInfoVo.setRollerOutput(rollerOutput); storeSilkInfoVo.setPackerOutput(packerOutput); storeSilkInfoVo.setRollerDetailList(rollerDetailList); storeSilkInfoVo.setPackerDetailList(packerDetailList); } } /** * 计ç®åºæåºé´ [begin, end) æ¶åå°ççæ¬¡ï¼ä» code=1ã2 çæ©/ä¸çï¼ * è¿å Map<yyyy-MM-dd, code>ï¼è¡¨ç¤ºè¯¥æ¥æä¸çè¯¥çæ¬¡ä¸åºæåºé´å卿¶é´éå * è¥å䏿¥ææ©/ä¸çåæéå ï¼value 使ç¨éå·æ¼æ¥ï¼å¦ "1,2" * <p> * ç®åæè·¯ï¼ * 1. å° begin/end 转为 LocalDateTimeï¼ååºè¦ççææèªç¶æ¥ * 2. 对æ¯ä¸å¤©æç次ç stim/etim çæç次æ¶é´çª [shiftStart, shiftEnd) * - è¥ etim <= stimï¼è§ä¸ºè·¨å¤©ç次ï¼shiftEnd = å½å¤©æ¥æ + 1 天 + etim * 3. ç¨ç®åçåºé´éå 夿ï¼shiftEnd > begin && shiftStart < end */ private List<MdShiftBo> calcShiftSpans(Date begin, Date end, List<MdShift> mdShifts) { List<MdShiftBo> result = new ArrayList<>(); // åºç¡æ ¡éª if (begin == null || end == null || !end.after(begin) || mdShifts == null || mdShifts.isEmpty()) { return result; } // ä» ä¿çæ©ç(code=1)ä¸ä¸ç(code=2) // åæ¶å¿½ç¥ stim/etim 为空ççæ¬¡ ZoneId zone = ZoneId.systemDefault(); LocalDateTime intervalStart = LocalDateTime.ofInstant(begin.toInstant(), zone); LocalDateTime intervalEnd = LocalDateTime.ofInstant(end.toInstant(), zone); LocalDate day = intervalStart.toLocalDate(); LocalDate lastDay = intervalEnd.toLocalDate(); // è§£ææ¶é´æ ¼å¼ï¼æ¯æ "H:mm" æ "H:mm:ss" DateTimeFormatter tf = DateTimeFormatter.ofPattern("H:mm[:ss]"); Set<String> seen = new HashSet<>(); // æå¤©éåè¦çèå´ while (!day.isAfter(lastDay)) { for (MdShift s : mdShifts) { // ä» æ©/ä¸ç String code = s.getCode(); if (!"1".equals(code) && !"2".equals(code)) { continue; } String st = s.getStim(); String et = s.getEtim(); if (st == null || et == null) { continue; } // è§£æçæ¬¡èµ·æ¢æ¶é´ LocalTime stt; LocalTime ett; try { stt = LocalTime.parse(st.trim(), tf); ett = LocalTime.parse(et.trim(), tf); } catch (Exception ignore) { // æ¶é´æ ¼å¼å¼å¸¸åè·³è¿è¯¥ç次 continue; } // çæå½å¤©è¯¥çæ¬¡çæ¶é´çª LocalDateTime shiftStart = LocalDateTime.of(day, stt); LocalDateTime shiftEnd = ett.isAfter(stt) || ett.equals(stt) ? LocalDateTime.of(day, ett) : LocalDateTime.of(day.plusDays(1), ett); // 跨天å¤ç // 夿åºé´æ¯å¦éå ï¼ [shiftStart, shiftEnd) ä¸ [intervalStart, intervalEnd) if (shiftEnd.isAfter(intervalStart) && shiftStart.isBefore(intervalEnd)) { Date shiftDay = Date.from(day.atStartOfDay(zone).toInstant()); String dedupeKey = shiftDay.getTime() + "-" + code; if (seen.add(dedupeKey)) { MdShiftBo bo = new MdShiftBo(); bo.setId(s.getId()); bo.setWsId(s.getWsId()); bo.setCode(s.getCode()); bo.setName(s.getName()); bo.setStim(s.getStim()); bo.setEtim(s.getEtim()); bo.setSeq(s.getSeq()); bo.setEnable(s.getEnable()); bo.setDel(s.getDel()); bo.setCreateUserName(s.getCreateUserName()); bo.setCreateUserTime(s.getCreateUserTime()); bo.setUpdateUserName(s.getUpdateUserName()); bo.setUpdateUserTime(s.getUpdateUserTime()); bo.setDay(shiftDay); result.add(bo); } } } day = day.plusDays(1); } result.sort(Comparator .comparing(MdShiftBo::getDay, Comparator.nullsLast(Date::compareTo)) .thenComparing(MdShiftBo::getCode, Comparator.nullsLast(String::compareTo))); return result; } /** @@ -98,6 +528,8 @@ lqw.eq(bo.getDistimebegin() != null, StoreSilkInfo::getDistimebegin, bo.getDistimebegin()); lqw.eq(bo.getDistimeend() != null, StoreSilkInfo::getDistimeend, bo.getDistimeend()); lqw.eq(StringUtils.isNotBlank(bo.getSiloid()), StoreSilkInfo::getSiloid, bo.getSiloid()); lqw.between(params.get("beginTime") != null && params.get("endTime") != null, StoreSilkInfo::getDistimeend, params.get("beginTime"), params.get("endTime")); return lqw; } @@ -134,7 +566,7 @@ /** * ä¿ååçæ°æ®æ ¡éª */ private void validEntityBeforeSave(StoreSilkInfo entity){ private void validEntityBeforeSave(StoreSilkInfo entity) { //TODO åä¸äºæ°æ®æ ¡éª,å¦å¯ä¸çº¦æ } @@ -147,7 +579,7 @@ */ @Override public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { if(isValid){ if (isValid) { //TODO åä¸äºä¸å¡ä¸çæ ¡éª,夿æ¯å¦éè¦æ ¡éª } return baseMapper.deleteByIds(ids) > 0; RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/md/domain/bo/MdShiftBo.java
@@ -86,5 +86,10 @@ */ private Date updateUserTime; /** * çæ¬¡æ¥æ */ private Date day; } RuoYi-Vue-Plus/ruoyi-modules/ruoyi-qa/src/main/java/org/dromara/qa/md/service/OracleShiftReader.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package org.dromara.qa.md.service; import com.baomidou.dynamic.datasource.annotation.DS; import lombok.RequiredArgsConstructor; import org.dromara.qa.md.domain.MdShift; import org.dromara.qa.md.mapper.MdShiftMapper; import org.springframework.stereotype.Service; import java.util.List; @DS("oracle") @Service @RequiredArgsConstructor public class OracleShiftReader { private final MdShiftMapper mdShiftMapper; public List<MdShift> listAll() { return mdShiftMapper.selectList(); } } RuoYi-Vue-Plus/¿ª·¢ÈÕÖ¾.md
@@ -12,5 +12,8 @@ #### 20260302 - å¾ åäºé¡¹ - [ ] ç®åå¨ä¸æä¿¡æ¯ä¿¡æ¯æ²¡æä»è§å¾ä¸è·åï¼ä½¿ç¨oracle_store_silk表模æ - [ ] ç®åå¨ä¸æä¿¡æ¯ä¿¡æ¯æ²¡æä»è§å¾ä¸è·åï¼ä½¿ç¨oracle_store_silk表模æ->使ç¨å¶ä¸è½¦é´çå®è§å¾æ°æ®æº - [ ] å䏿ºå¯¹åºå ³ç³»ï¼fså¼å¤´å¨åççå®å¼æ¯ä»ä¹ï¼ç®åæµè¯æ°æ®ä½¿ç¨çæ¯ fs11 -> å¨ä¸æå· - [ ] 确认1å°å䏿ºå¯¹åºç2å°å¨ä¸ææ¯ä¾æ¬¡ä¾ä¸è¿æ¯å¯ä»¥å¹¶è¡ä¾ä¸(<span style="color: red;">***å¹¶è¡ä¾ä¸æ æ³å确计ç®äº§é***</span>) - [ ] 确认 å䏿ºå¯¹åºå ³ç³»ä¸(key->pipe01 value->1#æºç»å¯¹åºçå䏿ºå管é)valueä¸ä¼éå¤ (<span style="color: red;">***éå¤å°å¯¼è´è®¡ç®é»è¾åºç°é误***</span>) ruoyi-plus-soybean/src/typings/api/analy.store-silk.api.d.ts
@@ -33,7 +33,7 @@ /** å¨ä¸æåºæç»ææ¶é´ */ distimeend: string; /** æåå·(æ«ä½) */ siloid: CommonType.IdType; siloid: string; }>; /** store silk search params */ ruoyi-plus-soybean/src/typings/api/qm.batch.api.d.ts
@@ -112,7 +112,17 @@ type BatchSearchParams = CommonType.RecordNullable< Pick< Api.Qm.Batch, 'batchCode' | 'typ' | 'eqpCode' | 'matCode' | 'batchDate' | 'flag' | 'deleted' | 'category' | 'state' | 'batchCode' | 'typ' | 'eqpCode' | 'matCode' | 'batchDate' | 'flag' | 'toMesDate' | 'fromMesDate' | 'deleted' | 'category' | 'state' > & Api.Common.CommonSearchParams >; ruoyi-plus-soybean/src/views/analy/feed-match/modules/feed-match-operate-drawer.vue
@@ -250,49 +250,49 @@ <NInput v-model:value="model.fs42" :rows="3" type="textarea" placeholder="请è¾å ¥4#å䏿ºå¯¹åºç第äºä¸ªå¨ä¸æ" /> </NFormItem> <NFormItem label="1#æºç»å¯¹åºçå䏿ºå管é" path="pipe01"> <NInput v-model:value="model.pipe01" placeholder="请è¾å ¥1#æºç»å¯¹åºçå䏿ºå管é" /> <NInputNumber v-model:value="model.pipe01" placeholder="请è¾å ¥1#æºç»å¯¹åºçå䏿ºå管é" class="w-full" /> </NFormItem> <NFormItem label="2#æºç»å¯¹åºçå䏿ºå管é" path="pipe02"> <NInput v-model:value="model.pipe02" placeholder="请è¾å ¥2#æºç»å¯¹åºçå䏿ºå管é" /> <NInputNumber v-model:value="model.pipe02" placeholder="请è¾å ¥2#æºç»å¯¹åºçå䏿ºå管é" class="w-full" /> </NFormItem> <NFormItem label="3#æºç»å¯¹åºçå䏿ºå管é" path="pipe03"> <NInput v-model:value="model.pipe03" placeholder="请è¾å ¥3#æºç»å¯¹åºçå䏿ºå管é" /> <NInputNumber v-model:value="model.pipe03" placeholder="请è¾å ¥3#æºç»å¯¹åºçå䏿ºå管é" class="w-full" /> </NFormItem> <NFormItem label="4#æºç»å¯¹åºçå䏿ºå管é" path="pipe04"> <NInput v-model:value="model.pipe04" placeholder="请è¾å ¥4#æºç»å¯¹åºçå䏿ºå管é" /> <NInputNumber v-model:value="model.pipe04" placeholder="请è¾å ¥4#æºç»å¯¹åºçå䏿ºå管é" class="w-full" /> </NFormItem> <NFormItem label="5#æºç»å¯¹åºçå䏿ºå管é" path="pipe05"> <NInput v-model:value="model.pipe05" placeholder="请è¾å ¥5#æºç»å¯¹åºçå䏿ºå管é" /> <NInputNumber v-model:value="model.pipe05" placeholder="请è¾å ¥5#æºç»å¯¹åºçå䏿ºå管é" class="w-full" /> </NFormItem> <NFormItem label="6#æºç»å¯¹åºçå䏿ºå管é" path="pipe06"> <NInput v-model:value="model.pipe06" placeholder="请è¾å ¥6#æºç»å¯¹åºçå䏿ºå管é" /> <NInputNumber v-model:value="model.pipe06" placeholder="请è¾å ¥6#æºç»å¯¹åºçå䏿ºå管é" class="w-full" /> </NFormItem> <NFormItem label="7#æºç»å¯¹åºçå䏿ºå管é" path="pipe07"> <NInput v-model:value="model.pipe07" placeholder="请è¾å ¥7#æºç»å¯¹åºçå䏿ºå管é" /> <NInputNumber v-model:value="model.pipe07" placeholder="请è¾å ¥7#æºç»å¯¹åºçå䏿ºå管é" class="w-full" /> </NFormItem> <NFormItem label="8#æºç»å¯¹åºçå䏿ºå管é" path="pipe08"> <NInput v-model:value="model.pipe08" placeholder="请è¾å ¥8#æºç»å¯¹åºçå䏿ºå管é" /> <NInputNumber v-model:value="model.pipe08" placeholder="请è¾å ¥8#æºç»å¯¹åºçå䏿ºå管é" class="w-full" /> </NFormItem> <NFormItem label="9#æºç»å¯¹åºçå䏿ºå管é" path="pipe09"> <NInput v-model:value="model.pipe09" placeholder="请è¾å ¥9#æºç»å¯¹åºçå䏿ºå管é" /> <NInputNumber v-model:value="model.pipe09" placeholder="请è¾å ¥9#æºç»å¯¹åºçå䏿ºå管é" class="w-full" /> </NFormItem> <NFormItem label="10#æºç»å¯¹åºçå䏿ºå管é" path="pipe10"> <NInput v-model:value="model.pipe10" placeholder="请è¾å ¥10#æºç»å¯¹åºçå䏿ºå管é" /> <NInputNumber v-model:value="model.pipe10" placeholder="请è¾å ¥10#æºç»å¯¹åºçå䏿ºå管é" class="w-full" /> </NFormItem> <NFormItem label="11#æºç»å¯¹åºçå䏿ºå管é" path="pipe11"> <NInput v-model:value="model.pipe11" placeholder="请è¾å ¥11#æºç»å¯¹åºçå䏿ºå管é" /> <NInputNumber v-model:value="model.pipe11" placeholder="请è¾å ¥11#æºç»å¯¹åºçå䏿ºå管é" class="w-full" /> </NFormItem> <NFormItem label="12#æºç»å¯¹åºçå䏿ºå管é" path="pipe12"> <NInput v-model:value="model.pipe12" placeholder="请è¾å ¥12#æºç»å¯¹åºçå䏿ºå管é" /> <NInputNumber v-model:value="model.pipe12" placeholder="请è¾å ¥12#æºç»å¯¹åºçå䏿ºå管é" class="w-full" /> </NFormItem> <NFormItem label="å䏿ºç¶æ 1-è¿æ¥ 0-æå¼" path="wsjState"> <NInput v-model:value="model.wsjState" placeholder="请è¾å ¥å䏿ºç¶æ 1-è¿æ¥ 0-æå¼" /> <NInputNumber v-model:value="model.wsjState" placeholder="请è¾å ¥å䏿ºç¶æ 1-è¿æ¥ 0-æå¼" class="w-full" /> </NFormItem> <NFormItem label="çæ¬¡" path="shift"> <NInput v-model:value="model.shift" placeholder="请è¾å ¥ç次" /> <NInputNumber v-model:value="model.shift" placeholder="请è¾å ¥ç次" class="w-full" /> </NFormItem> <NFormItem label="æºå°" path="equNo"> <NInput v-model:value="model.equNo" placeholder="请è¾å ¥æºå°" /> <NInputNumber v-model:value="model.equNo" placeholder="请è¾å ¥æºå°" class="w-full" /> </NFormItem> <NFormItem label="夿³¨" path="remark"> <NInput v-model:value="model.remark" placeholder="请è¾å ¥å¤æ³¨" /> ruoyi-plus-soybean/src/views/analy/hoister/modules/hoister-data-operate-drawer.vue
@@ -251,7 +251,6 @@ if (visible.value) { handleUpdateModelWhenEdit(); restoreValidation(); getTreeList(); } }); </script> @@ -272,112 +271,112 @@ <NInput v-model:value="model.key" :rows="3" type="textarea" placeholder="请è¾å ¥key" /> </NFormItem> <NFormItem label="ç½ç»ç¶æ 0å¼å¸¸ï¼1æ£å¸¸" path="online"> <NInput v-model:value="model.online" placeholder="请è¾å ¥ç½ç»ç¶æ 0å¼å¸¸ï¼1æ£å¸¸" /> <NInputNumber v-model:value="model.online" placeholder="请è¾å ¥ç½ç»ç¶æ 0å¼å¸¸ï¼1æ£å¸¸" class="w-full" /> </NFormItem> <NFormItem label="产é" path="qty"> <NInput v-model:value="model.qty" placeholder="请è¾å ¥äº§é" /> <NInputNumber v-model:value="model.qty" placeholder="请è¾å ¥äº§é" class="w-full" /> </NFormItem> <NFormItem label="1#æåæºç¶æ" path="tState1"> <NInput v-model:value="model.tState1" placeholder="请è¾å ¥1#æåæºç¶æ" /> <NInputNumber v-model:value="model.tState1" placeholder="请è¾å ¥1#æåæºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="2#æåæºç¶æ" path="tState2"> <NInput v-model:value="model.tState2" placeholder="请è¾å ¥2#æåæºç¶æ" /> <NInputNumber v-model:value="model.tState2" placeholder="请è¾å ¥2#æåæºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="3#æåæºç¶æ" path="tState3"> <NInput v-model:value="model.tState3" placeholder="请è¾å ¥3#æåæºç¶æ" /> <NInputNumber v-model:value="model.tState3" placeholder="请è¾å ¥3#æåæºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="4#æåæºç¶æ" path="tState4"> <NInput v-model:value="model.tState4" placeholder="请è¾å ¥4#æåæºç¶æ" /> <NInputNumber v-model:value="model.tState4" placeholder="请è¾å ¥4#æåæºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="5#æåæºç¶æ" path="tState5"> <NInput v-model:value="model.tState5" placeholder="请è¾å ¥5#æåæºç¶æ" /> <NInputNumber v-model:value="model.tState5" placeholder="请è¾å ¥5#æåæºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="6#æåæºç¶æ" path="tState6"> <NInput v-model:value="model.tState6" placeholder="请è¾å ¥6#æåæºç¶æ" /> <NInputNumber v-model:value="model.tState6" placeholder="请è¾å ¥6#æåæºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="7#æåæºç¶æ" path="tState7"> <NInput v-model:value="model.tState7" placeholder="请è¾å ¥7#æåæºç¶æ" /> <NInputNumber v-model:value="model.tState7" placeholder="请è¾å ¥7#æåæºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="8#æåæºç¶æ" path="tState8"> <NInput v-model:value="model.tState8" placeholder="请è¾å ¥8#æåæºç¶æ" /> <NInputNumber v-model:value="model.tState8" placeholder="请è¾å ¥8#æåæºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="9#æåæºç¶æ" path="tState9"> <NInput v-model:value="model.tState9" placeholder="请è¾å ¥9#æåæºç¶æ" /> <NInputNumber v-model:value="model.tState9" placeholder="请è¾å ¥9#æåæºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="10#æåæºç¶æ" path="tState10"> <NInput v-model:value="model.tState10" placeholder="请è¾å ¥10#æåæºç¶æ" /> <NInputNumber v-model:value="model.tState10" placeholder="请è¾å ¥10#æåæºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="11#æåæºç¶æ" path="tState11"> <NInput v-model:value="model.tState11" placeholder="请è¾å ¥11#æåæºç¶æ" /> <NInputNumber v-model:value="model.tState11" placeholder="请è¾å ¥11#æåæºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="12#æåæºç¶æ" path="tState12"> <NInput v-model:value="model.tState12" placeholder="请è¾å ¥12#æåæºç¶æ" /> <NInputNumber v-model:value="model.tState12" placeholder="请è¾å ¥12#æåæºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="1#æå æºç¶æ" path="pState1"> <NInput v-model:value="model.pState1" placeholder="请è¾å ¥1#æå æºç¶æ" /> <NInputNumber v-model:value="model.pState1" placeholder="请è¾å ¥1#æå æºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="2#æå æºç¶æ" path="pState2"> <NInput v-model:value="model.pState2" placeholder="请è¾å ¥2#æå æºç¶æ" /> <NInputNumber v-model:value="model.pState2" placeholder="请è¾å ¥2#æå æºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="3#æå æºç¶æ" path="pState3"> <NInput v-model:value="model.pState3" placeholder="请è¾å ¥3#æå æºç¶æ" /> <NInputNumber v-model:value="model.pState3" placeholder="请è¾å ¥3#æå æºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="4#æå æºç¶æ" path="pState4"> <NInput v-model:value="model.pState4" placeholder="请è¾å ¥4#æå æºç¶æ" /> <NInputNumber v-model:value="model.pState4" placeholder="请è¾å ¥4#æå æºç¶æ" class="w-full" /> </NFormItem> <NFormItem label="1#æåæºäº§é" path="tQty1"> <NInput v-model:value="model.tQty1" placeholder="请è¾å ¥1#æåæºäº§é" /> <NInputNumber v-model:value="model.tQty1" placeholder="请è¾å ¥1#æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="2#æåæºäº§é" path="tQty2"> <NInput v-model:value="model.tQty2" placeholder="请è¾å ¥2#æåæºäº§é" /> <NInputNumber v-model:value="model.tQty2" placeholder="请è¾å ¥2#æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="3#æåæºäº§é" path="tQty3"> <NInput v-model:value="model.tQty3" placeholder="请è¾å ¥3#æåæºäº§é" /> <NInputNumber v-model:value="model.tQty3" placeholder="请è¾å ¥3#æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="4#æåæºäº§é" path="tQty4"> <NInput v-model:value="model.tQty4" placeholder="请è¾å ¥4#æåæºäº§é" /> <NInputNumber v-model:value="model.tQty4" placeholder="请è¾å ¥4#æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="5#æåæºäº§é" path="tQty5"> <NInput v-model:value="model.tQty5" placeholder="请è¾å ¥5#æåæºäº§é" /> <NInputNumber v-model:value="model.tQty5" placeholder="请è¾å ¥5#æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="6#æåæºäº§é" path="tQty6"> <NInput v-model:value="model.tQty6" placeholder="请è¾å ¥6#æåæºäº§é" /> <NInputNumber v-model:value="model.tQty6" placeholder="请è¾å ¥6#æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="7#æåæºäº§é" path="tQty7"> <NInput v-model:value="model.tQty7" placeholder="请è¾å ¥7#æåæºäº§é" /> <NInputNumber v-model:value="model.tQty7" placeholder="请è¾å ¥7#æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="8#æåæºäº§é" path="tQty8"> <NInput v-model:value="model.tQty8" placeholder="请è¾å ¥8#æåæºäº§é" /> <NInputNumber v-model:value="model.tQty8" placeholder="请è¾å ¥8#æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="9#æåæºäº§é" path="tQty9"> <NInput v-model:value="model.tQty9" placeholder="请è¾å ¥9#æåæºäº§é" /> <NInputNumber v-model:value="model.tQty9" placeholder="请è¾å ¥9#æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="10#æåæºäº§é" path="tQty10"> <NInput v-model:value="model.tQty10" placeholder="请è¾å ¥10#æåæºäº§é" /> <NInputNumber v-model:value="model.tQty10" placeholder="请è¾å ¥10#æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="11#æåæºäº§é" path="tQty11"> <NInput v-model:value="model.tQty11" placeholder="请è¾å ¥11#æåæºäº§é" /> <NInputNumber v-model:value="model.tQty11" placeholder="请è¾å ¥11#æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="12#æåæºäº§é" path="tQty12"> <NInput v-model:value="model.tQty12" placeholder="请è¾å ¥12#æåæºäº§é" /> <NInputNumber v-model:value="model.tQty12" placeholder="请è¾å ¥12#æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="1#æå æºäº§é" path="pQty1"> <NInput v-model:value="model.pQty1" placeholder="请è¾å ¥1#æå æºäº§é" /> <NInputNumber v-model:value="model.pQty1" placeholder="请è¾å ¥1#æå æºäº§é" class="w-full" /> </NFormItem> <NFormItem label="2#æå æºäº§é" path="pQty2"> <NInput v-model:value="model.pQty2" placeholder="请è¾å ¥2#æå æºäº§é" /> <NInputNumber v-model:value="model.pQty2" placeholder="请è¾å ¥2#æå æºäº§é" class="w-full" /> </NFormItem> <NFormItem label="3#æå æºäº§é" path="pQty3"> <NInput v-model:value="model.pQty3" placeholder="请è¾å ¥3#æå æºäº§é" /> <NInputNumber v-model:value="model.pQty3" placeholder="请è¾å ¥3#æå æºäº§é" class="w-full" /> </NFormItem> <NFormItem label="4#æå æºäº§é" path="pQty4"> <NInput v-model:value="model.pQty4" placeholder="请è¾å ¥4#æå æºäº§é" /> <NInputNumber v-model:value="model.pQty4" placeholder="请è¾å ¥4#æå æºäº§é" class="w-full" /> </NFormItem> <NFormItem label="çæ¬¡" path="shift"> <NInput v-model:value="model.shift" placeholder="请è¾å ¥ç次" /> <NInputNumber v-model:value="model.shift" placeholder="请è¾å ¥ç次" class="w-full" /> </NFormItem> <NFormItem label="设å¤" path="equNo"> <NInput v-model:value="model.equNo" placeholder="请è¾å ¥è®¾å¤" /> <NInputNumber v-model:value="model.equNo" placeholder="请è¾å ¥è®¾å¤" class="w-full" /> </NFormItem> <NFormItem label="夿³¨" path="remark"> <NInput v-model:value="model.remark" placeholder="请è¾å ¥å¤æ³¨" /> ruoyi-plus-soybean/src/views/analy/packer/modules/packer-data-operate-drawer.vue
@@ -212,74 +212,74 @@ <NInput v-model:value="model.key" :rows="3" type="textarea" placeholder="请è¾å ¥key" /> </NFormItem> <NFormItem label="ç½ç»ç¶æ(0å¼å¸¸ï¼1æ£å¸¸)" path="online"> <NInput v-model:value="model.online" placeholder="请è¾å ¥ç½ç»ç¶æ(0å¼å¸¸ï¼1æ£å¸¸)" /> <NInputNumber v-model:value="model.online" placeholder="请è¾å ¥ç½ç»ç¶æ(0å¼å¸¸ï¼1æ£å¸¸)" class="w-full" /> </NFormItem> <NFormItem label="产é" path="qty"> <NInput v-model:value="model.qty" placeholder="请è¾å ¥äº§é" /> <NInputNumber v-model:value="model.qty" placeholder="请è¾å ¥äº§é" class="w-full" /> </NFormItem> <NFormItem label="åé¤äº§é" path="badQty"> <NInput v-model:value="model.badQty" placeholder="请è¾å ¥åé¤äº§é" /> <NInputNumber v-model:value="model.badQty" placeholder="请è¾å ¥åé¤äº§é" class="w-full" /> </NFormItem> <NFormItem label="å°çèæ¶è" path="xiaohemoVal"> <NInput v-model:value="model.xiaohemoVal" placeholder="请è¾å ¥å°çèæ¶è" /> <NInputNumber v-model:value="model.xiaohemoVal" placeholder="请è¾å ¥å°çèæ¶è" class="w-full" /> </NFormItem> <NFormItem label="æ¡çèæ¶è" path="tiaohemoVal"> <NInput v-model:value="model.tiaohemoVal" placeholder="请è¾å ¥æ¡çèæ¶è" /> <NInputNumber v-model:value="model.tiaohemoVal" placeholder="请è¾å ¥æ¡çèæ¶è" class="w-full" /> </NFormItem> <NFormItem label="å°ç纸æ¶è" path="xiaohezhiVal"> <NInput v-model:value="model.xiaohezhiVal" placeholder="请è¾å ¥å°ç纸æ¶è" /> <NInputNumber v-model:value="model.xiaohezhiVal" placeholder="请è¾å ¥å°ç纸æ¶è" class="w-full" /> </NFormItem> <NFormItem label="æ¡ç纸æ¶è" path="tiaohezhiVal"> <NInput v-model:value="model.tiaohezhiVal" placeholder="请è¾å ¥æ¡ç纸æ¶è" /> <NInputNumber v-model:value="model.tiaohezhiVal" placeholder="请è¾å ¥æ¡ç纸æ¶è" class="w-full" /> </NFormItem> <NFormItem label="å 衬纸æ¶è" path="neichenzhiVal"> <NInput v-model:value="model.neichenzhiVal" placeholder="请è¾å ¥å 衬纸æ¶è" /> <NInputNumber v-model:value="model.neichenzhiVal" placeholder="请è¾å ¥å 衬纸æ¶è" class="w-full" /> </NFormItem> <NFormItem label="è¿è¡æ¶é´" path="runTime"> <NInput v-model:value="model.runTime" placeholder="请è¾å ¥è¿è¡æ¶é´" /> <NInputNumber v-model:value="model.runTime" placeholder="请è¾å ¥è¿è¡æ¶é´" class="w-full" /> </NFormItem> <NFormItem label="åæºæ¶é´" path="stopTime"> <NInput v-model:value="model.stopTime" placeholder="请è¾å ¥åæºæ¶é´" /> <NInputNumber v-model:value="model.stopTime" placeholder="请è¾å ¥åæºæ¶é´" class="w-full" /> </NFormItem> <NFormItem label="åæºæ¬¡æ°" path="stopTimes"> <NInput v-model:value="model.stopTimes" placeholder="请è¾å ¥åæºæ¬¡æ°" /> <NInputNumber v-model:value="model.stopTimes" placeholder="请è¾å ¥åæºæ¬¡æ°" class="w-full" /> </NFormItem> <NFormItem label="车é" path="speed"> <NInput v-model:value="model.speed" placeholder="请è¾å ¥è½¦é" /> <NInputNumber v-model:value="model.speed" placeholder="请è¾å ¥è½¦é" class="w-full" /> </NFormItem> <NFormItem label="è¿è¡ç¶æ(-1 æç½ 0忢 1ä½éè¿è¡ 2æ£å¸¸è¿è¡)" path="runStatus"> <NRadioGroup v-model:value="model.runStatus"> <NSpace> <NRadio value="0" label="è¯·éæ©åå ¸çæ" /> <NRadio :value="0" label="è¯·éæ©åå ¸çæ" /> </NSpace> </NRadioGroup> </NFormItem> <NFormItem label="æåæºäº§é" path="tsQty"> <NInput v-model:value="model.tsQty" placeholder="请è¾å ¥æåæºäº§é" /> <NInputNumber v-model:value="model.tsQty" placeholder="请è¾å ¥æåæºäº§é" class="w-full" /> </NFormItem> <NFormItem label="主æºäº§éï¼å°å æºï¼" path="mainQty"> <NInput v-model:value="model.mainQty" placeholder="请è¾å ¥ä¸»æºäº§éï¼å°å æºï¼" /> <NInputNumber v-model:value="model.mainQty" placeholder="请è¾å ¥ä¸»æºäº§éï¼å°å æºï¼" class="w-full" /> </NFormItem> <NFormItem label="主æºåé¤é" path="mainBadQty"> <NInput v-model:value="model.mainBadQty" placeholder="请è¾å ¥ä¸»æºåé¤é" /> <NInputNumber v-model:value="model.mainBadQty" placeholder="请è¾å ¥ä¸»æºåé¤é" class="w-full" /> </NFormItem> <NFormItem label="éå æºäº§é" path="tbjQty"> <NInput v-model:value="model.tbjQty" placeholder="请è¾å ¥éå æºäº§é" /> <NInputNumber v-model:value="model.tbjQty" placeholder="请è¾å ¥éå æºäº§é" class="w-full" /> </NFormItem> <NFormItem label="éå æºåé¤å¥½å " path="tbjGdQty"> <NInput v-model:value="model.tbjGdQty" placeholder="请è¾å ¥éå æºåé¤å¥½å " /> <NInputNumber v-model:value="model.tbjGdQty" placeholder="请è¾å ¥éå æºåé¤å¥½å " class="w-full" /> </NFormItem> <NFormItem label="éå æºåé¤åå " path="tbjBadQty"> <NInput v-model:value="model.tbjBadQty" placeholder="请è¾å ¥éå æºåé¤åå " /> <NInputNumber v-model:value="model.tbjBadQty" placeholder="请è¾å ¥éå æºåé¤åå " class="w-full" /> </NFormItem> <NFormItem label="æå æºäº§é" path="pbjQty"> <NInput v-model:value="model.pbjQty" placeholder="请è¾å ¥æå æºäº§é" /> <NInputNumber v-model:value="model.pbjQty" placeholder="请è¾å ¥æå æºäº§é" class="w-full" /> </NFormItem> <NFormItem label="çæ¬¡" path="shift"> <NSelect v-model:value="model.shift" placeholder="è¯·éæ©çæ¬¡" :options="[{ value: '0', label: 'è¯·éæ©åå ¸çæ' }]" :options="[{ value: 0, label: 'è¯·éæ©åå ¸çæ' }]" clearable /> </NFormItem> @@ -287,7 +287,7 @@ <NSelect v-model:value="model.equNo" placeholder="è¯·éæ©è®¾å¤" :options="[{ value: '0', label: 'è¯·éæ©åå ¸çæ' }]" :options="[{ value: 0, label: 'è¯·éæ©åå ¸çæ' }]" clearable /> </NFormItem> ruoyi-plus-soybean/src/views/analy/store-silk/index.vue
@@ -10,6 +10,7 @@ import ButtonIcon from '@/components/custom/button-icon.vue'; import StoreSilkOperateDrawer from './modules/store-silk-operate-drawer.vue'; import StoreSilkSearch from './modules/store-silk-search.vue'; import StoreSilkDetail from './modules/store-silk-detail.vue'; defineOptions({ name: 'StoreSilkList' @@ -18,6 +19,9 @@ const appStore = useAppStore(); const { download } = useDownload(); const { hasAuth } = useAuth(); const selectedRollerDetailList = ref<any[]>([]); const selectedPackerDetailList = ref<any[]>([]); const searchParams = ref<Api.Analy.StoreSilkSearchParams>({ pageNum: 1, @@ -50,11 +54,6 @@ }, columns: () => [ { type: 'selection', align: 'center', width: 48 }, { key: 'index', title: $t('common.index'), align: 'center', @@ -74,16 +73,26 @@ minWidth: 130 }, { key: 'roller', title: 'å·æ¥äº§é', key: 'rollerOutput', title: 'å·æ¥äº§é(ç®±)', align: 'center', minWidth: 100 minWidth: 120, render: row => { const v = calcRollerBox((row as any).rollerOutput); if (v === null) return '-'; return v.toFixed(1); } }, { key: 'packer', title: 'å è£ äº§é', key: 'packerOutput', title: 'å è£ äº§é(ç®±)', align: 'center', minWidth: 100 minWidth: 120, render: row => { const v = calcPackerBox((row as any).packerOutput); if (v === null) return '-'; return v.toFixed(1); } }, { key: 'actualstarttime', @@ -120,60 +129,6 @@ title: 'æåå·(æ«ä½)', align: 'center', width: 160 }, { key: 'operate', title: $t('common.operate'), align: 'center', fixed: 'right', width: 130, render: row => { const divider = () => { if (!hasAuth('analy:storeSilk:edit') || !hasAuth('analy:storeSilk:remove')) { return null; } return <NDivider vertical />; }; const editBtn = () => { if (!hasAuth('analy:storeSilk:edit')) { return null; } return ( <ButtonIcon text type="primary" icon="material-symbols:drive-file-rename-outline-outline" tooltipContent={$t('common.edit')} onClick={() => edit(row.id)} /> ); }; const deleteBtn = () => { if (!hasAuth('analy:storeSilk:remove')) { return null; } return ( <ButtonIcon text type="error" icon="material-symbols:delete-outline" tooltipContent={$t('common.delete')} popconfirmContent={$t('common.confirmDelete')} onPositiveClick={() => handleDelete(row.id)} /> ); }; return ( <div class="flex-center gap-8px"> {editBtn()} {divider()} {deleteBtn()} </div> ); } } ] }); @@ -202,6 +157,30 @@ function handleExport() { download('/analy/storeSilk/export', searchParams.value, `å¨ä¸æäº§é_${new Date().getTime()}.xlsx`); } function calcRollerBox(val: unknown) { if (val === null || val === undefined) return null; const v = Number(val) / 50; if (!Number.isFinite(v)) return null; return v; } function calcPackerBox(val: unknown) { if (val === null || val === undefined) return null; const v = Number(val) / 10 / 250; if (!Number.isFinite(v)) return null; return v; } function handleRowClick(row: any) { return { onClick: () => { selectedRollerDetailList.value = row.rollerDetailList || []; selectedPackerDetailList.value = row.packerDetailList || []; }, style: 'cursor: pointer;' }; } </script> <template> @@ -213,8 +192,8 @@ v-model:columns="columnChecks" :disabled-delete="checkedRowKeys.length === 0" :loading="loading" :show-add="hasAuth('analy:storeSilk:add')" :show-delete="hasAuth('analy:storeSilk:remove')" :show-add="false" :show-delete="false" :show-export="hasAuth('analy:storeSilk:export')" @add="handleAdd" @delete="handleBatchDelete" @@ -243,7 +222,6 @@ </TableHeaderOperation> </template> <NDataTable v-model:checked-row-keys="checkedRowKeys" :columns="columns" :data="data" :size="tableSize" @@ -253,6 +231,7 @@ remote :row-key="row => row.id" :pagination="mobilePagination" :row-props="handleRowClick" class="sm:h-full" /> <StoreSilkOperateDrawer @@ -262,6 +241,11 @@ @submitted="getDataByPage" /> </NCard> <StoreSilkDetail :roller-detail-list="selectedRollerDetailList" :packer-detail-list="selectedPackerDetailList" class="h-[192px] overflow-hidden" /> </div> </template> ruoyi-plus-soybean/src/views/analy/store-silk/modules/store-silk-detail.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,173 @@ <script setup lang="tsx"> import { computed, ref } from 'vue'; import { NDataTable } from 'naive-ui'; import { $t } from '@/locales'; defineOptions({ name: 'StoreSilkDetail' }); interface StoreSilkDetailVo { fsNum: string; siloNum: string; pipeNum: string; equNo: string; shiftCode: string; shiftStartTime: string; shiftEndTime: string; output: number | null; } interface Props { rollerDetailList?: StoreSilkDetailVo[]; packerDetailList?: StoreSilkDetailVo[]; } const props = withDefaults(defineProps<Props>(), { rollerDetailList: () => [], packerDetailList: () => [] }); function calcRollerBox(val: unknown) { if (val === null || val === undefined) return null; const v = Number(val) / 50; if (!Number.isFinite(v)) return null; return v; } function calcPackerBox(val: unknown) { if (val === null || val === undefined) return null; const v = Number(val) / 10 / 250; if (!Number.isFinite(v)) return null; return v; } type DetailType = 'roller' | 'packer'; const detailType = ref<DetailType>('roller'); const detailList = computed(() => { return detailType.value === 'roller' ? props.rollerDetailList : props.packerDetailList; }); const columns: NaiveUI.TableColumn<StoreSilkDetailVo>[] = [ { key: 'index', title: $t('common.index'), align: 'center', width: 64, render: (_: any, index: number) => index + 1 }, { key: 'fsNum', title: 'å䏿ºå·', align: 'center', width: 100 }, { key: 'siloNum', title: 'å¨ä¸æå·', align: 'center', width: 100 }, { key: 'pipeNum', title: '管éå·', align: 'center', width: 100 }, { key: 'equNo', title: 'æºå°å·', align: 'center', width: 100 }, { key: 'shiftCode', title: 'çæ¬¡ä»£ç ', align: 'center', width: 100, render: (row: StoreSilkDetailVo) => { const map: Record<string, string> = { '1': 'æ©ç', '2': 'ä¸ç', '3': 'æç' }; return map[row.shiftCode] || row.shiftCode; } }, { key: 'shiftStartTime', title: 'çæ¬¡å¼å§æ¶é´', align: 'center', width: 160 }, { key: 'shiftEndTime', title: 'çæ¬¡ç»ææ¶é´', align: 'center', width: 160 }, { key: 'output', title: '产é(忝)', align: 'center', width: 120, render: (row: StoreSilkDetailVo) => { if (row.output === null || row.output === undefined) return '-'; const v = Number(row.output); if (!Number.isFinite(v)) return '-'; return v; } }, { key: 'outputBox', title: '产é(ç®±)', align: 'center', width: 100, render: (row: StoreSilkDetailVo) => { const v = detailType.value === 'roller' ? calcRollerBox(row.output) : calcPackerBox(row.output); if (v === null) return '-'; return v.toFixed(1); } } ]; </script> <template> <NCard title="产éæç»" :bordered="false" size="small" class="card-wrapper flex-col-stretch" :content-style="{ flex: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column' }" > <template #header-extra> <NSpace :size="8"> <NButton size="small" ghost :type="detailType === 'roller' ? 'primary' : 'default'" @click="detailType = 'roller'"> å·æ¥ </NButton> <NButton size="small" ghost :type="detailType === 'packer' ? 'primary' : 'default'" @click="detailType = 'packer'"> å è£ </NButton> </NSpace> </template> <div v-if="!detailList || detailList.length === 0" class="flex-center h-full text-gray-400"> 请ç¹å»ä¸æ¹è¡¨æ ¼è¡æ¥ç详æ </div> <NDataTable v-else :columns="columns as any" :data="detailList" flex-height class="flex-1-hidden" /> </NCard> </template> <style scoped> :deep(.n-card__content) { padding: 8px 12px; } </style> ruoyi-plus-soybean/src/views/analy/store-silk/modules/store-silk-operate-drawer.vue
@@ -162,16 +162,16 @@ /> </NFormItem> <NFormItem label="ææéé" path="jobinput"> <NInput v-model:value="model.jobinput" placeholder="请è¾å ¥ææéé" /> <NInputNumber v-model:value="model.jobinput" placeholder="请è¾å ¥ææéé" class="w-full" /> </NFormItem> <NFormItem label="æèéé" path="weightloss"> <NInput v-model:value="model.weightloss" placeholder="请è¾å ¥æèéé" /> <NInputNumber v-model:value="model.weightloss" placeholder="请è¾å ¥æèéé" class="w-full" /> </NFormItem> <NFormItem label="åºå¶ä¸ç" path="slkrate"> <NInput v-model:value="model.slkrate" placeholder="请è¾å ¥åºå¶ä¸ç" /> <NInputNumber v-model:value="model.slkrate" placeholder="请è¾å ¥åºå¶ä¸ç" class="w-full" /> </NFormItem> <NFormItem label="å¨ä¸æéé" path="weight"> <NInput v-model:value="model.weight" placeholder="请è¾å ¥å¨ä¸æéé" /> <NInputNumber v-model:value="model.weight" placeholder="请è¾å ¥å¨ä¸æéé" class="w-full" /> </NFormItem> <NFormItem label="å¨ä¸æåºæå¼å§æ¶é´" path="distimebegin"> <NDatePicker ruoyi-plus-soybean/src/views/md/shift/modules/shift-operate-drawer.vue
@@ -154,7 +154,7 @@ <NDrawerContent :title="title" :native-scrollbar="false" closable> <NForm ref="formRef" :model="model" :rules="rules"> <NFormItem label="车é´å¤é®" path="wsId"> <NInput v-model:value="model.wsId" placeholder="请è¾å ¥è½¦é´å¤é®" /> <NInputNumber v-model:value="model.wsId as any" placeholder="请è¾å ¥è½¦é´å¤é®" class="w-full" /> </NFormItem> <NFormItem label="ç¼ç " path="code"> <NInput v-model:value="model.code" placeholder="请è¾å ¥ç¼ç " /> @@ -169,13 +169,13 @@ <NInput v-model:value="model.etim" placeholder="请è¾å ¥çæ¬¡ç»ææ¶é´" /> </NFormItem> <NFormItem label="æåº" path="seq"> <NInput v-model:value="model.seq" placeholder="请è¾å ¥æåº" /> <NInputNumber v-model:value="model.seq" placeholder="请è¾å ¥æåº" class="w-full" /> </NFormItem> <NFormItem label="å¯ç¨" path="enable"> <NInput v-model:value="model.enable" placeholder="请è¾å ¥å¯ç¨" /> <NInputNumber v-model:value="model.enable" placeholder="请è¾å ¥å¯ç¨" class="w-full" /> </NFormItem> <NFormItem label="å é¤" path="del"> <NInput v-model:value="model.del" placeholder="请è¾å ¥å é¤" /> <NInputNumber v-model:value="model.del" placeholder="请è¾å ¥å é¤" class="w-full" /> </NFormItem> <NFormItem label="åå»ºç¨æ·" path="createUserName"> <NInput v-model:value="model.createUserName" placeholder="请è¾å ¥åå»ºç¨æ·" /> ruoyi-plus-soybean/src/views/md/shift/modules/shift-search.vue
@@ -49,7 +49,7 @@ <NInput v-model:value="model.name" placeholder="请è¾å ¥åç§°" /> </NFormItemGi> <NFormItemGi span="24 s:12 m:6" label="å¯ç¨" label-width="auto" path="enable" class="pr-24px"> <NInput v-model:value="model.enable" placeholder="请è¾å ¥å¯ç¨" /> <NInputNumber v-model:value="model.enable" placeholder="请è¾å ¥å¯ç¨" class="w-full" /> </NFormItemGi> <NFormItemGi :show-feedback="false" span="24" class="pr-24px"> <NSpace class="w-full" justify="end"> ruoyi-plus-soybean/src/views/qm/batch/modules/batch-operate-drawer.vue
@@ -344,7 +344,7 @@ <NInput v-model:value="model.enabled" placeholder="请è¾å ¥å¯ç¨æ å¿" /> </NFormItem> <NFormItem label="å°è´§æ»é" path="totalNum"> <NInput v-model:value="model.totalNum" placeholder="请è¾å ¥å°è´§æ»é" /> <NInputNumber v-model:value="model.totalNum" placeholder="请è¾å ¥å°è´§æ»é" class="w-full" /> </NFormItem> <NFormItem label="综åå¤å®" path="results"> <NInput v-model:value="model.results" placeholder="请è¾å ¥ç»¼åå¤å®" /> @@ -395,7 +395,7 @@ /> </NFormItem> <NFormItem label="å 餿 å¿" path="deleted"> <NInput v-model:value="model.deleted" placeholder="请è¾å ¥å 餿 å¿" /> <NInputNumber v-model:value="model.deleted" placeholder="请è¾å ¥å 餿 å¿" class="w-full" /> </NFormItem> <NFormItem label="æ¹æ¬¡æè¿°" path="batchDes"> <NInput v-model:value="model.batchDes" placeholder="请è¾å ¥æ¹æ¬¡æè¿°" /> @@ -413,13 +413,13 @@ <NInput v-model:value="model.boxno" placeholder="请è¾å ¥è£ ç®±å·" /> </NFormItem> <NFormItem label="ç¶æ¹æ¬¡å·" path="pid"> <NInput v-model:value="model.pid" placeholder="请è¾å ¥ç¶æ¹æ¬¡å·" /> <NInput v-model:value="model.pid as any" placeholder="请è¾å ¥ç¶æ¹æ¬¡å·" /> </NFormItem> <NFormItem label="夿 ¸äºº" path="reviewer"> <NInput v-model:value="model.reviewer" placeholder="请è¾å ¥å¤æ ¸äºº" /> </NFormItem> <NFormItem label="夿£æ¬¡æ°" path="rvcount"> <NInput v-model:value="model.rvcount" placeholder="请è¾å ¥å¤æ£æ¬¡æ°" /> <NInputNumber v-model:value="model.rvcount" placeholder="请è¾å ¥å¤æ£æ¬¡æ°" class="w-full" /> </NFormItem> <NFormItem label="æ¹æ¬¡ç¶æ" path="state"> <NInput v-model:value="model.state" placeholder="请è¾å ¥æ¹æ¬¡ç¶æ" /> ruoyi-plus-soybean/src/views/qm/batch/modules/batch-search.vue
@@ -116,7 +116,7 @@ /> </NFormItemGi> <NFormItemGi span="24 s:12 m:8" label="å 餿 å¿" label-width="auto" path="deleted" class="pr-24px"> <NInput v-model:value="model.deleted" placeholder="请è¾å ¥å 餿 å¿" /> <NInputNumber v-model:value="model.deleted" placeholder="请è¾å ¥å 餿 å¿" class="w-full" /> </NFormItemGi> <NFormItemGi span="24 s:12 m:8" label="ç±»å«" label-width="auto" path="category" class="pr-24px"> <NSelect v-model:value="model.category" :options="categoryOptions" placeholder="è¯·éæ©ç±»å«" clearable />