37758b759bce63f0ed20d6c9c95b7ee9dda5224e..1f455e5cda9016054c531bbae6b1639fe646628f
2025-11-27 czt
框架调整,及库区切换
1f455e 对比 | 目录
2025-11-27 czt
仓库页面
fdcb3d 对比 | 目录
已修改16个文件
已添加11个文件
2566 ■■■■ 文件已修改
fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/Constant.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/RedisConst.java 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Depot.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/CompanyRepository.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DepotRepository.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DepotStoreRepository.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DeptRepository.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/CoreCompanyService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/CoreDeptService.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/DepotService.java 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/DepotStoreService.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SysUserService.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/Company.view.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/CompanyPR.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/Depot.view.xml 488 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/DepotPR.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/DeptPR.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/SelectDept.view.xml 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/SelectDeptPR.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/SysUserPR.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/models/core.model.xml 285 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/SysIndexController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/axui/loginAndRegister.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/ruoyi/login.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/index-topnav.html 552 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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";
    /**
     * éƒ¨é—¨ç±»åž‹
     */
fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/RedisConst.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,228 @@
package com.fzzy.igds.constant;
/**
 * Redis缓存使用的系统常量配置 ä¸»è¦ç”¨äºŽé…ç½®ç³»ç»Ÿç¼“存的KEY配置
 */
