20260922172938

This commit is contained in:
oneao committed 2026-09-22 17:29:39 +08:00
1 parent 583984c24f
commit c8dad8d4a6
46 files changed
+3366 -1246

No files matched your search

@@ -30,6 +30,9 @@ import java.util.Set;
* 不读模块关系、不跑模块 SQL 规则。普通模块列表不允许传表名。</li>
* </ul>
*
* <p>另外,{@code saveobjt} 的删除行可以带 {@code dependent_deletes} 声明,把引用这些行的
* 依赖行一并删除(见 {@link #deleteDependents}):依赖关系由调用方声明,服务端不按表名猜。
*
* <p>计划、检查、删除在同一事务中完成(设计 §5.3):任一步骤失败整批回滚。
*/
@Service
@@ -178,6 +181,110 @@ public class DataDeleteService {
return deleted;
}
/**
* 依赖行删除:本表被删的行被别的表引用时,连引用行一起删(《FMS删除策略重构设计》§6.2)。
*
* <p>例如删除权限点({@code s_power})要连引用它的用户授权行({@code s_user_power})
* 一起删:授权行只记录“拥有”,没有外键约束,权限点没了、授权行留着就是幽灵授权 ——
* 权限判定会读到它,授权界面也无从解释。这类关系不登记在 {@code s_relation} 里
* (那是有模块归属的业务关系),也不由服务端按表名反查:调用方在请求里声明依赖表、
* 键列和取值列,这里按声明执行。表名只出现在请求里,服务端不认识具体业务表。
*
* <p>声明格式 {@code {table, key_field, source_field}}:对本表本次要删的每一行,
* 用取值列的值得出要删的键值,再删依赖表里键列等于该值的行。取值用本表这一行的列值
* 条件查出(与物理删除的 WHERE 同口径),所以调用方不需要先查一遍再拼删除行。
*
* @param parentTable 本表(正在删除的表)的元数据
* @param parentRows 本次要删除的行,列值即删除条件
* @param dependents 依赖声明列表
* @return 实际删除的依赖行数
*/
public int deleteDependents(
Connection connection,
DbUtils.TableMetadata parentTable,
List<Map<String, Object>> parentRows,
List<Map<String, Object>> dependents
) throws SQLException {
int total = 0;
for (Map<String, Object> dependent : dependents) {
String table = text(dependent.get("table"));
String keyField = text(dependent.get("key_field"));
String sourceField = text(dependent.get("source_field"));
// 声明不完整时直接拒绝:静默跳过等于把该清的依赖行留下,成了没人解释得了的孤儿行
if (table == null || keyField == null || sourceField == null) {
throw new BusinessException(
"依赖删除声明不完整,需要 table / key_field / source_field");
}
DbUtils.TableMetadata dependentTable = dbUtils.loadTableMetadata(connection, table);
DbUtils.ColumnMetadata keyColumn = requireKeyColumn(dependentTable, keyField);
DbUtils.ColumnMetadata sourceColumn = dbUtils.getColumn(parentTable, sourceField);
if (sourceColumn == null) {
throw new BusinessException("依赖删除的取值列不存在: "
+ parentTable.requestedName() + "." + sourceField);
}
List<Object> values = querySourceValues(
connection, parentTable, parentRows, sourceColumn);
if (values.isEmpty()) {
continue;
}
int deleted = deleteRecords(connection, dependentTable, keyColumn, values);
total += deleted;
writeDeleteLog(null, parentTable.requestedName(), table,
keyColumn.name(), values.size(), deleted);
}
return total;
}
/**
* 取出本表待删行在取值列上的值(去重)。
*
* <p>匹配条件与物理删除同口径:行内有本表可写列的列值做 AND;一行里没有任何本表列时
* 拒绝执行,和 {@code DbUtils.delete} 一样不允许从这条路径形成无条件匹配。
*/
private List<Object> querySourceValues(
Connection connection,
DbUtils.TableMetadata table,
List<Map<String, Object>> rows,
DbUtils.ColumnMetadata sourceColumn
) throws SQLException {
Set<Object> values = new LinkedHashSet<>();
for (Map<String, Object> row : rows) {
List<String> conditions = new ArrayList<>();
for (Map.Entry<String, Object> entry : row.entrySet()) {
DbUtils.ColumnMetadata column = columnOf(table, entry.getKey());
if (column == null || !column.writable()) {
continue;
}
conditions.add(dbUtils.quoteQualifiedIdentifier(column.name())
+ " = " + literal(entry.getValue(), column));
}
if (conditions.isEmpty()) {
throw new BusinessException("删除条件不能为空: " + table.requestedName());
}
String sql = "select distinct " + dbUtils.quoteQualifiedIdentifier(sourceColumn.name())
+ " from " + table.quotedName()
+ " where " + String.join(" and ", conditions);
for (Map<String, Object> found : dbUtils.loadDataBySql(connection, sql)) {
Object value = found.get(sourceColumn.name());
if (value != null) {
values.add(value);
}
}
}
return new ArrayList<>(values);
}
/** 按列名取元数据(大小写不敏感);不是本表列时返回 null,与物理删除忽略未知列同口径 */
private DbUtils.ColumnMetadata columnOf(DbUtils.TableMetadata table, String fieldName) {
if (fieldName == null) {
return null;
}
return table.columnsByName().get(fieldName.trim().toLowerCase(Locale.ROOT));
}
// ── target=module:计划 → 检查 → 执行 ──────────────────────────────────
private Map<String, Integer> executeModuleTarget(
@@ -25,6 +25,13 @@ import java.util.StringJoiner;
@Service
public class DataSaveService {
/**
* 依赖行删除声明(请求可选):本表本次要删的行被别的表引用时,连引用行一起删。
* 声明为 {@code [{table, key_field, source_field}]},由删除服务按声明执行
* (《FMS删除策略重构设计》§6.2)。表名只出现在请求里,服务端不按表名猜关系。
*/
private static final String DEPENDENT_DELETES = "dependent_deletes";
@Resource
private DataSource dataSource;
@@ -430,6 +437,15 @@ public class DataSaveService {
"update",
rows(request, "updates")
);
// 依赖行随本表删除:请求显式声明依赖表(如删权限点连引用它的授权行一起删),
// 由删除服务按声明查出引用行的键值再删(设计《删除策略》§6.2)。声明通用 ——
// 服务端不认识具体表名,依赖关系由调用方声明,不做“按表名猜关系”的特殊处理。
// 依赖行先于父行删除(设计 §5.3),所以放在物理删除之前;本表没有删除行时
// 没有依赖可清,直接跳过。与本次删除同事务,任一步失败整体回滚。
List<Map<String, Object>> dependentDeletes = rows(request, DEPENDENT_DELETES);
if (!deleteRows.isEmpty() && !dependentDeletes.isEmpty()) {
executeDependentDeletes(connection, table, deleteRows, dependentDeletes);
}
if (deleteTarget != null && !deleteTarget.isBlank() && !deleteRows.isEmpty()) {
executeDeletes(connection, request, tableName, keyField, deleteTarget, deleteRows);
} else {
@@ -450,6 +466,25 @@ public class DataSaveService {
);
}
/**
* 执行请求声明的依赖行删除(设计《删除策略》§6.2)。
*
* <p>具体匹配与删除走删除服务:那里有物理删除执行器、主键类型校验和删除日志,
* 与其它删除路径同一套实现,不在这里再写一份。
*/
private void executeDependentDeletes(
Connection connection,
DbUtils.TableMetadata table,
List<Map<String, Object>> deleteRows,
List<Map<String, Object>> dependentDeletes
) {
try {
dataDeleteService.deleteDependents(connection, table, deleteRows, dependentDeletes);
} catch (SQLException exception) {
throw new SaveObjectException(table.requestedName(), "delete", -1, exception);
}
}
/**
* 通过删除服务执行 saveobjt 的删除行(设计 §6.2)。
*
@@ -29,7 +29,9 @@ import java.util.regex.Pattern;
* 三层,与《FMS新系统核心表结构设计》第 14 节一一对应:
* 1. 动作权限(14.1 / 14.2):s_power(action.{模块}.{动作})+ s_user_power,白名单语义;
* 2. 字段权限(14.3):s_user_field_power 的 b_view / b_export,无记录按模块默认(可看可导出);
* 3. 数据范围(14.4):s_user_data_power,按操作精确匹配优先、多条规则 OR、整体再与其它条件 AND。
* 3. 数据范围(14.4):s_user_data_power,按操作精确匹配优先、多条规则 OR、整体再与其它条件 AND;
* 按范围判的规则所用的字段取自模块配置 s_module.b_scope_field(记录归属人字段),
* self 直接比该字段,dept / dept_tree 由当前用户反查部门后再比。
*/
@Service
public class SqlPermissionService {
@@ -107,7 +109,7 @@ public class SqlPermissionService {
* 无生效规则返回 null,表示该模块无数据范围限制。
*/
public String buildDataScopeCondition(String moduleId, String userId, String operation) {
String sql = "SELECT [b_operation], [b_scope_type], [b_scope_field], [b_condition_sql] "
String sql = "SELECT [b_operation], [b_scope_type], [b_condition_sql] "
+ "FROM [s_user_data_power] "
+ "WHERE [b_user_id] = ? AND [b_module_id] = ? AND [b_canuse] = 1 "
+ "AND ([b_operation] = ? OR [b_operation] = '*') "
@@ -128,20 +130,29 @@ public class SqlPermissionService {
List<Map<String, Object>> effective = exact.isEmpty() ? wildcard : exact;
String deptId = null;
// 判断字段只来自模块配置(s_module.b_scope_field,记录归属人字段):同一个模块的
// 所有用户必须用同一字段判范围,所以授权行上的同名列不参与判定。按需读一次,
// 只有按范围判的规则(self / dept / dept_tree)才需要它
String moduleScopeField = null;
List<String> fragments = new ArrayList<>();
for (Map<String, Object> row : effective) {
String scopeType = text(row.get("b_scope_type")).toLowerCase(Locale.ROOT);
String scopeField = text(row.get("b_scope_field"));
switch (scopeType) {
case "all", "" -> {
// 全部数据:不追加条件
}
case "self" -> {
String field = requireScopeField(scopeField);
if (moduleScopeField == null) {
moduleScopeField = loadModuleScopeField(connection, moduleId);
}
String field = requireScopeField(moduleScopeField);
fragments.add(quote(field) + " = " + dbUtils.toSqlStringLiteral(userId));
}
case "dept", "dept_tree" -> {
String field = requireScopeField(scopeField);
if (moduleScopeField == null) {
moduleScopeField = loadModuleScopeField(connection, moduleId);
}
String field = requireScopeField(moduleScopeField);
if (deptId == null) {
deptId = loadDeptId(connection, userId);
}
@@ -197,6 +208,20 @@ public class SqlPermissionService {
return rows.isEmpty() ? null : text(rows.get(0).get("b_dept_id"));
}
/**
* 模块的数据范围字段(s_module.b_scope_field,记录归属人字段如 b_inputuser_id)。
* 配在模块上而不是授权行上:同一个模块的所有用户必须用同一字段判范围。
* 未配置时返回空串,由 requireScopeField 明确报错,不静默放行。
*/
private String loadModuleScopeField(Connection connection, String moduleId) throws SQLException {
List<Map<String, Object>> rows = query(
connection,
"SELECT [b_scope_field] FROM [s_module] WHERE [b_id] = ?",
moduleId
);
return rows.isEmpty() ? "" : text(rows.get(0).get("b_scope_field"));
}
private String loadDeptPath(Connection connection, String deptId) throws SQLException {
List<Map<String, Object>> rows = query(
connection,
@@ -1,837 +1 @@
=== 新库 FMS:表结构 ===
--- b_cargo_damage_status ---
(表不存在)
--- b_bulkforkliftpersonname ---
(表不存在)
--- b_bulktype ---
(表不存在)
--- b_bulkpersonname ---
(表不存在)
--- b_bulkstevedorepersonname ---
(表不存在)
--- b_charging_method ---
(表不存在)
--- b_unloading_method ---
(表不存在)
--- b_sys_b_lessfull ---
(表不存在)
--- b_sys_edittype ---
(表不存在)
--- b_vessel ---
(表不存在)
--- b_freightpayment ---
(表不存在)
--- b_con_type ---
(表不存在)
--- b_jsfs ---
(表不存在)
--- b_city ---
(表不存在)
--- b_ivtype ---
(表不存在)
--- b_sys_sex ---
(表不存在)
--- b_sys_copies ---
(表不存在)
--- b_cztype ---
(表不存在)
--- b_sys_level ---
(表不存在)
--- b_sys_operator ---
(表不存在)
--- b_blstate ---
(表不存在)
--- b_sys_state ---
(表不存在)
--- b_sys_feesf ---
(表不存在)
--- bc_priceList_type ---
(表不存在)
--- b_sys_yesno ---
(表不存在)
--- b_sys_pricelisttype ---
(表不存在)
--- b_ystype ---
(表不存在)
--- b_billtype ---
(表不存在)
--- b_bgtype ---
(表不存在)
--- b_httype ---
(表不存在)
--- b_transway ---
(表不存在)
--- b_sys_hdtype ---
(表不存在)
--- b_package ---
(表不存在)
--- b_progress ---
(表不存在)
--- b_zxstate ---
(表不存在)
--- b_depot ---
(表不存在)
--- b_depotouttype ---
(表不存在)
--- b_depotintype ---
(表不存在)
--- car_daily_feetype ---
(表不存在)
--- car_jiayou_jsfs ---
(表不存在)
--- car_jiayou_type ---
(表不存在)
--- b_cdtype ---
(表不存在)
--- b_shfs ---
(表不存在)
--- car_jiayou_youliao ---
(表不存在)
--- b_thfs ---
(表不存在)
--- b_wangdian ---
(表不存在)
--- b_ywfrom ---
(表不存在)
--- b_ywtype_tc ---
(表不存在)
--- b_servicetype ---
(表不存在)
--- b_contype ---
(表不存在)
--- b_ywtype_ht ---
(表不存在)
--- b_dcterm ---
(表不存在)
--- b_ywtype_ky ---
(表不存在)
=== 旧库 G3HY2025:表结构 ===
--- b_cargo_damage_status ---
b_id varchar 50 not null
b_name varchar 50 null
--- b_bulkforkliftpersonname ---
b_id varchar 50 not null
b_name varchar 50 null
--- b_bulktype ---
b_id varchar 50 not null
b_name varchar 50 null
--- b_bulkpersonname ---
b_id varchar 50 not null
b_name varchar 50 null
--- b_bulkstevedorepersonname ---
b_id varchar 50 not null
b_name varchar 50 null
--- b_charging_method ---
b_id varchar 50 not null
b_name varchar 50 null
--- b_unloading_method ---
b_id varchar 50 not null
b_name varchar 50 null
--- b_sys_b_lessfull ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
--- b_sys_edittype ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 200 null
--- b_vessel ---
b_id varchar 50 not null
b_vessel_name varchar 100 null
b_edicode varchar 50 null
b_voy varchar 100 null
b_bz varchar 200 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_freightpayment ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_con_type ---
b_id varchar 50 not null
b_name varchar 50 null
b_edicode varchar 50 null
b_bz varchar 200 null
b_type varchar 50 null
b_linkcon varchar 50 null
b_default varchar 1 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_jsfs ---
b_id varchar 50 not null
b_name varchar 50 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_city ---
b_id varchar 50 not null
b_name_c varchar 50 null
b_name_e varchar 50 null
b_country_name_e varchar 50 null
b_country_name_c varchar 50 null
b_bz varchar 500 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_ivtype ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_sys_sex ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 200 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_sys_copies ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 200 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_cztype ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 200 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_sys_level ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 200 null
--- b_sys_operator ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 200 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_blstate ---
b_id varchar 50 not null
b_name varchar 50 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_sys_state ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_sys_feesf ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
--- bc_priceList_type ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
--- b_sys_yesno ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
--- b_sys_pricelisttype ---
b_id varchar 50 not null
b_name varchar 50 null
b_dw_id varchar 50 null
b_dw_name varchar 50 null
--- b_ystype ---
b_id varchar 50 null
b_name varchar 50 null
b_bz varchar 200 null
--- b_billtype ---
b_id varchar 50 null
b_name varchar 50 null
--- b_bgtype ---
b_id varchar 50 null
b_name varchar 50 null
--- b_httype ---
b_id varchar 50 null
b_name varchar 50 null
b_bz varchar 50 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_transway ---
b_id varchar 50 not null
b_name varchar 100 null
b_edicode varchar 50 null
b_bz varchar 100 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_sys_hdtype ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 200 null
--- b_package ---
b_id varchar 50 not null
b_name varchar 50 null
b_edicode varchar 50 null
b_bz varchar 100 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_progress ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 500 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_zxstate ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 200 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_depot ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 200 null
--- b_depotouttype ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
--- b_depotintype ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
--- car_daily_feetype ---
b_id varchar 50 null
b_name varchar 50 null
--- car_jiayou_jsfs ---
b_id varchar 50 null
b_name varchar 50 null
--- car_jiayou_type ---
b_id varchar 50 null
b_name varchar 50 null
--- b_cdtype ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
--- b_shfs ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
--- car_jiayou_youliao ---
b_id varchar 50 null
b_name varchar 50 null
--- b_thfs ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
--- b_wangdian ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
--- b_ywfrom ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
--- b_ywtype_tc ---
b_id varchar 50 not null
b_name varchar 50 null
b_bz varchar 50 null
--- b_servicetype ---
b_id varchar 50 not null
b_name varchar 50 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_contype ---
b_id varchar 50 not null
b_name varchar 50 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_ywtype_ht ---
b_id varchar 50 not null
b_name varchar 50 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_dcterm ---
b_id varchar 50 not null
b_name varchar 50 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
--- b_ywtype_ky ---
b_id varchar 50 not null
b_name varchar 50 null
b_inputuser_id varchar 50 null
b_inputdatetime datetime 8 null
b_updateuser_id varchar 50 null
b_updatedatetime datetime 8 null
=== 旧库 G3HY2025:数据样例(每表前 3 行) ===
--- b_cargo_damage_status ---
b_id b_name
001 完好
002 轻微破损
(2 行)
--- b_bulkforkliftpersonname ---
b_id b_name
001 小张
(1 行)
--- b_bulktype ---
b_id b_name
001 散货
(1 行)
--- b_bulkpersonname ---
b_id b_name
001 张三
002 李四
(2 行)
--- b_bulkstevedorepersonname ---
b_id b_name
001 小王
(1 行)
--- b_charging_method ---
b_id b_name
001 按件收费
002 按托收费
(2 行)
--- b_unloading_method ---
b_id b_name
001 吊车卸货
002 铲车卸货
(2 行)
--- b_sys_b_lessfull ---
b_id b_name b_bz
001 整箱 (null)
002 拼箱 (null)
(2 行)
--- b_sys_edittype ---
b_id b_name b_bz
001 selectid (null)
002 selectname (null)
003 date (null)
(3 行)
--- b_vessel ---
b_id b_vessel_name b_edicode b_voy b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 YM FOUNTAIN V.85W (null) N012 (null) (null) (null) (null) (null)
002 YM FOUNTAIN V.75W (null) N45 (null) (null) (null) (null) (null)
003 COSCO BOSTON (null) 202N (null) (null) (null) (null)
(3 行)
--- b_freightpayment ---
b_id b_name b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 FREIGHT PREPAID (null) (null) (null) (null)
002 FREIGHT COLLECT (null) (null) (null) (null)
003 Shipping LOYal (null) (null) (null) (null)
(3 行)
--- b_con_type ---
b_id b_name b_edicode b_bz b_type b_linkcon b_default b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 40GP 大箱 40GP 1 (null) (null) g3soft 2026-07-14 11:09:20.0
002 20GP 小箱 20GP 1 (null) (null) g3soft 2026-07-14 11:09:21.0
003 45HQ 大箱 45HQ 1 (null) (null) g3soft 2026-07-14 11:09:22.0
(3 行)
--- b_jsfs ---
b_id b_name b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 汇票 (null) (null) (null) (null)
002 转账 (null) (null) (null) (null)
(2 行)
--- b_city ---
b_id b_name_c b_name_e b_country_name_e b_country_name_c b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
CNNGB 宁波 NINGBO (null) (null) (null) (null) (null) (null)
CS001 阿拉木图 阿拉木图 (null) (null) (null) (null) (null) (null) (null)
CS002 阿腾科里 阿腾科里 (null) (null) (null) (null) (null) (null) (null)
(3 行)
--- b_ivtype ---
b_id b_name b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 增值税专票 (null) (null) (null) (null) (null)
002 增值税普票 (null) (null) (null) (null) (null)
(2 行)
--- b_sys_sex ---
b_id b_name b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 男 (null) (null) (null) (null) (null)
002 女 (null) (null) (null) (null) (null)
(2 行)
--- b_sys_copies ---
b_id b_name b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 ZERO (null) (null) (null) (null) (null)
002 ONE (null) (null) (null) (null) (null)
003 TWO (null) (null) (null) (null) (null)
(3 行)
--- b_cztype ---
b_id b_name b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 过磅称重法M1 (null) (null) (null) (null) (null)
002 累计相加称重法M2 (null) (null) (null) (null) (null)
(2 行)
--- b_sys_level ---
b_id b_name b_bz
001 1 (null)
002 2 (null)
003 3 (null)
(3 行)
--- b_sys_operator ---
b_id b_name b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 等于 (null) (null) (null) (null) (null)
002 不等于 (null) (null) (null) (null) (null)
003 为空 (null) (null) (null) (null) (null)
(3 行)
--- b_blstate ---
b_id b_name b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 电放 (null) (null) (null) (null)
002 正本 (null) (null) (null) (null)
(2 行)
--- b_sys_state ---
b_id b_name b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 草拟 (null) (null) (null) (null) (null)
002 送审 (null) (null) (null) (null) (null)
003 审核通过 (null) (null) (null) (null) (null)
(3 行)
--- b_sys_feesf ---
b_id b_name b_bz
001 应收 (null)
002 应付 (null)
(2 行)
--- bc_priceList_type ---
b_id b_name b_bz
001 客户价目 (null)
002 供应商 (null)
(2 行)
--- b_sys_yesno ---
b_id b_name b_bz
001 是 (null)
002 否 (null)
(2 行)
--- b_sys_pricelisttype ---
b_id b_name b_dw_id b_dw_name
001 委托单位 b_customer_id v_customer_company
002 订舱单位 b_dcdw_id v_dc_company
003 报关行 b_bgcompany_id v_bg_company
(3 行)
--- b_ystype ---
b_id b_name b_bz
001 应收款 (null)
002 应付款 (null)
003 预收款 (null)
(3 行)
--- b_billtype ---
b_id b_name
001 实际账单
002 虚拟账单
(2 行)
--- b_bgtype ---
b_id b_name
001 一般贸易
002 市场采购
(2 行)
--- b_httype ---
b_id b_name b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 客户合同 (null) (null) (null) (null) (null)
002 供应商合同 (null) (null) (null) (null) (null)
(2 行)
--- b_transway ---
b_id b_name b_edicode b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 CY-CY (null) (null) (null) (null) (null) (null)
002 DOOR-DOOR (null) (null) (null) (null) (null) (null)
003 CFS-CFS (null) (null) (null) (null) (null) (null)
(3 行)
--- b_sys_hdtype ---
b_id b_name b_bz
001 纸质 (null)
002 电子 (null)
(2 行)
--- b_package ---
b_id b_name b_edicode b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
BAGS BAGS (null) (null) (null) (null) (null) (null)
BALES BALES (null) (null) (null) (null) (null) (null)
CASES CASES (null) (null) (null) (null) (null) (null)
(3 行)
--- b_progress ---
b_id b_name b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 Active (null) (null) (null) (null)
002 Confirmed (null) (null) (null) (null)
003 Completed (null) (null) (null) (null)
(3 行)
--- b_zxstate ---
b_id b_name b_bz b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 待处理 (null) (null) (null) (null)
002 处理中 (null) (null) (null) (null)
003 已处理 (null) (null) (null) (null)
(3 行)
--- b_depot ---
b_id b_name b_bz
001 杭州
002 宁波
(2 行)
--- b_depotouttype ---
b_id b_name b_bz
001 领用出库
(1 行)
--- b_depotintype ---
b_id b_name b_bz
001 采购入库
(1 行)
--- car_daily_feetype ---
b_id b_name
001 过路费
(1 行)
--- car_jiayou_jsfs ---
b_id b_name
001 计算金额
002 计算升数
003 计算单价
(3 行)
--- car_jiayou_type ---
b_id b_name
001 现金加油
002 油卡加油
(2 行)
--- b_cdtype ---
b_id b_name b_bz
001 外用司机 (null)
002 自有车 (null)
(2 行)
--- b_shfs ---
b_id b_name b_bz
001 自提 (null)
002 送货上门 (null)
(2 行)
--- car_jiayou_youliao ---
b_id b_name
001 柴油
002 尿素
(2 行)
--- b_thfs ---
b_id b_name b_bz
001 客户送货 (null)
002 上门提货 (null)
(2 行)
--- b_wangdian ---
b_id b_name b_bz
001 宁波
002 西安
003 乌鲁木齐
(3 行)
--- b_ywfrom ---
b_id b_name b_bz
001 非系统 (null)
002 同行 (null)
(2 行)
--- b_ywtype_tc ---
b_id b_name b_bz
001 零担 (null)
002 整车 (null)
003 专车 (null)
(3 行)
--- b_servicetype ---
b_id b_name b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
1 全程散货 g3soft 2026-08-17 13:57:47.0(null) (null)
2 全程买箱 g3soft 2026-08-17 13:59:27.0(null) (null)
3 全程车皮 g3soft 2026-08-17 14:00:04.0(null) (null)
(3 行)
--- b_contype ---
b_id b_name b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
1 租箱 g3soft 2026-08-17 14:05:51.0(null) (null)
2 买箱 g3soft 2026-08-17 14:06:07.0(null) (null)
3 铁路箱 g3soft 2026-08-17 14:06:20.0(null) (null)
(3 行)
--- b_ywtype_ht ---
b_id b_name b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
(0 行)
--- b_dcterm ---
b_id b_name b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 条款1 g3soft 2026-08-31 15:48:02.0(null) (null)
(1 行)
--- b_ywtype_ky ---
b_id b_name b_inputuser_id b_inputdatetime b_updateuser_id b_updatedatetime
001 进口 g3soft 2026-08-31 15:46:48.0(null) (null)
(1 行)