From 9c1c77089f78ccf12649ea265d419976cd92ee46 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: Fri, 5 Dec 2025 13:17:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/controller/StockScreenController.java | 31 ++++ .../api/service/IStockScreenService.java | 9 ++ .../service/impl/StockScreenServiceImpl.java | 137 ++++++++++++++++++ 3 files changed, 177 insertions(+) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/api/controller/StockScreenController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/api/service/IStockScreenService.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/StockScreenServiceImpl.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/StockScreenController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/StockScreenController.java new file mode 100644 index 0000000..b08849b --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/StockScreenController.java @@ -0,0 +1,31 @@ +package com.ruoyi.api.controller; + +import com.ruoyi.api.service.IStockScreenService; +import com.ruoyi.common.core.domain.AjaxResult; +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; + +@RestController +@RequestMapping("/api/stock") +public class StockScreenController { + + @Autowired + private IStockScreenService stockScreenService; + + @GetMapping("/all") + public AjaxResult getAllStocks() { + return AjaxResult.success(stockScreenService.getAllStocksWithTotal()); + } + + @GetMapping("/cargoSpace/pie") + public AjaxResult getCargoSpacePie() { + return AjaxResult.success(stockScreenService.getCargoSpacePie()); + } + + @GetMapping("/inout/stat") + public AjaxResult getInOutStat() { + return AjaxResult.success(stockScreenService.getInOutSummary()); + } +} \ No newline at end of file diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/IStockScreenService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IStockScreenService.java new file mode 100644 index 0000000..83988fc --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/IStockScreenService.java @@ -0,0 +1,9 @@ +package com.ruoyi.api.service; + +import java.util.Map; + +public interface IStockScreenService { + Map getAllStocksWithTotal(); + Map getCargoSpacePie(); + Map getInOutSummary(); +} \ No newline at end of file diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/StockScreenServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/StockScreenServiceImpl.java new file mode 100644 index 0000000..3d9b193 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/impl/StockScreenServiceImpl.java @@ -0,0 +1,137 @@ +package com.ruoyi.api.service.impl; + +import com.ruoyi.api.service.IStockScreenService; +import com.ruoyi.bas.cargoSpace.mapper.BasCargoSpaceMapper; +import com.ruoyi.stock.stock.domain.BasStock; +import com.ruoyi.stock.stock.service.IBasStockService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class StockScreenServiceImpl implements IStockScreenService { + + @Autowired + private IBasStockService basStockService; + @Autowired + private BasCargoSpaceMapper basCargoSpaceMapper; + @Autowired + private JdbcTemplate jdbcTemplate; + + @Override + public Map getAllStocksWithTotal() { + List list = basStockService.selectBasStockListApi(new BasStock()); + BigDecimal total = BigDecimal.ZERO; + for (BasStock s : list) { + String q = s.getQuantity(); + if (q != null && !q.trim().isEmpty()) { + try { + total = total.add(new BigDecimal(q.trim())); + } catch (Exception ignored) { + } + } + } + Map result = new HashMap<>(); + List topList = list.size() > 50 ? list.subList(0, 50) : list; + result.put("stockMsg", topList); + result.put("totalQuantity", total); + return result; + } + + @Override + public Map getCargoSpacePie() { + List> statusCounts = basCargoSpaceMapper.selectStatusCount(); + Map countMap = new HashMap<>(); + for (Map m : statusCounts) { + Object status = m.get("status"); + Object count = m.get("count"); + if (status != null && count != null) { + try { + countMap.put(String.valueOf(status), Integer.parseInt(String.valueOf(count))); + } catch (Exception ignored) { + } + } + } + int totalCount = 0; + for (Integer v : countMap.values()) { + totalCount += v != null ? v : 0; + } + List> pie = new ArrayList<>(); + Map i1 = new HashMap<>(); i1.put("value", countMap.getOrDefault("1", 0)); i1.put("name", "空货位"); pie.add(i1); + Map i2 = new HashMap<>(); i2.put("value", countMap.getOrDefault("2", 0)); i2.put("name", "满货位"); pie.add(i2); + Map i3 = new HashMap<>(); i3.put("value", countMap.getOrDefault("3", 0)); i3.put("name", "入库已分配"); pie.add(i3); + Map i4 = new HashMap<>(); i4.put("value", countMap.getOrDefault("4", 0)); i4.put("name", "出库已分配"); pie.add(i4); + Map i5 = new HashMap<>(); i5.put("value", countMap.getOrDefault("5", 0)); i5.put("name", "入库需盘点"); pie.add(i5); + Map i6 = new HashMap<>(); i6.put("value", countMap.getOrDefault("6", 0)); i6.put("name", "出库需盘点"); pie.add(i6); + Map result = new HashMap<>(); + result.put("pie", pie); + result.put("totalCargoSpace", totalCount); + return result; + } + + @Override + public Map getInOutSummary() { + java.time.LocalDate now = java.time.LocalDate.now(); + java.time.format.DateTimeFormatter dFmt = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd"); + java.time.format.DateTimeFormatter mFmt = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"); + String todayPrefix = now.format(dFmt); + int dIn = countLike("in_stockin_finish", todayPrefix); + int dOut = countLike("out_stockout_finish", todayPrefix); + + java.time.LocalDate monday = now.with(java.time.DayOfWeek.MONDAY); + List wkIn = new ArrayList<>(); + List wkOut = new ArrayList<>(); + for (int i = 0; i < 7; i++) { + java.time.LocalDate day = monday.plusDays(i); + String p = day.format(dFmt); + wkIn.add(countLike("in_stockin_finish", p)); + wkOut.add(countLike("out_stockout_finish", p)); + } + + int year = now.getYear(); + List> monthStat = new ArrayList<>(); + for (int m = 1; m <= 12; m++) { + java.time.LocalDate mm = java.time.LocalDate.of(year, m, 1); + String mp = mm.format(mFmt); + int mi = countLikeMonth("in_stockin_finish", mp); + int mo = countLikeMonth("out_stockout_finish", mp); + Map item = new HashMap<>(); + item.put("mouth", String.valueOf(m)); + item.put("入库", mi); + item.put("出库", mo); + monthStat.add(item); + } + + Map res = new HashMap<>(); + res.put("drrk", String.valueOf(dIn)); + res.put("drck", String.valueOf(dOut)); + res.put("bzrk", wkIn); + res.put("bzck", wkOut); + res.put("statistic", monthStat); + return res; + } + + private int countLike(String table, String dayPrefix) { + try { + Integer c = jdbcTemplate.queryForObject("SELECT COUNT(1) FROM " + table + " WHERE create_date LIKE ?", Integer.class, dayPrefix + "%"); + return c == null ? 0 : c; + } catch (Exception e) { + return 0; + } + } + + private int countLikeMonth(String table, String monthPrefix) { + try { + Integer c = jdbcTemplate.queryForObject("SELECT COUNT(1) FROM " + table + " WHERE create_date LIKE ?", Integer.class, monthPrefix + "%"); + return c == null ? 0 : c; + } catch (Exception e) { + return 0; + } + } +} \ No newline at end of file