public class RedisConst {
    /**
     * æ ¹æ®ç»„织编码构建实际使用的KEY
     *
     * @param key1 ç»„织编码
     * @param key2 ç¼“å­˜KEY
     * @return
     */
    public static String buildKey(String key1, String key2) {
        return Constant.APP_NAME + ":" + key1 + ":" + key2;
    }
    /**
     * ä¸‰å±‚结构的KEY
     *
     * @param key1
     * @param key2
     * @param tag
     * @return
     */
    public static String buildKey(String key1, String key2, String tag) {
        return Constant.APP_NAME + ":" + key1 + ":" + key2 + ":" + tag;
    }
    /**
     * å››å±‚结构的KEY
     *
     * @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;
    }
    /**
     * åˆ›å»ºè®¾å¤‡åˆ—表的KEY,以分机为分组创建
     *
     * @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";
    /**
     * å­˜æ”¾æ°”象信息的KEY
     */
    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设备温湿度缓存key
     */
    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";
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Depot.java
@@ -97,11 +97,11 @@
    @TableField("bulk_weight")
    private Double bulkWeight;
    @Column(name = "store_keeper", columnDefinition = "varchar(4) COMMENT '保管员'")
    @Column(name = "store_keeper", columnDefinition = "varchar(40) COMMENT '保管员'")
    @TableField("store_keeper")
    private String storeKeeper;
    @Column(name = "store_keeper_name", columnDefinition = "varchar(4) COMMENT '保管员'")
    @Column(name = "store_keeper_name", columnDefinition = "varchar(40) COMMENT '保管员'")
    @TableField("store_keeper_name")
    private String storeKeeperName;
fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/CompanyRepository.java
@@ -17,6 +17,25 @@
public interface CompanyRepository extends JpaRepository<Company, String> {
    /**
     * æ ¹æ®id获取信息
     *
     * @param id
     * @return
     */
    @Query("from Company where id =:id order by id")
    List<Company> getDataById(@Param("id") String id);
    /**
     * æ ¹æ®companyId获取信息
     *
     * @param parentId
     * @return
     */
    @Query("from Company where id like:parentId order by id")
    List<Company> getDataByParentId(@Param("parentId") String parentId);
    /**
     * æ ¹æ®companyId获取信息
     *
     * @param companyId
fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DepotRepository.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
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);
    /**
     * èŽ·å–åº“åŒºä¸‹æœ€å¤§ä»“åº“ç¼–ç 
     *
     * @param deptId
     * @return
     */
    @Query("from Depot where deptId =:deptId order by id")
    List<Depot> getDepotMaxId(@Param("deptId") String deptId);
}
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);
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/repository/DeptRepository.java
@@ -19,11 +19,20 @@
    /**
     * æ ¹æ®id获取信息
     *
     * @param id
     * @param parentId
     * @return
     */
    @Query("from Dept where id like:parentId order by id")
    List<Dept> getDataByParentId(@Param("parentId") String parentId);
    /**
     * æ ¹æ®companyId获取信息
     *
     * @param companyId
     * @return
     */
    @Query("from Dept where id =:id order by id")
    Dept getDataById(@Param("id") String id);
    List<Dept> getDataById(@Param("id") String id);
    /**
     * æ ¹æ®companyId获取信息
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/CoreCompanyService.java
@@ -4,6 +4,7 @@
import com.fzzy.igds.repository.CompanyRepository;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -23,7 +24,16 @@
    /**
     * jpa查询公司信息
     * @param companyId
     * @param id
     * @return
     */
    public List<Company> getDataById(String id) {
        return companyRepository.getDataById(id);
    }
    /**
     * jpa查询公司信息
     * @return
     */
    public List<Company> getAllData(String companyId) {
@@ -35,6 +45,16 @@
    }
    /**
     * jpa查询公司信息
     * @return
     */
    public List<Company> getDataByParentId() {
        SysUser user = ContextUtil.getLoginUser();
        return companyRepository.getDataByParentId(user.getDeptId() + "%");
    }
    /**
     * jpa新增公司信息
     * @param sysDept
     * @return
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/CoreDeptService.java
@@ -1,10 +1,13 @@
package com.fzzy.igds.service;
import com.fzzy.igds.constant.Constant;
import com.fzzy.igds.domain.Dept;
import com.fzzy.igds.repository.DeptRepository;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysDeptService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
@@ -19,19 +22,33 @@
public class CoreDeptService {
    @Resource
    private ISysDeptService iSysDeptService;
    @Resource
    private DeptRepository deptRepository;
    /**
     * jpa查询信息
     * @param companyId
     * @param parentId
     * @return
     */
    public List<Dept> getAllData(String companyId) {
    public List<Dept> getDataByParentId(String parentId) {
        return deptRepository.getDataByParentId(parentId + "%");
    }
        if (StringUtils.isEmpty(companyId)) {
            companyId = ContextUtil.getCompanyId();
    /**
     * jpa查询信息
     * @return
     */
    public List<Dept> getDeptData() {
        SysUser user = ContextUtil.getLoginUser();
        SysDept userDept = iSysDeptService.selectDeptById(user.getDeptId());
        if (Constant.DEPT_TYPE_20.equals(userDept.getType())) {
            return deptRepository.getDataById(ContextUtil.subDeptId(user));
        }else {
            return deptRepository.getDataByParentId(user.getDeptId() + "%");
        }
        return deptRepository.getAllData(companyId);
    }
    /**
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/DepotService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,269 @@
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;
    /**
     * 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));
        }
        //主键ID
        if (StringUtils.isEmpty(depot.getId())) {
            depot.setId(getStrId(depot.getDeptId()));
            depot.setCreateBy(ContextUtil.getLoginUserName());
            depot.setCreateTime(new Date());
        }
        //默认顺序号
        if(null == depot.getOrderNum()){
            depot.setOrderNum(1);
        }
        depot.setUpdateBy(ContextUtil.getLoginUserName());
        depot.setUpdateTime(new Date());
        depotRepository.save(depot);
        flushCache(depot.getCompanyId());
    }
    /**
     * èŽ·å–ä¸»é”®ID
     * @param deptId
     * @param deptId
     */
    public String getStrId(String deptId) {
        List<Depot> depots = depotRepository.getDepotMaxId(deptId);
        String oldOrderId = null;
        if(null != depots && depots.size() > 0){
            oldOrderId = depots.get(0).getId().substring(deptId.length());
        }
        return deptId + ContextUtil.getOrderId(oldOrderId, 3);
    }
    /**
     * 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);
    }
}
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());
        }
    }
}
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);
    }
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/ContextUtil.java
@@ -3,8 +3,8 @@
import com.ruoyi.common.config.FrameworkConfig;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.time.LocalDateTime;
@@ -21,6 +21,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,63 @@
    }
    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);
    }
    /**
     * èŽ·å–é¡ºåºå·
     * @param oldOrderId åŽŸæœ‰é¡ºåºå·
     * @param num ä½æ•°
     * @return
     */
    public static String getOrderId(String oldOrderId, Integer num) {
        Integer index3 = 1001;
        Integer index4 = 10001;
        Integer index5 = 100001;
        Integer index = 0;
        String orderId = "001";
        if(StringUtils.isNotEmpty(oldOrderId)){
            index = Integer.valueOf(oldOrderId);
        }
        if(3 == num){
            orderId = ((index3 + index) + "").substring(1);
        }
        if(4 == num){
            orderId = ((index4 + index) + "").substring(1);
        }
        if(5 == num){
            orderId = ((index5 + index) + "").substring(1);
        }
        return orderId;
    }
}
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>
fzzy-igdss-view/src/main/java/com/fzzy/igds/CompanyPR.java
@@ -30,7 +30,7 @@
    @DataProvider
    public List<Company> getData() {
        return coreCompanyService.getAllData(null);
        return coreCompanyService.getDataByParentId();
    }
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">正在执行中..</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">正在删除</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>
fzzy-igdss-view/src/main/java/com/fzzy/igds/DepotPR.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
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);
        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);
    }
}
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>
fzzy-igdss-view/src/main/java/com/fzzy/igds/DeptPR.java
@@ -4,6 +4,10 @@
import com.bstek.dorado.annotation.DataResolver;
import com.fzzy.igds.domain.Dept;
import com.fzzy.igds.service.CoreDeptService;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.service.ISysDeptService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@@ -20,6 +24,7 @@
    @Resource
    private CoreDeptService coreDeptService;
    /**
     * æŸ¥è¯¢è®¾å¤‡,将操作信息调整为空,默认包括分库参数
     *
@@ -30,7 +35,7 @@
    @DataProvider
    public List<Dept> getData() {
        return coreDeptService.getAllData(null);
        return coreDeptService.getDeptData();
    }
    /**
fzzy-igdss-view/src/main/java/com/fzzy/igds/SelectDept.view.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<ViewConfig>
  <Arguments/>
  <Context/>
  <Model>
    <DataType name="dtCompany">
      <Property name="creationType">com.fzzy.igds.domain.Company</Property>
      <PropertyDef name="id">
        <Property></Property>
        <Property name="label">公司编码</Property>
      </PropertyDef>
      <PropertyDef name="dwmc">
        <Property></Property>
        <Property name="label">单位名称</Property>
      </PropertyDef>
      <Reference name="listArea">
        <Property name="dataType">[dtArea]</Property>
        <Property name="parameter">$${this.id}</Property>
        <Property name="dataProvider">selectDeptPR#listArea</Property>
      </Reference>
    </DataType>
    <DataType name="dtArea">
      <Property name="creationType">com.fzzy.igds.domain.Dept</Property>
      <PropertyDef name="id">
        <Property></Property>
        <Property name="label">库区代码</Property>
      </PropertyDef>
      <PropertyDef name="kqmc">
        <Property></Property>
        <Property name="label">库区名称</Property>
      </PropertyDef>
    </DataType>
  </Model>
  <View>
    <Property name="packages">font-awesome</Property>
    <DataSet id="dsCompany">
      <Property name="dataType">[dtCompany]</Property>
      <Property name="dataProvider">selectDeptPR#listCompany</Property>
    </DataSet>
    <DataTree>
      <ClientEvent name="onDataRowDoubleClick">var curNode = self.get(&quot;currentNode&quot;);&#xD;
if(curNode.get(&quot;hasChild&quot;)){&#xD;
    curNode.expand();&#xD;
    $notify(&quot;请选择库区……&quot;);&#xD;
}else{&#xD;
    var curData = self.get(&quot;currentEntity&quot;);&#xD;
    window.parent.onDeptAreaChange(curData.get(&quot;id&quot;));&#xD;
}</ClientEvent>
      <Property name="dataSet">dsCompany</Property>
      <Property name="highlightCurrentRow">false</Property>
      <BindingConfigs>
        <BindingConfig>
          <Property name="name">dwmc</Property>
          <Property name="hasChild">true</Property>
          <Property name="labelProperty">dwmc</Property>
          <Property name="iconClass">fa fa-university</Property>
          <BindingConfig>
            <Property name="name">name</Property>
            <Property name="childrenProperty">listArea</Property>
            <Property name="labelProperty">kqmc</Property>
            <Property name="iconClass">fa fa-home</Property>
          </BindingConfig>
        </BindingConfig>
      </BindingConfigs>
    </DataTree>
  </View>
</ViewConfig>
fzzy-igdss-view/src/main/java/com/fzzy/igds/SelectDeptPR.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.fzzy.igds;
import com.bstek.dorado.annotation.DataProvider;
import com.fzzy.igds.domain.Company;
import com.fzzy.igds.domain.Dept;
import com.fzzy.igds.service.CoreCompanyService;
import com.fzzy.igds.service.CoreDeptService;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.config.FrameworkConfig;
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 16:46
 */
