From fdcb3d4255a5897972aae4c31cf0cbaa81aef431 Mon Sep 17 00:00:00 2001
From: czt <czt18638530771@163.com>
Date: 星期四, 27 十一月 2025 14:52:55 +0800
Subject: [PATCH] 仓库页面

---
 fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java               |   35 +
 fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/Constant.java               |    5 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/service/DepotService.java            |  251 ++++++++
 fzzy-igdss-view/src/main/java/models/core.model.xml                              |  285 +++++++++
 fzzy-igdss-view/src/main/java/com/fzzy/igds/SysUserPR.java                       |   31 +
 fzzy-igdss-core/src/main/java/com/fzzy/igds/service/DepotStoreService.java       |  103 +++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SysUserService.java          |   47 +
 fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DepotStoreRepository.java |   30 +
 fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml                        |   10 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DepotRepository.java      |   78 ++
 fzzy-igdss-view/src/main/java/com/fzzy/igds/DepotPR.java                         |  102 +++
 fzzy-igdss-view/src/main/java/com/fzzy/igds/Depot.view.xml                       |  488 ++++++++++++++++
 fzzy-igdss-view/src/main/java/com/fzzy/igds/Company.view.xml                     |    2 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/RedisConst.java             |  228 +++++++
 14 files changed, 1,688 insertions(+), 7 deletions(-)

diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/Constant.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/Constant.java
index c244709..d89f627 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/Constant.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/Constant.java
@@ -7,7 +7,10 @@
  */
 public class Constant {
 
-
+    /**
+     * 绯荤粺鍚嶇О
+     */
+    public static final String APP_NAME = "igdss";
     /**
      * 閮ㄩ棬绫诲瀷
      */
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/RedisConst.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/RedisConst.java
new file mode 100644
index 0000000..2a3f955
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/RedisConst.java
@@ -0,0 +1,228 @@
+package com.fzzy.igds.constant;
+
+/**
+ * Redis缂撳瓨浣跨敤鐨勭郴缁熷父閲忛厤缃� 涓昏鐢ㄤ簬閰嶇疆绯荤粺缂撳瓨鐨凨EY閰嶇疆
+ */
+public class RedisConst {
+
+    /**
+     * 鏍规嵁缁勭粐缂栫爜鏋勫缓瀹為檯浣跨敤鐨凨EY
+     *
+     * @param key1 缁勭粐缂栫爜
+     * @param key2 缂撳瓨KEY
+     * @return
+     */
+    public static String buildKey(String key1, String key2) {
+        return Constant.APP_NAME + ":" + key1 + ":" + key2;
+    }
+
+    /**
+     * 涓夊眰缁撴瀯鐨凨EY
+     *
+     * @param key1
+     * @param key2
+     * @param tag
+     * @return
+     */
+    public static String buildKey(String key1, String key2, String tag) {
+        return Constant.APP_NAME + ":" + key1 + ":" + key2 + ":" + tag;
+    }
+
+    /**
+     * 鍥涘眰缁撴瀯鐨凨EY
+     *
+     * @param companyId
+     * @param key
+     * @param tag1
+     * @param tag2
+     * @return
+     */
+    public static String buildKey(String companyId, String key, String tag1, String tag2) {
+        return Constant.APP_NAME + ":" + companyId + ":" + key + ":" + tag1 + ":" + tag2;
+    }
+
+    /**
+     * 鍒涘缓璁惧鍒楄〃鐨凨EY锛屼互鍒嗘満涓哄垎缁勫垱寤�
+     *
+     * @param companyId
+     * @param key
+     * @param tag1
+     * @return
+     */
+    public static String buildDeviceKey(String companyId, String key, String tag1) {
+        return Constant.APP_NAME + ":" + companyId + ":" + key + ":" + tag1;
+    }
+
+    /**
+     * 鏍规嵁缂撳瓨KEY鐨勫墠缂�鐢熸垚缂撳瓨KEy
+     *
+     * @param prefix
+     * @param bizId
+     */
+    public static String buildKeyByPrefix(String prefix, String bizId) {
+        if (null == bizId) return Constant.APP_NAME + ":" + prefix;
+        return Constant.APP_NAME + ":" + prefix + ":" + bizId;
+    }
+
+    /**
+     * 瀛楀吀琛ㄧ紦瀛橀厤缃�
+     */
+    public static final String KEY_DIC_TRIGGER = "KEY_DIC_TRIGGER";
+
+    /**
+     * 浠撳簱鍒楄〃KEY
+     */
+    public static final String KEY_DEPOT = "DEPOT_DATA";
+
+    /**
+     * 浠撳簱鍙傛暟鍒楄〃KEY
+     */
+    public static final String KEY_DEPOT_CONF = "DEPOT_CONF";
+
+    /**
+     * 鍒嗘満鍒楄〃KEY
+     */
+    public static final String KEY_DEVICE_SER_LIST = "SER_LIST";
+
+    /**
+     * 璁惧鍒楄〃
+     */
+    public static final String KEY_DEVICE_LIST = "DEVICE_LIST";
+
+    /**
+     * 鍗曚釜鑹插彿鍚�
+     */
+    public static final String KEY_DEVICE = "DEVICE";
+
+    /**
+     * 璁惧鍒楄〃
+     */
+    public static final String KEY_DEVICE_IOT_LIST = "DEVICE_IOT_LIST";
+    /**
+     * 浠撳簱鍜屽垎鏈虹殑澶氬澶氬叧绯婚泦鍚�
+     */
+    public static final String KEY_DEPOT_SER_LIST = "DEPOT_SER_LIST";
+
+    /**
+     * 寤虹瓚鐗╀俊鎭�
+     */
+    public static final String KEY_BUILDING_LIST = "BUILDING_LIST";
+
+    /**
+     * 鎵ц鍛戒护KEY鍓嶇紑
+     */
+    public static final String KEY_ORDER_PRE = "ORDER";
+
+    /**
+     * 鏈�鏂扮伯鎯呬俊鎭紦瀛樺垪琛紝鐢ㄤ簬瀛樻斁褰撳墠鏈�鏂扮殑绮儏淇℃伅
+     */
+    public static final String KEY_GRAIN = "GRAIN_DATA";
+
+    /**
+     * 鏈�鏂版皵浣撲俊鎭紦瀛樺垪琛�
+     */
+    public static final String KEY_GAS_DATA = "GAS_DATA";
+
+    /**
+     * 绯荤粺閰嶇疆KEY
+     */
+    public static final String KEY_SYS_CONF = "SYS_CONF";
+
+    /**
+     * 绮簱鐨勬俯婀垮害淇℃伅缂撳瓨
+     */
+    public static final String KEY_DEPOT_TH_PREFIX = "DEPOT_TH_PREFIX";
+
+    /**
+     * 浠ュ垎鏈烘垨鑰呬粨搴撲负鍗曚綅瀛樺偍鐨勪粨娓╀粨婀跨紦瀛樻爣鏍囩
+     */
+    public static final String KEY_T_TH = "T_TH";
+
+    /**
+     * 瀛樻斁姘旇薄淇℃伅鐨凨EY
+     */
+    public static final String KEY_WEATHER_INFO = "WEATHER_INFO";
+
+    /**
+     * 鏍规嵁浠撳簱缂栫爜瀛樻斁鏈�鏂扮殑鑳借�楁暟鎹俊鎭�
+     */
+    public static final String KEY_ES_DATA_MAP = "ES_DATA_MAP";
+
+    /**
+     * 绯荤粺涓粍缁囧垪琛�
+     */
+    public static final String KEY_DEPT_LIST = "DEPT_LIST";
+
+    /**
+     * 鍒舵爱鏈洪厤缃垪琛�
+     */
+    public static final String KEY_N2_CONF_LIST = "N2_CONF_LIST";
+
+    /**
+     * 鏈�鏂版皵鍘嬩俊鎭紦瀛樺垪琛�
+     */
+    public static final String KEY_PRESSURE_DATA = "PRESSURE_DATA";
+
+    /**
+     * 绯荤粺閰嶇疆鐨勬憚鍍忔満淇℃伅缂撳瓨
+     */
+    public static final String KEY_CAMERA_LIST = "CAMERA_LIST";
+
+
+    /**
+     * 涓夌淮閰嶇疆鍏宠仈淇℃伅key
+     */
+    public static final String KEY_THREE_CONF = "THREE_CONF";
+
+    /**
+     * 涓存椂缂撳瓨KEY鍓嶇紑
+     */
+    public static final String KEY_TEMP_PREFIX = "TEMP_";
+
+    /**
+     * 鏁伴噺鐩戞祴鍙傛暟鍒楄〃KEY--鍗曚釜璁惧
+     */
+    public static final String KEY_QUANTITY_CONF = "QUANTITY_CONF";
+
+
+    /**
+     * 浠撳簱璐ㄩ噺宸℃鏁版嵁缂撳瓨
+     */
+    public static final String KEY_DEPOT_QUALITY = "DEPOT_QUALITY";
+
+    /**
+     * 浠撳簱娑蹭綅鏁版嵁缂撳瓨
+     */
+    public static final String KEY_DEPOT_HEIGHT = "DEPOT_HEIGHT";
+
+    /**
+     * 浠撳簱鐗╄仈缃戝叧iot璁惧娓╂箍搴︾紦瀛榢ey
+     */
+    public static final String KEY_IOT_DEPOT_TEMP_HUM = "IOT_DEPOT_TEMP_HUM";
+    /**
+     * 鍗曚釜鏁伴噺妫�娴嬫湇鍔�
+     */
+    public static final String PREFIX_QUANTITY_SER = "QUANTITY_SER";
+
+    /**
+     * 璀﹀憡閰嶇疆鍒楄〃KEY
+     */
+    public static final String KEY_WARN_CONF = "WARN_CONF";
+
+    /**
+     * 闂ㄧ璁惧閰嶇疆鍒楄〃
+     */
+    public static final String KEY_DOOR_SENSOR_LIST = "DOOR_SENSOR_LIST";
+
+    /**
+     * 鎶撴媿鍒嗘満缂撳瓨鍓嶇紑
+     */
+    public static final String CACHE_KEY_PRE = "SNAP_SER";
+
+
+    /**
+     * AI璁惧缂撳瓨key
+     */
+    public static final String KEY_AI_SER = "AI_SER";
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DepotRepository.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DepotRepository.java
new file mode 100644
index 0000000..a11388e
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DepotRepository.java
@@ -0,0 +1,78 @@
+package com.fzzy.igds.repository;
+
+import com.fzzy.igds.domain.Depot;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @Description
+ * @Author CZT
+ * @Date 2025/11/27 13:39
+ */
+@Service
+public interface DepotRepository extends JpaRepository<Depot, String> {
+
+    /**
+     * 鏍规嵁缁勭粐缂栫爜鑾峰彇浠撳簱璐т綅淇℃伅
+     *
+     * @param companyId
+     * @return
+     */
+    @Query("from Depot where companyId =:companyId order by orderNum")
+    List<Depot> getDepotByCompanyId(@Param("companyId") String companyId);
+
+    /**
+     * 鏍规嵁缁勭粐缂栫爜鍜屽簱鍖虹紪鐮佽幏鍙栦粨搴撹揣浣嶄俊鎭�
+     *
+     * @param companyId
+     * @param deptId
+     * @return
+     */
+    @Query("from Depot where companyId =:companyId and deptId =:deptId order by orderNum")
+    List<Depot> getDepot(@Param("companyId") String companyId, @Param("deptId") String deptId);
+
+    /**
+     * 鏍规嵁缁勭粐缂栫爜鍜屼粨搴撶紪鐮佽幏鍙栦粨搴撹揣浣嶄俊鎭�
+     * @param companyId
+     * @param id
+     * @return
+     */
+    @Query("from Depot where companyId =:companyId and id =:id")
+    Depot getDepotById(@Param("companyId") String companyId, @Param("id") String id);
+
+
+    /**
+     * 鏇存柊浠撳簱鐘舵��
+     * @param status
+     * @param depotId
+     */
+    @Transactional
+    @Modifying
+    @Query("update Depot set depotStatus =:status where id =:depotId")
+    void updateDepotStatus(@Param("status") String status, @Param("depotId") String depotId);
+
+    /**
+     * 鏍规嵁ids鑾峰彇浠撳簱
+     *
+     * @param list
+     * @return
+     */
+    @Query("from Depot where id IN :list order by orderNum")
+    List<Depot> getDepotByIds(@Param("list") List<String> list);
+
+    /**
+     * 鏇存柊浠撳簱鍌ㄩ噺
+     * @param weight
+     * @param depotId
+     */
+    @Transactional
+    @Modifying
+    @Query("update Depot set storageReal =:weight where id =:depotId")
+    void updateDepotStorage(@Param("weight") Double weight, @Param("depotId") String depotId);
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DepotStoreRepository.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DepotStoreRepository.java
new file mode 100644
index 0000000..7dfb4a6
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DepotStoreRepository.java
@@ -0,0 +1,30 @@
+package com.fzzy.igds.repository;
+
+import com.fzzy.igds.domain.DepotStore;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description
+ * @Author CZT
+ * @Date 2025/11/27 13:44
+ */
+@Service
+public interface DepotStoreRepository extends JpaRepository<DepotStore, String>, JpaSpecificationExecutor<DepotStore> {
+
+    /**
+     * 鏍规嵁浠撳簱缂栫爜鑾峰彇鏈�鍚庝竴鏉℃暟鎹�
+     * @param depotId
+     * @param end
+     * @return
+     */
+    @Query("from DepotStore where depotId =:depotId and createDate <:end order by createDate desc")
+    List<DepotStore> getDataByDepotId(@Param("depotId") String depotId,@Param("end") Date end);
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/DepotService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/DepotService.java
new file mode 100644
index 0000000..aa162a1
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/DepotService.java
@@ -0,0 +1,251 @@
+package com.fzzy.igds.service;
+
+import com.fzzy.igds.constant.RedisConst;
+import com.fzzy.igds.domain.Depot;
+import com.fzzy.igds.domain.DepotStore;
+import com.fzzy.igds.repository.DepotRepository;
+import com.fzzy.igds.utils.ContextUtil;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.mapper.SysDeptMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * @Description
+ * @Author CZT
+ * @Date 2025/11/27 13:43
+ */
+@Slf4j
+@Service
+public class DepotService {
+
+    @Resource
+    private DepotRepository depotRepository;
+    @Resource
+    private RedisCache redisCache;
+    @Resource
+    private SysDeptMapper deptMapper;
+    @Resource
+    private DepotStoreService depotStoreService;
+
+
+    /**
+     * jpa鏌ヨ浠撳簱鍒楄〃
+     * @param companyId
+     * @param deptId
+     * @return
+     */
+    public List<Depot> getData(String companyId, String deptId) {
+
+        if (StringUtils.isEmpty(companyId)) {
+            companyId = ContextUtil.getCompanyId();
+        }
+        if (StringUtils.isEmpty(deptId)) {
+            deptId = ContextUtil.subDeptId(null);
+        }
+        return depotRepository.getDepot(companyId, deptId);
+    }
+
+    /**
+     * jpa鏌ヨ浠撳簱鍒楄〃
+     * @param ids
+     * @return
+     */
+    public List<Depot> getDepotByIds(List<String> ids) {
+        if (null == ids ||ids.isEmpty()) {
+            return null;
+        }
+        return depotRepository.getDepotByIds(ids);
+    }
+
+    /**
+     * jpa淇濆瓨鏇存柊浠撳簱淇℃伅
+     * @param depot
+     */
+    public void saveDepot(Depot depot) {
+        if (StringUtils.isEmpty(depot.getCompanyId())) {
+            depot.setCompanyId(ContextUtil.getCompanyId());
+        }
+        if (StringUtils.isEmpty(depot.getDeptId())) {
+            depot.setDeptId(ContextUtil.subDeptId(null));
+        }
+        if(null == depot.getOrderNum()){
+            depot.setOrderNum(1);
+        }
+        depotRepository.save(depot);
+        flushCache(depot.getCompanyId());
+    }
+
+    /**
+     * jpa鏇存柊浠撳簱鐘舵��
+     * @param depotId
+     * @param status
+     */
+    public void updateDepotStatus(String depotId, String status) {
+        if (StringUtils.isEmpty(depotId)) {
+            return;
+        }
+        depotRepository.updateDepotStatus(status, depotId);
+    }
+
+    /**
+     * jpa鍒犻櫎浠撳簱璐т綅淇℃伅
+     * @param depot
+     */
+    public void deleteDepot(Depot depot) {
+        depotRepository.delete(depot);
+
+        //鍒犻櫎閰嶇疆缂撳瓨
+        this.delCacheDepot(depot, depot.getCompanyId());
+    }
+
+    /**
+     * 鍒锋柊浠撳簱璐т綅缂撳瓨
+     * @param companyId
+     */
+    public void flushCache(String companyId) {
+        if (StringUtils.isEmpty(companyId)) {
+            companyId = ContextUtil.getCompanyId();
+        }
+
+        List<Depot> list = depotRepository.getDepotByCompanyId(companyId);
+
+        this.setCacheDepotList(list, companyId);
+    }
+
+    /**
+     * 璁剧疆缂撳瓨
+     * @param list
+     * @param companyId
+     */
+    public void setCacheDepotList(List<Depot> list, String companyId) {
+        if (null == list) return;
+        String key;
+        for (Depot depot : list) {
+            key = RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT, depot.getId());
+            redisCache.setCacheObject(key, depot);
+        }
+    }
+
+    /**
+     * 鍒犻櫎缂撳瓨淇℃伅
+     * @param depot
+     * @param companyId
+     */
+    public void delCacheDepot(Depot depot, String companyId) {
+        if (null == depot) {
+            return;
+        }
+        if(StringUtils.isEmpty(companyId)){
+            companyId = ContextUtil.getCompanyId();
+        }
+        String key = RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT, depot.getId());
+        redisCache.deleteObject(key);
+    }
+
+    /**
+     * 鑾峰彇缂撳瓨-鏍规嵁缁勭粐缂栫爜鑾峰彇浠撳簱闆嗗悎
+     * @param companyId
+     * @return
+     */
+    public List<Depot> getCacheDepotList(String companyId) {
+        if(StringUtils.isEmpty(companyId)){
+            companyId = ContextUtil.getCompanyId();
+        }
+        String patten = RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT) + "*";
+
+        Collection<String> keys = redisCache.keys(patten);
+        if (null == keys) {
+            return null;
+        }
+
+        List<Depot> list = new ArrayList<>();
+        for (String key : keys) {
+            list.add((Depot) redisCache.getCacheObject(key));
+        }
+        //缂撳瓨鑾峰彇涓虹┖锛屽垯鏌ヨ鏁版嵁搴�
+        if(list.size() < 1){
+            list = depotRepository.getDepotByCompanyId(companyId);
+            setCacheDepotList(list, companyId);
+        }
+
+        //閲嶆柊鎺掑簭
+        Collections.sort(list, (p1, p2) -> p1.getOrderNum() - p2.getOrderNum());
+        return list;
+    }
+
+    /**
+     * 鑾峰彇缂撳瓨-鏍规嵁缁勭粐缂栫爜鍜屽簱鍖虹紪鐮佽幏鍙栦粨搴撻泦鍚�
+     * @param companyId
+     * @param deptId
+     * @return
+     */
+    public List<Depot> getCacheDepotList(String companyId, String deptId) {
+        if (StringUtils.isEmpty(deptId)) {
+            return null;
+        }
+        List<Depot> list = getCacheDepotList(companyId);
+        if(null == list || list.isEmpty()){
+            return null;
+        }
+        List<Depot> result = new ArrayList<>();
+        for (Depot depot : list) {
+            if (deptId.equals(depot.getDeptId())) {
+                result.add(depot);
+            }
+        }
+        //閲嶆柊鎺掑簭
+        Collections.sort(result, (p1, p2) -> p1.getOrderNum() - p2.getOrderNum());
+        return result;
+    }
+
+    /**
+     * 鑾峰彇浠撳簱淇℃伅-鏍规嵁浠撳簱缂栫爜鑾峰彇缂撳瓨淇℃伅
+     * @param companyId
+     * @param depotId
+     * @return
+     */
+    public Depot getCacheDepot(String companyId, String depotId) {
+        if (StringUtils.isEmpty(depotId)) {
+            return null;
+        }
+        if(StringUtils.isEmpty(companyId)){
+            companyId = ContextUtil.getCompanyId();
+        }
+        String key = RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT, depotId);
+        Depot depot = redisCache.getCacheObject(key);
+        if(null == depot){
+            depot = depotRepository.getDepotById(companyId, depotId);
+            redisCache.setCacheObject(key, depot);
+        }
+        return depot;
+    }
+
+    /**
+     * 鏍规嵁搴撳瓨淇℃伅鏇存柊浠撳簱淇℃伅
+     * @param data
+     */
+    public void updateByStore(DepotStore data) {
+
+        Depot depot = this.getCacheDepot(data.getCompanyId(), data.getDepotId());
+        if (null == depot) {
+            return;
+        }
+
+        depot.setStorageReal(data.getStorageReal());
+        depot.setDepotStatus(data.getDepotStatus());
+        depot.setFoodLevel(data.getFoodLevel());
+        depot.setFoodLocation(data.getFoodLocation());
+        depot.setFoodVariety(data.getFoodVariety());
+        depot.setFoodType(data.getFoodType());
+        depot.setFoodYear(data.getFoodYear());
+        if (null != data.getStoreDate()) {
+            depot.setStoreDate(data.getStoreDate());
+        }
+
+        this.saveDepot(depot);
+    }
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/DepotStoreService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/DepotStoreService.java
new file mode 100644
index 0000000..1dc77a6
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/DepotStoreService.java
@@ -0,0 +1,103 @@
+package com.fzzy.igds.service;
+
+import com.fzzy.igds.domain.DepotStore;
+import com.fzzy.igds.repository.DepotRepository;
+import com.fzzy.igds.repository.DepotStoreRepository;
+import com.fzzy.igds.utils.ContextUtil;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description
+ * @Author CZT
+ * @Date 2025/11/27 13:44
+ */
+@Slf4j
+@Service
+public class DepotStoreService {
+
+    @Resource
+    private DepotStoreRepository depotStoreRepository;
+    @Resource
+    private DepotRepository depotRepository;
+
+    /**
+     * JPA鍒嗛〉鏌ヨ鏁版嵁
+     *
+     * @param specification
+     * @param pageable
+     * @return
+     */
+    public Page<DepotStore> findAll(Specification<DepotStore> specification, Pageable pageable) {
+        return depotStoreRepository.findAll(specification, pageable);
+    }
+
+    /**
+     * JPA鏇存柊淇濆瓨鏁版嵁
+     *
+     * @param data
+     */
+    public void saveDepotStore(DepotStore data) {
+        if (StringUtils.isEmpty(data.getCompanyId())) {
+            data.setCompanyId(ContextUtil.getCompanyId());
+        }
+        if (StringUtils.isEmpty(data.getDeptId())) {
+            data.setDeptId(ContextUtil.subDeptId(null));
+        }
+        data.setUpdateBy(ContextUtil.getLoginUserName());
+        data.setUpdateTime(new Date());
+
+        data.setId(data.getDepotId() + "_" + DateFormatUtils.format(data.getStoreDate(), "yyyyMMddHHmmss") + "_" + DateFormatUtils.format(data.getUpdateTime(), "yyyyMMddHHmmss"));
+        data.setCreateTime(new Date());
+        data.setRemark("绯荤粺鐢熸垚");
+
+        depotStoreRepository.save(data);
+    }
+
+    /**
+     * JPA鍒犻櫎鏁版嵁
+     *
+     * @param data
+     * @return
+     */
+    public String delDepotStore(DepotStore data) {
+        depotStoreRepository.delete(data);
+        return null;
+    }
+
+    /**
+     * JPA鑾峰彇浠撳簱鏈�鍚庝竴鏉″簱瀛樻暟鎹�
+     *
+     * @param depotId
+     * @param time
+     * @return
+     */
+    public DepotStore getLastData(String depotId, Date time) {
+        List<DepotStore> list = depotStoreRepository.getDataByDepotId(depotId, time);
+        if (null == list || list.isEmpty()) {
+            return null;
+        }
+        return list.get(0);
+    }
+
+    public void addDepotStore(DepotStore store, boolean updateDepot) {
+        if (null == store.getUpdateTime()) store.setUpdateTime(new Date());
+        if (null == store.getId()) store.setId(ContextUtil.generateId());
+
+        depotStoreRepository.save(store);
+
+        if (updateDepot) {
+            depotRepository.updateDepotStorage(store.getStorageReal(), store.getDepotId());
+        }
+    }
+
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SysUserService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SysUserService.java
new file mode 100644
index 0000000..c26b31d
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SysUserService.java
@@ -0,0 +1,47 @@
+package com.fzzy.igds.service;
+
+import com.fzzy.igds.utils.ContextUtil;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.mapper.SysUserMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @Description
+ * @Author CZT
+ * @Date 2024/11/22 18:03
+ */
+@Slf4j
+@Service
+public class SysUserService {
+
+    @Resource
+    private SysUserMapper userMapper;
+
+    /**
+     * 鏍规嵁缁勭粐缂栫爜锛岃幏鍙栫敤鎴峰垪琛�
+     * @param companyId
+     * @return
+     */
+    public List<SysUser> getUser(String companyId) {
+        if(StringUtils.isEmpty(companyId)){
+            companyId = ContextUtil.getCompanyId();
+        }
+        SysUser sysUser = new SysUser();
+        sysUser.setCompanyId(companyId);
+        return userMapper.selectUserList(sysUser);
+    }
+
+    /**
+     * 鏍规嵁鐧诲綍鍚嶇О锛岃幏鍙栫敤鎴蜂俊鎭�
+     * @param loginName
+     * @return
+     */
+    public SysUser getUserByLoginName(String loginName) {
+        return userMapper.selectUserByLoginName(loginName);
+    }
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java
index b845309..3bd99fd 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java
@@ -22,6 +22,9 @@
     private static final AtomicLong sequence = new AtomicLong(0);
     private static String lastTimestamp = "";
 
+    //鍏ㄥ眬鐢ㄦ埛瀹炴椂鍧愬湪閮ㄩ棬
+    public static Map<String, String> contextUserDept = new HashMap<>();
+
     /**
      * 鐢熸垚椤哄簭ID锛氬勾鏈堟棩鏃跺垎绉掓绉�(17浣�) + 搴忓垪鍙�(4浣�) = 21浣�
      *
@@ -60,6 +63,36 @@
     }
 
     public static String getLoginUserName() {
-      return  ShiroUtils.getUserName() ;
+        SysUser user = ShiroUtils.getSysUser();
+        return null == user ? "绯荤粺" : user.getUserName();
+    }
+
+    public static SysUser getLoginUser() {
+        return ShiroUtils.getSysUser();
+    }
+
+    public static String subDeptId(SysUser user) {
+        if (null == user) {
+            user = getLoginUser();
+        }
+
+        if (null == user) {
+            return getCompanyId() + "001";
+        }
+
+        //浠庡叏灞�鑾峰彇锛屽鏋滄湁鍒欏彇鍏ㄥ眬鐨勯粯璁わ紝濡傛灉娌℃湁鍒欏彇鑷繁鎵�灞�
+        if (null != contextUserDept.get(user.getLoginName())) {
+            return contextUserDept.get(user.getLoginName());
+        }
+
+        if (null == user.getDeptId()) {
+            return user.getCompanyId();
+        }
+        return user.getDeptId().toString();
+    }
+
+    public static void updateSubDept(String userId, String deptId) {
+        if (null == deptId) return;
+        contextUserDept.put(userId, deptId);
     }
 }
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/Company.view.xml b/fzzy-igdss-view/src/main/java/com/fzzy/igds/Company.view.xml
index 6778bd3..3c4f5cf 100644
--- a/fzzy-igdss-view/src/main/java/com/fzzy/igds/Company.view.xml
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/Company.view.xml
@@ -230,7 +230,7 @@
           <ClientEvent name="onClick">view.get(&quot;#dsMain&quot;).flushAsync();&#xD;
           </ClientEvent>
           <Property name="caption">鍒锋柊</Property>
-          <Property name="exClassName">btn-q2</Property>
+          <Property name="exClassName">btn4</Property>
           <Property name="width">100</Property>
           <Property name="iconClass">fa fa-refresh</Property>
         </ToolBarButton>
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/Depot.view.xml b/fzzy-igdss-view/src/main/java/com/fzzy/igds/Depot.view.xml
new file mode 100644
index 0000000..d522c31
--- /dev/null
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/Depot.view.xml
@@ -0,0 +1,488 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ViewConfig>
+  <Arguments/>
+  <Context/>
+  <Model>
+    <DataType name="dataTypeUser">
+      <Property name="creationType">com.ruoyi.common.core.domain.entity.SysUser</Property>
+      <PropertyDef name="loginName">
+        <Property name="dataType">String</Property>
+        <Property name="label">鐢ㄦ埛鍚�</Property>
+      </PropertyDef>
+      <PropertyDef name="userName">
+        <Property name="dataType">String</Property>
+        <Property name="label">涓枃鍚�</Property>
+      </PropertyDef>
+    </DataType>
+  </Model>
+  <View layout="padding:10">
+    <ClientEvent name="onReady">&#xD;
+/**&#xD;
+ * 鏌ヨ&#xD;
+ */&#xD;
+query = function(){&#xD;
+    view.get(&quot;#dataSetdepot&quot;).flushAsync();&#xD;
+}&#xD;</ClientEvent>
+    <Property name="packages">font-awesome,css-common</Property>
+    <DataSet id="dataSetdepot">
+      <Property name="dataProvider">depotPR#getData</Property>
+      <Property name="dataType">[dtDepot]</Property>
+    </DataSet>
+    <DataSet id="dataSetUser">
+      <Property name="dataType">[dataTypeUser]</Property>
+      <Property name="dataProvider">sysUserPR#loadUser</Property>
+    </DataSet>
+    <Container>
+      <Property name="className">c-param</Property>
+      <ToolBar>
+        <ToolBarButton>
+          <ClientEvent name="onClick">view.get(&quot;#dataSetdepot&quot;).insert();&#xD;
+view.get(&quot;#depotdialog&quot;).show();&#xD;
+view.get(&quot;#oneId&quot;).set(&quot;readOnly&quot;,false);&#xD;
+view.get(&quot;#twoId&quot;).set(&quot;readOnly&quot;,false);</ClientEvent>
+          <Property name="caption">鏂板</Property>
+          <Property name="exClassName">btn1</Property>
+          <Property name="width">100</Property>
+          <Property name="iconClass">fa fa-plus</Property>
+        </ToolBarButton>
+        <ToolBarButton>
+          <ClientEvent name="onClick">var select = view.get(&quot;#dataGridDepot&quot;).get(&quot;selection&quot;);&#xD;
+if(select){&#xD;
+    view.get(&quot;#depotdialog&quot;).show();&#xD;
+    view.get(&quot;#oneId&quot;).set(&quot;readOnly&quot;,true);&#xD;
+    view.get(&quot;#twoId&quot;).set(&quot;readOnly&quot;,true);
+}else{&#xD;
+    $notify(&quot;璇烽�夋嫨闇�瑕佷慨鏀圭殑浠撳簱鈥︹��&quot;);&#xD;
+}</ClientEvent>
+          <Property name="caption">淇敼</Property>
+          <Property name="exClassName">btn2</Property>
+          <Property name="width">100</Property>
+          <Property name="iconClass">fa fa-pencil-square-o</Property>
+        </ToolBarButton>
+        <ToolBarButton>
+          <ClientEvent name="onClick">var select = view.get(&quot;#dataGridDepot&quot;).get(&quot;selection&quot;);&#xD;
+if(select){&#xD;
+    view.get(&quot;#deleteAjaxAction&quot;).set(&quot;parameter&quot;,select).execute();&#xD;
+    query();&#xD;
+}else{&#xD;
+    $notify(&quot;璇烽�夋嫨闇�瑕佸垹闄ょ殑浠撳簱鈥︹��&quot;);&#xD;
+}</ClientEvent>
+          <Property name="caption">鍒犻櫎</Property>
+          <Property name="exClassName">btn3</Property>
+          <Property name="width">100</Property>
+          <Property name="iconClass">fa fa-times</Property>
+        </ToolBarButton>
+        <ToolBarButton>
+          <Property name="caption">鍒锋柊缂撳瓨</Property>
+          <Property name="exClassName">btn4</Property>
+          <Property name="iconClass">fa fa-refresh</Property>
+          <Property name="width">100</Property>
+          <Property name="action">ajaxRefreshCache</Property>
+        </ToolBarButton>
+        <ToolBarButton>
+          <ClientEvent name="onClick">var url = &quot;com.fzzy.igds.sys.DepotStore.d&quot;;&#xD;
+var panelId = window.frameElement.getAttribute('data-id');
+window.parent.$.modal.openTab(&quot;搴撳瓨绠$悊&quot;, url, false, panelId);</ClientEvent>
+          <Property name="caption">搴撳瓨绠$悊</Property>
+          <Property name="iconClass">fa fa-book</Property>
+          <Property name="exClassName">btn1</Property>
+          <Property name="width">100</Property>
+        </ToolBarButton>
+      </ToolBar>
+      <DataGrid id="dataGridDepot" layoutConstraint="padding:8">
+        <ClientEvent name="onDataRowClick">view.get(&quot;#dataGridDepot&quot;).set(&quot;selection&quot;,arg.data);</ClientEvent>
+        <Property name="dataSet">dataSetdepot</Property>
+        <Property name="selectionMode">singleRow</Property>
+        <Property name="readOnly">true</Property>
+        <RowSelectorColumn/>
+        <RowNumColumn/>
+        <DataColumn name="id">
+          <Property name="property">id</Property>
+          <Property name="align">center</Property>
+          <Property name="width">160</Property>
+        </DataColumn>
+        <DataColumn name="name">
+          <Property name="property">name</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="depotStatus">
+          <Property name="property">depotStatus</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="foodVariety">
+          <Property name="property">foodVariety</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="foodType">
+          <Property name="property">foodType</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="foodLevel">
+          <Property name="property">foodLevel</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="storageReal">
+          <Property name="property">storageReal</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="foodYear">
+          <Property name="property">foodYear</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="foodLocation">
+          <Property name="property">foodLocation</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="storeDate">
+          <Property name="property">storeDate</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="storeKeeperName">
+          <Property name="property">storeKeeperName</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="depotType">
+          <Property name="property">depotType</Property>
+          <Property name="align">center</Property>
+        </DataColumn>
+        <DataColumn name="updateBy">
+          <Property name="property">updateBy</Property>
+          <Property name="align">center</Property>
+          <Property name="width">100</Property>
+        </DataColumn>
+        <DataColumn name="updateTime">
+          <Property name="property">updateTime</Property>
+          <Property name="align">center</Property>
+          <Property name="width">160</Property>
+        </DataColumn>
+      </DataGrid>
+    </Container>
+    <Dialog id="depotdialog" layout="regionPadding:8">
+      <Property name="iconClass">fa fa-tasks</Property>
+      <Property name="caption">浠撳簱淇℃伅</Property>
+      <Property name="width">1200</Property>
+      <Property name="closeable">false</Property>
+      <Buttons>
+        <Button id="btnOK">
+          <ClientEvent name="onClick">//鍚屾椂鎻愪氦鍘嗗彶涔�&#xD;
+var data = view.get(&quot;#dataSetdepot.data:#&quot;);&#xD;
+view.get(&quot;#updateactionSave&quot;).execute(function(result){&#xD;
+	if(result){&#xD;
+		$notify(result);&#xD;
+	}else{&#xD;
+		self.get(&quot;parent&quot;).hide();&#xD;
+        query();&#xD;
+	}&#xD;
+});</ClientEvent>
+          <Property name="caption">淇濆瓨</Property>
+          <Property name="iconClass">fa fa-check-circle</Property>
+          <Property name="exClassName">btn1</Property>
+          <Property name="width">120</Property>
+        </Button>
+        <Button>
+          <ClientEvent name="onClick">var cur = view.get(&quot;#dataSetdepot.data:#&quot;);&#xD;
+if(cur) cur.cancel();&#xD;
+self.get(&quot;parent&quot;).hide();</ClientEvent>
+          <Property name="caption">鍙栨秷</Property>
+          <Property name="exClassName">btn3</Property>
+          <Property name="iconClass">fa fa-times-circle</Property>
+          <Property name="width">120</Property>
+        </Button>
+      </Buttons>
+      <Children>
+        <FieldSet layout="padding:5">
+          <Property name="caption">鍩烘湰淇℃伅</Property>
+          <Buttons/>
+          <Children>
+            <AutoForm>
+              <Property name="dataSet">dataSetdepot</Property>
+              <Property name="readOnly">false</Property>
+              <Property name="labelSeparator"> : </Property>
+              <Property name="labelAlign">right</Property>
+              <Property name="cols">*,*,*,*,*,*</Property>
+              <Property name="labelWidth">80</Property>
+              <AutoFormElement id="oneId" layoutConstraint="colSpan:2">
+                <Property name="name">id</Property>
+                <Property name="property">id</Property>
+                <Editor>
+                  <TextEditor>
+                    <Property name="blankText">-- 绯荤粺鑷姩鐢熸垚 --</Property>
+                  </TextEditor>
+                </Editor>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">name</Property>
+                <Property name="property">name</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">deptId</Property>
+                <Property name="property">deptId</Property>
+                <Editor/>
+              </AutoFormElement>
+                <AutoFormElement layoutConstraint="colSpan:2">
+                    <Property name="name">storageMax</Property>
+                    <Property name="property">storageMax</Property>
+                    <Editor/>
+                </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">storeType</Property>
+                <Property name="property">storeType</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">createBy</Property>
+                <Property name="property">createBy</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">depotStatus</Property>
+                <Property name="property">depotStatus</Property>
+                <Property name="trigger">autoMappingDropDown2</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">depotType</Property>
+                <Property name="property">depotType</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">createTime</Property>
+                <Property name="property">createTime</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">storeKeeperName</Property>
+                <Property name="property">storeKeeperName</Property>
+                <Property name="trigger">triggerUserList</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">orderNum</Property>
+                <Property name="property">orderNum</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">updateBy</Property>
+                <Property name="property">updateBy</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:4">
+                <Property name="name">remark</Property>
+                <Property name="property">remark</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">updateTime</Property>
+                <Property name="property">updateTime</Property>
+                <Editor/>
+              </AutoFormElement>
+            </AutoForm>
+          </Children>
+        </FieldSet>
+        <FieldSet layout="padding:5">
+          <Property name="caption">鍌ㄧ伯淇℃伅</Property>
+          <Buttons/>
+          <Children>
+            <AutoForm>
+              <Property name="dataSet">dataSetdepot</Property>
+              <Property name="readOnly">false</Property>
+              <Property name="labelSeparator"> : </Property>
+              <Property name="labelAlign">right</Property>
+              <Property name="cols">*,*,*,*,*,*</Property>
+              <Property name="labelWidth">80</Property>
+              <AutoFormElement id="twoId" layoutConstraint="colSpan:2">
+                <Property name="name">storageReal</Property>
+                <Property name="property">storageReal</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">foodVariety</Property>
+                <Property name="property">foodVariety</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">foodType</Property>
+                <Property name="property">foodType</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">foodLevel</Property>
+                <Property name="property">foodLevel</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">foodYear</Property>
+                <Property name="property">foodYear</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">foodLocation</Property>
+                <Property name="property">foodLocation</Property>
+                <Property name="trigger">ddFoodOrigin</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">storeDate</Property>
+                <Property name="property">storeDate</Property>
+                <Editor/>
+              </AutoFormElement>
+              <Label>
+                <Property name="text"></Property>
+                <Property name="style">
+                  <Property name="color">blue</Property>
+                  <Property name="padding-left">50px</Property>
+                </Property>
+              </Label>
+              <Label layoutConstraint="colSpan:3">
+                <Property name="text">璇存槑锛�1銆佸疄闄呭偍閲忚皟鏁磋浣跨敤鈥滃簱瀛樼鐞嗏�濆姛鑳斤紱</Property>
+                <Property name="style">
+                  <Property name="color">blue</Property>
+                  <Property name="padding-left">50px</Property>
+                </Property>
+              </Label>
+            </AutoForm>
+          </Children>
+        </FieldSet>
+        <FieldSet layout="padding:5">
+          <Property name="caption">璐ㄦ淇℃伅</Property>
+          <Buttons/>
+          <Children>
+            <AutoForm>
+              <Property name="dataSet">dataSetdepot</Property>
+              <Property name="readOnly">false</Property>
+              <Property name="labelSeparator"> : </Property>
+              <Property name="labelAlign">right</Property>
+              <Property name="cols">*,*,*,*,*,*</Property>
+              <Property name="labelWidth">80</Property>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">perWet</Property>
+                <Property name="property">perWet</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">perImpurity</Property>
+                <Property name="property">perImpurity</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">bulkWeight</Property>
+                <Property name="property">bulkWeight</Property>
+                <Editor/>
+              </AutoFormElement>
+              <AutoFormElement layoutConstraint="colSpan:2">
+                <Property name="name">checkDate</Property>
+                <Property name="property">checkDate</Property>
+                <Editor/>
+              </AutoFormElement>
+              <Label>
+                <Property name="text"></Property>
+                <Property name="style">
+                  <Property name="color">blue</Property>
+                  <Property name="padding-left">50px</Property>
+                </Property>
+              </Label>
+              <Label layoutConstraint="colSpan:3">
+                <Property name="text">璇存槑锛氬偍澶囩伯璐ㄦ淇℃伅浼氭牴鎹川閲忕鐞� 鑷姩鍚屾鏇存柊</Property>
+                <Property name="style">
+                  <Property name="color">blue</Property>
+                  <Property name="padding-left">50px</Property>
+                </Property>
+              </Label>
+            </AutoForm>
+          </Children>
+        </FieldSet>
+      </Children>
+      <Tools/>
+    </Dialog>
+    <UpdateAction id="updateactionSave">
+      <Property name="executingMessage">姝e湪鎵ц涓�..</Property>
+      <Property name="dataResolver">depotPR#saveOrUpdate</Property>
+      <UpdateItem>
+        <Property name="dataSet">dataSetdepot</Property>
+        <Property name="dataPath">[#current]</Property>
+        <Property name="alias">data</Property>
+      </UpdateItem>
+    </UpdateAction>
+    <AjaxAction id="deleteAjaxAction">
+      <Property name="successMessage">鍒犻櫎鎴愬姛</Property>
+      <Property name="service">depotPR#deletedepot</Property>
+      <Property name="executingMessage">姝e湪鍒犻櫎</Property>
+    </AjaxAction>
+    <AjaxAction id="ajaxRefreshCache">
+      <Property name="service">depotPR#flushCache</Property>
+      <Property name="successMessage">鍒锋柊鎴愬姛锛�</Property>
+      <Property name="confirmMessage">纭畾瑕佸埛鏂扮紦瀛樹箞锛�</Property>
+    </AjaxAction>
+    <YearDropDown id="yearDropDown1"/>
+    <DataSetDropDown id="triggerUserList">
+      <Property name="dataSet">dataSetUser</Property>
+      <Property name="property">userName</Property>
+      <Property name="assignmentMap">storeKeeperName=userName,storeKeeper=loginName</Property>
+    </DataSetDropDown>
+    <CustomDropDown id="ddFoodOrigin">
+      <Property name="minHeight">500</Property>
+      <Property name="assignmentMap">foodLocation=name</Property>
+      <Property name="minWidth">500</Property>
+      <Container layout="regionPadding:5">
+        <DataSet id="dsFoodOrigin">
+          <Property name="dataProvider">dicAreaPR#pageList</Property>
+          <Property name="parameter"></Property>
+          <Property name="pageSize">30</Property>
+          <Property name="dataType">[dtArea]</Property>
+        </DataSet>
+        <Container layout="hbox regionPadding:5">
+          <TextEditor id="key2">
+            <Property name="blankText"> -- 鍚嶇О --</Property>
+            <Property name="width">200</Property>
+          </TextEditor>
+          <Button>
+            <ClientEvent name="onClick">var key = view.get(&quot;#key2.value&quot;);&#xD;
+                  view.get(&quot;#dsFoodOrigin&quot;).set(&quot;parameter&quot;,{key:key}).flushAsync();</ClientEvent>
+            <Property name="caption">鏌ヨ</Property>
+            <Property name="iconClass">fa fa-search</Property>
+          </Button>
+          <Button>
+            <ClientEvent name="onClick">var data = view.get(&quot;#dsFoodOrigin.data:#&quot;);&#xD;
+                  if(data){&#xD;
+                  view.get(&quot;#ddFoodOrigin&quot;).close(data.toJSON());&#xD;
+                  }</ClientEvent>
+            <Property name="iconClass">fa fa-check</Property>
+            <Property name="caption">纭畾</Property>
+          </Button>
+        </Container>
+        <DataGrid>
+          <ClientEvent name="onDataRowDoubleClick">var data = view.get(&quot;#dsFoodOrigin.data:#&quot;);&#xD;
+                if(data){&#xD;
+                view.get(&quot;#ddFoodOrigin&quot;).close(data.toJSON());&#xD;
+                }</ClientEvent>
+          <Property name="dataSet">dsFoodOrigin</Property>
+          <Property name="readOnly">true</Property>
+          <DataColumn name="code">
+            <Property name="property">code</Property>
+            <Property name="readOnly">true</Property>
+            <Property name="align">center</Property>
+          </DataColumn>
+          <DataColumn name="name">
+            <ClientEvent name="onRenderCell">arg.dom.style.fontWeight = &quot;bold&quot;;&#xD;
+arg.processDefault = true;</ClientEvent>
+            <Property name="property">name</Property>
+            <Property name="readOnly">true</Property>
+            <Property name="align">center</Property>
+          </DataColumn>
+          <DataColumn name="simple">
+            <Property name="property">simple</Property>
+            <Property name="readOnly">true</Property>
+            <Property name="align">center</Property>
+          </DataColumn>
+        </DataGrid>
+        <DataPilot layoutConstraint="bottom">
+          <Property name="dataSet">dsFoodOrigin</Property>
+        </DataPilot>
+      </Container>
+    </CustomDropDown>
+    <ListDropDown id="listOri">
+      <Property name="items">涓�,鍗�,瑗�,鍖�,涓滃寳,涓滃崡,瑗垮崡,瑗垮寳</Property>
+    </ListDropDown>
+  </View>
+</ViewConfig>
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/DepotPR.java b/fzzy-igdss-view/src/main/java/com/fzzy/igds/DepotPR.java
new file mode 100644
index 0000000..3e6650b
--- /dev/null
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/DepotPR.java
@@ -0,0 +1,102 @@
+package com.fzzy.igds;
+
+import com.bstek.dorado.annotation.DataProvider;
+import com.bstek.dorado.annotation.DataResolver;
+import com.bstek.dorado.annotation.Expose;
+import com.fzzy.igds.domain.Depot;
+import com.fzzy.igds.service.DepotService;
+import com.fzzy.igds.utils.ContextUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @Description
+ * @Author CZT
+ * @Date 2025/11/27 13:57
+ */
+@Slf4j
+@Component
+public class DepotPR {
+
+    @Resource
+    private DepotService depotService;
+
+    /**
+     * depotPR#getData
+     * @return
+     */
+    @DataProvider
+    public List<Depot> getData(){
+        return depotService.getData(null, null);
+    }
+
+    /**
+     * depotPR#saveOrUpdate
+     * @param data
+     * @return
+     */
+    @DataResolver
+    @Transactional
+    public String saveOrUpdate(Depot data) {
+
+        Depot depot = new Depot();
+        BeanUtils.copyProperties(data, depot);
+        depotService.saveDepot(depot);
+        depotService.flushCache(null);
+        return null;
+    }
+
+    /**
+     * depotPR#deleteDepot
+     * @param data
+     */
+    @Expose
+    @Transactional
+    public void deleteDepot(Depot data)  {
+        Depot depot = new Depot();
+        BeanUtils.copyProperties(data, depot);
+        depotService.deleteDepot(depot);
+    }
+
+    /**
+     * depotPR#flushCache
+     */
+    @Expose
+    public void flushCache() {
+        depotService.flushCache(null);
+    }
+
+    /**
+     * ${dorado.getDataProvider("depotPR#getAllCache").getResult()}
+     * @return
+     */
+    @DataProvider
+    public List<Depot> getAllCache() {
+        return depotService.getCacheDepotList(null, ContextUtil.subDeptId(null));
+    }
+
+    /**
+     * depotPR#ajaxGetAllCache
+     * @return
+     */
+    @Expose
+    public List<Depot> ajaxGetAllCache() {
+        return depotService.getCacheDepotList(null, ContextUtil.subDeptId(null));
+    }
+
+    /**
+     * depotPR#getDepot 鑾峰彇浠撳簱淇℃伅
+     *
+     * @param depotId
+     * @return
+     */
+    @Expose
+    public Depot getDepot(String depotId) {
+        return depotService.getCacheDepot(null, depotId);
+    }
+
+}
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml b/fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml
index b46488a..a04ea00 100644
--- a/fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml
@@ -163,7 +163,7 @@
           <ClientEvent name="onClick">view.get(&quot;#dsMain&quot;).flushAsync();&#xD;
           </ClientEvent>
           <Property name="caption">鍒锋柊</Property>
-          <Property name="exClassName">btn-q2</Property>
+          <Property name="exClassName">btn4</Property>
           <Property name="width">100</Property>
           <Property name="iconClass">fa fa-refresh</Property>
         </ToolBarButton>
@@ -231,16 +231,18 @@
             view.get(&quot;#dialogMain&quot;).hide();&#xD;
             }&#xD;
             });</ClientEvent>
-          <Property name="caption">纭畾</Property>
+          <Property name="caption">淇濆瓨</Property>
+          <Property name="iconClass">fa fa-check-circle</Property>
           <Property name="exClassName">btn1</Property>
-          <Property name="iconClass">fa fa-check</Property>
+          <Property name="width">120</Property>
         </Button>
         <Button>
           <ClientEvent name="onClick">view.get(&quot;#dsMain.data:#&quot;).cancel();&#xD;
             self.get(&quot;parent&quot;).hide();</ClientEvent>
           <Property name="caption">鍙栨秷</Property>
           <Property name="exClassName">btn3</Property>
-          <Property name="iconClass">fa fa-times</Property>
+          <Property name="iconClass">fa fa-times-circle</Property>
+          <Property name="width">120</Property>
         </Button>
       </Buttons>
       <Children>
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/SysUserPR.java b/fzzy-igdss-view/src/main/java/com/fzzy/igds/SysUserPR.java
new file mode 100644
index 0000000..b4cd391
--- /dev/null
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/SysUserPR.java
@@ -0,0 +1,31 @@
+package com.fzzy.igds;
+
+import com.bstek.dorado.annotation.DataProvider;
+import com.fzzy.igds.service.SysUserService;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @Description 鐢ㄦ埛淇℃伅
+ * @Author CZT
+ * @Date 2025/11/27 14:40
+ */
+@Component
+public class SysUserPR {
+
+	@Resource
+	private SysUserService sysUserService;
+
+	/**
+	 * sysUserPR#loadUser
+	 * @return
+	 */
+	@DataProvider
+	public List<SysUser> loadUser() {
+		return sysUserService.getUser(null);
+    }
+
+}
\ No newline at end of file
diff --git a/fzzy-igdss-view/src/main/java/models/core.model.xml b/fzzy-igdss-view/src/main/java/models/core.model.xml
index fa3c9b0..1bfba3a 100644
--- a/fzzy-igdss-view/src/main/java/models/core.model.xml
+++ b/fzzy-igdss-view/src/main/java/models/core.model.xml
@@ -148,4 +148,289 @@
       <Property name="required">false</Property>
     </PropertyDef>
   </DataType>
+  <DataType name="dtDepot">
+    <Property name="creationType">com.fzzy.igds.domain.Depot</Property>
+    <PropertyDef name="id">
+      <Property></Property>
+      <Property name="label">浠撳簱缂栧彿</Property>
+      <Property name="readOnly">true</Property>
+    </PropertyDef>
+    <PropertyDef name="companyId">
+      <Property></Property>
+      <Property name="label">缁勭粐缂栫爜</Property>
+    </PropertyDef>
+    <PropertyDef name="deptId">
+      <Property></Property>
+      <Property name="label">鎵�灞炲垎搴�</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;deptPR#getData&quot;).getResult()}</Property>
+        <Property name="keyProperty">deptId</Property>
+        <Property name="valueProperty">deptName</Property>
+      </Property>
+      <Property name="readOnly">true</Property>
+    </PropertyDef>
+    <PropertyDef name="name">
+      <Property></Property>
+      <Property name="label">浠撳簱鍚嶇О</Property>
+      <Property name="required">true</Property>
+    </PropertyDef>
+    <PropertyDef name="depotType">
+      <Property></Property>
+      <Property name="label">浠撴埧绫诲瀷</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#triggerDepotType&quot;).getResult()}</Property>
+        <Property name="keyProperty">dictValue</Property>
+        <Property name="valueProperty">dictLabel</Property>
+      </Property>
+      <Property name="required">true</Property>
+    </PropertyDef>
+    <PropertyDef name="depotStatus">
+      <Property></Property>
+      <Property name="label">浠撳簱鐘舵��</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#triggerDepotStatus&quot;).getResult()}</Property>
+        <Property name="keyProperty">dictValue</Property>
+        <Property name="valueProperty">dictLabel</Property>
+      </Property>
+    </PropertyDef>
+    <PropertyDef name="storeType">
+      <Property></Property>
+      <Property name="label">鍌ㄧ伯鏂瑰紡</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#triggerStoreType&quot;).getResult()}</Property>
+        <Property name="keyProperty">dictValue</Property>
+        <Property name="valueProperty">dictLabel</Property>
+      </Property>
+    </PropertyDef>
+    <PropertyDef name="storageMax">
+      <Property name="dataType">Double</Property>
+      <Property name="label">璁捐鍌ㄩ噺</Property>
+      <Property name="displayFormat">#0.0 KG</Property>
+      <Property name="required">true</Property>
+    </PropertyDef>
+    <PropertyDef name="storageReal">
+      <Property name="dataType">Double</Property>
+      <Property name="label">瀹為檯鍌ㄩ噺</Property>
+      <Property name="displayFormat">#0.0 KG</Property>
+      <Property name="required">false</Property>
+    </PropertyDef>
+    <PropertyDef name="foodType">
+      <Property></Property>
+      <Property name="label">绮鎬ц川</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#sysDictData&quot;).getResult(&quot;FOOD_TYPE_&quot;)}</Property>
+        <Property name="keyProperty">dictValue</Property>
+        <Property name="valueProperty">dictLabel</Property>
+      </Property>
+    </PropertyDef>
+    <PropertyDef name="foodVariety">
+      <Property></Property>
+      <Property name="label">绮鍝佺</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#sysDictData&quot;).getResult(&quot;FOOD_VARIETY_&quot;)}</Property>
+        <Property name="keyProperty">dictValue</Property>
+        <Property name="valueProperty">dictLabel</Property>
+      </Property>
+    </PropertyDef>
+    <PropertyDef name="foodLevel">
+      <Property></Property>
+      <Property name="label">绮绛夌骇</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#triggerFoodLevel&quot;).getResult()}</Property>
+        <Property name="keyProperty">dictValue</Property>
+        <Property name="valueProperty">dictLabel</Property>
+      </Property>
+    </PropertyDef>
+    <PropertyDef name="foodLocation">
+      <Property></Property>
+      <Property name="label">绮浜у湴</Property>
+    </PropertyDef>
+    <PropertyDef name="foodLocationId">
+      <Property></Property>
+      <Property name="label">绮浜у湴</Property>
+    </PropertyDef>
+    <PropertyDef name="foodYear">
+      <Property></Property>
+      <Property name="label">绮骞翠唤</Property>
+    </PropertyDef>
+    <PropertyDef name="perWet">
+      <Property name="dataType">Double</Property>
+      <Property name="label">姘村垎</Property>
+      <Property name="displayFormat">0.0 %</Property>
+    </PropertyDef>
+    <PropertyDef name="perImpurity">
+      <Property name="dataType">Double</Property>
+      <Property name="label">鏉傝川</Property>
+      <Property name="displayFormat">0.0 %</Property>
+    </PropertyDef>
+    <PropertyDef name="bulkWeight">
+      <Property name="dataType">Double</Property>
+      <Property name="label">瀹归噸</Property>
+      <Property name="displayFormat">0.0 g/L</Property>
+    </PropertyDef>
+    <PropertyDef name="storeKeeper">
+      <Property></Property>
+      <Property name="label">淇濈鍛�</Property>
+    </PropertyDef>
+    <PropertyDef name="storeKeeperName">
+      <Property></Property>
+      <Property name="label">淇濈鍛�</Property>
+    </PropertyDef>
+    <PropertyDef name="storeDate">
+      <Property name="dataType">Date</Property>
+      <Property name="label">鍏ュ簱鏃ユ湡</Property>
+    </PropertyDef>
+    <PropertyDef name="checkDate">
+      <Property name="dataType">Date</Property>
+      <Property name="label">璐ㄦ鏃ユ湡</Property>
+    </PropertyDef>
+    <PropertyDef name="remark">
+      <Property></Property>
+      <Property name="label">澶囨敞淇℃伅</Property>
+    </PropertyDef>
+    <PropertyDef name="orderNum">
+      <Property name="dataType">Integer</Property>
+      <Property name="label">椤哄簭鍙�</Property>
+    </PropertyDef>
+    <PropertyDef name="createTime">
+      <Property name="dataType">DateTime</Property>
+      <Property name="label">鍒涘缓鏃堕棿</Property>
+      <Property name="readOnly">true</Property>
+    </PropertyDef>
+    <PropertyDef name="createBy">
+      <Property></Property>
+      <Property name="label">鍒涘缓浜�</Property>
+      <Property name="readOnly">true</Property>
+    </PropertyDef>
+    <PropertyDef name="updateTime">
+      <Property name="dataType">DateTime</Property>
+      <Property name="label">鏇存柊鏃堕棿</Property>
+      <Property name="readOnly">true</Property>
+    </PropertyDef>
+    <PropertyDef name="updateBy">
+      <Property></Property>
+      <Property name="label">鏇存柊浜�</Property>
+      <Property name="readOnly">true</Property>
+    </PropertyDef>
+  </DataType>
+  <DataType name="dtDepotStore">
+    <Property name="creationType">com.fzzy.igds.domain.DepotStore</Property>
+    <PropertyDef name="id">
+      <Property></Property>
+    </PropertyDef>
+    <PropertyDef name="companyId">
+      <Property></Property>
+      <Property name="label">缁勭粐缂栫爜</Property>
+    </PropertyDef>
+    <PropertyDef name="deptId">
+      <Property></Property>
+      <Property name="label">鎵�灞炲垎搴�</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;deptPR#getData&quot;).getResult()}</Property>
+        <Property name="keyProperty">deptId</Property>
+        <Property name="valueProperty">deptName</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>
+      <Property name="required">true</Property>
+    </PropertyDef>
+    <PropertyDef name="foodType">
+      <Property></Property>
+      <Property name="label">绮鎬ц川</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#sysDictData&quot;).getResult(&quot;FOOD_TYPE_&quot;)}</Property>
+        <Property name="keyProperty">dictValue</Property>
+        <Property name="valueProperty">dictLabel</Property>
+      </Property>
+    </PropertyDef>
+    <PropertyDef name="foodVariety">
+      <Property></Property>
+      <Property name="label">绮鍝佺</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#sysDictData&quot;).getResult(&quot;FOOD_VARIETY_&quot;)}</Property>
+        <Property name="keyProperty">dictValue</Property>
+        <Property name="valueProperty">dictLabel</Property>
+      </Property>
+    </PropertyDef>
+    <PropertyDef name="foodLevel">
+      <Property></Property>
+      <Property name="label">绮绛夌骇</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#triggerFoodLevel&quot;).getResult()}</Property>
+        <Property name="keyProperty">dictValue</Property>
+        <Property name="valueProperty">dictLabel</Property>
+      </Property>
+    </PropertyDef>
+    <PropertyDef name="foodLocationId">
+      <Property></Property>
+      <Property name="label">绮浜у湴</Property>
+    </PropertyDef>
+    <PropertyDef name="foodLocation">
+      <Property></Property>
+      <Property name="label">绮浜у湴</Property>
+    </PropertyDef>
+    <PropertyDef name="foodYear">
+      <Property></Property>
+      <Property name="label">鏀惰揣骞村害</Property>
+    </PropertyDef>
+    <PropertyDef name="depotStatus">
+      <Property></Property>
+      <Property name="label">浠撳簱鐘舵��</Property>
+      <Property name="mapping">
+        <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#triggerDepotStatus&quot;).getResult()}</Property>
+        <Property name="keyProperty">dictValue</Property>
+        <Property name="valueProperty">dictLabel</Property>
+      </Property>
+      <Property name="required">true</Property>
+    </PropertyDef>
+    <PropertyDef name="storeDate">
+      <Property name="dataType">DateTime</Property>
+      <Property name="label">鍏ヤ粨鏃堕棿</Property>
+    </PropertyDef>
+    <PropertyDef name="fullDate">
+      <Property name="dataType">Date</Property>
+      <Property name="label">灏佷粨鏃ユ湡</Property>
+    </PropertyDef>
+    <PropertyDef name="outDate">
+      <Property name="label">鍑轰粨瀹屾垚鏃堕棿</Property>
+      <Property name="dataType">DateTime</Property>
+    </PropertyDef>
+    <PropertyDef name="storageReal">
+      <Property name="dataType">Double</Property>
+      <Property name="label">瀹為檯鍌ㄩ噺</Property>
+      <Property name="displayFormat">#,##0 KG</Property>
+      <Property name="required">true</Property>
+    </PropertyDef>
+    <PropertyDef name="remark">
+      <Property></Property>
+      <Property name="label">澶囨敞</Property>
+    </PropertyDef>
+    <PropertyDef name="createTime">
+      <Property name="dataType">DateTime</Property>
+      <Property name="label">鍒涘缓鏃堕棿</Property>
+      <Property name="readOnly">true</Property>
+    </PropertyDef>
+    <PropertyDef name="createBy">
+      <Property></Property>
+      <Property name="label">鍒涘缓浜�</Property>
+      <Property name="readOnly">true</Property>
+    </PropertyDef>
+    <PropertyDef name="updateTime">
+      <Property name="dataType">DateTime</Property>
+      <Property name="label">鏇存柊鏃堕棿</Property>
+      <Property name="readOnly">true</Property>
+    </PropertyDef>
+    <PropertyDef name="updateBy">
+      <Property></Property>
+      <Property name="label">鏇存柊浜�</Property>
+      <Property name="readOnly">true</Property>
+    </PropertyDef>
+  </DataType>
 </Model>

--
Gitblit v1.9.3