From 69f9c9af7f1a8b3fd6025089920f83d1cb0cac02 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Wed, 4 Nov 2026 03:15:42 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E7=BB=84=E7=BB=87=E6=A0=91?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E6=9D=83=E9=99=90=E3=80=81=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E5=85=AC=E5=8F=B8=E5=9B=9E=E5=86=99=E3=80=81=E5=90=88=E5=90=8C?= =?UTF-8?q?=E8=AE=A1=E8=B4=B9=E5=AE=A2=E5=95=86=E8=A7=92=E8=89=B2=E4=B8=8E?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E8=8F=9C=E5=8D=95=E8=A1=A5=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- .../springblade/system/pojo/entity/Dept.java | 4 + .../system/pojo/vo/RoleDataScopeVO.java | 12 + .../transport/pojo/vo/ContractManageVO.java | 6 +- .../system/controller/DeptController.java | 8 +- .../service/IRoleMenuDataScopeService.java | 10 + .../system/service/impl/DeptServiceImpl.java | 70 +-- .../impl/RoleMenuDataScopeServiceImpl.java | 40 +- .../impl/CommonAddressServiceImpl.java | 2 +- .../impl/ContractManageServiceImpl.java | 34 +- .../support/ContractPartySupport.java | 38 +- .../transport/wrapper/CommonCargoWrapper.java | 6 +- .../transport/wrapper/CommonRouteWrapper.java | 6 +- .../wrapper/LoadingManageWrapper.java | 6 +- .../wrapper/ProcessConfigWrapper.java | 6 +- .../wrapper/ShippingTemplateWrapper.java | 6 +- .../wrapper/TransportPlanWrapper.java | 5 +- .../transport/wrapper/WaybillWrapper.java | 4 +- ...se_menu_view_permission_patch_20261104.sql | 44 ++ ..._biz_dept_backfill_by_creator_20261104.sql | 511 ++++++++++++++++++ .../blade_business_dept_config_20261102.sql | 3 +- doc/sql/transport/blade_currency.sql | 1 + doc/sql/transport/blade_customer_type.sql | 1 + ...de_dept_tree_permission_patch_20261104.sql | 9 + doc/sql/transport/blade_fee_item.sql | 1 + doc/sql/transport/blade_measurement_unit.sql | 3 +- doc/sql/transport/transport.sql | 7 + 26 files changed, 745 insertions(+), 98 deletions(-) create mode 100644 doc/sql/transport/blade_base_menu_view_permission_patch_20261104.sql create mode 100644 doc/sql/transport/blade_biz_dept_backfill_by_creator_20261104.sql create mode 100644 doc/sql/transport/blade_dept_tree_permission_patch_20261104.sql diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/pojo/entity/Dept.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/pojo/entity/Dept.java index 0446ece9..a024a6f8 100644 --- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/pojo/entity/Dept.java +++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/pojo/entity/Dept.java @@ -203,14 +203,18 @@ public class Dept extends TenantEntity { /** * 是否平台公司:0否,1是 + * ALWAYS:保证「否(0)」也能更新落库,避免被字段策略跳过 */ @Schema(description = "是否平台公司:0否,1是") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private Integer isPlatformCompany; /** * 是否业务部门:0否,1是 + * ALWAYS:保证「否(0)」也能更新落库,避免被字段策略跳过 */ @Schema(description = "是否业务部门:0否,1是") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private Integer isBusinessDept; /** diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/pojo/vo/RoleDataScopeVO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/pojo/vo/RoleDataScopeVO.java index 1656f7ae..78eb5307 100644 --- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/pojo/vo/RoleDataScopeVO.java +++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/pojo/vo/RoleDataScopeVO.java @@ -67,6 +67,18 @@ public class RoleDataScopeVO implements Serializable { return scope; } + /** + * 无组织可见(未配置数据权限时的默认结果) + */ + public static RoleDataScopeVO none() { + RoleDataScopeVO scope = new RoleDataScopeVO(); + scope.setScopeType(RoleDataScopeType.CUSTOM.getCode()); + scope.setAllDept(false); + scope.setOwnCreate(false); + scope.setDeptIds(Collections.emptyList()); + return scope; + } + public static RoleDataScopeVO ownCreate() { RoleDataScopeVO scope = new RoleDataScopeVO(); scope.setScopeType(RoleDataScopeType.OWN_CREATE.getCode()); diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ContractManageVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ContractManageVO.java index 5f76a439..c26bef6f 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ContractManageVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ContractManageVO.java @@ -64,9 +64,13 @@ public class ContractManageVO extends ContractManage { private Boolean hcsSynced; @TableField(exist = false) - @Schema(description = "生效类型筛选") + @Schema(description = "合同状态筛选") private String effectiveType; + @TableField(exist = false) + @Schema(description = "客商(匹配甲/乙/丙方)") + private String partyName; + @TableField(exist = false) @Schema(description = "创建人姓名") private String createUserName; diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/DeptController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/DeptController.java index c5f370ac..0c4a3256 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/DeptController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/DeptController.java @@ -126,8 +126,11 @@ public class DeptController extends BladeController { /** * 获取部门树形结构 + *

+ * 登录即可调用;数据范围由角色「数据权限」中 {@code dept_tree}(树形结构)单独配置, + * 未配置时返回空树(默认不展示)。 */ - @PreAuth(menu = "dept") + @PreAuth(AuthConstant.PERMIT_ALL) @GetMapping("/tree") @ApiOperationSupport(order = 4) @Operation(summary = "树形结构", description = "树形结构") @@ -139,8 +142,9 @@ public class DeptController extends BladeController { * 懒加载获取部门树形结构 *

* tenantId 由 Service 层完整决策:超管入参为空表示查全部,非超管强制覆盖为会话租户。 + * 数据范围与 {@link #tree} 相同,由 {@code dept_tree} 单独配置,未配置时返回空树。 */ - @PreAuth(menu = "dept") + @PreAuth(AuthConstant.PERMIT_ALL) @GetMapping("/lazy-tree") @ApiOperationSupport(order = 5) @Operation(summary = "懒加载树形结构", description = "树形结构") diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleMenuDataScopeService.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleMenuDataScopeService.java index 93cb33d2..17349a22 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleMenuDataScopeService.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleMenuDataScopeService.java @@ -66,6 +66,16 @@ public interface IRoleMenuDataScopeService extends BaseService roleIds, String menuCode, List userDeptIds); + /** + * 按菜单编码解析角色数据权限;菜单不存在或未配置时返回空权限(不回落为全部组织) + * + * @param roleIds 角色ID集合 + * @param menuCode 菜单编码 + * @param userDeptIds 用户所属组织 + * @return 解析结果 + */ + RoleDataScopeVO resolveByMenuCodeOrEmpty(List roleIds, String menuCode, List userDeptIds); + /** * 合并用户全部角色菜单配置为最宽数据权限 * diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DeptServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DeptServiceImpl.java index a211a169..2b2f485e 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DeptServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DeptServiceImpl.java @@ -224,13 +224,18 @@ public class DeptServiceImpl extends ServiceImpl implements ID .toList(); } + /** + * 组织树专用数据权限菜单编码(角色「数据权限」中单独配置;未配置时组织树默认不展示)。 + */ + public static final String MENU_DEPT_TREE = "dept_tree"; + /** * 解析当前登录用户的组织树数据权限。 *

- * 超管或角色菜单数据权限最宽合并为「全部组织」时不过滤; - * 其余按角色配置的组织并集过滤。仅「本人创建」时按用户所属组织及下级展示组织树。 + * 仅读取 {@link #MENU_DEPT_TREE}「树形结构」菜单的数据权限配置,不再合并其他业务菜单; + * 超管不过滤;未配置该菜单数据权限时返回空树(默认不显示)。 * - * @return 过滤上下文;无法识别用户时按空权限处理 + * @return 过滤上下文;无法识别用户或未配置时按空权限处理 */ private DeptDataScopeFilter resolveDeptDataScopeFilter() { if (AuthUtil.isAdministrator()) { @@ -246,8 +251,11 @@ public class DeptServiceImpl extends ServiceImpl implements ID if (Func.isNotEmpty(user) && Func.isNotEmpty(user.getDeptId())) { userDeptIds = Func.toLongList(user.getDeptId()); } - RoleDataScopeVO scope = roleMenuDataScopeService.resolveWidest(roleIds, userDeptIds); - if (scope == null || scope.isAllDept()) { + RoleDataScopeVO scope = roleMenuDataScopeService.resolveByMenuCodeOrEmpty(roleIds, MENU_DEPT_TREE, userDeptIds); + if (scope == null) { + return DeptDataScopeFilter.empty(); + } + if (scope.isAllDept()) { return DeptDataScopeFilter.all(); } LinkedHashSet allowedDeptIds = new LinkedHashSet<>(); @@ -665,12 +673,9 @@ public class DeptServiceImpl extends ServiceImpl implements ID dept.setAncestors(parent.getAncestors() + StringPool.COMMA + dept.getParentId()); } dept.setIsDeleted(BladeConstant.DB_NOT_DELETED); - if (dept.getIsPlatformCompany() == null) { - dept.setIsPlatformCompany(0); - } - if (dept.getIsBusinessDept() == null) { - dept.setIsBusinessDept(0); - } + // 统一规范为 0/1,避免前端传空串、布尔或其它类型导致更新未生效 + dept.setIsPlatformCompany(normalizeYesNoFlag(dept.getIsPlatformCompany())); + dept.setIsBusinessDept(normalizeYesNoFlag(dept.getIsBusinessDept())); // 排序未填时默认 1 if (dept.getSort() == null) { dept.setSort(1); @@ -679,9 +684,24 @@ public class DeptServiceImpl extends ServiceImpl implements ID throw new ServiceException("租户ID不能为空"); } validateDeptCategory(dept); - validateDeptCode(dept, parent); + validateDeptCode(dept); validateContractInitialSerial(dept); - return saveOrUpdate(dept); + boolean saved = saveOrUpdate(dept); + if (saved && Func.isNotEmpty(dept.getId())) { + // 显式回写两个业务标志,避免部分更新路径漏改 + this.update(Wrappers.lambdaUpdate() + .set(Dept::getIsPlatformCompany, dept.getIsPlatformCompany()) + .set(Dept::getIsBusinessDept, dept.getIsBusinessDept()) + .eq(Dept::getId, dept.getId())); + } + return saved; + } + + /** + * 将是否类标志规范为 0/1;空值按 0 处理。 + */ + private Integer normalizeYesNoFlag(Integer flag) { + return Integer.valueOf(1).equals(flag) ? 1 : 0; } @Override @@ -881,9 +901,9 @@ public class DeptServiceImpl extends ServiceImpl implements ID } } - private void validateDeptCode(Dept dept, Dept parent) { + private void validateDeptCode(Dept dept) { String deptCode = dept.getDeptCode(); - // 组织编码非必填,为空时存 null,避免唯一索引冲突 + // 组织编码非必填,为空时存 null,避免唯一索引冲突;不再校验 GWWL/上级编码+三位数字格式 if (StringUtil.isBlank(deptCode)) { dept.setDeptCode(null); return; @@ -892,26 +912,6 @@ public class DeptServiceImpl extends ServiceImpl implements ID if (deptCode.length() > 30) { throw new ServiceException("组织编码不能超过30个字符"); } - // 顶级组织不依赖上级编码 - if (parent == null) { - this.ensureDeptCodeUnique(dept, deptCode); - dept.setDeptCode(deptCode); - return; - } - if (StringUtil.isBlank(parent.getDeptCode())) { - throw new ServiceException("请选择已配置组织编码的上级组织"); - } - // 公司:GWWL+三位数字;部门:所属公司编码+三位数字;其他:上级编码+三位数字 - String expectedParentCode = parent.getDeptCode(); - if (DeptCategory.COMPANY.getCode().equals(dept.getDeptCategory())) { - expectedParentCode = OAConvertConstant.OA_SYNC_ROOT_DEPT_CODE; - } else if (DeptCategory.DEPT.getCode().equals(dept.getDeptCategory()) - && StringUtil.isNotBlank(dept.getBelongCompanyCode())) { - expectedParentCode = dept.getBelongCompanyCode(); - } - if (!org.springblade.system.util.DeptCodeUtil.matchesChildCode(expectedParentCode, deptCode)) { - throw new ServiceException("组织编码格式应为:" + expectedParentCode + "三位数字(不足补零,中间不加-)"); - } this.ensureDeptCodeUnique(dept, deptCode); dept.setDeptCode(deptCode); } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleMenuDataScopeServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleMenuDataScopeServiceImpl.java index 0314afc9..04d62d5b 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleMenuDataScopeServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleMenuDataScopeServiceImpl.java @@ -184,20 +184,44 @@ public class RoleMenuDataScopeServiceImpl extends BaseServiceImpllambdaQuery() - .eq(Menu::getCode, menuCode) - .eq(Menu::getIsDeleted, 0) - .last("limit 1")); + Menu menu = findMenuByCode(menuCode); if (Func.isEmpty(menu)) { return RoleDataScopeVO.all(); } - List scopeList = list(Wrappers.lambdaQuery() - .in(RoleMenuDataScope::getRoleId, roleIds) - .eq(RoleMenuDataScope::getMenuId, menu.getId()) - .eq(RoleMenuDataScope::getIsDeleted, 0)); + List scopeList = listScopes(roleIds, menu.getId()); return mergeScopes(scopeList, userDeptIds); } + @Override + public RoleDataScopeVO resolveByMenuCodeOrEmpty(List roleIds, String menuCode, List userDeptIds) { + if (Func.isEmpty(roleIds) || Func.isBlank(menuCode)) { + return RoleDataScopeVO.none(); + } + Menu menu = findMenuByCode(menuCode); + if (Func.isEmpty(menu)) { + return RoleDataScopeVO.none(); + } + List scopeList = listScopes(roleIds, menu.getId()); + if (Func.isEmpty(scopeList)) { + return RoleDataScopeVO.none(); + } + return mergeScopes(scopeList, userDeptIds); + } + + private Menu findMenuByCode(String menuCode) { + return menuMapper.selectOne(Wrappers.

lambdaQuery() + .eq(Menu::getCode, menuCode) + .eq(Menu::getIsDeleted, 0) + .last("limit 1")); + } + + private List listScopes(List roleIds, Long menuId) { + return list(Wrappers.lambdaQuery() + .in(RoleMenuDataScope::getRoleId, roleIds) + .eq(RoleMenuDataScope::getMenuId, menuId) + .eq(RoleMenuDataScope::getIsDeleted, 0)); + } + @Override public RoleDataScopeVO resolveWidest(List roleIds, List userDeptIds) { if (Func.isEmpty(roleIds)) { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CommonAddressServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CommonAddressServiceImpl.java index b8f1e083..b882244c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CommonAddressServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CommonAddressServiceImpl.java @@ -310,7 +310,7 @@ public class CommonAddressServiceImpl extends BaseServiceImpl queryWrapper, String partyName) { + if (Func.isEmpty(partyName)) { + return; + } + queryWrapper.and(wrapper -> wrapper.like(ContractManage::getPartyA, partyName) + .or().like(ContractManage::getPartyB, partyName) + .or().like(ContractManage::getPartyC, partyName)); + } + private void applyEffectiveType(LambdaQueryWrapper queryWrapper, String effectiveType) { if (Func.isEmpty(effectiveType)) { return; @@ -700,7 +712,7 @@ public class ContractManageServiceImpl extends BaseServiceImpl wrapper2.ne(ContractManage::getContractStage, STAGE_TEMPORARY) .lt(ContractManage::getEndDate, today))); - default -> throw new ServiceException("无效的生效类型筛选条件"); + default -> throw new ServiceException("无效的合同状态筛选条件"); } } @@ -1049,18 +1061,11 @@ public class ContractManageServiceImpl extends BaseServiceImpl plans)) { throw new ServiceException("计费方案设置格式不正确"); } - Map defaultPlanCount = new HashMap<>(); for (Object value : plans) { if (!(value instanceof Map plan)) { throw new ServiceException("计费方案设置格式不正确"); } - String transportMode = trimValue(plan.get("transportMode")); - if (isDefaultBillingPlan(plan)) { - int count = defaultPlanCount.merge(transportMode, 1, Integer::sum); - if (count > 1) { - throw new ServiceException("同一运输方式仅支持配置一个默认计费方案"); - } - } + // 一个客商对应一个方案,不再校验「默认方案」 validateBillingMatchConditions(plan); validateBillingRuleTaxRates(plan); } @@ -1122,15 +1127,6 @@ public class ContractManageServiceImpl extends BaseServiceImpl plan) { - Object value = plan.get("defaultPlan"); - return Boolean.TRUE.equals(value) || "true".equalsIgnoreCase(String.valueOf(value)) || "1".equals(String.valueOf(value)); - } - - private String trimValue(Object value) { - return value == null ? null : TransportBusinessSupport.trimToNull(String.valueOf(value)); - } - private void validatePaymentRatios(String paymentRatioJson) { if (Func.isEmpty(paymentRatioJson)) return; try { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/ContractPartySupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/ContractPartySupport.java index 58b638d1..074fd3be 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/ContractPartySupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/ContractPartySupport.java @@ -93,7 +93,8 @@ public final class ContractPartySupport { } /** - * 校验计费方案均已绑定合同明细中的客商 + * 校验计费方案均已绑定合同明细中的客商。 + * 客户合同仅允许绑定甲方;承运商合同仅允许绑定乙方/丙方。 */ public static void validateBillingPlanBindings(ContractManage contractManage) { String billingPlanJson = contractManage.getBillingPlanJson(); @@ -104,7 +105,10 @@ public final class ContractPartySupport { if (!(parsed instanceof List plans) || plans.isEmpty()) { return; } - Map> partyByRowId = indexPartyRows(contractManage); + Set allowedRoles = allowedBillingPartyRoles(contractManage.getContractCategory()); + Map> partyByRowId = indexPartyRows(contractManage).entrySet().stream() + .filter(entry -> allowedRoles.contains(normalizeRole(String.valueOf(entry.getValue().get("partyRole"))))) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (left, right) -> left, LinkedHashMap::new)); Set customerKeys = partyByRowId.values().stream() .map(ContractPartySupport::customerMatchKey) .filter(Func::isNotEmpty) @@ -121,6 +125,9 @@ public final class ContractPartySupport { if (Func.isEmpty(partyRowId) && Func.isEmpty(customerId) && Func.isEmpty(customerName)) { throw new ServiceException("计费方案第" + (index + 1) + "个必须选择适用客商"); } + if (Func.isNotEmpty(partyRole) && !allowedRoles.contains(partyRole)) { + throw new ServiceException(billingPartyRoleMessage(contractManage.getContractCategory(), index + 1)); + } boolean matched = false; if (Func.isNotEmpty(partyRowId) && partyByRowId.containsKey(partyRowId)) { matched = true; @@ -134,11 +141,36 @@ public final class ContractPartySupport { } } if (!matched) { - throw new ServiceException("计费方案第" + (index + 1) + "个适用客商不在合同甲/乙/丙明细中"); + throw new ServiceException(billingPartyRoleMessage(contractManage.getContractCategory(), index + 1)); } } } + /** + * 计费方案可选客商角色:客户合同=甲方;承运商合同=乙方/丙方 + */ + public static Set allowedBillingPartyRoles(String contractCategory) { + String category = Func.toStr(contractCategory).trim(); + if ("承运商合同".equals(category)) { + return Set.of(ROLE_B, ROLE_C); + } + if ("客户合同".equals(category)) { + return Set.of(ROLE_A); + } + return Set.of(ROLE_A, ROLE_B, ROLE_C); + } + + private static String billingPartyRoleMessage(String contractCategory, int planIndex) { + String category = Func.toStr(contractCategory).trim(); + if ("承运商合同".equals(category)) { + return "计费方案第" + planIndex + "个适用客商只能选择乙方或丙方"; + } + if ("客户合同".equals(category)) { + return "计费方案第" + planIndex + "个适用客商只能选择甲方"; + } + return "计费方案第" + planIndex + "个适用客商不在合同甲/乙/丙明细中"; + } + public static List> parsePartyRows(String partyJson) { if (Func.isEmpty(partyJson)) { return List.of(); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/wrapper/CommonCargoWrapper.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/wrapper/CommonCargoWrapper.java index c0841d37..d026d57b 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/wrapper/CommonCargoWrapper.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/wrapper/CommonCargoWrapper.java @@ -23,12 +23,11 @@ package org.springblade.transport.wrapper; import org.springblade.core.mp.support.BaseEntityWrapper; -import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.BeanUtil; -import org.springblade.core.tool.utils.Func; import org.springblade.system.cache.UserCache; import org.springblade.transport.pojo.entity.CommonCargo; import org.springblade.transport.pojo.vo.CommonCargoVO; +import org.springblade.transport.support.TransportBusinessSupport; import java.math.BigDecimal; import java.util.Objects; @@ -52,8 +51,7 @@ public class CommonCargoWrapper extends BaseEntityWrapper { waybillVO.setCreateUserName(UserCache.getUserRealName(waybill.getCreateUser())); waybillVO.setUpdateUserName(UserCache.getUserRealName(waybill.getUpdateUser())); waybillVO.setDataSource(TransportBusinessSupport.normalizeWaybillDataSource(waybill.getDataSource())); - Long currentDeptId = Func.firstLong(AuthUtil.getDeptId()); - waybillVO.setReadonly(currentDeptId != null && !Objects.equals(waybill.getDeptId(), currentDeptId)); + waybillVO.setReadonly(TransportBusinessSupport.isDeptReadonly(waybill.getDeptId(), TransportBusinessSupport.MENU_WAYBILL_MANAGE)); String displayStatus = WaybillProcessSupport.normalizeBusinessStatus( waybill.getBusinessStatus(), waybill.getProcessJson(), waybill.getDriverAcceptStatus()); waybillVO.setBusinessStatus(displayStatus); diff --git a/doc/sql/transport/blade_base_menu_view_permission_patch_20261104.sql b/doc/sql/transport/blade_base_menu_view_permission_patch_20261104.sql new file mode 100644 index 00000000..d595f321 --- /dev/null +++ b/doc/sql/transport/blade_base_menu_view_permission_patch_20261104.sql @@ -0,0 +1,44 @@ +-- ---------------------------- +-- 补齐基础/系统业务模块「查看」按钮权限(角色授权用) +-- 执行前请确认目标库尚未存在同 code 菜单 +-- ---------------------------- + +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) +SELECT 2075429330000000001, 2075421555200860162, 'port_terminal_view', '查看', 'port_terminal_view', '', '', 1, 2, 0, 1, NULL, '', 0 +FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `blade_menu` WHERE `code` = 'port_terminal_view' AND `is_deleted` = 0); + +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) +SELECT 2075429280000000001, 2075427962415456258, 'railway_station_view', '查看', 'railway_station_view', '', '', 1, 2, 0, 1, NULL, '', 0 +FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `blade_menu` WHERE `code` = 'railway_station_view' AND `is_deleted` = 0); + +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) +SELECT 2075431850000000001, 2075431169720033282, 'airport_master_view', '查看', 'airport_master_view', '', '', 1, 2, 0, 1, NULL, '', 0 +FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `blade_menu` WHERE `code` = 'airport_master_view' AND `is_deleted` = 0); + +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) +SELECT 2075449000000000009, 2075449000000000001, 'currency_view', '查看', 'currency_view', '', '', 1, 2, 0, 1, NULL, '', 0 +FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `blade_menu` WHERE `code` = 'currency_view' AND `is_deleted` = 0); + +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) +SELECT 2075449100000000006, 2075449100000000001, 'customer_type_view', '查看', 'customer_type_view', '', '', 1, 2, 0, 1, NULL, '', 0 +FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `blade_menu` WHERE `code` = 'customer_type_view' AND `is_deleted` = 0); + +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) +SELECT 2075449200000000009, 2075449200000000001, 'fee_item_view', '查看', 'fee_item_view', '', '', 1, 2, 0, 1, NULL, '', 0 +FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `blade_menu` WHERE `code` = 'fee_item_view' AND `is_deleted` = 0); + +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) +SELECT 2075449300000000006, 2075449300000000001, 'measurement_unit_view', '查看', 'measurement_unit_view', '', '', 1, 2, 0, 1, NULL, '', 0 +FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `blade_menu` WHERE `code` = 'measurement_unit_view' AND `is_deleted` = 0); + +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) +SELECT 2080110200000000105, 2080110200000000101, 'business_dept_config_view', '查看', 'business_dept_config_view', '', '', 4, 2, 0, 1, NULL, '', 0 +FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `blade_menu` WHERE `code` = 'business_dept_config_view' AND `is_deleted` = 0); diff --git a/doc/sql/transport/blade_biz_dept_backfill_by_creator_20261104.sql b/doc/sql/transport/blade_biz_dept_backfill_by_creator_20261104.sql new file mode 100644 index 00000000..7f623bdf --- /dev/null +++ b/doc/sql/transport/blade_biz_dept_backfill_by_creator_20261104.sql @@ -0,0 +1,511 @@ +-- ---------------------------- +-- 业务数据「所属组织」旧残留批量订正 +-- 口径:按创建人当前所属组织(blade_user.dept_id 首个)回填 dept_id / dept_name(或 organization_name) +-- 适用:各环境 OA/组织同步后,业务表仍挂着已删/不存在/空组织的存量数据 +-- 可重复执行;update_time 不改,保留原值 +-- ---------------------------- +-- +-- 订正范围(仅处理残留): +-- 1) dept_id 为空或 <=0 +-- 2) dept_id 在 blade_dept 中不存在或已逻辑删除 +-- 仅名称字段的表:organization_name / dept_name 为空,或名称在当前未删除组织中找不到 +-- +-- 取值规则: +-- create_user → blade_user.dept_id(多组织取逗号分隔第一个,与登录态 AuthUtil.firstLong 一致) +-- → blade_dept.dept_name +-- 创建人无组织、或组织已失效:跳过该行 +-- +-- 特殊: +-- blade_customer_archive 客商所属组织业务上固定为「广西现代物流集团有限公司」, +-- 不按创建人组织回填,残留时改挂该顶级组织。 +-- 合同负责部门(organization_id)/ 票据使用部门(blade_bill_payment.dept_id)不在本脚本范围。 +-- +-- 执行顺序: +-- 0 预览 → 1 备份 → 2 订正 → 3 校验;出问题用 4 回退 +-- ---------------------------- + +SET NAMES utf8mb4; + +-- ---------------------------- +-- 0. 预览:各表待订正条数(执行订正前先看) +-- ---------------------------- +-- DROP TEMPORARY TABLE IF EXISTS tmp_user_current_dept; +-- CREATE TEMPORARY TABLE tmp_user_current_dept AS +-- SELECT +-- u.id AS user_id, +-- CAST(SUBSTRING_INDEX(TRIM(u.dept_id), ',', 1) AS UNSIGNED) AS dept_id, +-- d.dept_name AS dept_name +-- FROM blade_user u +-- INNER JOIN blade_dept d +-- ON d.id = CAST(SUBSTRING_INDEX(TRIM(IFNULL(u.dept_id, '')), ',', 1) AS UNSIGNED) +-- AND IFNULL(d.is_deleted, 0) = 0 +-- WHERE IFNULL(u.is_deleted, 0) = 0 +-- AND IFNULL(TRIM(u.dept_id), '') <> '' +-- AND CAST(SUBSTRING_INDEX(TRIM(u.dept_id), ',', 1) AS UNSIGNED) > 0; +-- ALTER TABLE tmp_user_current_dept ADD PRIMARY KEY (user_id); +-- +-- SELECT 'blade_common_route' AS table_name, COUNT(*) AS pending_cnt +-- FROM blade_common_route t +-- INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +-- WHERE IFNULL(t.is_deleted, 0) = 0 +-- AND (t.dept_id IS NULL OR t.dept_id <= 0 +-- OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); +-- -- 其余表同理,可按第 2 节表清单自行复制预览 + +-- ---------------------------- +-- 1. 备份表(不存在则创建;可重复执行) +-- ---------------------------- +CREATE TABLE IF NOT EXISTS blade_biz_dept_backfill_bak_20261104 ( + bak_id BIGINT NOT NULL AUTO_INCREMENT, + table_name VARCHAR(64) NOT NULL, + biz_id BIGINT NOT NULL, + old_dept_id BIGINT DEFAULT NULL, + old_dept_name VARCHAR(255) DEFAULT NULL, + new_dept_id BIGINT DEFAULT NULL, + new_dept_name VARCHAR(255) DEFAULT NULL, + create_user BIGINT DEFAULT NULL, + bak_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (bak_id), + KEY idx_biz_dept_bak_table_biz (table_name, biz_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='所属组织订正备份20261104'; + +START TRANSACTION; + +-- 创建人 → 当前所属组织(多组织取第一个) +DROP TEMPORARY TABLE IF EXISTS tmp_user_current_dept; +CREATE TEMPORARY TABLE tmp_user_current_dept AS +SELECT + u.id AS user_id, + CAST(SUBSTRING_INDEX(TRIM(u.dept_id), ',', 1) AS UNSIGNED) AS dept_id, + d.dept_name AS dept_name +FROM blade_user u +INNER JOIN blade_dept d + ON d.id = CAST(SUBSTRING_INDEX(TRIM(IFNULL(u.dept_id, '')), ',', 1) AS UNSIGNED) + AND IFNULL(d.is_deleted, 0) = 0 +WHERE IFNULL(u.is_deleted, 0) = 0 + AND IFNULL(TRIM(u.dept_id), '') <> '' + AND CAST(SUBSTRING_INDEX(TRIM(u.dept_id), ',', 1) AS UNSIGNED) > 0; +ALTER TABLE tmp_user_current_dept ADD PRIMARY KEY (user_id); + +-- 客商固定顶级组织 +DROP TEMPORARY TABLE IF EXISTS tmp_fixed_owner_dept; +CREATE TEMPORARY TABLE tmp_fixed_owner_dept AS +SELECT d.id AS dept_id, d.dept_name +FROM blade_dept d +WHERE IFNULL(d.is_deleted, 0) = 0 + AND d.dept_name = '广西现代物流集团有限公司' +ORDER BY d.id +LIMIT 1; +ALTER TABLE tmp_fixed_owner_dept ADD PRIMARY KEY (dept_id); + +-- ---------------------------- +-- 2. 订正:dept_id + dept_name 类表 +-- ---------------------------- + +-- 2.1 常用线路 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_common_route', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_common_route t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_common_route t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.2 常用货物 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_common_cargo', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_common_cargo t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_common_cargo t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.3 过程配置 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_process_config', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_process_config t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_process_config t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.4 发货模板 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_shipping_template', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_shipping_template t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_shipping_template t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.5 运输计划 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_transport_plan', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_transport_plan t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_transport_plan t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.6 运单 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_waybill', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_waybill t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_waybill t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.7 配载 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_loading_manage', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_loading_manage t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_loading_manage t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.8 常用地址 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_common_address', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_common_address t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_common_address t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.9 预结算 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_pre_settlement', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_pre_settlement t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_pre_settlement t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.10 正式结算 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_formal_settlement', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_formal_settlement t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_formal_settlement t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.11 应收应付明细 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_receivable_payable_detail', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_receivable_payable_detail t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_receivable_payable_detail t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.12 异常处置 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_exception_disposal', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_exception_disposal t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_exception_disposal t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.13 风险处置 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_risk_disposal', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_risk_disposal t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_risk_disposal t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.14 开票申请 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_invoice_application', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_invoice_application t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_invoice_application t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.15 收票登记 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_invoice_receipt', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_invoice_receipt t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_invoice_receipt t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.16 付款申请 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_payment_application', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_payment_application t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_payment_application t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.17 运输对账 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_transport_reconciliation', t.id, t.dept_id, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_transport_reconciliation t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +UPDATE blade_transport_reconciliation t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- 2.18 客商档案:固定挂顶级「广西现代物流集团有限公司」 +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_customer_archive', t.id, t.dept_id, t.dept_name, f.dept_id, f.dept_name, t.create_user +FROM blade_customer_archive t +CROSS JOIN tmp_fixed_owner_dept f +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0) + OR IFNULL(t.dept_id, 0) <> f.dept_id); + +UPDATE blade_customer_archive t +CROSS JOIN tmp_fixed_owner_dept f +SET t.dept_id = f.dept_id, + t.dept_ids = CAST(f.dept_id AS CHAR), + t.dept_name = f.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_id IS NULL OR t.dept_id <= 0 + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0) + OR IFNULL(t.dept_id, 0) <> f.dept_id); + +-- ---------------------------- +-- 2.19 仅名称字段:司机 / 车辆 / 船舶 / 派车 +-- ---------------------------- + +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_transport_driver', t.id, NULL, t.organization_name, c.dept_id, c.dept_name, t.create_user +FROM blade_transport_driver t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.organization_name IS NULL OR TRIM(t.organization_name) = '' + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE IFNULL(d.is_deleted, 0) = 0 AND d.dept_name = t.organization_name)); + +UPDATE blade_transport_driver t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.organization_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.organization_name IS NULL OR TRIM(t.organization_name) = '' + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE IFNULL(d.is_deleted, 0) = 0 AND d.dept_name = t.organization_name)); + +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_transport_vehicle', t.id, NULL, t.organization_name, c.dept_id, c.dept_name, t.create_user +FROM blade_transport_vehicle t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.organization_name IS NULL OR TRIM(t.organization_name) = '' + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE IFNULL(d.is_deleted, 0) = 0 AND d.dept_name = t.organization_name)); + +UPDATE blade_transport_vehicle t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.organization_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.organization_name IS NULL OR TRIM(t.organization_name) = '' + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE IFNULL(d.is_deleted, 0) = 0 AND d.dept_name = t.organization_name)); + +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_transport_ship', t.id, NULL, t.organization_name, c.dept_id, c.dept_name, t.create_user +FROM blade_transport_ship t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.organization_name IS NULL OR TRIM(t.organization_name) = '' + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE IFNULL(d.is_deleted, 0) = 0 AND d.dept_name = t.organization_name)); + +UPDATE blade_transport_ship t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.organization_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.organization_name IS NULL OR TRIM(t.organization_name) = '' + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE IFNULL(d.is_deleted, 0) = 0 AND d.dept_name = t.organization_name)); + +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_vehicle_dispatch', t.id, NULL, t.organization_name, c.dept_id, c.dept_name, t.create_user +FROM blade_vehicle_dispatch t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.organization_name IS NULL OR TRIM(t.organization_name) = '' + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE IFNULL(d.is_deleted, 0) = 0 AND d.dept_name = t.organization_name)); + +UPDATE blade_vehicle_dispatch t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.organization_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.organization_name IS NULL OR TRIM(t.organization_name) = '' + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE IFNULL(d.is_deleted, 0) = 0 AND d.dept_name = t.organization_name)); + +-- 2.20 结算调整单(仅 dept_name) +INSERT INTO blade_biz_dept_backfill_bak_20261104 (table_name, biz_id, old_dept_id, old_dept_name, new_dept_id, new_dept_name, create_user) +SELECT 'blade_settlement_adjustment', t.id, NULL, t.dept_name, c.dept_id, c.dept_name, t.create_user +FROM blade_settlement_adjustment t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_name IS NULL OR TRIM(t.dept_name) = '' + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE IFNULL(d.is_deleted, 0) = 0 AND d.dept_name = t.dept_name)); + +UPDATE blade_settlement_adjustment t +INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +SET t.dept_name = c.dept_name +WHERE IFNULL(t.is_deleted, 0) = 0 + AND (t.dept_name IS NULL OR TRIM(t.dept_name) = '' + OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE IFNULL(d.is_deleted, 0) = 0 AND d.dept_name = t.dept_name)); + +COMMIT; + +-- ---------------------------- +-- 3. 校验(订正后执行) +-- ---------------------------- +-- SELECT table_name, COUNT(*) AS bak_rows +-- FROM blade_biz_dept_backfill_bak_20261104 +-- GROUP BY table_name +-- ORDER BY table_name; +-- +-- -- 仍挂无效组织、且创建人当前有有效组织的运单(示例,期望 0) +-- SELECT COUNT(*) AS still_bad +-- FROM blade_waybill t +-- INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +-- WHERE IFNULL(t.is_deleted, 0) = 0 +-- AND (t.dept_id IS NULL OR t.dept_id <= 0 +-- OR NOT EXISTS (SELECT 1 FROM blade_dept d WHERE d.id = t.dept_id AND IFNULL(d.is_deleted, 0) = 0)); + +-- ---------------------------- +-- 4. 回退(按备份表恢复;按需取消注释) +-- ---------------------------- +-- UPDATE blade_waybill t +-- INNER JOIN blade_biz_dept_backfill_bak_20261104 b +-- ON b.table_name = 'blade_waybill' AND b.biz_id = t.id +-- SET t.dept_id = b.old_dept_id, t.dept_name = b.old_dept_name; +-- -- 其他表同理替换 table_name / 字段名 + +-- ---------------------------- +-- 5. 可选:全量强制按创建人当前组织覆盖(不仅残留) +-- 默认不要执行;确认业务需要「全部改挂创建人当前组织」时再跑 +-- ---------------------------- +-- UPDATE blade_waybill t +-- INNER JOIN tmp_user_current_dept c ON c.user_id = t.create_user +-- SET t.dept_id = c.dept_id, t.dept_name = c.dept_name +-- WHERE IFNULL(t.is_deleted, 0) = 0; diff --git a/doc/sql/transport/blade_business_dept_config_20261102.sql b/doc/sql/transport/blade_business_dept_config_20261102.sql index 6b80ee2f..e42118f9 100644 --- a/doc/sql/transport/blade_business_dept_config_20261102.sql +++ b/doc/sql/transport/blade_business_dept_config_20261102.sql @@ -34,4 +34,5 @@ INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `s (2080110200000000101, 1123598815738675203, 'business_dept_config', '业务部门配置', 'business_dept_config', '/system/business-dept-config', 'iconfont iconicon_group', 25, 1, 0, 1, NULL, '', 0), (2080110200000000102, 2080110200000000101, 'business_dept_config_add', '新增', 'business_dept_config_add', '', '', 1, 2, 0, 1, NULL, '', 0), (2080110200000000103, 2080110200000000101, 'business_dept_config_edit', '编辑', 'business_dept_config_edit', '', '', 2, 2, 0, 1, NULL, '', 0), -(2080110200000000104, 2080110200000000101, 'business_dept_config_delete', '删除', 'business_dept_config_delete', '', '', 3, 2, 0, 1, NULL, '', 0); +(2080110200000000104, 2080110200000000101, 'business_dept_config_delete', '删除', 'business_dept_config_delete', '', '', 3, 2, 0, 1, NULL, '', 0), +(2080110200000000105, 2080110200000000101, 'business_dept_config_view', '查看', 'business_dept_config_view', '', '', 4, 2, 0, 1, NULL, '', 0); diff --git a/doc/sql/transport/blade_currency.sql b/doc/sql/transport/blade_currency.sql index 8bdd98d5..287ea1b0 100644 --- a/doc/sql/transport/blade_currency.sql +++ b/doc/sql/transport/blade_currency.sql @@ -40,3 +40,4 @@ INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `s INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449000000000006, 2075449000000000001, 'currency_edit', '编辑', 'currency_edit', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449000000000007, 2075449000000000001, 'currency_status', '修改状态', 'currency_status', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449000000000008, 2075449000000000001, 'currency_add', '新增', 'currency_add', '', '', 1, 2, 0, 1, NULL, '', 0); +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449000000000009, 2075449000000000001, 'currency_view', '查看', 'currency_view', '', '', 1, 2, 0, 1, NULL, '', 0); diff --git a/doc/sql/transport/blade_customer_type.sql b/doc/sql/transport/blade_customer_type.sql index 4e4d8563..de47ddbb 100644 --- a/doc/sql/transport/blade_customer_type.sql +++ b/doc/sql/transport/blade_customer_type.sql @@ -26,3 +26,4 @@ INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `s INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449100000000003, 2075449100000000001, 'customer_type_edit', '编辑', 'customer_type_edit', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449100000000004, 2075449100000000001, 'customer_type_status', '修改状态', 'customer_type_status', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449100000000005, 2075449100000000001, 'customer_type_add', '新增', 'customer_type_add', '', '', 1, 2, 0, 1, NULL, '', 0); +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449100000000006, 2075449100000000001, 'customer_type_view', '查看', 'customer_type_view', '', '', 1, 2, 0, 1, NULL, '', 0); diff --git a/doc/sql/transport/blade_dept_tree_permission_patch_20261104.sql b/doc/sql/transport/blade_dept_tree_permission_patch_20261104.sql new file mode 100644 index 00000000..274b3520 --- /dev/null +++ b/doc/sql/transport/blade_dept_tree_permission_patch_20261104.sql @@ -0,0 +1,9 @@ +-- ---------------------------- +-- 组织树 /dept/tree 独立权限菜单(角色「数据权限」中配置) +-- 未配置该菜单数据权限时,组织树接口默认返回空(不展示) +-- ---------------------------- + +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) +SELECT 2076110415738675232, 1123598815738675205, 'dept_tree', '树形结构', 'dept_tree', '/api/blade-system/dept/tree', 'file-text', 5, 2, 2, 1, '', '组织树接口独立数据权限配置项;未配置时组织树默认不展示', 0 +FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM `blade_menu` WHERE `code` = 'dept_tree' AND `is_deleted` = 0); diff --git a/doc/sql/transport/blade_fee_item.sql b/doc/sql/transport/blade_fee_item.sql index b2f69e80..ae50d9e4 100644 --- a/doc/sql/transport/blade_fee_item.sql +++ b/doc/sql/transport/blade_fee_item.sql @@ -33,3 +33,4 @@ INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `s INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449200000000006, 2075449200000000001, 'fee_item_import', '批量导入', 'fee_item_import', '/api/blade-system/fee-item/import-fee-item', 'upload', 5, 2, 3, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449200000000007, 2075449200000000001, 'fee_item_template', '下载模板', 'fee_item_template', '/api/blade-system/fee-item/export-template', 'download', 6, 2, 2, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449200000000008, 2075449200000000001, 'fee_item_export', '批量导出', 'fee_item_export', '/api/blade-system/fee-item/export-fee-item', 'download', 7, 2, 2, 1, NULL, '', 0); +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449200000000009, 2075449200000000001, 'fee_item_view', '查看', 'fee_item_view', '', '', 1, 2, 0, 1, NULL, '', 0); diff --git a/doc/sql/transport/blade_measurement_unit.sql b/doc/sql/transport/blade_measurement_unit.sql index 175be766..6c213b00 100644 --- a/doc/sql/transport/blade_measurement_unit.sql +++ b/doc/sql/transport/blade_measurement_unit.sql @@ -30,4 +30,5 @@ INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `s (2075449300000000002, 2075449300000000001, 'measurement_unit_delete', '删除', 'measurement_unit_delete', '', '', 1, 2, 0, 1, NULL, '', 0), (2075449300000000003, 2075449300000000001, 'measurement_unit_edit', '编辑', 'measurement_unit_edit', '', '', 1, 2, 0, 1, NULL, '', 0), (2075449300000000004, 2075449300000000001, 'measurement_unit_status', '修改状态', 'measurement_unit_status', '', '', 1, 2, 0, 1, NULL, '', 0), -(2075449300000000005, 2075449300000000001, 'measurement_unit_add', '新增', 'measurement_unit_add', '', '', 1, 2, 0, 1, NULL, '', 0); +(2075449300000000005, 2075449300000000001, 'measurement_unit_add', '新增', 'measurement_unit_add', '', '', 1, 2, 0, 1, NULL, '', 0), +(2075449300000000006, 2075449300000000001, 'measurement_unit_view', '查看', 'measurement_unit_view', '', '', 1, 2, 0, 1, NULL, '', 0); diff --git a/doc/sql/transport/transport.sql b/doc/sql/transport/transport.sql index cc1fab90..2aa8621f 100644 --- a/doc/sql/transport/transport.sql +++ b/doc/sql/transport/transport.sql @@ -836,6 +836,7 @@ INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `s INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (1123598815738675230, 1123598815738675205, 'dept_edit', '修改', 'edit', '/system/dept/edit', 'form', 2, 2, 2, 1, '', NULL, 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (1123598815738675231, 1123598815738675205, 'dept_delete', '删除', 'delete', '/api/blade-system/dept/remove', 'delete', 3, 2, 3, 1, '', NULL, 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (1123598815738675232, 1123598815738675205, 'dept_view', '查看', 'view', '/system/dept/view', 'file-text', 4, 2, 2, 1, '', NULL, 0); +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2076110415738675232, 1123598815738675205, 'dept_tree', '树形结构', 'dept_tree', '/api/blade-system/dept/tree', 'file-text', 5, 2, 2, 1, '', '组织树接口独立数据权限配置项;未配置时组织树默认不展示', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (1123598815738675233, 1123598815738675206, 'dict_add', '新增', 'add', '/system/dict/add', 'plus', 1, 2, 1, 1, '', NULL, 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (1123598815738675234, 1123598815738675206, 'dict_edit', '修改', 'edit', '/system/dict/edit', 'form', 2, 2, 2, 1, '', NULL, 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (1123598815738675235, 1123598815738675206, 'dict_delete', '删除', 'delete', '/api/blade-system/dict/remove', 'delete', 3, 2, 3, 1, '', NULL, 0); @@ -998,7 +999,9 @@ INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `s INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075429169922023425, 2075427962415456258, 'railway_station_edit', '编辑', 'railway_station_edit', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075429216734650369, 2075427962415456258, 'railway_station_status', '修改状态', 'railway_station_status', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075429274242752513, 2075427962415456258, 'railway_station_add', '新增', 'railway_station_add', '', '', 1, 2, 0, 1, NULL, '', 0); +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075429280000000001, 2075427962415456258, 'railway_station_view', '查看', 'railway_station_view', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075429329544650754, 2075421555200860162, 'port_terminal_add', '新增', 'port_terminal_add', '', '', 1, 2, 0, 1, NULL, '', 0); +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075429330000000001, 2075421555200860162, 'port_terminal_view', '查看', 'port_terminal_view', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075431169720033282, 1164733399668962201, 'airport_master', '空港机场主数据', 'airport_master', '/base/airport-master', 'iconfont icon-fengche', 30, 1, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075431461312241665, 2075431169720033282, 'airport_master_import', '批量导入', 'airport_master_import', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075431522544885762, 2075431169720033282, 'airport_master_template', '下载模板', 'airport_master_template', '', '', 1, 2, 0, 1, NULL, '', 0); @@ -1007,6 +1010,7 @@ INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `s INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075431710063828994, 2075431169720033282, 'airport_master_edit', '编辑', 'airport_master_edit', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075431753298714626, 2075431169720033282, 'airport_master_status', '修改状态', 'airport_master_status', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075431820189474818, 2075431169720033282, 'airport_master_add', '新增', 'airport_master_add', '', '', 1, 2, 0, 1, NULL, '', 0); +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075431850000000001, 2075431169720033282, 'airport_master_view', '查看', 'airport_master_view', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449000000000001, 1164733399668962201, 'currency', '币种汇率管理', 'currency', '/base/currency', 'iconfont iconicon_exchange', 40, 1, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449000000000002, 2075449000000000001, 'currency_import', '批量导入', 'currency_import', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449000000000003, 2075449000000000001, 'currency_template', '下载模板', 'currency_template', '', '', 1, 2, 0, 1, NULL, '', 0); @@ -1015,11 +1019,13 @@ INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `s INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449000000000006, 2075449000000000001, 'currency_edit', '编辑', 'currency_edit', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449000000000007, 2075449000000000001, 'currency_status', '修改状态', 'currency_status', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449000000000008, 2075449000000000001, 'currency_add', '新增', 'currency_add', '', '', 1, 2, 0, 1, NULL, '', 0); +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449000000000009, 2075449000000000001, 'currency_view', '查看', 'currency_view', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449100000000001, 1164733399668962201, 'customer_type', '客商类型', 'customer_type', '/base/customer-type', 'iconfont icon-hezuohuobanmiyueguanli', 50, 1, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449100000000002, 2075449100000000001, 'customer_type_delete', '批量删除', 'customer_type_delete', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449100000000003, 2075449100000000001, 'customer_type_edit', '编辑', 'customer_type_edit', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449100000000004, 2075449100000000001, 'customer_type_status', '修改状态', 'customer_type_status', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449100000000005, 2075449100000000001, 'customer_type_add', '新增', 'customer_type_add', '', '', 1, 2, 0, 1, NULL, '', 0); +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449100000000006, 2075449100000000001, 'customer_type_view', '查看', 'customer_type_view', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449200000000001, 1164733399668962201, 'fee_item', '费用项', 'fee_item', '/base/fee-item', 'iconfont icon-shoucang', 60, 1, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449200000000002, 2075449200000000001, 'fee_item_delete', '批量删除', 'fee_item_delete', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449200000000003, 2075449200000000001, 'fee_item_edit', '编辑', 'fee_item_edit', '', '', 1, 2, 0, 1, NULL, '', 0); @@ -1028,6 +1034,7 @@ INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `s INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449200000000006, 2075449200000000001, 'fee_item_import', '批量导入', 'fee_item_import', '/api/blade-system/fee-item/import-fee-item', 'upload', 5, 2, 3, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449200000000007, 2075449200000000001, 'fee_item_template', '下载模板', 'fee_item_template', '/api/blade-system/fee-item/export-template', 'download', 6, 2, 2, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449200000000008, 2075449200000000001, 'fee_item_export', '批量导出', 'fee_item_export', '/api/blade-system/fee-item/export-fee-item', 'download', 7, 2, 2, 1, NULL, '', 0); +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075449200000000009, 2075449200000000001, 'fee_item_view', '查看', 'fee_item_view', '', '', 1, 2, 0, 1, NULL, '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075436235826896898, 0, 'blade-transport', '车/船务管理', 'blade-transport', '/vehicle', 'iconfont icon-shebeiguanli', 10, 1, 0, 1, '', '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075437082342301697, 2075436235826896898, 'maintenance_record', '维修记录', 'maintenance_record', '/vehicle/maintenance-record', 'iconfont icon-wxbgongju', 20, 1, 0, 1, '', '', 0); INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) VALUES (2075437237678350338, 2075436235826896898, 'maintenance_plan', '保养记录', 'maintenance_plan', '/vehicle/maintenance-plan', 'iconfont iconicon_exchange', 30, 1, 0, 1, '', '', 0);