@Component
public class SelectDeptPR {
    @Resource
    private CoreCompanyService companyService;
    @Resource
    private CoreDeptService deptService;
    /**
     * selectDeptPR#listCompany
     * æ ¹æ®è¡Œæ”¿åŒºåˆ’代码获取 ä¼ä¸šä¿¡æ¯åˆ—表
     * @param id
     * @return
     */
    @DataProvider
    public List<Company> listCompany(String id){
        //获取当前登录人
        SysUser user = ContextUtil.getLoginUser();
        if(FrameworkConfig.getCompanyId().equals(user.getCompanyId())){
            //系统监管账号
            return companyService.getAllData(user.getCompanyId());
        }else {
            //收储公司账号
            return companyService.getDataById(user.getCompanyId());
        }
    }
    /**
     * èŽ·å–å…¬å¸ä¸‹å±žåº“åŒºåˆ—è¡¨
     * selectDeptPR#listArea
     * @param id
     * @return
     */
    @DataProvider
    public List<Dept> listArea(String id){
        return deptService.getDataByParentId(id);
    }
}
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);
    }
}
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>
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/SysIndexController.java
@@ -1,9 +1,12 @@
package com.fzzy.sys.controller;
import com.fzzy.igds.constant.Constant;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.config.FrameworkConfig;
import com.ruoyi.common.constant.ShiroConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.text.Convert;
@@ -13,6 +16,7 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.shiro.service.SysPasswordService;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysMenuService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
@@ -37,16 +41,50 @@
    private ISysConfigService configService;
    @Resource
    private SysPasswordService passwordService;
    @Resource
    private ISysDeptService iSysDeptService;
    /**
     * é¡µé¢è·¯ç”±
     *
     * @param mmap
     * @return
     */
    @GetMapping("/index-gateway")
    public String indexGateway(ModelMap mmap) {
        //获取登录人信息
        SysUser user = getSysUser();
        //单库区主页
        return "redirect:index?deptId=" + user.getDeptId();
    }
    // ç³»ç»Ÿé¦–页
    @GetMapping("/index")
    public String index(@RequestParam(value = "bizType", required = false) String bizType,
    public String index(@RequestParam(value = "deptId", required = true) String deptId,
                        ModelMap mmap) {
        // å–身份信息
        SysUser user = getSysUser();
        mmap.put("user", user);
        mmap.put("sysName", FrameworkConfig.getName());
        //判断是否显示库区选择弹窗
        String showDeptList = "Y";
        SysDept userDept = iSysDeptService.selectDeptById(user.getDeptId());
        if (Constant.DEPT_TYPE_20.equals(userDept.getType())) {
            showDeptList = "N";
        }
        mmap.put("showDeptList", showDeptList);
        ContextUtil.updateSubDept(user.getLoginName(), deptId);
        SysDept dept = iSysDeptService.selectDeptById(Long.valueOf(deptId));
        mmap.put("dept", dept);
        mmap.put("deptId", deptId);
        //后台默认页面
        String welcomeUrl = "/group/gis";
        mmap.put("welcomeUrl", welcomeUrl);
        // æ ¹æ®ç”¨æˆ·id取出菜单
        List<SysMenu> menus = menuService.selectMenusByUser(user);
        mmap.put("menus", menus);
fzzy-igdss-web/src/main/resources/static/axui/loginAndRegister.js
@@ -39,7 +39,7 @@
        },
        success: function(r) {
            if (r.code == web_status.SUCCESS) {
                location.href = ctx + 'index';
                location.href = ctx + 'index-gateway';
            } else {
                $('.imgcode').click();
                $(".code").val("");
fzzy-igdss-web/src/main/resources/static/ruoyi/login.js
@@ -31,7 +31,7 @@
        },
        success: function(r) {
            if (r.code == web_status.SUCCESS) {
                location.href = ctx + 'index';
                location.href = ctx + 'index-gateway';
            } else {
                $('.imgcode').click();
                $(".code").val("");
fzzy-igdss-web/src/main/resources/templates/index-topnav.html
@@ -1,12 +1,12 @@
<!DOCTYPE html>
<html  lang="zh" xmlns:th="http://www.thymeleaf.org">
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="renderer" content="webkit">
    <title th:text="${sysName}">智慧粮库管理系统</title>
    <title th:text="${sysName}">智慧粮库管理系统</title>
    <!-- é¿å…IE使用兼容模式 -->
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <link th:href="@{favicon.ico}" rel="shortcut icon"/>
    <link th:href="@{/css/bootstrap.min.css}" rel="stylesheet"/>
    <link th:href="@{/css/jquery.contextMenu.min.css}" rel="stylesheet"/>
@@ -15,9 +15,12 @@
    <link th:href="@{/css/style.min.css}" rel="stylesheet"/>
    <link th:href="@{/css/skins.css?v=20200902}" rel="stylesheet"/>
    <link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.8}" rel="stylesheet"/>
    <style type="text/css">.fixed-sidebar .nav:not(.navbar-toolbar)>li.active{border-left:0px!important;}</style>
    <style type="text/css">.fixed-sidebar .nav:not(.navbar-toolbar) > li.active {
        border-left: 0px !important;
    }</style>
</head>
<body class="fixed-sidebar full-height-layout skin-zcl" th:classappend="${isMobile} ? 'canvas-menu'" style="overflow: hidden">
<body class="fixed-sidebar full-height-layout skin-zcl" th:classappend="${isMobile} ? 'canvas-menu'"
      style="overflow: hidden">
<div id="wrapper">
    <!--左侧导航开始-->
@@ -25,183 +28,200 @@
        <div class="nav-close">
            <i class="fa fa-times-circle"></i>
        </div>
        <a th:href="@{/index}">
        <a onclick="onDeptChange()" href="javascript:;">
            <li class="logo hidden-xs">
                <span class="logo-lg" th:text="${sysName}">智慧粮库管理系统</span>
            </li>
         </a>
        </a>
        <div class="sidebar-collapse tab-content" id="side-menu">
            <div class="user-panel">
                <a class="menuItem noactive" title="个人中心" th:href="@{/system/user/profile}">
                    <div class="hide" th:text="个人中心"></div>
                    <div class="pull-left image">
                        <img th:src="(${#strings.isEmpty(user.avatar)}) ? @{/img/profile.jpg} : @{${user.avatar}}" th:onerror="this.src='img/profile.jpg'" class="img-circle" alt="User Image">
                    </div>
                </a>
                <div class="pull-left info">
                  <p>[[${user.loginName}]]</p>
                  <a href="javascript:;"><i class="fa fa-circle text-success"></i> åœ¨çº¿</a>
                  <a th:href="@{logout}" style="padding-left:5px;"><i class="fa fa-sign-out text-danger"></i> æ³¨é”€</a>
                </div>
            </div>
            <div class="user-panel">
                <a class="menuItem noactive" title="个人中心" th:href="@{/system/user/profile}">
                    <div class="hide" th:text="个人中心"></div>
                    <div class="pull-left image">
                        <img th:src="(${#strings.isEmpty(user.avatar)}) ? @{/img/profile.jpg} : @{${user.avatar}}"
                             th:onerror="this.src='img/profile.jpg'" class="img-circle" alt="User Image">
                    </div>
                </a>
                <div class="pull-left info">
                    <p>[[${user.loginName}]]</p>
                    <a href="javascript:;"><i class="fa fa-circle text-success"></i> åœ¨çº¿</a>
                    <a th:href="@{logout}" style="padding-left:5px;"><i class="fa fa-sign-out text-danger"></i> æ³¨é”€</a>
                </div>
            </div>
            <!-- å·¦ä¾§èœå• -->
            <th:block th:each="menu : ${menus}">
            <div class="tab-pane fade height-full" th:id="|menu_${menu.menuId}|">
              <ul class="nav">
                <li th:each="cmenu : ${menu.children}">
                  <a class="menu-content" th:if="${#lists.isEmpty(cmenu.children)}" th:href="@{${cmenu.url}}" th:classappend="${#strings.isEmpty(cmenu.target)} ? |menuItem| : ${cmenu.target}" th:data-refresh="${cmenu.isRefresh == '0'}">
                    <i th:class="${cmenu.icon} + ' fa-fw'"></i> <span class="nav-label">[[${cmenu.menuName}]]</span>
                  </a>
                  <a class="menu-content" th:if="${not #lists.isEmpty(cmenu.children)}" href="javascript:;">
                    <i th:class="${cmenu.icon} + ' fa-fw'"></i>
                    <span class="nav-label">[[${cmenu.menuName}]]</span>
                    <span class="fa arrow"></span>
                  </a>
                  <ul th:if="${not #lists.isEmpty(cmenu.children)}" class="nav nav-second-level collapse">
                    <li th:each="emenu : ${cmenu.children}">
                      <a th:if="${#lists.isEmpty(emenu.children)}" th:href="@{${emenu.url}}" th:class="${#strings.isEmpty(emenu.target)} ? |menuItem| : ${emenu.target}" th:data-refresh="${emenu.isRefresh == '0'}">
                        <i th:class="${emenu.icon} + ' fa-fw'"></i>
                        [[${emenu.menuName}]]
                      </a>
                      <a th:if="${not #lists.isEmpty(emenu.children)}" href="javascript:;">
                        <i th:class="${emenu.icon} + ' fa-fw'"></i>
                        [[${emenu.menuName}]]
                        <span class="fa arrow"></span>
                      </a>
                      <ul th:if="${not #lists.isEmpty(emenu.children)}" class="nav nav-third-level collapse">
                        <li th:each="fmenu : ${emenu.children}"><a th:if="${#lists.isEmpty(fmenu.children)}" th:class="${#strings.isEmpty(fmenu.target)} ? |menuItem| : ${fmenu.target}" th:href="@{${fmenu.url}}" th:data-refresh="${fmenu.isRefresh == '0'}">[[${fmenu.menuName}]]</a></li>
                      </ul>
                    </li>
                  </ul>
                </li>
              </ul>
            </div>
            </th:block>
            <!-- é¦–页菜单 -->
            <div class="tab-pane fade height-full" id="index">
              <ul class="nav">
                <li>
                  <a class="menuItem" th:href="@{/archive/index}">
                  <i class="fa fa-home"></i> <span class="nav-label">首页</span></a>
                </li>
              </ul>
            </div>
            <th:block th:each="menu : ${menus}">
                <div class="tab-pane fade height-full" th:id="|menu_${menu.menuId}|">
                    <ul class="nav">
                        <li th:each="cmenu : ${menu.children}">
                            <a class="menu-content" th:if="${#lists.isEmpty(cmenu.children)}" th:href="@{${cmenu.url}}"
                               th:classappend="${#strings.isEmpty(cmenu.target)} ? |menuItem| : ${cmenu.target}"
                               th:data-refresh="${cmenu.isRefresh == '0'}">
                                <i th:class="${cmenu.icon} + ' fa-fw'"></i> <span class="nav-label">[[${cmenu.menuName}]]</span>
                            </a>
                            <a class="menu-content" th:if="${not #lists.isEmpty(cmenu.children)}" href="javascript:;">
                                <i th:class="${cmenu.icon} + ' fa-fw'"></i>
                                <span class="nav-label">[[${cmenu.menuName}]]</span>
                                <span class="fa arrow"></span>
                            </a>
                            <ul th:if="${not #lists.isEmpty(cmenu.children)}" class="nav nav-second-level collapse">
                                <li th:each="emenu : ${cmenu.children}">
                                    <a th:if="${#lists.isEmpty(emenu.children)}" th:href="@{${emenu.url}}"
                                       th:class="${#strings.isEmpty(emenu.target)} ? |menuItem| : ${emenu.target}"
                                       th:data-refresh="${emenu.isRefresh == '0'}">
                                        <i th:class="${emenu.icon} + ' fa-fw'"></i>
                                        [[${emenu.menuName}]]
                                    </a>
                                    <a th:if="${not #lists.isEmpty(emenu.children)}" href="javascript:;">
                                        <i th:class="${emenu.icon} + ' fa-fw'"></i>
                                        [[${emenu.menuName}]]
                                        <span class="fa arrow"></span>
                                    </a>
                                    <ul th:if="${not #lists.isEmpty(emenu.children)}"
                                        class="nav nav-third-level collapse">
                                        <li th:each="fmenu : ${emenu.children}"><a
                                                th:if="${#lists.isEmpty(fmenu.children)}"
                                                th:class="${#strings.isEmpty(fmenu.target)} ? |menuItem| : ${fmenu.target}"
                                                th:href="@{${fmenu.url}}" th:data-refresh="${fmenu.isRefresh == '0'}">[[${fmenu.menuName}]]</a>
                                        </li>
                                    </ul>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </div>
            </th:block>
            <!-- é¦–页菜单 -->
            <div class="tab-pane fade height-full" id="index">
                <ul class="nav">
                    <li>
                        <a class="menuItem" th:href="@{/index}">
                            <i class="fa fa-home"></i> <span class="nav-label">首页</span></a>
                    </li>
                </ul>
            </div>
            <!-- å®žä¾‹æ¼”示菜单 -->
            <div class="tab-pane fade height-full" id="demo" th:if="${demoEnabled}">
              <ul class="nav">
                <li>
                  <a href="javascript:;"><i class="fa fa-edit"></i> <span class="nav-label">表单</span><span class="fa arrow"></span></a>
                  <ul class="nav nav-second-level collapse">
                    <li><a class="menuItem" th:href="@{/demo/form/button}">按钮</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/grid}">栅格</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/select}">下拉框</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/timeline}">时间轴</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/progress_bars}">进度条</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/basic}">基本表单</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/cards}">卡片列表</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/jasny}">功能扩展</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/sortable}">拖动排序</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/invoice}">单据打印</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/labels_tips}">标签 & æç¤º</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/tabs_panels}">选项卡 & é¢æ¿</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/validate}">表单校验</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/wizard}">表单向导</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/upload}">文件上传</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/datetime}">日期和时间</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/summernote}">富文本编辑器</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/duallistbox}">左右互选组件</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/autocomplete}">搜索自动补全</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/cxselect}">多级联动下拉</a></li>
                    <li><a class="menuItem" th:href="@{/demo/form/localrefresh}">Ajax局部刷新</a></li>
                  </ul>
                </li>
                <li>
                  <a href="javascript:;"><i class="fa fa-table"></i> <span class="nav-label">表格</span><span class="fa arrow"></span></a>
                  <ul class="nav nav-second-level collapse">
                    <li><a class="menuItem" th:href="@{/demo/table/search}">查询条件</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/footer}">数据汇总</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/groupHeader}">组合表头</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/export}">表格导出</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/exportSelected}">导出选择列</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/remember}">翻页记住选择</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/pageGo}">跳转至指定页</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/params}">自定义查询参数</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/multi}">初始多表格</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/button}">点击按钮加载表格</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/data}">直接加载表格数据</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/fixedColumns}">表格冻结列</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/event}">自定义触发事件</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/headerStyle}">表格标题格式化</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/detail}">表格细节视图</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/child}">表格父子视图</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/image}">表格图片预览</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/curd}">动态增删改查</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/reorderRows}">表格行拖拽操作</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/reorderColumns}">表格列拖拽操作</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/resizable}">表格列宽拖动</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/editable}">表格行内编辑</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/subdata}">主子表提交</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/refresh}">表格自动刷新</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/print}">表格打印配置</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/dynamicColumns}">表格动态列</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/customView}">自定义视图分页</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/asynTree}">异步加载表格树</a></li>
                    <li><a class="menuItem" th:href="@{/demo/table/other}">表格其他操作</a></li>
                  </ul>
                </li>
                <li>
                  <a href="javascript:;"><i class="fa fa-flask"></i> <span class="nav-label">弹框</span><span class="fa arrow"></span></a>
                  <ul class="nav nav-second-level collapse">
                    <li><a class="menuItem" th:href="@{/demo/modal/dialog}">模态窗口</a></li>
                    <li><a class="menuItem" th:href="@{/demo/modal/layer}">弹层组件</a></li>
                    <li><a class="menuItem" th:href="@{/demo/modal/table}">弹层表格</a></li>
                  </ul>
                </li>
                <li>
                  <a href="javascript:;"><i class="fa fa-wpforms"></i> <span class="nav-label">操作</span><span class="fa arrow"></span></a>
                  <ul class="nav nav-second-level collapse">
                    <li><a class="menuItem" th:href="@{/demo/operate/table}">表格</a></li>
                    <li><a class="menuItem" th:href="@{/demo/operate/other}">其他</a></li>
                  </ul>
                </li>
                <li>
                  <a href="javascript:;"><i class="fa fa-bar-chart-o"></i> <span class="nav-label">报表</span><span class="fa arrow"></span></a>
                  <ul class="nav nav-second-level collapse">
                    <li><a class="menuItem" th:href="@{/demo/report/echarts}">百度ECharts</a></li>
                    <li><a class="menuItem" th:href="@{/demo/report/peity}">peity</a></li>
                    <li><a class="menuItem" th:href="@{/demo/report/sparkline}">sparkline</a></li>
                    <li><a class="menuItem" th:href="@{/demo/report/metrics}">图表组合</a></li>
                  </ul>
                </li>
                <li>
                  <a href="javascript:;"><i class="fa fa-book"></i> <span class="nav-label">图标</span><span class="fa arrow"></span></a>
                  <ul class="nav nav-second-level collapse">
                    <li><a class="menuItem" th:href="@{/demo/icon/fontawesome}">Font Awesome</a></li>
                    <li><a class="menuItem" th:href="@{/demo/icon/glyphicons}">Glyphicons</a></li>
                  </ul>
                </li>
                <li>
                  <a href="javascript:;"><i class="fa fa-navicon"></i> <span class="nav-label">四层菜单</span><span class="fa arrow"></span></a>
                  <ul class="nav nav-second-level collapse">
                    <li>
                        <a href="javascript:;" id="damian">三级菜单1<span class="fa arrow"></span></a>
                        <ul class="nav nav-third-level collapse">
                            <li>
                                <a href="javascript:;">四级菜单1</a>
                            </li>
                            <li>
                                <a href="javascript:;">四级菜单2</a>
                            </li>
                        </ul>
                    </li>
                    <li><a href="javascript:;">三级菜单2</a></li>
                  </ul>
                </li>
              </ul>
            </div>
            <div class="tab-pane fade height-full" id="demo" th:if="${demoEnabled}">
                <ul class="nav">
                    <li>
                        <a href="javascript:;"><i class="fa fa-edit"></i> <span class="nav-label">表单</span><span
                                class="fa arrow"></span></a>
                        <ul class="nav nav-second-level collapse">
                            <li><a class="menuItem" th:href="@{/demo/form/button}">按钮</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/grid}">栅格</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/select}">下拉框</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/timeline}">时间轴</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/progress_bars}">进度条</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/basic}">基本表单</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/cards}">卡片列表</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/jasny}">功能扩展</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/sortable}">拖动排序</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/invoice}">单据打印</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/labels_tips}">标签 & æç¤º</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/tabs_panels}">选项卡 & é¢æ¿</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/validate}">表单校验</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/wizard}">表单向导</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/upload}">文件上传</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/datetime}">日期和时间</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/summernote}">富文本编辑器</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/duallistbox}">左右互选组件</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/autocomplete}">搜索自动补全</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/cxselect}">多级联动下拉</a></li>
                            <li><a class="menuItem" th:href="@{/demo/form/localrefresh}">Ajax局部刷新</a></li>
                        </ul>
                    </li>
                    <li>
                        <a href="javascript:;"><i class="fa fa-table"></i> <span class="nav-label">表格</span><span
                                class="fa arrow"></span></a>
                        <ul class="nav nav-second-level collapse">
                            <li><a class="menuItem" th:href="@{/demo/table/search}">查询条件</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/footer}">数据汇总</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/groupHeader}">组合表头</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/export}">表格导出</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/exportSelected}">导出选择列</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/remember}">翻页记住选择</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/pageGo}">跳转至指定页</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/params}">自定义查询参数</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/multi}">初始多表格</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/button}">点击按钮加载表格</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/data}">直接加载表格数据</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/fixedColumns}">表格冻结列</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/event}">自定义触发事件</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/headerStyle}">表格标题格式化</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/detail}">表格细节视图</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/child}">表格父子视图</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/image}">表格图片预览</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/curd}">动态增删改查</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/reorderRows}">表格行拖拽操作</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/reorderColumns}">表格列拖拽操作</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/resizable}">表格列宽拖动</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/editable}">表格行内编辑</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/subdata}">主子表提交</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/refresh}">表格自动刷新</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/print}">表格打印配置</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/dynamicColumns}">表格动态列</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/customView}">自定义视图分页</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/asynTree}">异步加载表格树</a></li>
                            <li><a class="menuItem" th:href="@{/demo/table/other}">表格其他操作</a></li>
                        </ul>
                    </li>
                    <li>
                        <a href="javascript:;"><i class="fa fa-flask"></i> <span class="nav-label">弹框</span><span
                                class="fa arrow"></span></a>
                        <ul class="nav nav-second-level collapse">
                            <li><a class="menuItem" th:href="@{/demo/modal/dialog}">模态窗口</a></li>
                            <li><a class="menuItem" th:href="@{/demo/modal/layer}">弹层组件</a></li>
                            <li><a class="menuItem" th:href="@{/demo/modal/table}">弹层表格</a></li>
                        </ul>
                    </li>
                    <li>
                        <a href="javascript:;"><i class="fa fa-wpforms"></i> <span class="nav-label">操作</span><span
                                class="fa arrow"></span></a>
                        <ul class="nav nav-second-level collapse">
                            <li><a class="menuItem" th:href="@{/demo/operate/table}">表格</a></li>
                            <li><a class="menuItem" th:href="@{/demo/operate/other}">其他</a></li>
                        </ul>
                    </li>
                    <li>
                        <a href="javascript:;"><i class="fa fa-bar-chart-o"></i> <span
                                class="nav-label">报表</span><span class="fa arrow"></span></a>
                        <ul class="nav nav-second-level collapse">
                            <li><a class="menuItem" th:href="@{/demo/report/echarts}">百度ECharts</a></li>
                            <li><a class="menuItem" th:href="@{/demo/report/peity}">peity</a></li>
                            <li><a class="menuItem" th:href="@{/demo/report/sparkline}">sparkline</a></li>
                            <li><a class="menuItem" th:href="@{/demo/report/metrics}">图表组合</a></li>
                        </ul>
                    </li>
                    <li>
                        <a href="javascript:;"><i class="fa fa-book"></i> <span class="nav-label">图标</span><span
                                class="fa arrow"></span></a>
                        <ul class="nav nav-second-level collapse">
                            <li><a class="menuItem" th:href="@{/demo/icon/fontawesome}">Font Awesome</a></li>
                            <li><a class="menuItem" th:href="@{/demo/icon/glyphicons}">Glyphicons</a></li>
                        </ul>
                    </li>
                    <li>
                        <a href="javascript:;"><i class="fa fa-navicon"></i> <span
                                class="nav-label">四层菜单</span><span class="fa arrow"></span></a>
                        <ul class="nav nav-second-level collapse">
                            <li>
                                <a href="javascript:;" id="damian">三级菜单1<span class="fa arrow"></span></a>
                                <ul class="nav nav-third-level collapse">
                                    <li>
                                        <a href="javascript:;">四级菜单1</a>
                                    </li>
                                    <li>
                                        <a href="javascript:;">四级菜单2</a>
                                    </li>
                                </ul>
                            </li>
                            <li><a href="javascript:;">三级菜单2</a></li>
                        </ul>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
    <!--左侧导航结束-->
