作者 yangfu

增加设备档案导入功能

@@ -3,12 +3,14 @@ package service @@ -3,12 +3,14 @@ package service
3 import ( 3 import (
4 "fmt" 4 "fmt"
5 "github.com/linmadan/egglib-go/core/application" 5 "github.com/linmadan/egglib-go/core/application"
  6 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
6 "github.com/linmadan/egglib-go/utils/tool_funs" 7 "github.com/linmadan/egglib-go/utils/tool_funs"
7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/command" 8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/command"
8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/dto" 9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/dto"
9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/query" 10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/query"
10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory" 11 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
11 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" 12 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  13 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
12 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" 14 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
13 "time" 15 "time"
14 ) 16 )
@@ -287,6 +289,33 @@ func (deviceService *DeviceService) SearchDevice(operateInfo *domain.OperateInfo @@ -287,6 +289,33 @@ func (deviceService *DeviceService) SearchDevice(operateInfo *domain.OperateInfo
287 return count, result, nil 289 return count, result, nil
288 } 290 }
289 291
  292 +// 批量添加产品服务
  293 +func (deviceService *DeviceService) BatchAddProduct(opt *domain.OperateInfo, list []*domain.ImportDeviceItem) ([]interface{}, error) {
  294 + transactionContext, err := factory.CreateTransactionContext(nil)
  295 + if err != nil {
  296 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  297 + }
  298 + if err := transactionContext.StartTransaction(); err != nil {
  299 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  300 + }
  301 + defer func() {
  302 + transactionContext.RollbackTransaction()
  303 + }()
  304 +
  305 + batchAddProductService, _ := domainService.NewPGBatchAddDeviceService(transactionContext.(*pgTransaction.TransactionContext))
  306 + var failRows []interface{}
  307 + if failRows, err = batchAddProductService.BatchAddDevice(opt, list); err != nil {
  308 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  309 + }
  310 + if len(failRows) != 0 {
  311 + return failRows, nil //有错误行,回滚
  312 + }
  313 + if err := transactionContext.CommitTransaction(); err != nil {
  314 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  315 + }
  316 + return failRows, nil
  317 +}
  318 +
