diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/TwinController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/TwinController.java new file mode 100644 index 0000000..7cb80c5 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/TwinController.java @@ -0,0 +1,39 @@ +package com.ruoyi.api.controller; + +import com.ruoyi.api.service.ITwinService; +import com.ruoyi.bas.cargoSpace.domain.BasCargoSpace; +import com.ruoyi.bas.cargoSpace.service.IBasCargoSpaceService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.annotation.Anonymous; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api2wms/twin") +public class TwinController { + + @Autowired + private IBasCargoSpaceService basCargoSpaceService; + + @Autowired + private ITwinService twinService; + + @Anonymous + @GetMapping("/getEmptyCargoSpace") + public AjaxResult getEmptyCargoSpace() { + List list = basCargoSpaceService.selectCargoSpaceWithStock(); + return AjaxResult.success(list); + } + + @Anonymous + @GetMapping("/getStockList") + public Map getStockList() { + return twinService.getStockListOverview(); + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/ITwinService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/ITwinService.java new file mode 100644 index 0000000..1a7ff85 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/ITwinService.java @@ -0,0 +1,8 @@ +package com.ruoyi.api.service; + +import java.util.Map; + +public interface ITwinService { + Map getStockListOverview(); +} + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/TwinServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/TwinServiceImpl.java new file mode 100644 index 0000000..33bb28d --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/TwinServiceImpl.java @@ -0,0 +1,253 @@ +package com.ruoyi.api.service.impl; + +import com.ruoyi.api.service.ITwinService; +import com.ruoyi.bas.cargoSpace.domain.BasCargoSpace; +import com.ruoyi.bas.cargoSpace.service.IBasCargoSpaceService; +import com.ruoyi.in.stockinfinish.domain.InStockinFinish; +import com.ruoyi.in.stockinfinish.service.IInStockinFinishService; +import com.ruoyi.out.outStockoutFinish.domain.OutStockoutFinish; +import com.ruoyi.out.outStockoutFinish.service.IOutStockoutFinishService; +import com.ruoyi.stock.stock.domain.BasStock; +import com.ruoyi.stock.stock.service.IBasStockService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.YearMonth; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.WeekFields; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class TwinServiceImpl implements ITwinService { + @Autowired + private IBasStockService basStockService; + @Autowired + private IBasCargoSpaceService basCargoSpaceService; + @Autowired + private IInStockinFinishService inStockinFinishService; + @Autowired + private IOutStockoutFinishService outStockoutFinishService; + + @Override + public Map getStockListOverview() { + BasStock basStock = new BasStock(); + List list = basStockService.selectBasStockList(basStock); + List> stockList = new ArrayList<>(); + int limit = Math.min(list.size(), 50); + for (int i = 0; i < limit; i++) { + BasStock stock = list.get(i); + Map map = new HashMap<>(); + map.put("productCode", stock.getProductId()); + map.put("productName", stock.getProductName()); + map.put("lotNo", stock.getTrayCode()); + map.put("quantity", stock.getQuantity() != null ? stock.getQuantity().toString() : "0"); + stockList.add(map); + } + + List cargoSpaces = basCargoSpaceService.selectBasCargoSpaceList(new BasCargoSpace()); + int ky = 0; + int zy = 0; + int sd = 0; + int zs = cargoSpaces.size(); + int c1 = 0; + int c2 = 0; + int c3 = 0; + int c4 = 0; + int c5 = 0; + int c6 = 0; + for (BasCargoSpace cs : cargoSpaces) { + String s = cs.getStatus(); + if ("1".equals(s) || "3".equals(s) || "5".equals(s)) { + ky++; + } else if ("2".equals(s) || "4".equals(s) || "6".equals(s)) { + zy++; + } + if ("1".equals(s)) { + c1++; + } else if ("2".equals(s)) { + c2++; + } else if ("3".equals(s)) { + c3++; + } else if ("4".equals(s)) { + c4++; + } else if ("5".equals(s)) { + c5++; + } else if ("6".equals(s)) { + c6++; + } + if ("Y".equalsIgnoreCase(cs.getLocked())) { + sd++; + } + } + Map information = new HashMap<>(); + information.put("ky", String.valueOf(ky)); + information.put("zy", String.valueOf(zy)); + information.put("sd", String.valueOf(sd)); + information.put("zs", String.valueOf(zs)); + + Map result = new HashMap<>(); + result.put("stock", stockList); + result.put("information", information); + List charts = new ArrayList<>(); + charts.add(c1); + charts.add(c2); + charts.add(c3); + charts.add(c4); + charts.add(c5); + charts.add(c6); + result.put("charts", charts); + + List finishes = inStockinFinishService.selectInStockinFinishList(new InStockinFinish()); + LocalDate today = LocalDate.now(ZoneId.systemDefault()); + WeekFields wf = WeekFields.ISO; + LocalDate weekStart = today.with(wf.dayOfWeek(), 1); + LocalDate weekEnd = today.with(wf.dayOfWeek(), 7); + int[] weekCounts = new int[7]; + DateTimeFormatter[] fmts = new DateTimeFormatter[] { + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"), + DateTimeFormatter.ofPattern("yyyy-MM-dd"), + DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"), + DateTimeFormatter.ofPattern("yyyy/MM/dd") + }; + for (InStockinFinish f : finishes) { + String cd = f.getCreateDate(); + if (cd == null || cd.isEmpty()) continue; + LocalDate date = null; + for (DateTimeFormatter fmt : fmts) { + try { + if (fmt.toString().contains("H")) { + LocalDateTime dt = LocalDateTime.parse(cd, fmt); + date = dt.toLocalDate(); + } else { + date = LocalDate.parse(cd, fmt); + } + break; + } catch (Exception ignored) { + } + } + if (date == null) continue; + if (!date.isBefore(weekStart) && !date.isAfter(weekEnd)) { + int idx = date.getDayOfWeek().getValue() - 1; + weekCounts[idx]++; + } + } + List weekData = new ArrayList<>(); + for (int i = 0; i < 7; i++) { + weekData.add(String.valueOf(weekCounts[i])); + } + Map weekInStock = new HashMap<>(); + weekInStock.put("time", List.of("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")); + weekInStock.put("data", weekData); + result.put("weekInStock", weekInStock); + + YearMonth ym = YearMonth.now(ZoneId.systemDefault()); + int daysInMonth = ym.lengthOfMonth(); + int[] monthCounts = new int[daysInMonth]; + for (InStockinFinish f : finishes) { + String cd = f.getCreateDate(); + if (cd == null || cd.isEmpty()) continue; + LocalDate date = null; + for (DateTimeFormatter fmt : fmts) { + try { + if (fmt.toString().contains("H")) { + LocalDateTime dt = LocalDateTime.parse(cd, fmt); + date = dt.toLocalDate(); + } else { + date = LocalDate.parse(cd, fmt); + } + break; + } catch (Exception ignored) { + } + } + if (date == null) continue; + if (YearMonth.from(date).equals(ym)) { + int d = date.getDayOfMonth(); + monthCounts[d - 1]++; + } + } + List monthTime = new ArrayList<>(); + List monthData = new ArrayList<>(); + for (int i = 1; i <= daysInMonth; i++) { + monthTime.add(i); + monthData.add(monthCounts[i - 1]); + } + Map monthInStock = new HashMap<>(); + monthInStock.put("time", monthTime); + monthInStock.put("data", monthData); + result.put("monthInStock", monthInStock); + + List outFinishes = outStockoutFinishService.selectOutStockoutFinishList(new OutStockoutFinish()); + int[] weekCountsOut = new int[7]; + for (OutStockoutFinish f : outFinishes) { + String cd = f.getCreateDate(); + if (cd == null || cd.isEmpty()) continue; + LocalDate date = null; + for (DateTimeFormatter fmt : fmts) { + try { + if (fmt.toString().contains("H")) { + LocalDateTime dt = LocalDateTime.parse(cd, fmt); + date = dt.toLocalDate(); + } else { + date = LocalDate.parse(cd, fmt); + } + break; + } catch (Exception ignored) { + } + } + if (date == null) continue; + if (!date.isBefore(weekStart) && !date.isAfter(weekEnd)) { + int idx = date.getDayOfWeek().getValue() - 1; + weekCountsOut[idx]++; + } + } + List weekDataOut = new ArrayList<>(); + for (int i = 0; i < 7; i++) { + weekDataOut.add(String.valueOf(weekCountsOut[i])); + } + Map weekOutStock = new HashMap<>(); + weekOutStock.put("time", List.of("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")); + weekOutStock.put("data", weekDataOut); + result.put("weekOutStock", weekOutStock); + + int[] monthCountsOut = new int[daysInMonth]; + for (OutStockoutFinish f : outFinishes) { + String cd = f.getCreateDate(); + if (cd == null || cd.isEmpty()) continue; + LocalDate date = null; + for (DateTimeFormatter fmt : fmts) { + try { + if (fmt.toString().contains("H")) { + LocalDateTime dt = LocalDateTime.parse(cd, fmt); + date = dt.toLocalDate(); + } else { + date = LocalDate.parse(cd, fmt); + } + break; + } catch (Exception ignored) { + } + } + if (date == null) continue; + if (YearMonth.from(date).equals(ym)) { + int d = date.getDayOfMonth(); + monthCountsOut[d - 1]++; + } + } + List monthTimeOut = new ArrayList<>(); + List monthDataOut = new ArrayList<>(); + for (int i = 1; i <= daysInMonth; i++) { + monthTimeOut.add(i); + monthDataOut.add(monthCountsOut[i - 1]); + } + Map monthOutStock = new HashMap<>(); + monthOutStock.put("time", monthTimeOut); + monthOutStock.put("data", monthDataOut); + result.put("monthOutStock", monthOutStock); + return result; + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/mapper/BasCargoSpaceMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/mapper/BasCargoSpaceMapper.java index 8358230..da2cddd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/mapper/BasCargoSpaceMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/mapper/BasCargoSpaceMapper.java @@ -84,4 +84,11 @@ public interface BasCargoSpaceMapper extends BaseMapper * @return 库存信息集合 */ public List selectBasCargoSpaceListByRoadway(BasCargoSpace basCargoSpace); + + /** + * 数字孪生用:查询库存信息(关联物料信息) + * + * @return 库存信息集合 + */ + public List selectCargoSpaceWithStock(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/service/IBasCargoSpaceService.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/service/IBasCargoSpaceService.java index 42c6ead..756d70d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/service/IBasCargoSpaceService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/service/IBasCargoSpaceService.java @@ -76,4 +76,11 @@ public interface IBasCargoSpaceService extends IService * @return 库存信息集合 */ public List selectBasCargoSpaceListByRoadway(BasCargoSpace basCargoSpace); + + /** + * 数字孪生用:查询库存信息(关联物料信息) + * + * @return 库存信息集合 + */ + public List selectCargoSpaceWithStock(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/service/impl/BasCargoSpaceServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/service/impl/BasCargoSpaceServiceImpl.java index 65ff0bd..9b7c5fa 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/service/impl/BasCargoSpaceServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/service/impl/BasCargoSpaceServiceImpl.java @@ -113,4 +113,13 @@ public class BasCargoSpaceServiceImpl extends ServiceImpl selectCargoSpaceWithStock() { + return basCargoSpaceMapper.selectCargoSpaceWithStock(); + } } diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 4aab4eb..e23a67a 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -16,7 +16,7 @@ ruoyi: # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 - port: 8081 + port: 8080 servlet: # 应用的访问路径 context-path: / diff --git a/ruoyi-admin/src/main/resources/mapper/bas/cargoSpace/BasCargoSpaceMapper.xml b/ruoyi-admin/src/main/resources/mapper/bas/cargoSpace/BasCargoSpaceMapper.xml index 1286d57..0b306a1 100644 --- a/ruoyi-admin/src/main/resources/mapper/bas/cargoSpace/BasCargoSpaceMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/bas/cargoSpace/BasCargoSpaceMapper.xml @@ -195,6 +195,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ORDER BY the_platoon, the_floor,the_column +