fix: 优化逻辑

This commit is contained in:
tangwei 2026-06-25 15:39:18 +08:00
parent fcb300f2d4
commit 77681adba9
3 changed files with 302 additions and 16 deletions

View File

@ -13,7 +13,7 @@ public class Constant {
public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String CODE_KEY = "code-key-";
public static final long CODE_EXPIRATION_TIME = 1000 * 60;
public static final long CODE_EXPIRATION_TIME = 1000 * 60 * 2;
/**
* 用于IP定位转换
*/

View File

@ -20,9 +20,11 @@ import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Service
public class MsOperationLogServiceImpl implements IMsOperationLogService {
@ -33,22 +35,146 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService {
static {
ENG_FIELD_MEANING_MAP.put("STCD", "电站编码");
ENG_FIELD_MEANING_MAP.put("TM", "数据时间");
ENG_FIELD_MEANING_MAP.put("ENNM", "电站名称");
ENG_FIELD_MEANING_MAP.put("BASE_ID", "所属基地编码");
ENG_FIELD_MEANING_MAP.put("BASE_NAME", "所属基地名称");
ENG_FIELD_MEANING_MAP.put("HBRVCD", "所属基地流域编码");
ENG_FIELD_MEANING_MAP.put("HBRVCD_NAME", "所属基地流域名称");
ENG_FIELD_MEANING_MAP.put("RVCD", "所属流域编码");
ENG_FIELD_MEANING_MAP.put("RVCD_NAME", "所属流域名称");
ENG_FIELD_MEANING_MAP.put("ADDVCD", "所属行政区编码");
ENG_FIELD_MEANING_MAP.put("ADDVCD_NAME", "所属行政区名称");
ENG_FIELD_MEANING_MAP.put("COUNTRY", "所属国家编码");
ENG_FIELD_MEANING_MAP.put("COUNTRY_NAME", "所属国家名称");
ENG_FIELD_MEANING_MAP.put("REACHCD", "所属河段编码");
ENG_FIELD_MEANING_MAP.put("REACHCD_NAME", "所属河段名称");
ENG_FIELD_MEANING_MAP.put("HYCD", "所属公司编码");
ENG_FIELD_MEANING_MAP.put("HYNM", "所属公司名称");
ENG_FIELD_MEANING_MAP.put("TOP_HYCD", "所属集团编码");
ENG_FIELD_MEANING_MAP.put("TOP_HYNM", "所属集团名称");
ENG_FIELD_MEANING_MAP.put("BLPRD", "所属建设阶段");
ENG_FIELD_MEANING_MAP.put("BLDSTT", "建设状态");
ENG_FIELD_MEANING_MAP.put("BLDSTT_CODE", "建设状态分类");
ENG_FIELD_MEANING_MAP.put("ENGTP", "工程类别");
ENG_FIELD_MEANING_MAP.put("PRSC", "工程规模");
ENG_FIELD_MEANING_MAP.put("SCRSC", "工程规模(水库库容)");
ENG_FIELD_MEANING_MAP.put("PRGR", "工程等别");
ENG_FIELD_MEANING_MAP.put("FN", "主要功能");
ENG_FIELD_MEANING_MAP.put("BSSSIN", "地震基本烈度");
ENG_FIELD_MEANING_MAP.put("FRSSIN", "设防地震烈度");
ENG_FIELD_MEANING_MAP.put("ADJUST_ENG", "是否调节水库");
ENG_FIELD_MEANING_MAP.put("ISHVBRRG", "有无拦河坝");
ENG_FIELD_MEANING_MAP.put("DVTP", "开发方式");
ENG_FIELD_MEANING_MAP.put("CNTP", "建设类型");
ENG_FIELD_MEANING_MAP.put("DTIN", "数据是否接入");
ENG_FIELD_MEANING_MAP.put("DTIN_TM", "数据接入时间");
ENG_FIELD_MEANING_MAP.put("USFL", "是否启用");
ENG_FIELD_MEANING_MAP.put("MONTH_REPORT", "是否发布月报");
ENG_FIELD_MEANING_MAP.put("TB_WAY", "填报方式");
ENG_FIELD_MEANING_MAP.put("TB_FREQUENCY", "填报频率");
ENG_FIELD_MEANING_MAP.put("RGCP", "调节性能");
ENG_FIELD_MEANING_MAP.put("LGTD", "经度");
ENG_FIELD_MEANING_MAP.put("LTTD", "纬度");
ENG_FIELD_MEANING_MAP.put("ELEV", "高程");
ENG_FIELD_MEANING_MAP.put("STLC", "站址");
ENG_FIELD_MEANING_MAP.put("ORDER_INDEX", "排序");
ENG_FIELD_MEANING_MAP.put("STDSDT", "规划设计日期");
ENG_FIELD_MEANING_MAP.put("PSTSTDT", "计划开工日期");
ENG_FIELD_MEANING_MAP.put("PESSTDT", "计划完工日期");
ENG_FIELD_MEANING_MAP.put("SWDT", "开工日期");
ENG_FIELD_MEANING_MAP.put("JCDT", "建成日期");
ENG_FIELD_MEANING_MAP.put("WDDT", "退役/拆除日期");
ENG_FIELD_MEANING_MAP.put("JLDT", "截流日期");
ENG_FIELD_MEANING_MAP.put("INTRODUCE", "电站简介");
ENG_FIELD_MEANING_MAP.put("LOGO", "电站LOGO");
ENG_FIELD_MEANING_MAP.put("INFFILE", "介绍弹窗图片");
ENG_FIELD_MEANING_MAP.put("DMAT", "坝体材质");
ENG_FIELD_MEANING_MAP.put("DMTP", "坝体类型");
ENG_FIELD_MEANING_MAP.put("MNUN", "管理单位");
ENG_FIELD_MEANING_MAP.put("CMUN", "主管单位");
ENG_FIELD_MEANING_MAP.put("BLSYS", "归属部门");
ENG_FIELD_MEANING_MAP.put("ROLL", "绕经度方向旋转矩阵值");
ENG_FIELD_MEANING_MAP.put("PITCH", "绕纬度方向旋转矩阵值");
ENG_FIELD_MEANING_MAP.put("HEADING", "绕高程方向旋转矩阵值");
ENG_FIELD_MEANING_MAP.put("SCALE", "模型缩放比例");
ENG_FIELD_MEANING_MAP.put("IMPDSTRZ", "是否受下游顶托");
ENG_FIELD_MEANING_MAP.put("PROV", "工程概况");
ENG_FIELD_MEANING_MAP.put("ESTRYDIS", "河口距离");
ENG_FIELD_MEANING_MAP.put("THRSMDAYS", "三同时评价允许误差天数");
ENG_FIELD_MEANING_MAP.put("ZJXYDZ", "直接下游电站");
ENG_FIELD_MEANING_MAP.put("EDTUN", "编制单位");
ENG_FIELD_MEANING_MAP.put("EDTTM", "编制时间");
ENG_FIELD_MEANING_MAP.put("DSNSTT", "勘测设计情况");
ENG_FIELD_MEANING_MAP.put("YSDLEN", "引水道长");
ENG_FIELD_MEANING_MAP.put("DMRKTP", "坝基岩性");
ENG_FIELD_MEANING_MAP.put("HNTJZL", "混凝土浇筑量");
ENG_FIELD_MEANING_MAP.put("GNTP", "容量构成");
ENG_FIELD_MEANING_MAP.put("CNTRAR", "控制流域面积");
ENG_FIELD_MEANING_MAP.put("CNTRSC", "控制面积占全流域比例");
ENG_FIELD_MEANING_MAP.put("AVYRP", "多年平均降水量");
ENG_FIELD_MEANING_MAP.put("AVQ", "多年平均流量");
ENG_FIELD_MEANING_MAP.put("DSAVQ", "电站未建枯水期平均流量");
ENG_FIELD_MEANING_MAP.put("DSMXQ", "设计洪峰流量");
ENG_FIELD_MEANING_MAP.put("CHMXQ", "校核洪峰流量");
ENG_FIELD_MEANING_MAP.put("RVLEN", "河道长度");
ENG_FIELD_MEANING_MAP.put("RVGR", "河道比降");
ENG_FIELD_MEANING_MAP.put("AVW", "多年平均径流量");
ENG_FIELD_MEANING_MAP.put("AVYRQ", "多年平均年径流量");
ENG_FIELD_MEANING_MAP.put("AVSD", "多年平均输沙量");
ENG_FIELD_MEANING_MAP.put("AVS", "多年平均含沙量");
ENG_FIELD_MEANING_MAP.put("MYAVMNAT", "多年平均最低气温");
ENG_FIELD_MEANING_MAP.put("DSW1", "设计一日洪量");
ENG_FIELD_MEANING_MAP.put("DSW3", "设计三日洪量");
ENG_FIELD_MEANING_MAP.put("CHFLDR", "校核洪水历时");
ENG_FIELD_MEANING_MAP.put("CHFLW", "校核洪水总量");
ENG_FIELD_MEANING_MAP.put("CPSC", "库容系数");
ENG_FIELD_MEANING_MAP.put("NRZAR", "正常蓄水位时水库面积");
ENG_FIELD_MEANING_MAP.put("BCKLEN", "水库回水长度");
ENG_FIELD_MEANING_MAP.put("NRAVWT", "天然河流平均水温");
ENG_FIELD_MEANING_MAP.put("NRMXAVWT", "天然河流最高温月份多年平均水温");
ENG_FIELD_MEANING_MAP.put("NRMNAVWT", "天然河流最低温月份多年平均水温");
ENG_FIELD_MEANING_MAP.put("DNAVWT", "建成后坝下平均水温");
ENG_FIELD_MEANING_MAP.put("DNMXAVWT", "建成后坝下最高温月份多年平均水温");
ENG_FIELD_MEANING_MAP.put("DNMNAVWT", "建成后坝下最低温月份多年平均水温");
ENG_FIELD_MEANING_MAP.put("NRUPAR", "坝址以上流域面积");
ENG_FIELD_MEANING_MAP.put("NRAVZ", "坝址天然河流平均水位");
ENG_FIELD_MEANING_MAP.put("NRAVH", "坝址天然河流平均水深");
ENG_FIELD_MEANING_MAP.put("DSNFQFRQ", "设计入库洪水流量");
ENG_FIELD_MEANING_MAP.put("CKFQFQR", "校核入库洪水流量");
ENG_FIELD_MEANING_MAP.put("OBMXW3", "实测最大洪量(三天)");
ENG_FIELD_MEANING_MAP.put("FDCZ", "水库淹没城镇");
ENG_FIELD_MEANING_MAP.put("FDQT", "淹没其它设施");
ENG_FIELD_MEANING_MAP.put("DSTCRVR", "距河源距离");
ENG_FIELD_MEANING_MAP.put("CKW3", "校核洪量(三天)");
ENG_FIELD_MEANING_MAP.put("FSLTDZ", "防洪限制水位");
ENG_FIELD_MEANING_MAP.put("RSTP", "资源类别");
ENG_FIELD_MEANING_MAP.put("ADJCPS", "调节库容单独");
ENG_FIELD_MEANING_MAP.put("ADJCPM", "调节库容联合");
ENG_FIELD_MEANING_MAP.put("YRGEB", "已正建规模装机容量");
ENG_FIELD_MEANING_MAP.put("TTPWRB", "已正建规模年发电量");
ENG_FIELD_MEANING_MAP.put("DMCREL", "坝顶高程");
ENG_FIELD_MEANING_MAP.put("WSC", "水量利用系数");
ENG_FIELD_MEANING_MAP.put("MXDMHG", "最大坝高");
ENG_FIELD_MEANING_MAP.put("MXDMHGL", "最大坝高(左)");
ENG_FIELD_MEANING_MAP.put("MXDMHGR", "最大坝高(右)");
ENG_FIELD_MEANING_MAP.put("WVTPEL", "防浪墙顶高程");
}
private static final Map<String, String> ENG_CODE_NAME_FIELD_MAP = new LinkedHashMap<>();
private static final Set<String> ENG_NAME_COLUMNS = new HashSet<>();
static {
ENG_CODE_NAME_FIELD_MAP.put("BASE_ID", "BASE_NAME");
ENG_CODE_NAME_FIELD_MAP.put("HBRVCD", "HBRVCD_NAME");
ENG_CODE_NAME_FIELD_MAP.put("RVCD", "RVCD_NAME");
ENG_CODE_NAME_FIELD_MAP.put("ADDVCD", "ADDVCD_NAME");
ENG_CODE_NAME_FIELD_MAP.put("COUNTRY", "COUNTRY_NAME");
ENG_CODE_NAME_FIELD_MAP.put("HYCD", "HYNM");
ENG_CODE_NAME_FIELD_MAP.put("TOP_HYCD", "TOP_HYNM");
ENG_CODE_NAME_FIELD_MAP.put("REACHCD", "REACHCD_NAME");
ENG_NAME_COLUMNS.addAll(ENG_CODE_NAME_FIELD_MAP.values());
}
@Resource
@ -66,17 +192,28 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService {
msOperationLogMapper.insert(mainLog);
List<MsOperationLogDetail> details = new ArrayList<>();
Set<String> processedColumns = new HashSet<>();
for (Field field : SdEngInfoBH.class.getDeclaredFields()) {
if (shouldSkipField(field)) {
continue;
}
field.setAccessible(true);
String columnName = resolveColumnName(field);
if (ENG_NAME_COLUMNS.contains(columnName) || processedColumns.contains(columnName)) {
continue;
}
Object newValue = getFieldValue(field, engInfo);
if (newValue == null) {
continue;
}
details.add(buildDetail(mainLog.getId(), engInfo.getStcd(), resolveColumnName(field),
null, newValue, "新增字段值"));
String nameColumn = ENG_CODE_NAME_FIELD_MAP.get(columnName);
Object newNameValue = StrUtil.isBlank(nameColumn) ? newValue : getColumnValue(engInfo, nameColumn);
details.add(buildDetail(mainLog.getId(), engInfo.getStcd(), columnName,
null, null, newValue, newNameValue, "新增字段值"));
processedColumns.add(columnName);
if (StrUtil.isNotBlank(nameColumn)) {
processedColumns.add(nameColumn);
}
}
batchInsertDetails(details);
}
@ -93,18 +230,30 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService {
msOperationLogMapper.insert(mainLog);
List<MsOperationLogDetail> details = new ArrayList<>();
Set<String> processedColumns = new HashSet<>();
for (Field field : SdEngInfoBH.class.getDeclaredFields()) {
if (shouldSkipField(field)) {
continue;
}
field.setAccessible(true);
Object oldValue = getFieldValue(field, before);
Object newValue = getFieldValue(field, after);
if (equalsValue(oldValue, newValue)) {
String columnName = resolveColumnName(field);
if (ENG_NAME_COLUMNS.contains(columnName) || processedColumns.contains(columnName)) {
continue;
}
details.add(buildDetail(mainLog.getId(), after.getStcd(), resolveColumnName(field),
oldValue, newValue, "修改字段值"));
Object oldValue = getFieldValue(field, before);
Object newValue = getFieldValue(field, after);
String nameColumn = ENG_CODE_NAME_FIELD_MAP.get(columnName);
Object oldNameValue = StrUtil.isBlank(nameColumn) ? oldValue : getColumnValue(before, nameColumn);
Object newNameValue = StrUtil.isBlank(nameColumn) ? newValue : getColumnValue(after, nameColumn);
if (equalsValue(oldValue, newValue) && equalsValue(oldNameValue, newNameValue)) {
continue;
}
details.add(buildDetail(mainLog.getId(), after.getStcd(), columnName,
oldValue, oldNameValue, newValue, newNameValue, "修改字段值"));
processedColumns.add(columnName);
if (StrUtil.isNotBlank(nameColumn)) {
processedColumns.add(nameColumn);
}
}
batchInsertDetails(details);
}
@ -121,8 +270,10 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService {
private MsOperationLogDetail buildDetail(String mainId,
String stationCode,
String fieldCode,
Object oldValue,
Object newValue,
Object oldValueCode,
Object oldValueName,
Object newValueCode,
Object newValueName,
String remark) {
MsOperationLogDetail detail = new MsOperationLogDetail();
detail.setMainId(mainId);
@ -130,10 +281,10 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService {
detail.setStationCode(stationCode);
detail.setFieldCode(fieldCode);
detail.setFieldMeaning(ENG_FIELD_MEANING_MAP.getOrDefault(fieldCode, fieldCode));
detail.setOldValueCode(formatValue(oldValue));
detail.setOldValueName(formatValue(oldValue));
detail.setNewValueCode(formatValue(newValue));
detail.setNewValueName(formatValue(newValue));
detail.setOldValueCode(formatValue(oldValueCode));
detail.setOldValueName(formatValue(oldValueName));
detail.setNewValueCode(formatValue(newValueCode));
detail.setNewValueName(formatValue(newValueName));
detail.setRemark(remark);
return detail;
}
@ -173,6 +324,22 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService {
}
}
private Object getColumnValue(Object target, String columnName) {
if (target == null || StrUtil.isBlank(columnName)) {
return null;
}
for (Field field : SdEngInfoBH.class.getDeclaredFields()) {
if (shouldSkipField(field)) {
continue;
}
field.setAccessible(true);
if (StrUtil.equals(resolveColumnName(field), columnName)) {
return getFieldValue(field, target);
}
}
return null;
}
private boolean equalsValue(Object oldValue, Object newValue) {
return StrUtil.equals(formatValue(oldValue), formatValue(newValue));
}

View File

@ -203,6 +203,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
@Override
@Transactional(rollbackFor = Exception.class)
public boolean addEngInfo(SdEngInfoBH engInfo, String source) {
fillRelatedNameFields(engInfo);
boolean result = this.save(engInfo);
if (result) {
msOperationLogService.recordEngAddLog(engInfo, source);
@ -219,13 +220,131 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
@Transactional(rollbackFor = Exception.class)
public boolean updateEngInfo(SdEngInfoBH engInfo, String source) {
SdEngInfoBH before = engInfo == null ? null : this.getById(engInfo.getStcd());
boolean result = this.updateById(engInfo);
SdEngInfoBH after = before == null ? engInfo : BeanUtil.copyProperties(before, SdEngInfoBH.class);
if (after != null) {
BeanUtil.copyProperties(engInfo, after, CopyOptions.create().ignoreNullValue());
fillRelatedNameFields(after);
}
boolean result = this.updateById(after);
if (result && before != null) {
msOperationLogService.recordEngUpdateLog(before, engInfo, source);
msOperationLogService.recordEngUpdateLog(before, after, source);
}
return result;
}
private void fillRelatedNameFields(SdEngInfoBH engInfo) {
if (engInfo == null) {
return;
}
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("baseId", engInfo.getBaseId());
paramMap.put("hbrvcd", engInfo.getHbrvcd());
paramMap.put("rvcd", engInfo.getRvcd());
paramMap.put("addvcd", engInfo.getAddvcd());
paramMap.put("country", engInfo.getCountry());
paramMap.put("hycd", engInfo.getHycd());
paramMap.put("topHycd", engInfo.getTopHycd());
paramMap.put("reachcd", engInfo.getReachcd());
Map<String, Object> row = microservicDynamicSQLMapper.getOneBySql(buildEngRelatedNameSql(paramMap), paramMap);
engInfo.setBaseName(resolveRelatedName(engInfo.getBaseId(), row, "BASENAME"));
engInfo.setHbrvcdName(resolveRelatedName(engInfo.getHbrvcd(), row, "HBRVNM"));
engInfo.setRvcdName(resolveRelatedName(engInfo.getRvcd(), row, "RVNM"));
engInfo.setAddvcdName(resolveRelatedName(engInfo.getAddvcd(), row, "ADDVNM"));
engInfo.setCountryName(resolveRelatedName(engInfo.getCountry(), row, "COUNTRY_NAME"));
engInfo.setHynm(resolveRelatedName(engInfo.getHycd(), row, "HYNM"));
engInfo.setTopHynm(resolveRelatedName(engInfo.getTopHycd(), row, "TOP_HYNM"));
engInfo.setReachcdName(resolveRelatedName(engInfo.getReachcd(), row, "REACHCD_NAME"));
}
private String buildEngRelatedNameSql(Map<String, Object> paramMap) {
StringBuilder sql = new StringBuilder("SELECT ");
sql.append(buildScalarNameSelect(
StringUtils.hasText((String) paramMap.get("baseId")),
"(SELECT hb.BASENAME FROM SD_HYDROBASE hb WHERE hb.BASEID = #{map.baseId} AND NVL(hb.IS_DELETED, 0) = 0 AND ROWNUM = 1)",
"BASENAME"
));
sql.append(", ");
sql.append(buildHbrvNameSelect(paramMap));
sql.append(", ");
sql.append(buildScalarNameSelect(
StringUtils.hasText((String) paramMap.get("rvcd")),
"(SELECT rv.RVNM FROM SD_RVCD_DIC rv WHERE rv.RVCD = #{map.rvcd} AND ROWNUM = 1)",
"RVNM"
));
sql.append(", ");
sql.append(buildScalarNameSelect(
StringUtils.hasText((String) paramMap.get("addvcd")),
"(SELECT addv.ADDVNM FROM SD_ADDVCD_DIC addv WHERE addv.ADDVCD = #{map.addvcd} AND ROWNUM = 1)",
"ADDVNM"
));
sql.append(", ");
sql.append(buildScalarNameSelect(
StringUtils.hasText((String) paramMap.get("country")),
"(SELECT country.COUNTRY_NAME FROM SD_COUNTRY_B country WHERE country.COUNTRY_ID = #{map.country} " +
"AND NVL(country.ENABLED, 1) = 1 AND ROWNUM = 1)",
"COUNTRY_NAME"
));
sql.append(", ");
sql.append(buildScalarNameSelect(
StringUtils.hasText((String) paramMap.get("hycd")),
"(SELECT hy.HYNM FROM SD_HYCD_DIC hy WHERE hy.HYCD = #{map.hycd} " +
"AND NVL(hy.IS_DELETED, 0) = 0 AND NVL(hy.ENABLED, 1) = 1 AND ROWNUM = 1)",
"HYNM"
));
sql.append(", ");
sql.append(buildScalarNameSelect(
StringUtils.hasText((String) paramMap.get("topHycd")),
"(SELECT hy.HYNM FROM SD_HYCD_DIC hy WHERE hy.HYCD = #{map.topHycd} " +
"AND NVL(hy.IS_DELETED, 0) = 0 AND NVL(hy.ENABLED, 1) = 1 AND ROWNUM = 1)",
"TOP_HYNM"
));
sql.append(", ");
sql.append(buildScalarNameSelect(
StringUtils.hasText((String) paramMap.get("reachcd")),
"(SELECT rv.RVNM FROM SD_RVCD_DIC rv WHERE rv.RVCD = #{map.reachcd} AND ROWNUM = 1)",
"REACHCD_NAME"
));
sql.append(" FROM DUAL");
return sql.toString();
}
private String buildHbrvNameSelect(Map<String, Object> paramMap) {
if (!StringUtils.hasText((String) paramMap.get("hbrvcd"))) {
return "NULL AS HBRVNM";
}
StringBuilder sql = new StringBuilder("(SELECT hbrv.HBRVNM FROM SD_HBRV_DIC hbrv WHERE hbrv.HBRVCD = #{map.hbrvcd} ");
if (StringUtils.hasText((String) paramMap.get("baseId"))) {
sql.append("AND hbrv.BASEID = #{map.baseId} ");
}
sql.append("AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 AND ROWNUM = 1) AS HBRVNM");
return sql.toString();
}
private String buildScalarNameSelect(boolean hasText, String querySql, String alias) {
if (!hasText) {
return "NULL AS " + alias;
}
return querySql + " AS " + alias;
}
private String resolveRelatedName(String code, Map<String, Object> row, String column) {
if (code == null) {
return null;
}
if (code.isBlank()) {
return "";
}
if (row == null) {
return null;
}
Object value = row.get(column);
if (value == null) {
value = row.get(column.toLowerCase());
}
return value == null ? null : String.valueOf(value);
}
@Override
public boolean deleteEngInfo(String stcd) {
return this.update( new LambdaUpdateWrapper<SdEngInfoBH>().eq(SdEngInfoBH::getStcd, stcd).set(SdEngInfoBH::getIsDeleted, 1));