From c216a6a9ee53ef3f6b683d20a91d72a3ad236a08 Mon Sep 17 00:00:00 2001
From: sgj <1442489573@qq.com>
Date: 星期一, 22 十二月 2025 15:32:34 +0800
Subject: [PATCH] 添加库存报表

---
 fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SuperInventoryReportService.java |  282 +++++++++++++++++++++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/DepotStore.java                   |    4 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/data/SuperInventoryReportData.java       |   70 +++++
 fzzy-igdss-view/src/main/java/com/fzzy/igds/SuperInventoryReport.view.xml            |  287 ++++++++++++++++++++++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/data/SuperInventoryReportParam.java      |   27 ++
 fzzy-igdss-view/src/main/java/com/fzzy/igds/SuperInventoryReportPR.java              |   73 +++++
 6 files changed, 741 insertions(+), 2 deletions(-)

diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/SuperInventoryReportData.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/SuperInventoryReportData.java
new file mode 100644
index 0000000..66abbd6
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/SuperInventoryReportData.java
@@ -0,0 +1,70 @@
+package com.fzzy.igds.data;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *鐩戠搴撳瓨鎶ヨ〃鏁版嵁
+ *
+ * @author sgj
+ * @date 2025/12/19
+
+ */
+@Data
+public class SuperInventoryReportData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鏀跺偍鍏徃
+     */
+    private String customerName;
+
+    /**
+     * 鎵�灞炲簱鍖�
+     */
+    private String deptId;
+
+    /**
+     * 鎵�灞炰粨搴�
+     */
+    private String depotId;
+
+
+    /**
+     * 鏈熷垵鏁伴噺(鍗曚綅KG)
+     */
+    private Double initialWeight = 0.0;
+
+    /**
+     * 鍏ュ簱鏁伴噺(鍗曚綅KG)
+     */
+    private Double recordInWeight = 0.0;
+
+    /**
+     * 鍊掑叆鏁伴噺(鍗曚綅KG)
+     */
+    private Double changeInWeight = 0.0;
+
+    /**
+     * 鍑哄簱鏁伴噺(鍗曚綅KG)
+     */
+    private Double recordOutWeight = 0.0;
+
+    /**
+     * 鍊掑嚭鏁伴噺(鍗曚綅KG)
+     */
+    private Double changeOutWeight = 0.0;
+
+    /**
+     * 鎹熻�楁暟閲�(鍗曚綅KG)
+     */
+    private Double lossWeight = 0.0;
+
+    /**
+     * 鏈熸湯鏁伴噺(鍗曚綅KG)
+     */
+    private Double finalWeight = 0.0;
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/SuperInventoryReportParam.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/SuperInventoryReportParam.java
new file mode 100644
index 0000000..956843a
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/SuperInventoryReportParam.java
@@ -0,0 +1,27 @@
+package com.fzzy.igds.data;
+
+
+import lombok.Data;
+
+/**
+ *鐩戠搴撳瓨鎶ヨ〃鏌ヨ瀹炰綋绫�
+ *
+ * @author sgj
+ * @date 2025/12/19
+
+ */
+@Data
+public class SuperInventoryReportParam extends IgdsBaseParam {
+
+    //    鏀跺偍鍏徃
+    private String customerName;
+
+    private String title;
+
+    private String timeDesc;
+
+    private String createUser;
+
+    private String createTime;
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/DepotStore.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/DepotStore.java
index 3e5732a..f70328a 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/DepotStore.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/DepotStore.java
@@ -56,8 +56,8 @@
     @TableField("food_level")
     private String foodLevel;
 
-    @Column(name = "food_locationId", columnDefinition = "varchar(40) COMMENT '绮浜у湴'")
-    @TableField("food_locationId")
+    @Column(name = "food_location_id", columnDefinition = "varchar(40) COMMENT '绮浜у湴'")
+    @TableField("food_location_id")
     private String foodLocationId;
 
     @Column(name = "food_location", columnDefinition = "varchar(40) COMMENT '绮浜у湴'")
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SuperInventoryReportService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SuperInventoryReportService.java
new file mode 100644
index 0000000..be3b45f
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SuperInventoryReportService.java
@@ -0,0 +1,282 @@
+package com.fzzy.igds.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fzzy.igds.constant.Constant;
+import com.fzzy.igds.data.SuperInventoryReportData;
+import com.fzzy.igds.data.SuperInventoryReportParam;
+import com.fzzy.igds.domain.*;
+import com.fzzy.igds.mapper.*;
+import com.fzzy.igds.utils.ContextUtil;
+import com.fzzy.igds.utils.DateUtil;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鐩戠搴撳瓨鎶ヨ〃Service
+ *
+ * @author sgj
+ * @date 2025/12/19
+ */
+@Slf4j
+@Service
+public class SuperInventoryReportService {
+
+    @Resource
+    private DepotStoreMapper depotStoreMapper;
+    @Resource
+    private InoutRecordMapper inoutRecordMapper;
+    @Resource
+    private InoutStockChangeMapper inoutStockChangeMapper;
+    @Resource
+    private CoreCompanyMapper coreCompanyMapper;
+    @Resource
+    private InoutLossOverMapper inoutLossOverMapper;
+
+    @Resource
+    private CoreDeptService coreDeptService;
+    @Resource
+    private DepotService depotService;
+
+    /**
+     * 鏌ヨ鎶ヨ〃鏁版嵁
+     *
+     * @author sgj
+     * @date 2025/12/19
+     * @param param
+
+     */
+    public List<SuperInventoryReportData> listSuperInventoryReportData(SuperInventoryReportParam param) {
+        //1.鑾峰彇鏌ヨ寰楄捣姝㈡椂闂达紝濡傛灉娌℃湁鍒欙紝榛樿鎴鏃堕棿涓哄綋澶╋紝璧峰鏃堕棿涓�30澶╁墠
+        Date end = new Date();
+        Date start = DateUtil.getNewByDay(end, -30);
+        if (null == param.getStart()) {
+            param.setStart(DateUtil.getCurZero(start));
+        }
+        if (null == param.getEnd()) {
+            param.setEnd(DateUtil.getCurZero(end));
+        }
+
+        //榛樿缁勭粐缂栫爜
+        String companyId = ContextUtil.getCompanyId();
+        //榛樿搴撳尯缂栫爜
+        String deptId = ContextUtil.subDeptId(null);
+        param.setCompanyId(companyId);
+        if (StringUtils.isEmpty(param.getDeptId())) {
+            param.setDeptId(deptId);
+        }
+
+        //region 鍒濆鍖栭渶瑕佽寖鍥寸殑鏁版嵁
+        Map<String, SuperInventoryReportData> resultMap = new HashMap<>();
+        //鏌ヨ褰撳墠鐢ㄦ埛涓嬪睘鐨勬墍鏈夊簱鍖�
+        List<Dept> deptList = coreDeptService.getDeptData();
+        if (null == deptList || deptList.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        //棰勫姞杞芥墍鏈夐儴闂ㄤ笅鐨勪粨搴撲俊鎭紝鍑忓皯閲嶅鏌ヨ
+        Map<String, List<Depot>> deptDepotsMap = new HashMap<>();
+        Map<String, Company> companyCache = new HashMap<>();
+
+        for (Dept dept : deptList) {
+            //鑾峰彇搴撳尯涓嬫墍鏈変粨搴�
+            List<Depot> depotList = depotService.getData(companyId, dept.getId(), true);
+            if (null == depotList || depotList.isEmpty()) {
+                continue;
+            }
+            deptDepotsMap.put(dept.getId(), depotList);
+
+            //缂撳瓨鍏徃淇℃伅
+            int deptIdLength = dept.getId().length();
+            String companyCode = dept.getId().substring(0, deptIdLength - 3);
+            if (!companyCache.containsKey(companyCode)) {
+                Company company = coreCompanyMapper.selectById(companyCode);
+                companyCache.put(companyCode, company);
+            }
+        }
+
+        //鏋勫缓缁撴灉鏁版嵁
+        for (Map.Entry<String, List<Depot>> entry : deptDepotsMap.entrySet()) {
+            String deptIdKey = entry.getKey();
+            Company company = companyCache.get(deptIdKey.substring(0, deptIdKey.length() - 3));
+
+            for (Depot depot : entry.getValue()) {
+                //搴撳尯缂栫爜+浠撳簱缂栫爜缁勬垚鍞竴閿�
+                String key = deptIdKey + "_" + depot.getId();
+                SuperInventoryReportData data = new SuperInventoryReportData();
+
+                data.setCustomerName(Optional.ofNullable(company)
+                        .map(Company::getId)
+                        .orElse("-"));
+                data.setDeptId(deptIdKey);
+                data.setDepotId(depot.getId());
+                resultMap.put(key, data);
+            }
+        }
+        //endregion
+
+        if (resultMap.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        //2.鏌ヨ鏃堕棿鑼冨洿鍐呯殑鍚勭鏁版嵁
+        List<DepotStore> depotStores = queryDepotStores(param);
+        List<InoutRecord> inoutRecords = queryInoutRecords(param);
+        List<InoutStockChange> inoutStockChanges = queryInoutStockChanges(param);
+        List<InoutLossOver> inoutLossOvers = queryInoutLossOvers(param);
+
+        //3. 鏁版嵁鍒嗙粍棰勫鐞嗭紝鎻愰珮鍚庣画鏌ユ壘鏁堢巼
+        Map<String, List<DepotStore>> storeGroupMap = depotStores.stream()
+                .collect(Collectors.groupingBy(store -> store.getDeptId() + "_" + store.getDepotId()));
+
+        Map<String, List<InoutRecord>> recordGroupMap = inoutRecords.stream()
+                .collect(Collectors.groupingBy(record -> record.getDeptId() + "_" + record.getDepotId()));
+
+        //4. 鏍规嵁搴撳尯銆佷粨搴撲负鍞竴閿紝缁勮鎶ヨ〃鏁版嵁
+        Date todayZero = DateUtil.getCurZero(new Date());
+        boolean isEndDateBeforeToday = param.getEnd().before(todayZero);
+
+        for (SuperInventoryReportData data : resultMap.values()) {
+            String dataKey = data.getDeptId() + "_" + data.getDepotId();
+
+            //鑾峰彇搴撳瓨鏁版嵁
+            List<DepotStore> depotStoreList = storeGroupMap.getOrDefault(dataKey, new ArrayList<>());
+            if (depotStoreList.isEmpty()) {
+                continue;
+            }
+
+            //鎺掑簭搴撳瓨鏁版嵁
+            depotStoreList.sort(Comparator.comparing(DepotStore::getCreateTime));
+
+            //鑾峰彇鍑哄叆搴撹褰�
+            List<InoutRecord> recordList = recordGroupMap.getOrDefault(dataKey, new ArrayList<>());
+            Map<Boolean, List<InoutRecord>> recordPartition = recordList.stream()
+                    .collect(Collectors.partitioningBy(record -> Constant.TYPE_IN.equals(record.getType())));
+
+            List<InoutRecord> recordInList = recordPartition.get(true);
+            List<InoutRecord> recordOutList = recordPartition.get(false);
+
+            //鑾峰彇鍊掍粨鏁版嵁
+            Map<Boolean, List<InoutStockChange>> stockChangePartition = inoutStockChanges.stream()
+                    .filter(change -> data.getDeptId().equals(change.getDeptId()))
+                    .collect(Collectors.partitioningBy(change -> data.getDepotId().equals(change.getDepotIdIn())));
+
+            List<InoutStockChange> stockChangeInList = new ArrayList<>();
+            List<InoutStockChange> stockChangeOutList = new ArrayList<>();
+
+            //鍊掑叆鏁版嵁
+            stockChangeInList.addAll(stockChangePartition.get(true).stream()
+                    .filter(change -> data.getDepotId().equals(change.getDepotIdIn()))
+                    .collect(Collectors.toList()));
+
+            //鍊掑嚭鏁版嵁
+            stockChangeOutList.addAll(stockChangePartition.get(false).stream()
+                    .filter(change -> data.getDepotId().equals(change.getDepotIdOut()))
+                    .collect(Collectors.toList()));
+
+            //鎹熺泭鏁版嵁
+            List<InoutLossOver> lossOverList = inoutLossOvers.stream()
+                    .filter(loss -> data.getDeptId().equals(loss.getDeptId())
+                            && data.getDepotId().equals(loss.getDepotId()))
+                    .collect(Collectors.toList());
+
+            //璁$畻鍚勯」缁熻鏁版嵁
+            double sumRecordIn = recordInList.stream()
+                    .mapToDouble(InoutRecord::getRecordWeight)
+                    .sum();
+
+            double sumRecordOut = recordOutList.stream()
+                    .mapToDouble(InoutRecord::getRecordWeight)
+                    .sum();
+
+            double sumStockChangeIn = stockChangeInList.stream()
+                    .mapToDouble(InoutStockChange::getNumber)
+                    .sum();
+
+            double sumStockChangeOut = stockChangeOutList.stream()
+                    .mapToDouble(InoutStockChange::getNumber)
+                    .sum();
+
+            double sumLossOver = lossOverList.stream()
+                    .mapToDouble(lossOver -> Constant.TYPE_LOSS.equals(lossOver.getType())
+                            ? -lossOver.getAmount()
+                            : lossOver.getAmount())
+                    .sum();
+
+            //璁$畻鏈熷垵鏈熸湯閲嶉噺
+            Double initialWeight = depotStoreList.get(0).getStorageReal();
+            Double finalWeight;
+
+            if (isEndDateBeforeToday) {
+                //濡傛灉鎴鏃堕棿涓烘槰澶╋紙褰撳ぉ鐨�0鐐�0鍒�0绉�0姣锛夊強涔嬪墠锛屽垯鏈�鍚庝竴鏉℃暟鎹负鏈熸湯鏁伴噺
+                finalWeight = depotStoreList.get(depotStoreList.size() - 1).getStorageReal();
+            } else {
+                //濡傛灉鎴鏃堕棿涓轰粖澶╁強涔嬪悗锛屽垯闇�瑕佺粨鍚堝叆鍑哄簱璁板綍鏁版嵁鏉ヨ绠楁湡鏈暟閲忥紝瑙勫垯锛氭湡鏈暟閲� = 鏈熷垵鏁伴噺 + 鍏ュ簱鏁伴噺 - 鍑哄簱鏁伴噺 + 鍊掑叆鏁伴噺 - 鍊掑嚭鏁伴噺+ 鎹熺泭鏁版嵁
+                finalWeight = initialWeight + sumRecordIn - sumRecordOut + sumStockChangeIn - sumStockChangeOut + sumLossOver;
+            }
+
+            //璁剧疆鏁版嵁
+            data.setInitialWeight(initialWeight);
+            data.setRecordInWeight(sumRecordIn);
+            data.setChangeInWeight(sumStockChangeIn);
+            data.setRecordOutWeight(sumRecordOut);
+            data.setChangeOutWeight(sumStockChangeOut);
+            data.setLossWeight(sumLossOver);
+            data.setFinalWeight(finalWeight);
+        }
+
+        return new ArrayList<>(resultMap.values());
+    }
+
+    /**
+     * 鏌ヨ搴撳瓨鏁版嵁
+     */
+    private List<DepotStore> queryDepotStores(SuperInventoryReportParam param) {
+        QueryWrapper<DepotStore> depotStoreQueryWrapper = new QueryWrapper<>();
+        depotStoreQueryWrapper.eq("company_id", param.getCompanyId());
+        depotStoreQueryWrapper.eq("dept_id", param.getDeptId());
+        depotStoreQueryWrapper.between("create_time", param.getStart(), param.getEnd());
+        depotStoreQueryWrapper.orderByAsc("create_time");
+        return depotStoreMapper.selectList(depotStoreQueryWrapper);
+    }
+
+    /**
+     * 鏌ヨ鍑哄叆搴撹褰曟暟鎹�
+     */
+    private List<InoutRecord> queryInoutRecords(SuperInventoryReportParam param) {
+        QueryWrapper<InoutRecord> inoutRecordQueryWrapper = new QueryWrapper<>();
+        inoutRecordQueryWrapper.eq("company_id", param.getCompanyId());
+        inoutRecordQueryWrapper.eq("dept_id", param.getDeptId());
+        inoutRecordQueryWrapper.between("create_time", param.getStart(), param.getEnd());
+        inoutRecordQueryWrapper.orderByAsc("create_time");
+        return inoutRecordMapper.selectList(inoutRecordQueryWrapper);
+    }
+
+    /**
+     * 鏌ヨ鍊掍粨鏁版嵁
+     */
+    private List<InoutStockChange> queryInoutStockChanges(SuperInventoryReportParam param) {
+        QueryWrapper<InoutStockChange> inoutStockChangeQueryWrapper = new QueryWrapper<>();
+        inoutStockChangeQueryWrapper.eq("company_id", param.getCompanyId());
+        inoutStockChangeQueryWrapper.eq("dept_id", param.getDeptId());
+        inoutStockChangeQueryWrapper.between("create_time", param.getStart(), param.getEnd());
+        inoutStockChangeQueryWrapper.orderByAsc("create_time");
+        return inoutStockChangeMapper.selectList(inoutStockChangeQueryWrapper);
+    }
+
+    /**
+     * 鏌ヨ鎹熺泭鏁版嵁
+     */
+    private List<InoutLossOver> queryInoutLossOvers(SuperInventoryReportParam param) {
+        QueryWrapper<InoutLossOver> inoutLossOverQueryWrapper = new QueryWrapper<>();
+        inoutLossOverQueryWrapper.eq("company_id", param.getCompanyId());
+        inoutLossOverQueryWrapper.eq("dept_id", param.getDeptId());
+        inoutLossOverQueryWrapper.between("create_time", param.getStart(), param.getEnd());
+        inoutLossOverQueryWrapper.orderByAsc("create_time");
+        return inoutLossOverMapper.selectList(inoutLossOverQueryWrapper);
+    }
+}
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/SuperInventoryReport.view.xml b/fzzy-igdss-view/src/main/java/com/fzzy/igds/SuperInventoryReport.view.xml
new file mode 100644
index 0000000..7e7a9cc
--- /dev/null
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/SuperInventoryReport.view.xml
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ViewConfig>
+  <Arguments/>
+  <Context/>
+  <Model>
+    <DataType name="dtMain">
+      <Property name="creationType">com.fzzy.igds.data.SuperInventoryReportData</Property>
+      <PropertyDef name="customerName">
+        <Property name="label">鏀跺偍鍏徃</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;companyPR#getData&quot;).getResult()}</Property>
+          <Property name="keyProperty">id</Property>
+          <Property name="valueProperty">dwmc</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="deptId">
+        <Property name="label">鎵�灞炲簱鍖�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deptPR#getAllData&quot;).getResult()}</Property>
+          <Property name="keyProperty">id</Property>
+          <Property name="valueProperty">kqmc</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="depotId">
+        <Property name="label">鎵�灞炰粨搴�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;depotPR#getAllCache&quot;).getResult()}</Property>
+          <Property name="keyProperty">id</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="initialWeight">
+        <Property name="label">鏈熷垵鏁伴噺</Property>
+        <Property name="displayFormat">0.0 KG</Property>
+        <Property name="dataType">Double</Property>
+      </PropertyDef>
+      <PropertyDef name="recordInWeight">
+        <Property name="label">鍏ュ簱鏁伴噺</Property>
+        <Property name="dataType">Double</Property>
+        <Property name="displayFormat">0.0 KG</Property>
+      </PropertyDef>
+      <PropertyDef name="changeInWeight">
+        <Property name="label">鍊掑叆鏁伴噺</Property>
+        <Property name="dataType">Double</Property>
+        <Property name="displayFormat">0.0 KG</Property>
+      </PropertyDef>
+      <PropertyDef name="recordOutWeight">
+        <Property name="label">鍑哄簱鏁伴噺</Property>
+        <Property name="dataType">Double</Property>
+        <Property name="displayFormat">0.0 KG</Property>
+      </PropertyDef>
+      <PropertyDef name="changeOutWeight">
+        <Property name="label">鍊掑嚭鏁伴噺</Property>
+        <Property name="dataType">Double</Property>
+        <Property name="displayFormat">0.0 KG</Property>
+      </PropertyDef>
+      <PropertyDef name="lossWeight">
+        <Property name="label">鎹熻�楁暟閲�</Property>
+        <Property name="dataType">Double</Property>
+        <Property name="displayFormat">0.0 KG</Property>
+      </PropertyDef>
+      <PropertyDef name="finalWeight">
+        <Property name="label">鏈熸湯鏁伴噺</Property>
+        <Property name="dataType">Double</Property>
+        <Property name="displayFormat">0.0 KG</Property>
+      </PropertyDef>
+    </DataType>
+    <DataType name="dtQuery">
+      <Property name="creationType">com.fzzy.igds.data.SuperInventoryReportParam</Property>
+      <PropertyDef name="deptId">
+        <Property></Property>
+        <Property name="label">鎵�灞炲簱鍖�</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;deptPR#getAllData&quot;).getResult()}</Property>
+          <Property name="keyProperty">id</Property>
+          <Property name="valueProperty">kqmc</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="depotId">
+        <Property></Property>
+        <Property name="label">瑁呭嵏浠撳簱</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;depotPR#getAllCache&quot;).getResult()}</Property>
+          <Property name="keyProperty">id</Property>
+          <Property name="valueProperty">name</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="start">
+        <Property name="label">寮�濮嬫椂闂�</Property>
+        <Property name="dataType">Date</Property>
+      </PropertyDef>
+      <PropertyDef name="end">
+        <Property name="label">鎴鏃堕棿</Property>
+        <Property name="dataType">Date</Property>
+      </PropertyDef>
+      <PropertyDef name="customerName">
+        <Property></Property>
+        <Property name="label">鏀跺偍鍏徃</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;companyPR#getData&quot;).getResult()}</Property>
+          <Property name="keyProperty">id</Property>
+          <Property name="valueProperty">dwmc</Property>
+        </Property>
+      </PropertyDef>
+      <PropertyDef name="timeDesc">
+        <Property></Property>
+        <Property name="label">鏃堕棿</Property>
+      </PropertyDef>
+      <PropertyDef name="title">
+        <Property></Property>
+      </PropertyDef>
+      <PropertyDef name="createUser">
+        <Property name="label">鍒涘缓浜�</Property>
+      </PropertyDef>
+      <PropertyDef name="createTime">
+        <Property name="label">鍒涘缓鏃堕棿</Property>
+      </PropertyDef>
+    </DataType>
+  </Model>
+  <View layout="padding:10">
+    <ClientEvent name="onReady">var deptId = window.parent.DEPT_ID;//鐖堕〉闈腑鐨勫垎搴撶紪鐮�&#xD;
+&#xD;
+&#xD;
+//榛樿鏌ヨ鏌ヨ鎻愭潯浠�&#xD;
+view.get(&quot;#dsQuery&quot;).insert({&#xD;
+	deptId:deptId&#xD;
+});&#xD;
+&#xD;
+query = function(){&#xD;
+	var data = view.get(&quot;#dsQuery.data&quot;);&#xD;
+	view.get(&quot;#dsQuery&quot;).set(&quot;parameter&quot;,data).flushAsync();&#xD;
+};&#xD;
+query();</ClientEvent>
+    <Property name="packages">font-awesome,css-common</Property>
+    <DataSet id="dsMain">
+      <Property name="dataType">[dtMain]</Property>
+      <Property name="dataProvider">superInventoryReportPR#getReportData</Property>
+      <Property name="loadMode">manual</Property>
+    </DataSet>
+    <DataSet id="dsQuery">
+      <Property name="dataType">dtQuery</Property>
+      <Property></Property>
+      <Property name="loadMode">manual</Property>
+      <Property name="dataProvider">superInventoryReportPR#getQuery</Property>
+    </DataSet>
+    <Container>
+      <Property name="className">c-param</Property>
+      <AutoForm>
+        <Property name="cols">*,*,*,*,90,90,140</Property>
+        <Property name="dataSet">dsQuery</Property>
+        <Property name="labelSeparator">锛�</Property>
+        <Property name="labelAlign">right</Property>
+        <Property name="labelWidth">110</Property>
+        <Property name="exClassName">bg-color</Property>
+        <AutoFormElement>
+          <Property name="property">customerName</Property>
+          <Property name="name">customerName</Property>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">deptId</Property>
+          <Property name="property">deptId</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">start</Property>
+          <Property name="property">start</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">end</Property>
+          <Property name="property">end</Property>
+          <Editor/>
+        </AutoFormElement>
+        <Button>
+          <ClientEvent name="onClick">var data = view.get(&quot;#dsQuery.data&quot;);&#xD;
+view.get(&quot;#dsMain&quot;).set(&quot;parameter&quot;,data).flushAsync();</ClientEvent>
+          <Property name="caption">鎼滅储</Property>
+          <Property name="exClassName">btn-q1</Property>
+          <Property name="iconClass">fa fa-search</Property>
+        </Button>
+        <Button>
+          <ClientEvent name="onClick">view.get(&quot;#dsQuery&quot;).flushAsync();</ClientEvent>
+          <Property name="exClassName">btn-q2</Property>
+          <Property name="iconClass">fa fa-refresh</Property>
+          <Property name="caption">閲嶇疆</Property>
+        </Button>
+        <Button layoutConstraint="left">
+          <Property name="caption">瀵煎嚭EXCEL</Property>
+          <Property name="exClassName">btn-q2</Property>
+          <Property name="width">140</Property>
+          <Property name="iconClass">fa fa-file-excel-o</Property>
+        </Button>
+      </AutoForm>
+    </Container>
+    <Container>
+      <Property name="className">c-data</Property>
+      <AutoForm id="autoForm1" layoutConstraint="top">
+        <Property name="cols">*,*,*,*</Property>
+        <Property name="dataSet">dsQuery</Property>
+        <Property name="labelAlign">right</Property>
+        <Property name="showHint">false</Property>
+        <Property name="labelWidth">120</Property>
+        <AutoFormElement layoutConstraint="colSpan:4">
+          <Property name="name">title</Property>
+          <Property name="property">title</Property>
+          <Property name="showLabel">false</Property>
+          <Property name="editorType">Label</Property>
+          <Property name="style">
+            <Property name="font">bold 30px Georgia, serif;</Property>
+            <Property name="text-align">center</Property>
+          </Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">timeDesc</Property>
+          <Property name="property">timeDesc</Property>
+          <Property name="editorType">Label</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="visible">false</Property>
+          <Property name="name">depotId</Property>
+          <Property name="property">depotId</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">createUser</Property>
+          <Property name="property">createUser</Property>
+          <Property name="editorType">Label</Property>
+          <Editor/>
+        </AutoFormElement>
+        <AutoFormElement>
+          <Property name="name">createTime</Property>
+          <Property name="property">createTime</Property>
+          <Property name="editorType">Label</Property>
+          <Editor/>
+        </AutoFormElement>
+      </AutoForm>
+      <DataGrid id="dataGridMain" layoutConstraint="padding:8">
+        <Property name="dataSet">dsMain</Property>
+        <Property name="readOnly">true</Property>
+        <Property name="highlightCurrentRow">false</Property>
+        <Property name="hideMode">visibility</Property>
+        <Property name="headerRowHeight">30</Property>
+        <Property name="rowHeight">50</Property>
+        <RowNumColumn/>
+        <DataColumn name="customerName">
+          <Property name="property">customerName</Property>
+        </DataColumn>
+        <DataColumn name="deptId">
+          <Property name="property">deptId</Property>
+        </DataColumn>
+        <DataColumn name="depotId">
+          <Property name="property">depotId</Property>
+        </DataColumn>
+        <DataColumn name="initialWeight">
+          <Property name="property">initialWeight</Property>
+        </DataColumn>
+        <DataColumn name="recordInWeight">
+          <Property name="property">recordInWeight</Property>
+        </DataColumn>
+        <DataColumn name="changeInWeight">
+          <Property name="property">changeInWeight</Property>
+        </DataColumn>
+        <DataColumn name="recordOutWeight">
+          <Property name="property">recordOutWeight</Property>
+        </DataColumn>
+        <DataColumn name="changeOutWeight">
+          <Property name="property">changeOutWeight</Property>
+        </DataColumn>
+        <DataColumn name="lossWeight">
+          <Property name="property">lossWeight</Property>
+        </DataColumn>
+        <DataColumn name="finalWeight">
+          <Property name="property">finalWeight</Property>
+        </DataColumn>
+      </DataGrid>
+      <ToolBar id="tool" layoutConstraint="bottom">
+        <Fill/>
+        <DataPilot layoutConstraint="right">
+          <Property name="itemCodes">pageSize,pages</Property>
+          <Property name="dataSet">dsMain</Property>
+        </DataPilot>
+      </ToolBar>
+    </Container>
+  </View>
+</ViewConfig>
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/SuperInventoryReportPR.java b/fzzy-igdss-view/src/main/java/com/fzzy/igds/SuperInventoryReportPR.java
new file mode 100644
index 0000000..a496bad
--- /dev/null
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/SuperInventoryReportPR.java
@@ -0,0 +1,73 @@
+package com.fzzy.igds;
+
+import com.bstek.dorado.annotation.DataProvider;
+import com.fzzy.igds.data.SuperInventoryReportData;
+import com.fzzy.igds.data.SuperInventoryReportParam;
+import com.fzzy.igds.service.SuperInventoryReportService;
+import com.fzzy.igds.service.SysDeptService;
+import com.fzzy.igds.utils.ContextUtil;
+import com.fzzy.igds.utils.DateUtil;
+import com.ruoyi.common.core.domain.entity.SysDept;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 搴撳瓨鎶ヨ〃
+ *
+ * @author sgj
+ * @date 2025/12/22
+ */
+@Component
+public class SuperInventoryReportPR {
+
+    @Resource
+    private SuperInventoryReportService superInventoryReportService;
+    @Resource
+    private SysDeptService sysDeptService;
+
+    /**
+     * superInventoryReportPR#getQuery
+     *
+     * @return
+     */
+    @DataProvider
+    public SuperInventoryReportParam getQuery() {
+        SuperInventoryReportParam result = new SuperInventoryReportParam();
+        SysDept subDept = sysDeptService.getCacheDept(null, ContextUtil.subDeptId(null));
+        result.setTitle("搴撳瓨鎶ヨ〃");
+        if (null != subDept) {
+            result.setTitle(subDept.getDeptName() + "搴撳瓨鎶ヨ〃");
+            result.setDeptId(String.valueOf(subDept.getDeptId()));
+        }
+        result.setTimeDesc("妫�娴嬫椂闂�");
+        result.setEnd(new Date());
+        Date start = DateUtil.getNewByDay(new Date(), -30);
+        result.setStart(start);
+        result.setTimeDesc(
+                DateFormatUtils.format(start, "yyyy-MM-dd") + "   鎴嚦锛�"
+                        + DateFormatUtils.format(new Date(), "yyyy-MM-dd"));
+        result.setCreateUser(ContextUtil.getLoginUserName());
+        result.setCreateTime(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
+        return result;
+    }
+
+    /**
+     * superInventoryReportPR#getReportData
+     *
+     * @param param
+     */
+    @DataProvider
+    public List<SuperInventoryReportData> getReportData(SuperInventoryReportParam param) {
+        if (null == param) {
+            param = new SuperInventoryReportParam();
+        }
+        List<SuperInventoryReportData> superInventoryReportData = superInventoryReportService.listSuperInventoryReportData(param);
+        return superInventoryReportData;
+    }
+
+
+}

--
Gitblit v1.9.3