diff --git a/controller/meter04kv.go b/controller/meter04kv.go index 3135bb2..3360225 100644 --- a/controller/meter04kv.go +++ b/controller/meter04kv.go @@ -6,6 +6,7 @@ import ( "electricity_bill_calc/response" "electricity_bill_calc/security" "electricity_bill_calc/service" + "electricity_bill_calc/utils" "fmt" "log" "net/http" @@ -261,6 +262,21 @@ func batchImport04kVMeterArchive(c *gin.Context) { result.Json(http.StatusNotAcceptable, "上传的表计档案文件存在错误。", gin.H{"errors": errs}) return } - log.Printf("[controller|debug] records: %+v", records) - result.Failure(http.StatusNotAcceptable, "调试中") + + mergedMeters := utils.Map(records, func(meter model.Meter04KV) model.Meter04KV { + meter.ParkId = requestParkId + meter.Enabled = true + return meter + }) + errs = service.Meter04kVService.DuplicateMeterCodeValidate(mergedMeters) + if len(errs) > 0 { + result.Json(http.StatusNotAcceptable, "上传的表计档案文件存在错误。", gin.H{"errors": errs}) + return + } + err = service.Meter04kVService.BatchCreateMeter(mergedMeters) + if err != nil { + result.Error(http.StatusInternalServerError, err.Error()) + return + } + result.Json(http.StatusOK, "上传的表计档案已经全部导入。", gin.H{"errors": make([]excel.ExcelAnalysisError, 0)}) } diff --git a/service/meter04kv.go b/service/meter04kv.go index 6b8f1d0..e38bd73 100644 --- a/service/meter04kv.go +++ b/service/meter04kv.go @@ -2,8 +2,10 @@ package service import ( "electricity_bill_calc/config" + "electricity_bill_calc/excel" "electricity_bill_calc/global" "electricity_bill_calc/model" + "fmt" "xorm.io/builder" "xorm.io/xorm" @@ -105,3 +107,36 @@ func (m _Meter04kVService) UpdateSingleMeter(meter *model.Meter04KV) error { } return nil } + +func (_Meter04kVService) DuplicateMeterCodeValidate(meters []model.Meter04KV) []excel.ExcelAnalysisError { + errs := make([]excel.ExcelAnalysisError, 0) + for i := 0; i < len(meters); i++ { + for j := i + 1; j < len(meters); j++ { + if meters[j].Code == meters[i].Code { + errs = append(errs, excel.ExcelAnalysisError{Row: j + 1, Col: 0, Err: excel.AnalysisError{Err: fmt.Errorf("第 %d 行表计表号与第 %d 行表计表号重复!", j+1, i+1)}}) + } + } + } + return errs +} + +func (m _Meter04kVService) BatchCreateMeter(meters []model.Meter04KV) error { + tx := global.DBConn.NewSession() + if err := tx.Begin(); err != nil { + return err + } + defer tx.Close() + + for _, meter := range meters { + err := m.insertNewMeter(tx, meter) + if err != nil { + return err + } + } + err := tx.Commit() + if err != nil { + tx.Rollback() + return err + } + return nil +}