From 032efd9aaee7660fa061d3ad887df3f69520eb32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=AB=E7=8C=ABguowen?= <9290821+guowen-the-cat@user.noreply.gitee.com> Date: Thu, 18 Dec 2025 16:56:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E5=AD=97=E5=AD=AA=E7=94=9F=EF=BC=9A?= =?UTF-8?q?=E8=B4=A7=E4=BD=8D=E3=80=81=E5=BA=93=E5=AD=98=E3=80=81=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/api/controller/TwinController.java | 39 +++ .../com/ruoyi/api/service/ITwinService.java | 8 + .../api/service/impl/TwinServiceImpl.java | 253 ++++++++++++++++++ .../bas/cargoSpace/domain/BasCargoSpace.java | 9 + .../mapper/BasCargoSpaceMapper.java | 7 + .../service/IBasCargoSpaceService.java | 7 + .../impl/BasCargoSpaceServiceImpl.java | 10 + .../bas/cargoSpace/BasCargoSpaceMapper.xml | 16 ++ 8 files changed, 349 insertions(+) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/api/controller/TwinController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/api/service/ITwinService.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/TwinServiceImpl.java 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..a2eb5ca --- /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.bas.cargoSpace.domain.BasCargoSpace; +import com.ruoyi.bas.cargoSpace.service.IBasCargoSpaceService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.api.service.ITwinService; +import com.ruoyi.stock.stock.domain.BasStock; +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.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api2wms/twin") +public class TwinController { + + @Autowired + private IBasCargoSpaceService basCargoSpaceService; + + @Autowired + private ITwinService twinService; + + @GetMapping("/getEmptyCargoSpace") + public AjaxResult getEmptyCargoSpace() { + List list = basCargoSpaceService.selectCargoSpaceWithStock(); + return AjaxResult.success(list); + } + + @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..cbca6a6 --- /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.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; +import java.time.temporal.WeekFields; + +@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.getLotNo()); + 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/domain/BasCargoSpace.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/domain/BasCargoSpace.java index fce6d1a..cba0e6b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/domain/BasCargoSpace.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargoSpace/domain/BasCargoSpace.java @@ -1,5 +1,6 @@ package com.ruoyi.bas.cargoSpace.domain; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.annotation.Excel; @@ -104,4 +105,12 @@ Y锁、N开 */ private String spare7; private String stockStatus; + + /** 物料编码 */ + @TableField(exist = false) + private String productId; + + /** 物料名称 */ + @TableField(exist = false) + private String productName; } 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 b14e2cf..828c341 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 @@ -92,5 +92,12 @@ public interface BasCargoSpaceMapper extends BaseMapper */ public List selectBasCargoSpaceListByRoadway(BasCargoSpace basCargoSpace); + /** + * 数字孪生用:查询库存信息(关联物料信息) + * + * @return 库存信息集合 + */ + public List selectCargoSpaceWithStock(); + void lockedCargoSpace(BasCargoSpace basCargoSpace); } 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 c8c33f1..5b85bdd 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 @@ -84,4 +84,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 225ee6e..085380b 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 @@ -130,4 +130,14 @@ public class BasCargoSpaceServiceImpl extends ServiceImpl selectCargoSpaceWithStock() { + return basCargoSpaceMapper.selectCargoSpaceWithStock(); + } } 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 5da1c16..33ba8d5 100644 --- a/ruoyi-admin/src/main/resources/mapper/bas/cargoSpace/BasCargoSpaceMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/bas/cargoSpace/BasCargoSpaceMapper.xml @@ -228,6 +228,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ORDER BY the_platoon, the_floor,the_column + +