新增配方日志查询功能,记录配方和混炼示方的创建、更新与删除操作,增强数据追溯能力。
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
@@ -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
|
||||
);
|
||||
@@ -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')
|
||||
Reference in New Issue
Block a user