新增配方日志查询功能,记录配方和混炼示方的创建、更新与删除操作,增强数据追溯能力。

This commit is contained in:
geht
2026-05-26 17:50:55 +08:00
parent c70f7b2b90
commit 9e36435a72
19 changed files with 9926 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
-- 分类字典统一租户ID为1002幂等
SET NAMES utf8mb4;
SET @mes_tenant_id = 1002;
UPDATE `sys_category`
SET `tenant_id` = @mes_tenant_id,
`update_by` = 'admin',
`update_time` = NOW()
WHERE IFNULL(`tenant_id`, 0) <> @mes_tenant_id;

View File

@@ -0,0 +1,75 @@
-- 配方日志查询配合示方/混炼示方修改日志表 + 字典 + 菜单
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS `mes_xsl_formula_spec_edit_log` (
`id` varchar(32) NOT NULL COMMENT '主键',
`spec_type` varchar(20) NOT NULL COMMENT '示方分类 formula=配合示方 mixing=混炼示方',
`spec_id` varchar(32) NOT NULL COMMENT '示方主表ID',
`spec_title` varchar(200) DEFAULT NULL COMMENT '示方标识胶料代号/规格名',
`issue_number` varchar(64) DEFAULT NULL COMMENT '发行编号',
`action_type` varchar(20) NOT NULL COMMENT '操作类型 create=新增 update=修改 delete=删除',
`change_summary` varchar(2000) DEFAULT NULL COMMENT '修改内容摘要',
`before_snapshot` longtext COMMENT '变更前快照JSON',
`after_snapshot` longtext COMMENT '变更后快照JSON',
`modify_time` datetime DEFAULT NULL COMMENT '修改时间',
`modify_by` varchar(64) DEFAULT NULL COMMENT '修改人账号',
`modify_by_name` varchar(100) DEFAULT NULL COMMENT '修改人姓名',
`tenant_id` int DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`id`),
KEY `idx_fsel_spec_type` (`spec_type`),
KEY `idx_fsel_spec_id` (`spec_id`),
KEY `idx_fsel_issue_no` (`issue_number`),
KEY `idx_fsel_modify_time` (`modify_time`),
KEY `idx_fsel_tenant` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MES配方示方修改日志';
INSERT IGNORE INTO `sys_dict` (`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `type`, `tenant_id`)
VALUES ('1995000000000000107', '配方日志示方分类', 'xslmes_formula_spec_edit_log_type', '配方日志查询-示方分类', 0, 'admin', NOW(), 0, 1002);
INSERT IGNORE INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`)
VALUES ('1995000000000001071', '1995000000000000107', '配合示方', 'formula', 1, 1, 'admin', NOW());
INSERT IGNORE INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`)
VALUES ('1995000000000001072', '1995000000000000107', '混炼示方', 'mixing', 2, 1, 'admin', NOW());
INSERT IGNORE INTO `sys_dict` (`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `type`, `tenant_id`)
VALUES ('1995000000000000108', '配方日志操作类型', 'xslmes_formula_spec_edit_log_action', '配方日志查询-操作类型', 0, 'admin', NOW(), 0, 1002);
INSERT IGNORE INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`)
VALUES ('1995000000000001081', '1995000000000000108', '新增', 'create', 1, 1, 'admin', NOW());
INSERT IGNORE INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`)
VALUES ('1995000000000001082', '1995000000000000108', '修改', 'update', 2, 1, 'admin', NOW());
INSERT IGNORE INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`)
VALUES ('1995000000000001083', '1995000000000000108', '删除', 'delete', 3, 1, 'admin', NOW());
INSERT IGNORE INTO `sys_permission` (
`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`,
`menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`,
`hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`,
`del_flag`, `rule_flag`, `status`, `internal_or_external`
) VALUES (
'177925970995560', '1900000000000000810', '配方日志查询', '/xslmes/mesXslFormulaSpecEditLog',
'xslmes/mesXslFormulaSpecEditLog/MesXslFormulaSpecEditLogList', 1, 'MesXslFormulaSpecEditLogList', NULL,
1, NULL, '0', 5.50, 0, 'ant-design:file-search-outlined', 0, 1,
0, 0, '配合示方/混炼示方修改日志查询与对比', 'admin', NOW(), 'admin', NOW(),
0, 0, '1', 0
);
INSERT IGNORE INTO `sys_permission` (`id`, `parent_id`, `name`, `menu_type`, `perms`, `perms_type`, `sort_no`, `is_route`, `is_leaf`, `hidden`, `status`, `del_flag`, `create_by`, `create_time`)
VALUES ('177925970995561', '177925970995560', '查询', 2, 'xslmes:mes_xsl_formula_spec_edit_log:list', '1', 1.00, 0, 1, 0, '1', 0, 'admin', NOW());
INSERT IGNORE INTO `sys_permission` (`id`, `parent_id`, `name`, `menu_type`, `perms`, `perms_type`, `sort_no`, `is_route`, `is_leaf`, `hidden`, `status`, `del_flag`, `create_by`, `create_time`)
VALUES ('177925970995562', '177925970995560', '导出', 2, 'xslmes:mes_xsl_formula_spec_edit_log:exportXls', '1', 2.00, 0, 1, 0, '1', 0, 'admin', NOW());
INSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`)
SELECT REPLACE(UUID(), '-', ''), r.id, p.id, NULL, NOW(), '127.0.0.1'
FROM `sys_role` r
CROSS JOIN `sys_permission` p
WHERE r.`role_code` = 'admin'
AND p.`id` IN ('177925970995560', '177925970995561', '177925970995562')
AND NOT EXISTS (
SELECT 1 FROM `sys_role_permission` rp
WHERE rp.`role_id` = r.id AND rp.`permission_id` = p.id
);