@@ -211,74 +231,87 @@
        <div class="row border-bottom">
            <nav class="navbar navbar-static-top" role="navigation" style="margin-bottom: 0">
                <div class="navbar-header">
                    <a class="navbar-minimalize minimalize-styl-2" style="color:#FFF;" href="javascript:;" title="收起菜单">
                        <i class="fa fa-bars"></i>
                    <a class="navbar-minimalize minimalize-styl-2" style="color:#FFF;" href="javascript:;"
                       title="收起菜单">
                        <i class="fa fa-bars"></i>
                    </a>
                </div>
                <!-- é¡¶éƒ¨æ  -->
                <div id="navMenu">
                  <ul class="nav navbar-toolbar nav-tabs navbar-left hidden-xs">
                    <!-- é¡¶éƒ¨èœå•列表 -->
                    <th:block th:each="menu : ${menus}">
                       <li role="presentation" th:id="|tab_${menu.menuId}|">
                           <a th:if="${#lists.isEmpty(menu.children)}" data-toggle="tab" th:class="@{${!#strings.isEmpty(menu.target) && menu.target == 'menuBlank'} ? 'menuBlank' : 'menuItem noactive'}" th:href="@{${menu.url}}">
                            <i th:class="${menu.icon}"></i> <span>[[${menu.menuName}]]</span>
                        </a>
                        <a th:if="${not #lists.isEmpty(menu.children)}" data-toggle="tab" th:class="@{${!#strings.isEmpty(menu.target) && menu.target == 'menuBlank'} ? 'menuBlank'}" th:href="@{${!#strings.isEmpty(menu.target) && menu.target == 'menuBlank'} ? @{${menu.url}} : |#menu_${menu.menuId}|}">
                            <i th:class="${menu.icon}"></i> <span>[[${menu.menuName}]]</span>
                        </a>
                    </li>
                    </th:block>