290 func NewDeviceService(options map[string]interface{}) *DeviceService { 319 func NewDeviceService(options map[string]interface{}) *DeviceService {
291 newDeviceService := &DeviceService{} 320 newDeviceService := &DeviceService{}
292 return newDeviceService 321 return newDeviceService
@@ -292,7 +292,7 @@ func (productService *ProductService) BatchAddProduct(opt *domain.OperateInfo, l @@ -292,7 +292,7 @@ func (productService *ProductService) BatchAddProduct(opt *domain.OperateInfo, l
292 292
293 batchAddProductService, _ := domainService.NewPGBatchAddProductService(transactionContext.(*pgTransaction.TransactionContext)) 293 batchAddProductService, _ := domainService.NewPGBatchAddProductService(transactionContext.(*pgTransaction.TransactionContext))
294 var failRows []interface{} 294 var failRows []interface{}
295 - if failRows, err = batchAddProductService.BatchAddProduct(opt, list); err != nil { 295 + if failRows, err = batchAddProductService.BatchAddProduct(opt, list, false); err != nil {
296 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 296 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
297 } 297 }
298 if len(failRows) != 0 { 298 if len(failRows) != 0 {
@@ -18,6 +18,19 @@ const ( @@ -18,6 +18,19 @@ const (
18 DeviceStatusScrapped = 3 // 3:报废 18 DeviceStatusScrapped = 3 // 3:报废
19 ) 19 )
20 20
  21 +var (
  22 + mapRiskLevel = map[string]int{
  23 + "高": RiskLevelHigh,
  24 + "中": RiskLevelMiddle,
  25 + "低": RiskLevelLow,
  26 + }
  27 + mapDeviceStatus = map[string]int{
  28 + "正常": DeviceStatusNormal,
  29 + "封存": DeviceStatusArchive,
  30 + "报废": DeviceStatusScrapped,
  31 + }
  32 +)
  33 +
21 // 设备 34 // 设备
22 type Device struct { 35 type Device struct {
23 // 设备Id 36 // 设备Id
@@ -99,3 +112,60 @@ func (device *Device) Valid() error { @@ -99,3 +112,60 @@ func (device *Device) Valid() error {
99 } 112 }
100 return nil 113 return nil
101 } 114 }
  115 +
  116 +// 导入设备数据体
  117 +type ImportDeviceItem struct {
  118 + // 设备编号
  119 + DeviceCode string `json:"deviceCode,omitempty"`
  120 + // 设备名称
  121 + DeviceName string `json:"deviceName,omitempty"`
  122 + // 设备型号
  123 + DeviceModel string `json:"deviceModel,omitempty"`
  124 + // 设备类型
  125 + DeviceType string `json:"deviceType,omitempty"`
  126 + // 品牌
  127 + Brand string `json:"brand,omitempty"`
  128 + // 设备状态 1:正常 2:封存 3:报废
  129 + Status string `json:"status,omitempty"`
  130 + // 风险等级 1:高 2:中 3:低
  131 + Level string `json:"level,omitempty"`
  132 + // 失败理由
  133 + FailReason string `json:"failReason"`
  134 +
  135 + // 设备状态 1:正常 2:封存 3:报废
  136 + DeviceStatus int `json:"-"`
  137 + // 风险等级 1:高 2:中 3:低
  138 + RiskLevel int `json:"-"`
  139 +}
  140 +
  141 +func (item *ImportDeviceItem) Valid() error {
  142 + if len(item.DeviceCode) == 0 {
  143 + return fmt.Errorf("设备编号不能为空")
  144 + }
  145 + if len(item.DeviceName) == 0 {
  146 + return fmt.Errorf("设备名称不能为空")
  147 + }
  148 + if len(item.DeviceModel) == 0 {
  149 + return fmt.Errorf("设备型号不能为空")
  150 + }
  151 + if len(item.DeviceType) == 0 {
  152 + return fmt.Errorf("设备类型不能为空")
  153 + }
  154 + if len(item.Status) == 0 {
  155 + return fmt.Errorf("设备状态不能为空")
  156 + }
  157 + if len(item.Level) == 0 {
  158 + return fmt.Errorf("风险等级不能为空")
  159 + }
  160 + if v, ok := mapDeviceStatus[item.Status]; !ok {
  161 + return fmt.Errorf("设备状态格式有误")
  162 + } else {
  163 + item.DeviceStatus = v
  164 + }
  165 + if v, ok := mapRiskLevel[item.Level]; !ok {
  166 + return fmt.Errorf("风险等级格式有误")
  167 + } else {
  168 + item.RiskLevel = v
  169 + }
  170 + return nil
  171 +}
@@ -54,9 +54,9 @@ func (product *Product) Update(data map[string]interface{}) error { @@ -54,9 +54,9 @@ func (product *Product) Update(data map[string]interface{}) error {
54 if productCategory, ok := data["productCategory"]; ok { 54 if productCategory, ok := data["productCategory"]; ok {
55 product.ProductCategory = productCategory.(string) 55 product.ProductCategory = productCategory.(string)
56 } 56 }
57 - //if quantity, ok := data["quantity"]; ok {  
58 - // product.ProductSpec.Quantity = quantity.(float64)  
59 - //} 57 + if product.ProductSpec == nil {
  58 + product.ProductSpec = &UnitQuantity{}
  59 + }
60 if unit, ok := data["unit"]; ok { 60 if unit, ok := data["unit"]; ok {
61 product.ProductSpec.Unit = unit.(string) 61 product.ProductSpec.Unit = unit.(string)
62 } 62 }
  1 +package domainService
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/linmadan/egglib-go/core/application"
  6 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  10 + "time"
  11 +)
  12 +
  13 +type PGBatchAddDeviceService struct {
  14 + transactionContext *pgTransaction.TransactionContext
  15 +}
  16 +
  17 +func (ptr *PGBatchAddDeviceService) BatchAddDevice(opt *domain.OperateInfo, list []*domain.ImportDeviceItem) ([]interface{}, error) {
  18 + var failRows = make([]interface{}, 0)
  19 +
  20 + deviceRepository, _ := repository.NewDeviceRepository(ptr.transactionContext)
  21 + _, devices, _ := deviceRepository.Find(map[string]interface{}{"companyId": opt.CompanyId, "orgId": opt.OrgId})
  22 + var mapProduct = make(map[string]*domain.Device)
  23 + for i := range devices {
  24 + mapProduct[devices[i].DeviceCode] = devices[i]
  25 + }
  26 +
  27 + for i := range list {
  28 + item := list[i]
  29 + if err := item.Valid(); err != nil {
  30 + item.FailReason = err.Error()
  31 + failRows = append(failRows, item)
  32 + continue
  33 + }
  34 + newItem := &domain.Device{
  35 + CompanyId: opt.CompanyId,
  36 + OrgId: opt.OrgId,
  37 + DeviceCode: item.DeviceCode,
  38 + DeviceName: item.DeviceName,
  39 + DeviceModel: item.DeviceCode,
  40 + DeviceType: item.DeviceType,
  41 + Brand: item.Brand,
  42 + DeviceStatus: item.DeviceStatus,
  43 + RiskLevel: item.RiskLevel,
  44 + CreatedAt: time.Now(),
  45 + UpdatedAt: time.Now(),
  46 + WorkStation: &domain.WorkStation{},
  47 + }
  48 + if _, ok := mapProduct[newItem.DeviceCode]; !ok {
  49 + mapProduct[newItem.DeviceCode] = newItem
  50 + } else {
  51 + item.FailReason = "导入的设备编号已存在"
  52 + failRows = append(failRows, item)
  53 + continue
  54 + }
  55 + if _, err := deviceRepository.Save(newItem); err != nil {
  56 + log.Logger.Error(err.Error())
  57 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "服务器异常")
  58 + }
  59 + }
  60 +
  61 + return failRows, nil
  62 +}
  63 +
  64 +func NewPGBatchAddDeviceService(transactionContext *pgTransaction.TransactionContext) (*PGBatchAddDeviceService, error) {
  65 + if transactionContext == nil {
  66 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  67 + } else {
  68 + return &PGBatchAddDeviceService{
  69 + transactionContext: transactionContext,
  70 + }, nil
  71 + }
  72 +}
@@ -4,6 +4,7 @@ import ( @@ -4,6 +4,7 @@ import (
4 "fmt" 4 "fmt"
5 "github.com/linmadan/egglib-go/core/application" 5 "github.com/linmadan/egglib-go/core/application"
6 pgTransaction "github.com/linmadan/egglib-go/transaction/pg" 6 pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  7 + "github.com/linmadan/egglib-go/utils/tool_funs"
7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" 8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis" 9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis"
9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" 10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository"
@@ -16,7 +17,10 @@ type PGBatchAddProductService struct { @@ -16,7 +17,10 @@ type PGBatchAddProductService struct {
16 transactionContext *pgTransaction.TransactionContext 17 transactionContext *pgTransaction.TransactionContext
17 } 18 }
18 19
19 -func (ptr *PGBatchAddProductService) BatchAddProduct(opt *domain.OperateInfo, list []*domain.ImportProductItem) ([]interface{}, error) { 20 +// BatchAddProduct 批量添加产品
  21 +
  22 +// replaceOld true:已存在的做更新操作
  23 +func (ptr *PGBatchAddProductService) BatchAddProduct(opt *domain.OperateInfo, list []*domain.ImportProductItem, replaceOld bool) ([]interface{}, error) {
20 var failRows = make([]interface{}, 0) 24 var failRows = make([]interface{}, 0)
21 25
22 productRepository, _ := repository.NewProductRepository(ptr.transactionContext) 26 productRepository, _ := repository.NewProductRepository(ptr.transactionContext)
@@ -48,6 +52,15 @@ func (ptr *PGBatchAddProductService) BatchAddProduct(opt *domain.OperateInfo, li @@ -48,6 +52,15 @@ func (ptr *PGBatchAddProductService) BatchAddProduct(opt *domain.OperateInfo, li
48 CreatedAt: time.Now(), 52 CreatedAt: time.Now(),
49 UpdatedAt: time.Now(), 53 UpdatedAt: time.Now(),
50 } 54 }
  55 + // 存在旧数据->>覆盖
  56 + if replaceOld {
  57 + if old, ok := mapProduct[newItem.ProductCode]; ok {
  58 + if err := ptr.updateProduct(opt, item, old); err != nil {
  59 + return failRows, err
  60 + }
  61 + continue
  62 + }
  63 + }
51 if len(newItem.ProductCode) == 0 { 64 if len(newItem.ProductCode) == 0 {
52 code, err := redis.GenCode(generator) 65 code, err := redis.GenCode(generator)
53 if err != nil { 66 if err != nil {
@@ -72,6 +85,18 @@ func (ptr *PGBatchAddProductService) BatchAddProduct(opt *domain.OperateInfo, li @@ -72,6 +85,18 @@ func (ptr *PGBatchAddProductService) BatchAddProduct(opt *domain.OperateInfo, li
72 return failRows, nil 85 return failRows, nil
73 } 86 }
74 87
  88 +func (ptr *PGBatchAddProductService) updateProduct(opt *domain.OperateInfo, item *domain.ImportProductItem, old *domain.Product) error {
  89 + productRepository, _ := repository.NewProductRepository(ptr.transactionContext)
  90 + if err := old.Update(tool_funs.SimpleStructToMap(item)); err != nil {
  91 + return err
  92 + }
  93 + if _, err := productRepository.Save(old); err != nil {
  94 + log.Logger.Error(err.Error())
  95 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, "服务器异常")
  96 + }
  97 + return nil
  98 +}
  99 +
75 func NewPGBatchAddProductService(transactionContext *pgTransaction.TransactionContext) (*PGBatchAddProductService, error) { 100 func NewPGBatchAddProductService(transactionContext *pgTransaction.TransactionContext) (*PGBatchAddProductService, error) {
76 if transactionContext == nil { 101 if transactionContext == nil {
77 return nil, fmt.Errorf("transactionContext参数不能为nil") 102 return nil, fmt.Errorf("transactionContext参数不能为nil")
@@ -5,6 +5,7 @@ import ( @@ -5,6 +5,7 @@ import (
5 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/command" 5 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/command"
6 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/query" 6 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/query"
7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/service" 7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/service"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
8 ) 9 )
9 10
10 type DeviceController struct { 11 type DeviceController struct {
@@ -66,3 +67,13 @@ func (controller *DeviceController) SearchDevice() { @@ -66,3 +67,13 @@ func (controller *DeviceController) SearchDevice() {
66 total, data, err := deviceService.SearchDevice(ParseOperateInfo(controller.BaseController), listDeviceQuery) 67 total, data, err := deviceService.SearchDevice(ParseOperateInfo(controller.BaseController), listDeviceQuery)
67 ResponseGrid(controller.BaseController, total, data, err) 68 ResponseGrid(controller.BaseController, total, data, err)
68 } 69 }
  70 +
  71 +func (controller *DeviceController) BatchAddDevice() {
  72 + productService := service.NewDeviceService(nil)
  73 + cmd := &struct {
  74 + List []*domain.ImportDeviceItem `json:"list"`
  75 + }{}
  76 + Must(controller.Unmarshal(cmd))
  77 + data, err := productService.BatchAddProduct(ParseOperateInfo(controller.BaseController), cmd.List)
  78 + controller.Response(data, err)
  79 +}
@@ -12,4 +12,5 @@ func init() { @@ -12,4 +12,5 @@ func init() {
12 web.Router("/devices/:deviceId", &controllers.DeviceController{}, "Delete:RemoveDevice") 12 web.Router("/devices/:deviceId", &controllers.DeviceController{}, "Delete:RemoveDevice")
13 web.Router("/devices/", &controllers.DeviceController{}, "Get:ListDevice") 13 web.Router("/devices/", &controllers.DeviceController{}, "Get:ListDevice")
14 web.Router("/devices/search", &controllers.DeviceController{}, "Post:SearchDevice") 14 web.Router("/devices/search", &controllers.DeviceController{}, "Post:SearchDevice")
  15 + web.Router("/devices/batch-add", &controllers.DeviceController{}, "Post:BatchAddDevice")
15 } 16 }