View File

@@ -0,0 +1,117 @@
# -*- coding: utf-8 -*-
"""生成分类字典「行政区划」Flyway SQL国家-省-市-县)"""
import json
from pathlib import Path
MYSQL_DIR = Path(__file__).resolve().parents[1]
JEECG_BOOT = Path(__file__).resolve().parents[9]
PCA_PATH = JEECG_BOOT / 'jeecg-boot-base-core/src/main/resources/static/pca.json'
OUT_PATH = MYSQL_DIR / 'V3.9.2_105__sys_region_category_dict.sql'
MES_TENANT_ID = 1002
pca = json.loads(PCA_PATH.read_text(encoding='utf-8'))
OTHER_COUNTRIES = [
('阿富汗', 'AF'), ('阿尔巴尼亚', 'AL'), ('阿尔及利亚', 'DZ'), ('安道尔', 'AD'), ('安哥拉', 'AO'),
('安提瓜和巴布达', 'AG'), ('阿根廷', 'AR'), ('亚美尼亚', 'AM'), ('澳大利亚', 'AU'), ('奥地利', 'AT'),
('阿塞拜疆', 'AZ'), ('巴哈马', 'BS'), ('巴林', 'BH'), ('孟加拉国', 'BD'), ('巴巴多斯', 'BB'),
('白俄罗斯', 'BY'), ('比利时', 'BE'), ('伯利兹', 'BZ'), ('贝宁', 'BJ'), ('不丹', 'BT'),
('玻利维亚', 'BO'), ('波黑', 'BA'), ('博茨瓦纳', 'BW'), ('巴西', 'BR'), ('文莱', 'BN'),
('保加利亚', 'BG'), ('布基纳法索', 'BF'), ('布隆迪', 'BI'), ('佛得角', 'CV'), ('柬埔寨', 'KH'),
('喀麦隆', 'CM'), ('加拿大', 'CA'), ('中非', 'CF'), ('乍得', 'TD'), ('智利', 'CL'),
('哥伦比亚', 'CO'), ('科摩罗', 'KM'), ('刚果(布)', 'CG'), ('刚果(金)', 'CD'), ('哥斯达黎加', 'CR'),
('科特迪瓦', 'CI'), ('克罗地亚', 'HR'), ('古巴', 'CU'), ('塞浦路斯', 'CY'), ('捷克', 'CZ'),
('丹麦', 'DK'), ('吉布提', 'DJ'), ('多米尼克', 'DM'), ('多米尼加', 'DO'), ('厄瓜多尔', 'EC'),
('埃及', 'EG'), ('萨尔瓦多', 'SV'), ('赤道几内亚', 'GQ'), ('厄立特里亚', 'ER'), ('爱沙尼亚', 'EE'),
('斯威士兰', 'SZ'), ('埃塞俄比亚', 'ET'), ('斐济', 'FJ'), ('芬兰', 'FI'), ('法国', 'FR'),
('加蓬', 'GA'), ('冈比亚', 'GM'), ('格鲁吉亚', 'GE'), ('德国', 'DE'), ('加纳', 'GH'),
('希腊', 'GR'), ('格林纳达', 'GD'), ('危地马拉', 'GT'), ('几内亚', 'GN'), ('几内亚比绍', 'GW'),
('圭亚那', 'GY'), ('海地', 'HT'), ('洪都拉斯', 'HN'), ('匈牙利', 'HU'), ('冰岛', 'IS'),
('印度', 'IN'), ('印度尼西亚', 'ID'), ('伊朗', 'IR'), ('伊拉克', 'IQ'), ('爱尔兰', 'IE'),
('以色列', 'IL'), ('意大利', 'IT'), ('牙买加', 'JM'), ('日本', 'JP'), ('约旦', 'JO'),
('哈萨克斯坦', 'KZ'), ('肯尼亚', 'KE'), ('基里巴斯', 'KI'), ('科威特', 'KW'), ('吉尔吉斯斯坦', 'KG'),
('老挝', 'LA'), ('拉脱维亚', 'LV'), ('黎巴嫩', 'LB'), ('莱索托', 'LS'), ('利比里亚', 'LR'),
('利比亚', 'LY'), ('列支敦士登', 'LI'), ('立陶宛', 'LT'), ('卢森堡', 'LU'), ('马达加斯加', 'MG'),
('马拉维', 'MW'), ('马来西亚', 'MY'), ('马尔代夫', 'MV'), ('马里', 'ML'), ('马耳他', 'MT'),
('马绍尔群岛', 'MH'), ('毛里塔尼亚', 'MR'), ('毛里求斯', 'MU'), ('墨西哥', 'MX'), ('密克罗尼西亚', 'FM'),
('摩尔多瓦', 'MD'), ('摩纳哥', 'MC'), ('蒙古', 'MN'), ('黑山', 'ME'), ('摩洛哥', 'MA'),
('莫桑比克', 'MZ'), ('缅甸', 'MM'), ('纳米比亚', 'NA'), ('瑙鲁', 'NR'), ('尼泊尔', 'NP'),
('荷兰', 'NL'), ('新西兰', 'NZ'), ('尼加拉瓜', 'NI'), ('尼日尔', 'NE'), ('尼日利亚', 'NG'),
('朝鲜', 'KP'), ('北马其顿', 'MK'), ('挪威', 'NO'), ('阿曼', 'OM'), ('巴基斯坦', 'PK'),
('帕劳', 'PW'), ('巴拿马', 'PA'), ('巴布亚新几内亚', 'PG'), ('巴拉圭', 'PY'), ('秘鲁', 'PE'),
('菲律宾', 'PH'), ('波兰', 'PL'), ('葡萄牙', 'PT'), ('卡塔尔', 'QA'), ('罗马尼亚', 'RO'),
('俄罗斯', 'RU'), ('卢旺达', 'RW'), ('圣基茨和尼维斯', 'KN'), ('圣卢西亚', 'LC'), ('圣文森特和格林纳丁斯', 'VC'),
('萨摩亚', 'WS'), ('圣马力诺', 'SM'), ('圣多美和普林西比', 'ST'), ('沙特阿拉伯', 'SA'), ('塞内加尔', 'SN'),
('塞尔维亚', 'RS'), ('塞舌尔', 'SC'), ('塞拉利昂', 'SL'), ('新加坡', 'SG'), ('斯洛伐克', 'SK'),
('斯洛文尼亚', 'SI'), ('所罗门群岛', 'SB'), ('索马里', 'SO'), ('南非', 'ZA'), ('韩国', 'KR'),
('南苏丹', 'SS'), ('西班牙', 'ES'), ('斯里兰卡', 'LK'), ('苏丹', 'SD'), ('苏里南', 'SR'),
('瑞典', 'SE'), ('瑞士', 'CH'), ('叙利亚', 'SY'), ('塔吉克斯坦', 'TJ'), ('坦桑尼亚', 'TZ'),
('泰国', 'TH'), ('东帝汶', 'TL'), ('多哥', 'TG'), ('汤加', 'TO'), ('特立尼达和多巴哥', 'TT'),
('突尼斯', 'TN'), ('土耳其', 'TR'), ('土库曼斯坦', 'TM'), ('图瓦卢', 'TV'), ('乌干达', 'UG'),
('乌克兰', 'UA'), ('阿联酋', 'AE'), ('英国', 'GB'), ('美国', 'US'), ('乌拉圭', 'UY'),
('乌兹别克斯坦', 'UZ'), ('瓦努阿图', 'VU'), ('梵蒂冈', 'VA'), ('委内瑞拉', 'VE'), ('越南', 'VN'),
('也门', 'YE'), ('赞比亚', 'ZM'), ('津巴布韦', 'ZW'),
]
seq = 0
def make_id(code: str) -> str:
global seq
if code.isdigit():
return f'1995{int(code):015d}'
seq += 1
return f'1995900000000{seq:06d}'
def esc(s: str) -> str:
return s.replace('\\', '\\\\').replace("'", "''")
nodes = []
root_id = '1995000000000000001'
nodes.append({'id': root_id, 'pid': '0', 'name': '行政区划', 'code': 'SYS_REGION', 'has_child': '1'})
cn_id = make_id('86')
nodes.append({'id': cn_id, 'pid': root_id, 'name': '中国', 'code': 'SYS_REGION_86', 'has_child': '1'})
for prov_code, prov_name in pca['86'].items():
prov_id = make_id(prov_code)
cities = pca.get(prov_code, {})
nodes.append({'id': prov_id, 'pid': cn_id, 'name': prov_name, 'code': prov_code, 'has_child': '1' if cities else '0'})
for city_code, city_name in cities.items():
city_id = make_id(city_code)
counties = pca.get(city_code, {})
nodes.append({'id': city_id, 'pid': prov_id, 'name': city_name, 'code': city_code, 'has_child': '1' if counties else '0'})
for county_code, county_name in counties.items():
nodes.append({'id': make_id(county_code), 'pid': city_id, 'name': county_name, 'code': county_code, 'has_child': '0'})
for name, iso in OTHER_COUNTRIES:
nodes.append({'id': make_id(f'C{iso}'), 'pid': root_id, 'name': name, 'code': f'SYS_REGION_{iso}', 'has_child': '0'})
lines = [
'-- 分类字典:国家-省-市-县 四级行政区划(幂等)',
'-- 数据来源JeecgBoot pca.json + ISO3166 国家列表',
'SET NAMES utf8mb4;',
'',
]
batch_size = 50
for i in range(0, len(nodes), batch_size):
batch = nodes[i : i + batch_size]
lines.append('INSERT INTO `sys_category` (`id`, `pid`, `name`, `code`, `has_child`, `is_rubber`, `tenant_id`, `create_by`, `create_time`)')
values = []
for n in batch:
values.append(
"SELECT '{id}', '{pid}', '{name}', '{code}', '{has_child}', '0', {tenant_id}, 'admin', NOW() FROM DUAL "
"WHERE NOT EXISTS (SELECT 1 FROM `sys_category` WHERE `code` = '{code}')".format(
id=n['id'], pid=n['pid'], name=esc(n['name']), code=n['code'], has_child=n['has_child'], tenant_id=MES_TENANT_ID
)
)
lines.append('\nUNION ALL\n'.join(values))
lines.append(';')
lines.append('')
OUT_PATH.write_text('\n'.join(lines), encoding='utf-8')
print(f'Generated {len(nodes)} nodes -> {OUT_PATH}')
print(f'File size: {OUT_PATH.stat().st_size / 1024:.1f} KB')