gaoluyang
6 天以前 0d0dd802605c57dad9bbfc05dc791bdbdf541608
fix(mes,sql): 库存预警补单位名称,补齐演示角色缺失的菜单授权

- 库存预警明细返回 unitName(来自计量单位表),仓储端可直接看到缺口单位。
- 新增 docs/sql/cfwj_role_menu_gap_20261103.sql:给 163–168 演示角色补授权
库存预警、分拣配送、设备借用、数据工具、采购合同、采购申请统计、资产管理、
办公用品、预订货、销售款统计;并补上「计划排程」顶级目录本身的授权,
否则其下生产计划/生产排产在普通角色菜单树里会被丢弃。
- 演示数据脚本补充 3 条库存预警规则(2 条低于下限、1 条高于上限),
让「库存预警」页有真实告警可看。

Co-Authored-By: Claude Code <noreply@anthropic.com>
已添加1个文件
已修改3个文件
141 ■■■■■ 文件已修改
docs/sql/cfwj_role_menu_gap_20261103.sql 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
scripts/cfwj-demo-seed-20261103/README.md 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
scripts/cfwj-demo-seed-20261103/seed_cfwj_docs.py 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stockwarning/MesWmStockWarningServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/sql/cfwj_role_menu_gap_20261103.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
-- è¯šå‘五金(CFWJ)角色菜单授权补漏 2026-11-03
-- èƒŒæ™¯ï¼šèœå•补齐后仍有若干页面只授权给了超管(role_id=1),普通演示角色看不到;
--       å¦å¤–「计划排程」顶级目录本身没有授权记录,会导致其下的生产计划/生产排产在普通角色菜单树里被丢弃。
-- è§’色:163 è®¾å¤‡ / 164 è´¨é‡ / 165 é”€å”® / 166 ç”Ÿäº§ç®¡ç†å‘˜ / 167 ç”Ÿäº§å‘˜ / 168 ç»ç†
-- å¹‚等:逐对检查 system_role_menu æ˜¯å¦å·²å­˜åœ¨ï¼Œä¸ä¼šäº§ç”Ÿé‡å¤æŽˆæƒã€‚
INSERT INTO system_role_menu (role_id, menu_id, creator, create_time)
SELECT p.role_id, p.menu_id, '1', NOW()
FROM (
  SELECT 2 AS role_id, 1075513 AS menu_id
UNION ALL   SELECT 155 AS role_id, 1075513 AS menu_id
UNION ALL   SELECT 160 AS role_id, 1075513 AS menu_id
UNION ALL   SELECT 161 AS role_id, 1075513 AS menu_id
UNION ALL   SELECT 162 AS role_id, 1075513 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075513 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075513 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075513 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075538 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075538 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075538 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075539 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075539 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075539 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075540 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075540 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075540 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075541 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075541 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075541 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075542 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075542 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075542 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075543 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075543 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075543 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075544 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075544 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075544 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075545 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075545 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075545 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075546 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075546 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075546 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075547 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075547 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075547 AS menu_id
UNION ALL   SELECT 163 AS role_id, 1075514 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075514 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075514 AS menu_id
UNION ALL   SELECT 163 AS role_id, 1075515 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075515 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075515 AS menu_id
UNION ALL   SELECT 163 AS role_id, 1075516 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075516 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075516 AS menu_id
UNION ALL   SELECT 163 AS role_id, 1075517 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075517 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075517 AS menu_id
UNION ALL   SELECT 163 AS role_id, 1075518 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075518 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075518 AS menu_id
UNION ALL   SELECT 163 AS role_id, 1075519 AS menu_id
UNION ALL   SELECT 166 AS role_id, 1075519 AS menu_id
UNION ALL   SELECT 167 AS role_id, 1075519 AS menu_id
UNION ALL   SELECT 163 AS role_id, 1075521 AS menu_id
UNION ALL   SELECT 163 AS role_id, 1075522 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075523 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075524 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075525 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075526 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075527 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075528 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075536 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075537 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075548 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075549 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075550 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075551 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075552 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075553 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075554 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075555 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075556 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075557 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075558 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075559 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075560 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075561 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075562 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075563 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075564 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075565 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075566 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075567 AS menu_id
UNION ALL   SELECT 165 AS role_id, 1075568 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075568 AS menu_id
UNION ALL   SELECT 165 AS role_id, 1075569 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075569 AS menu_id
UNION ALL   SELECT 165 AS role_id, 1075570 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075570 AS menu_id
UNION ALL   SELECT 165 AS role_id, 1075571 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075571 AS menu_id
UNION ALL   SELECT 165 AS role_id, 1075572 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075572 AS menu_id
UNION ALL   SELECT 165 AS role_id, 1075573 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075573 AS menu_id
UNION ALL   SELECT 165 AS role_id, 1075574 AS menu_id
UNION ALL   SELECT 168 AS role_id, 1075574 AS menu_id
) p
WHERE NOT EXISTS (
  SELECT 1 FROM system_role_menu rm
  WHERE rm.role_id = p.role_id AND rm.menu_id = p.menu_id AND rm.deleted = b'0'
);
scripts/cfwj-demo-seed-20261103/README.md
@@ -35,8 +35,8 @@
| è®¾å¤‡ | mes_dv_{subject,checkplan,checkrecord,maintenrecord,repair,spare,metering} |
| äººåŠ› | hrm_attendance_record(300 æ¡ï¼‰ã€hrm_salary_calculation(10 æ¡ï¼‰ã€hrm_salary_payment(1 æ¡ï¼‰ |
待检任务页需要的「已到货未检验」(到货通知 6/7)与「已出库未检验」(销售出库单 4、退货检验 RQC)在
`seed_cfwj_docs.py` ç¬¬ 13 èŠ‚è¡¥å……ã€‚
待检任务页需要的「已到货未检验」(到货通知 6/7)、「已出库未检验」(销售出库单 4、退货检验 RQC)以及
仓储库存预警规则(低于下限 2 æ¡ã€é«˜äºŽä¸Šé™ 1 æ¡ï¼‰éƒ½åœ¨ `seed_cfwj_docs.py` ç¬¬ 13 èŠ‚è¡¥å……ã€‚
## ç‰©æ–™ id å£å¾„
scripts/cfwj-demo-seed-20261103/seed_cfwj_docs.py
@@ -780,5 +780,17 @@
                        'remark', 'creator', 'create_time'], rqcl)
print('pending-inspect extra ok')
# åº“存预警规则:覆盖低于下限、高于上限两类,让仓储「库存预警」页有真实告警
warn_rules = [  # id, item, warehouse, min, max, remark
    (1, 1001, 3, 80, None, '成品仓法兰盘低于安全库存'),
    (2, 1015, 4, 100, None, '切削液低于补货点'),
    (3, 1009, 1, 2000, 3000, '钢棒超储'),
]
clean('mes_wm_stock_warning_rule', [r[0] for r in warn_rules])
ins('mes_wm_stock_warning_rule', ['id', 'item_id', 'warehouse_id', 'min_quantity', 'max_quantity', 'enabled',
                                  'notify_user_id', 'remark', 'creator', 'create_time'],
    [(r[0], r[1], r[2], r[3], r[4], 1, 249, r[5], ADMIN, ts(D(2026, 8, 3), 6100 + r[0])) for r in warn_rules])
print('stock warning rules ok')
conn.commit()
print('DOCS OK')
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stockwarning/MesWmStockWarningServiceImpl.java
@@ -8,10 +8,12 @@
import cn.iocoder.yudao.module.mes.controller.admin.wm.stockwarning.vo.MesWmStockWarningRulePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.stockwarning.vo.MesWmStockWarningRuleRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.stockwarning.vo.MesWmStockWarningRuleSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stockwarning.MesWmStockWarningRuleDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.stockwarning.MesWmStockWarningRuleMapper;
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
@@ -50,6 +52,8 @@
    private MesWmStockWarningRuleMapper ruleMapper;
    @Resource
    private MesMdmItemService mdmItemService;
    @Resource
    private MesMdUnitMeasureService unitMeasureService;
    @Resource
    private MesWmWarehouseService warehouseService;
    @Resource
@@ -144,6 +148,9 @@
        // 3. é€æ¡è§„则判断是否预警
        Map<Long, MesMdmItemDO> itemMap = mdmItemService.getItemMap(
                convertSet(rules, MesWmStockWarningRuleDO::getItemId));
        // ç‰©æ–™å•位来自计量单位表,缺失时前端会显示「--」,这里补齐便于仓管直接判断缺口大小
        Map<Long, MesMdUnitMeasureDO> unitMap = unitMeasureService.getUnitMeasureMap(
                convertSet(itemMap.values(), MesMdmItemDO::getUnitMeasureId));
        Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                convertSet(rules, MesWmStockWarningRuleDO::getWarehouseId));
        List<MesWmStockWarningAlertRespVO> alertList = new ArrayList<>();
@@ -168,6 +175,10 @@
            if (item != null) {
                alert.setItemCode(item.getCode());
                alert.setItemName(item.getName());
                MesMdUnitMeasureDO unit = unitMap.get(item.getUnitMeasureId());
                if (unit != null) {
                    alert.setUnitName(unit.getName());
                }
            }
            MesWmWarehouseDO warehouse = warehouseMap.get(rule.getWarehouseId());
            if (warehouse != null) {