<!--                    <li role="presentation" id="tab_index">-->
<!--                      <a data-toggle="tab" href="#index">-->
<!--                        <i class="fa fa-area-chart"></i> <span>统计报表</span>-->
<!--                      </a>-->
<!--                    </li>-->
<!--                    <li role="presentation" id="tab_demo" th:if="${demoEnabled}">-->
<!--                      <a data-toggle="tab" href="#demo">-->
<!--                        <i class="fa fa-desktop"></i> <span>实例演示</span>-->
<!--                      </a>-->
<!--                    </li>-->
                  </ul>
                </div>
                    <ul class="nav navbar-toolbar nav-tabs navbar-left hidden-xs">
                        <!-- é¡¶éƒ¨èœå•列表 -->
                        <th:block th:each="menu : ${menus}">
                            <li role="presentation" th:id="|tab_${menu.menuId}|">
                                <a th:if="${#lists.isEmpty(menu.children)}" data-toggle="tab"
                                   th:class="@{${!#strings.isEmpty(menu.target) && menu.target == 'menuBlank'} ? 'menuBlank' : 'menuItem noactive'}"
                                   th:href="@{${menu.url}}">
                                    <i th:class="${menu.icon}"></i> <span>[[${menu.menuName}]]</span>
                                </a>
                                <a th:if="${not #lists.isEmpty(menu.children)}" data-toggle="tab"
                                   th:class="@{${!#strings.isEmpty(menu.target) && menu.target == 'menuBlank'} ? 'menuBlank'}"
                                   th:href="@{${!#strings.isEmpty(menu.target) && menu.target == 'menuBlank'} ? @{${menu.url}} : |#menu_${menu.menuId}|}">
                                    <i th:class="${menu.icon}"></i> <span>[[${menu.menuName}]]</span>
                                </a>
                            </li>
                        </th:block>
                        <!--                    <li role="presentation" id="tab_index">-->
                        <!--                      <a data-toggle="tab" href="#index">-->
                        <!--                        <i class="fa fa-area-chart"></i> <span>统计报表</span>-->
                        <!--                      </a>-->
                        <!--                    </li>-->
                        <!--                    <li role="presentation" id="tab_demo" th:if="${demoEnabled}">-->
                        <!--                      <a data-toggle="tab" href="#demo">-->
                        <!--                        <i class="fa fa-desktop"></i> <span>实例演示</span>-->
                        <!--                      </a>-->
                        <!--                    </li>-->
                    </ul>
                </div>
                <!-- å³ä¾§æ  -->
                <ul class="nav navbar-top-links navbar-right welcome-message">
                    <li><a data-toggle="tooltip" data-trigger="hover" data-placement="bottom" title="开发文档" href="https://fzzygf-company.feishu.cn/wiki/ZgS5wQuyMi2uDKk9xN6cx8jlnuf" target="_blank"><i class="fa fa-question-circle"></i> æ–‡æ¡£</a></li>
                    <li><a data-toggle="tooltip" data-trigger="hover" data-placement="bottom" title="锁定屏幕" href="javascript:;" id="lockScreen"><i class="fa fa-lock"></i> é”å±</a></li>
                    <li><a data-toggle="tooltip" data-trigger="hover" data-placement="bottom" title="全屏显示" href="javascript:;" id="fullScreen"><i class="fa fa-arrows-alt"></i> å…¨å±</a></li>
                    <li style="background-color: #03703a;"><a onclick="showDepotAreaSelect()" data-toggle="tooltip" data-trigger="hover" data-placement="bottom" title="库区选择"
                           href="javascript:;"><i class="fa fa-refresh"></i> [[${#strings.defaultString(dept.deptName,
                        '-')}]]</a></li>
                    <li><a data-toggle="tooltip" data-trigger="hover" data-placement="bottom" title="开发文档"
                           href="https://fzzygf-company.feishu.cn/wiki/ZgS5wQuyMi2uDKk9xN6cx8jlnuf" target="_blank"><i
                            class="fa fa-question-circle"></i> æ–‡æ¡£</a></li>
                    <li><a data-toggle="tooltip" data-trigger="hover" data-placement="bottom" title="锁定屏幕"
                           href="javascript:;" id="lockScreen"><i class="fa fa-lock"></i> é”å±</a></li>
                    <li><a data-toggle="tooltip" data-trigger="hover" data-placement="bottom" title="全屏显示"
                           href="javascript:;" id="fullScreen"><i class="fa fa-arrows-alt"></i> å…¨å±</a></li>
                    <li class="dropdown user-menu">
                        <a href="javascript:void(0)" class="dropdown-toggle" data-hover="dropdown">
                            <img th:src="(${#strings.isEmpty(user.avatar)}) ? @{/img/profile.jpg} : @{${user.avatar}}" th:onerror="this.src='img/profile.jpg'" class="user-image">
                            <span class="hidden-xs">[[${#strings.defaultString(user.userName, '-')}]]</span>
                        </a>
                        <ul class="dropdown-menu">
                            <li class="mt5">
                                <a th:href="@{/system/user/profile}" class="menuItem noactive">
                                <i class="fa fa-user"></i> ä¸ªäººä¸­å¿ƒ</a>
                            </li>
                            <li>
                                <a onclick="resetPwd()">
                                <i class="fa fa-key"></i> ä¿®æ”¹å¯†ç </a>
                            </li>
                            <li>
                                <a onclick="switchSkin()">
                                <i class="fa fa-dashboard"></i> åˆ‡æ¢ä¸»é¢˜</a>
                            </li>
                            <li>
                                <a onclick="toggleMenu()">
                                <i class="fa fa-toggle-off"></i> å·¦ä¾§èœå•</a>
                            </li>
                            <li class="divider"></li>
                            <li>
                                <a th:href="@{logout}">
                                <i class="fa fa-sign-out"></i> é€€å‡ºç™»å½•</a>
                            </li>
                        </ul>
                    </li>
                        <a href="javascript:void(0)" class="dropdown-toggle" data-hover="dropdown">
                            <img th:src="(${#strings.isEmpty(user.avatar)}) ? @{/img/profile.jpg} : @{${user.avatar}}"
                                 th:onerror="this.src='img/profile.jpg'" class="user-image">
                            <span class="hidden-xs">[[${#strings.defaultString(user.userName, '-')}]]</span>
                        </a>
                        <ul class="dropdown-menu">
                            <li class="mt5">
                                <a th:href="@{/system/user/profile}" class="menuItem noactive">
                                    <i class="fa fa-user"></i> ä¸ªäººä¸­å¿ƒ</a>
                            </li>
                            <li>
                                <a onclick="resetPwd()">
                                    <i class="fa fa-key"></i> ä¿®æ”¹å¯†ç </a>
                            </li>
                            <li>
                                <a onclick="switchSkin()">
                                    <i class="fa fa-dashboard"></i> åˆ‡æ¢ä¸»é¢˜</a>
                            </li>
                            <li>
                                <a onclick="toggleMenu()">
                                    <i class="fa fa-toggle-off"></i> å·¦ä¾§èœå•</a>
                            </li>
                            <li class="divider"></li>
                            <li>
                                <a th:href="@{logout}">
                                    <i class="fa fa-sign-out"></i> é€€å‡ºç™»å½•</a>
                            </li>
                        </ul>
                    </li>
                </ul>
            </nav>
        </div>
@@ -288,7 +321,7 @@
            </button>
            <nav class="page-tabs menuTabs">
                <div class="page-tabs-content">
                    <a href="javascript:;" class="active menuTab" th:data-id="@{/eoms/index}">首页</a>
                    <a href="javascript:;" class="active menuTab" th:data-id="${welcomeUrl}">欢迎</a>
                </div>
            </nav>
            <button class="roll-nav roll-right tabRight">
@@ -297,15 +330,16 @@
            <a href="javascript:void(0);" class="roll-nav roll-right tabReload"><i class="fa fa-refresh"></i> åˆ·æ–°</a>
        </div>
        <a id="ax_close_max" class="ax_close_max" href="javascript:;" title="关闭全屏"> <i class="fa fa-times-circle-o"></i> </a>
        <a id="ax_close_max" class="ax_close_max" href="javascript:;" title="关闭全屏"> <i
                class="fa fa-times-circle-o"></i> </a>
        <div class="row mainContent" id="content-main" th:classappend="${mainClass}">
            <iframe class="RuoYi_iframe" name="iframe0" width="100%" height="100%" th:data-id="@{/eoms/index}"
                th:src="@{/eoms/index}" frameborder="0" seamless></iframe>
            <iframe class="RuoYi_iframe" name="iframe0" width="100%" height="100%" th:data-id="${welcomeUrl}"
                    th:src="${welcomeUrl}" frameborder="0" seamless></iframe>
        </div>
        <div th:if="${footer}" class="footer">
            <div class="pull-right">© [[${copyrightYear}]] RuoYi Copyright </div>
            <div class="pull-right">© [[${copyrightYear}]] RuoYi Copyright</div>
        </div>
    </div>
    <!--右侧部分结束-->
@@ -327,6 +361,9 @@
window.history.forward(1);
var ctx = [[@{/}]]; 
var lockscreen = [[${session.lockscreen}]]; 
var dept = [[${dept}]];
var deptId = [[${deptId}]];
var showDeptList = [[${showDeptList}]];
if(lockscreen){window.top.location=ctx+"lockscreen";}
// çš®è‚¤ç¼“å­˜
var skin = storage.get("skin");
@@ -364,6 +401,35 @@
    })
}
/**
 * å¼¹å‡ºåˆ‡æ¢åº“区列表
 */
function showDepotAreaSelect() {
    if(showDeptList === "N"){
        return false;
    }
    layer.open({
        type: 2,
        title: '选择库区',
        area: ['400px', '650px'],
        offset: ['50px', '1350px'],
        shade: 0,
        content: "com.fzzy.igds.SelectDept.d",
        closeBtn: 1
    });
}
/**
 * é‡æ–°åˆ‡æ¢é¡µé¢
 */
function onDeptChange() {
    onDeptAreaChange(deptId);
}
function onDeptAreaChange(id) {
    window.location.href = "./index?deptId=" + id;
    return true;
}
/* åˆ‡æ¢èœå• */
function toggleMenu() {
    $.modal.confirm("确认要切换成左侧菜单吗?", function() {