云
2026-10-27 22cb0ddec260bb5c5868543e8fe27d67625e8951
feat(menu): 更新安全数据驾驶舱菜单挂载位置并完善库存记录字段

- 将安全数据驾驶舱菜单从智慧驾驶舱下移至管理驾驶舱(reportAnalysis)下
- 修改SQL脚本中的父菜单名称查询条件和排序逻辑
- 为入库/出库记录表添加油品相关字段包括油库、储罐、车辆、司机等信息
- 在登录日志中使用用户昵称显示,支持昵称为空时回退到登录账号
- 更新操作日志中操作人员名称显示逻辑,优先使用用户昵称
已添加1个文件
已修改3个文件
128 ■■■■■ 文件已修改
doc/20261026_add_safety_dashboard_menu.sql 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/20261027_add_oil_fields_to_stock_in_out_record.sql 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/aspectj/LogAspect.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/20261026_add_safety_dashboard_menu.sql
@@ -1,6 +1,6 @@
-- ============================================================
-- å®‰å…¨æ•°æ®é©¾é©¶èˆ± èœå•
-- æŒ‚载位置:智慧驾驶舱(父菜单)下
-- æŒ‚载位置:管理驾驶舱(reportAnalysis)下,与「智慧驾驶舱」同级
-- é¡µé¢ç»„件:reportAnalysis/safetyDashboard/index
-- å¯é‡å¤æ‰§è¡Œï¼šçˆ¶èœå•不存在不插入;同 path/name å·²å­˜åœ¨ä¸é‡å¤æ’å…¥
-- æ³¨æ„ï¼šæ‰€æœ‰è¯­å¥éœ€åœ¨åŒä¸€ä¸ªæ•°æ®åº“连接中依次执行,用户变量才会保留
@@ -8,11 +8,11 @@
-- æ‰§è¡Œå‰å¯å…ˆç¡®è®¤çˆ¶èœå•与是否已存在:
-- SELECT menu_id, menu_name, parent_id, path, component, menu_type, visible, status
-- FROM sys_menu WHERE menu_name = '智慧驾驶舱';
-- FROM sys_menu WHERE menu_name = '管理驾驶舱';
SET @parent_name := '智慧驾驶舱';
SET @parent_name := '管理驾驶舱';
-- å¦‚果按名称找不到父菜单,可把父菜单的路由地址填在这里作为兜底(留 NULL è¡¨ç¤ºä¸å¯ç”¨ï¼‰
SET @parent_path := NULL;
SET @parent_path := 'reportAnalysis';
SET @menu_name  := '安全数据驾驶舱';
SET @menu_path  := 'safetyDashboard';
@@ -36,11 +36,8 @@
    LIMIT 1
);
-- 3. æŽ’序号排到父菜单最后
SET @order_num := COALESCE(
    (SELECT MAX(order_num) FROM sys_menu WHERE parent_id = @parent_id),
    0
) + 1;
-- 3. æŽ’序号置顶(与已落库数据一致)
SET @order_num := 1;
-- 4. æ’入菜单(父菜单存在且菜单不存在时)
INSERT INTO sys_menu (
@@ -86,7 +83,7 @@
-- ============================================================
-- å›žæ»šï¼ˆæŒ‰éœ€æ‰§è¡Œï¼‰
-- ============================================================
-- SET @parent_id := (SELECT menu_id FROM sys_menu WHERE menu_name = '智慧驾驶舱' ORDER BY menu_id LIMIT 1);
-- SET @parent_id := (SELECT menu_id FROM sys_menu WHERE menu_name = '管理驾驶舱' ORDER BY menu_id LIMIT 1);
-- SET @menu_id := (SELECT menu_id FROM sys_menu
--                  WHERE parent_id = @parent_id AND path = 'safetyDashboard' LIMIT 1);
-- DELETE FROM sys_role_menu WHERE menu_id = @menu_id;
doc/20261027_add_oil_fields_to_stock_in_out_record.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
-- ä¸ºå…¥åº“/出库记录补齐油品、油库、储罐、车辆、卸车/装车、过磅等字段
-- èƒŒæ™¯ï¼šStockInventoryMapper.xml æ— æ¡ä»¶æŸ¥è¯¢è¿™äº›åˆ—,非油品租户库缺列会导致
--       åº“存汇总接口报 Unknown column 'sir.oil_product'
-- æ‰§è¡Œåº“:product-inventory-management-yxhj(已执行,2026-10-27)
-- è¯´æ˜Žï¼šå…¨éƒ¨ä¸ºå¯ç©ºåˆ—,不影响现有数据;如需在其他租户库执行,改库名即可
ALTER TABLE `stock_in_record`
    ADD COLUMN `oil_depot_id` bigint DEFAULT NULL COMMENT '入库油库id',
    ADD COLUMN `oil_depot_name` varchar(128) DEFAULT NULL COMMENT '入库油库名称',
    ADD COLUMN `inbound_category` varchar(50) DEFAULT NULL COMMENT '入库类别:自购入库/代储入库',
    ADD COLUMN `sales_ledger_id` bigint DEFAULT NULL COMMENT '绑定的销售台账id(代储入库必填)',
    ADD COLUMN `tank_id` bigint DEFAULT NULL COMMENT '储罐id',
    ADD COLUMN `tank_no` varchar(64) DEFAULT NULL COMMENT '储罐号',
    ADD COLUMN `inbound_time` datetime DEFAULT NULL COMMENT '入库时间',
    ADD COLUMN `oil_product` varchar(20) DEFAULT NULL COMMENT '油品',
    ADD COLUMN `original_quantity` decimal(18,2) DEFAULT NULL COMMENT '原厂数量(吨)',
    ADD COLUMN `customer_id` bigint DEFAULT NULL COMMENT '客户id',
    ADD COLUMN `customer_name` varchar(128) DEFAULT NULL COMMENT '客户名称',
    ADD COLUMN `contact_person` varchar(64) DEFAULT NULL COMMENT '客户对接人',
    ADD COLUMN `contact_phone` varchar(20) DEFAULT NULL COMMENT '对接人电话',
    ADD COLUMN `driver_name` varchar(50) DEFAULT NULL COMMENT '司机姓名',
    ADD COLUMN `driver_phone` varchar(20) DEFAULT NULL COMMENT '司机电话',
    ADD COLUMN `escort_name` varchar(50) DEFAULT NULL COMMENT '押运员姓名',
    ADD COLUMN `escort_phone` varchar(20) DEFAULT NULL COMMENT '押运员电话',
    ADD COLUMN `truck_plate_no` varchar(20) DEFAULT NULL COMMENT '车牌号',
    ADD COLUMN `trailer_plate_no` varchar(20) DEFAULT NULL COMMENT '挂车号',
    ADD COLUMN `tank_inspection_status` varchar(20) DEFAULT NULL COMMENT '车体/铅封检验是否正常',
    ADD COLUMN `unloading_crane_position` varchar(20) DEFAULT NULL COMMENT '卸车鹤位',
    ADD COLUMN `density` varchar(20) DEFAULT NULL COMMENT '密度(kg/L)',
    ADD COLUMN `unload_photos` text COMMENT '卸油关键环节拍照(JSON数组)',
    ADD COLUMN `gross_weight` decimal(14,2) DEFAULT NULL COMMENT '毛重(吨)',
    ADD COLUMN `tare_weight` decimal(14,2) DEFAULT NULL COMMENT '皮重(吨)',
    ADD COLUMN `net_weight` decimal(14,2) DEFAULT NULL COMMENT '净重(吨)',
    ADD COLUMN `loss_quantity` decimal(14,2) DEFAULT NULL COMMENT '亏量(吨)',
    ADD COLUMN `actual_volume` decimal(14,2) DEFAULT NULL COMMENT '实际入库体积(升)',
    ADD COLUMN `pound_photos` text COMMENT '磅单上传(JSON数组)';
ALTER TABLE `stock_out_record`
    ADD COLUMN `sales_ledger_id` bigint DEFAULT NULL COMMENT '销售台账id',
    ADD COLUMN `out_category` varchar(20) DEFAULT NULL COMMENT '出库类别',
    ADD COLUMN `oil_depot_id` bigint DEFAULT NULL COMMENT '出库油库id',
    ADD COLUMN `oil_depot_name` varchar(100) DEFAULT NULL COMMENT '出库油库名称',
    ADD COLUMN `tank_id` bigint DEFAULT NULL COMMENT '储罐id',
    ADD COLUMN `tank_no` varchar(50) DEFAULT NULL COMMENT '储罐号',
    ADD COLUMN `out_date` date DEFAULT NULL COMMENT '出库日期',
    ADD COLUMN `oil_product` varchar(20) DEFAULT NULL COMMENT '油品',
    ADD COLUMN `out_tonnage` decimal(14,2) DEFAULT NULL COMMENT '出库吨位(吨)',
    ADD COLUMN `customer_id` bigint DEFAULT NULL COMMENT '客户id',
    ADD COLUMN `customer_name` varchar(100) DEFAULT NULL COMMENT '客户名称',
    ADD COLUMN `contact_person` varchar(50) DEFAULT NULL COMMENT '客户对接人',
    ADD COLUMN `contact_phone` varchar(20) DEFAULT NULL COMMENT '对接人电话',
    ADD COLUMN `loading_inspection_status` varchar(20) DEFAULT NULL COMMENT '车体/铅封检验是否正常',
    ADD COLUMN `loading_crane_position` varchar(20) DEFAULT NULL COMMENT '装车鹤位',
    ADD COLUMN `loading_photos` text COMMENT '装油关键环节拍照(JSON数组)',
    ADD COLUMN `density` varchar(20) DEFAULT NULL COMMENT '密度(kg/L)',
    ADD COLUMN `gross_weight` decimal(14,2) DEFAULT NULL COMMENT '毛重(吨)',
    ADD COLUMN `tare_weight` decimal(14,2) DEFAULT NULL COMMENT '皮重(吨)',
    ADD COLUMN `net_weight` decimal(14,2) DEFAULT NULL COMMENT '净重(吨)',
    ADD COLUMN `loss_quantity` decimal(14,2) DEFAULT NULL COMMENT '亏量(吨)',
    ADD COLUMN `actual_volume` decimal(14,2) DEFAULT NULL COMMENT '实际出库体积(升)',
    ADD COLUMN `pound_photos` text COMMENT '磅单上传(JSON数组)',
    ADD COLUMN `driver_name` varchar(50) DEFAULT NULL COMMENT '司机姓名',
    ADD COLUMN `driver_phone` varchar(20) DEFAULT NULL COMMENT '司机电话',
    ADD COLUMN `escort_name` varchar(50) DEFAULT NULL COMMENT '押运员姓名',
    ADD COLUMN `escort_phone` varchar(20) DEFAULT NULL COMMENT '押运员电话',
    ADD COLUMN `truck_plate_no` varchar(20) DEFAULT NULL COMMENT '车牌号',
    ADD COLUMN `vehicle_id` bigint DEFAULT NULL COMMENT '车辆id',
    ADD COLUMN `residual_oil` decimal(16,4) DEFAULT NULL COMMENT '残留油量(吨)',
    ADD COLUMN `deduct_quantity` decimal(16,4) DEFAULT NULL COMMENT '扣减数量(吨)',
    ADD COLUMN `trailer_plate_no` varchar(20) DEFAULT NULL COMMENT '挂车号';
src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
@@ -98,8 +98,10 @@
            operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255));
            if (loginUser != null)
            {
                operLog.setOperName(loginUser.getUsername());
                SysUser currentUser = loginUser.getUser();
                // æ“ä½œäººå‘˜è®°å½•昵称,昵称为空时回退登录账号
                operLog.setOperName(StringUtils.isNotNull(currentUser) && StringUtils.isNotEmpty(currentUser.getNickName())
                        ? currentUser.getNickName() : loginUser.getUsername());
                if (StringUtils.isNotNull(currentUser) && StringUtils.isNotNull(currentUser.getDept()))
                {
                    operLog.setDeptName(currentUser.getDept().getDeptName());
src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java
@@ -14,6 +14,8 @@
import com.ruoyi.project.monitor.domain.SysOperLog;
import com.ruoyi.project.monitor.service.ISysLogininforService;
import com.ruoyi.project.monitor.service.ISysOperLogService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.service.ISysUserService;
import eu.bitwalker.useragentutils.UserAgent;
/**
@@ -44,11 +46,13 @@
            @Override
            public void run()
            {
                // ç™»å½•日志用户名称记录昵称,昵称为空时回退登录账号
                String displayName = resolveNickName(username);
                String address = AddressUtils.getRealAddressByIP(ip);
                StringBuilder s = new StringBuilder();
                s.append(LogUtils.getBlock(ip));
                s.append(address);
                s.append(LogUtils.getBlock(username));
                s.append(LogUtils.getBlock(displayName));
                s.append(LogUtils.getBlock(status));
                s.append(LogUtils.getBlock(message));
                // æ‰“印信息到日志
@@ -59,7 +63,7 @@
                String browser = userAgent.getBrowser().getName();
                // å°è£…对象
                SysLogininfor logininfor = new SysLogininfor();
                logininfor.setUserName(username);
                logininfor.setUserName(displayName);
                logininfor.setIpaddr(ip);
                logininfor.setLoginLocation(address);
                logininfor.setBrowser(browser);
@@ -81,8 +85,35 @@
    }
    /**
     * æŒ‰ç™»å½•账号查询昵称,查询不到时回退为原账号
     *
     * @param username ç™»å½•账号
     * @return æ˜µç§°
     */
    private static String resolveNickName(String username)
    {
        if (StringUtils.isEmpty(username))
        {
            return username;
        }
        try
        {
            SysUser user = SpringUtils.getBean(ISysUserService.class).selectUserByUserName(username);
            if (user != null && StringUtils.isNotEmpty(user.getNickName()))
            {
                return user.getNickName();
            }
        }
        catch (Exception e)
        {
            // æŸ¥è¯¢æ˜µç§°å¤±è´¥ä¸å½±å“ç™»å½•日志写入,回退为登录账号
        }
        return username;
    }
    /**
     * æ“ä½œæ—¥å¿—记录
     *
     *
     * @param operLog æ“ä½œæ—¥å¿—信息
     * @return ä»»åŠ¡task
     */