public static class UIRecordConverter { public static bool AsBool(IUIRecord uiRecord, string columnName); public static bool AsBool(IUIRecord uiRecord, string columnName, bool defaultValue); public static DateTime AsDateTime(IUIRecord uiRecord, string columnName, DateTime defaultValue); public static DateTime AsDateTime(IUIRecord uiRecord, string columnName); public static decimal AsDecimal(IUIRecord uiRecord, string columnName); public static decimal AsDecimal(IUIRecord uiRecord, string columnName, decimal defaultValue); public static int AsInt(IUIRecord uiRecord, string columnName, int defaultValue); public static int AsInt(IUIRecord uiRecord, string columnName); public static long AsLong(IUIRecord uiRecord, string columnName); public static long AsLong(IUIRecord uiRecord, string columnName, long defaultValue); public static bool? AsNullableBool(IUIRecord uiRecord, string columnName); public static DateTime? AsNullableDateTime(IUIRecord uiRecord, string columnName); public static decimal? AsNullableDecimal(IUIRecord uiRecord, string columnName); public static int? AsNullableInt(IUIRecord uiRecord, string columnName); public static long? AsNullableLong(IUIRecord uiRecord, string columnName); public static string AsNullableString(IUIRecord uiRecord, string columnName); public static string AsString(IUIRecord uiRecord, string columnName); public static string AsString(IUIRecord uiRecord, string columnName, string defaultValue); }
时间: 2023-02-09 13:51:43 浏览: 203
这是一个用于从 IUIRecord 对象中提取数据的静态类。该类包含若干方法,每个方法都接受 IUIRecord 对象和列名作为参数,并返回指定类型的值。例如,AsBool 方法可以提取 IUIRecord 对象中指定列名的布尔值,AsInt 方法可以提取 IUIRecord 对象中指定列名的整数值。所有这些方法都有两个重载版本,一个带有默认值参数,一个没有默认值参数。如果 IUIRecord 对象中不存在指定的列名,或者该列的值不能转换为指定的类型,则使用默认值版本的方法将返回默认值,而不使用默认值版本的方法将抛出异常。这个类还包含一些 AsNullable* 类型的方法,这些方法可以提取 IUIRecord 对象中指定列名的可空类型的值。
相关问题
private static Dictionary<string, int> GenerateFieldColumnMapping(List<FieldTitleMapping> attrs, Worksheet worksheet) { var propColumnIndexDict = new Dictionary<string, int>(); try { var importExcelTitleRow = worksheet.Cells.Rows[0]; if (importExcelTitleRow[0].IsMerged) { importExcelTitleRow = worksheet.Cells.Rows[1]; } var titleRowEnumerator = attrs.GetEnumerator(); var rowEnumerator = importExcelTitleRow.GetEnumerator(); while (titleRowEnumerator.MoveNext()) { var currentConfigField = titleRowEnumerator.Current; bool isGetMapperSuccess = false; var columIndex = 0; while (rowEnumerator.MoveNext()) { var currentCell = rowEnumerator.Current as Cell; if (!string.IsNullOrEmpty(currentCell.StringValue)) { var curTitleI18nName = currentConfigField.FieldAttribute.TitleKey.Trim(); if (curTitleI18nName.Equals(RemoveBadgeOfTitle(currentCell.StringValue), StringComparison.OrdinalIgnoreCase)) { propColumnIndexDict.Add(currentConfigField.FieldName, columIndex); isGetMapperSuccess = true; break; } } columIndex++; } if (!isGetMapperSuccess) { //propColumnIndexDict.Clear(); //return propColumnIndexDict; } rowEnumerator.Reset(); } } catch (Exception ex) { propColumnIndexDict.Clear(); } return propColumnIndexDict; } 优化这段代码
这段代码的主要问题在于它包含了多个嵌套的循环,导致时间复杂度很高,需要进行优化。以下是优化建议:
1. 将循环中的逻辑提取出来,减少循环嵌套。可以将获取标题行的逻辑提取到一个方法中,避免每次循环都去获取一遍,同时也可以将获取当前单元格的逻辑提取到一个方法中。
2. 在获取标题行后,将标题行转换为一个字典,将列名作为 key,列索引作为 value。这样在后面的循环中,就可以直接通过列名获取列索引,而不需要再次遍历标题行。
3. 在内层循环中,可以通过使用 LINQ 的 FirstOrDefault 方法,来查找第一个满足条件的单元格,而不需要使用循环遍历。这样可以大大减少时间复杂度。
4. 对于异常的处理,可以考虑将异常抛出,而不是在方法中直接清空字典。这样可以将异常的处理交给上层调用者来处理,也可以更好地定位问题。
优化后的代码如下:
```
private static Dictionary<string, int> GenerateFieldColumnMapping(List<FieldTitleMapping> attrs, Worksheet worksheet)
{
var propColumnIndexDict = new Dictionary<string, int>();
try
{
var titleRow = GetTitleRow(worksheet);
var titleDict = titleRow.Cells.Select((cell, index) => new { cell.StringValue, index })
.Where(x => !string.IsNullOrEmpty(x.StringValue))
.ToDictionary(x => RemoveBadgeOfTitle(x.StringValue), x => x.index);
foreach (var configField in attrs)
{
var titleKey = configField.FieldAttribute.TitleKey.Trim();
if (titleDict.TryGetValue(titleKey, out int columnIndex))
{
propColumnIndexDict.Add(configField.FieldName, columnIndex);
}
else
{
// 如果找不到对应的列,可以考虑抛出异常,而不是清空字典
throw new Exception($"无法找到列名为 \"{titleKey}\" 的列");
}
}
}
catch (Exception ex)
{
// 异常的处理,可以考虑将异常抛出,而不是在方法中直接清空字典
throw ex;
}
return propColumnIndexDict;
}
private static Row GetTitleRow(Worksheet worksheet)
{
var titleRow = worksheet.Cells.Rows[0];
if (titleRow[0].IsMerged)
{
titleRow = worksheet.Cells.Rows[1];
}
return titleRow;
}
private static Cell GetCurrentCell(IEnumerator enumerator)
{
if (enumerator.MoveNext())
{
return enumerator.Current as Cell;
}
return null;
}
private static string RemoveBadgeOfTitle(string title)
{
// 去掉标题中的徽章,例如:(必填)
return Regex.Replace(title, @"\((.*?)\)", "").Trim();
}
```
public static function fetchRefundOrderProducts(int $order_id) { $tmp_pro = self::find()->select('img_url,product_name,buy_number as refund_number,properties,is_gift,product_id,price,parts_ids')->where(['order_id' => $order_id])->indexBy('product_id')->asArray()->all(); foreach ($tmp_pro as $ktp => &$vtp) { $vtp['url_code'] = $service->idToCode($vtp['product_id']); $tmp_pro[$ktp]['gifts'] = []; if ($vtp['is_gift']) { $tmp_pro[$vtp['is_gift']]['gifts'][] = $vtp; unset($tmp_pro[$ktp]); } } $result = array_values($tmp_pro); return $result; } 用go改写
请注意,由于Go语言没有类似于PHP的Active Record模式,因此需要使用其他方式进行数据库查询和操作。下面是一个参考的Go语言实现,使用了GORM库进行数据库查询和ORM映射:
```
import (
"github.com/jinzhu/gorm"
)
type Product struct {
ImgUrl string `gorm:"column:img_url"`
ProductName string `gorm:"column:product_name"`
RefundNumber int `gorm:"column:buy_number"`
Properties string `gorm:"column:properties"`
IsGift bool `gorm:"column:is_gift"`
ProductId int `gorm:"column:product_id;primary_key"`
Price float64 `gorm:"column:price"`
PartsIds string `gorm:"column:parts_ids"`
}
func FetchRefundOrderProducts(orderId int) ([]Product, error) {
db, err := gorm.Open("mysql", "user:password@tcp(localhost:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
return nil, err
}
defer db.Close()
var products []Product
db.Where("order_id = ?", orderId).Find(&products)
service := NewService() // 假设已经实现了idToCode()方法
for i, p := range products {
products[i].UrlCode = service.IdToCode(p.ProductId)
}
result := []Product{}
for _, p := range products {
if p.IsGift {
for i, q := range products {
if q.ProductId == p.IsGift {
products[i].Gifts = append(products[i].Gifts, p)
break
}
}
} else {
result = append(result, p)
}
}
return result, nil
}
```
说明:
1. 定义了Product结构体,包含了查询结果中需要的字段。注意,结构体的字段名需要与数据库表中的列名相对应。
2. 定义了FetchRefundOrderProducts()函数,接受一个订单ID作为参数,返回查询结果数组和可能的错误。
3. 在函数中,首先使用gorm.Open()方法连接数据库,并通过db.Where().Find()方法查询指定订单的退款商品信息。
4. 遍历查询结果,对于每个商品信息:
- 通过idToCode()方法将商品ID转换为URL编码。
- 如果商品是赠品,则将其添加到对应主商品的gifts属性中。
5. 根据查询结果中是否是赠品,将商品信息分别添加到最终结果集中或从结果集中删除。
6. 返回最终结果集和可能的错误。
请根据实际需要进行调整和修改。
阅读全文