unit_conversion.go 16.1 KB
package service

import (
	"fmt"
	"github.com/linmadan/egglib-go/core/application"
	"github.com/linmadan/egglib-go/utils/tool_funs"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/unitConversion/command"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/unitConversion/dto"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/unitConversion/query"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
	"time"
)

// 单位换算服务
type UnitConversionService struct {
}

// 创建单位换算服务
func (unitConversionService *UnitConversionService) CreateUnitConversion(operateInfo *domain.OperateInfo, cmd *command.CreateUnitConversionCommand) (interface{}, error) {
	cmd.CompanyId = operateInfo.CompanyId
	cmd.OrgId = operateInfo.OrgId
	if err := cmd.ValidateCommand(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()

	var workStation *domain.WorkStation
	_, workStation, err = factory.FastPgWorkstation(transactionContext, cmd.WorkshopId, cmd.LineId, cmd.SectionId)
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}

	var userService = domainService.NewUserService()
	var org *domain.Org
	org, err = userService.Organization(cmd.OrgId)
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}

	newUnitConversion := &domain.UnitConversion{
		CompanyId:               cmd.CompanyId,
		OrgId:                   cmd.OrgId,
		Material:                cmd.Material,
		FromUnitQuantity:        cmd.FromUnitQuantity,
		ToUnitQuantity:          cmd.ToUnitQuantity,
		IntelligentWeighingFlag: cmd.IntelligentWeighingFlag,
		WorkStation:             workStation,
		CreatedAt:               time.Now(),
		UpdatedAt:               time.Now(),
		Ext:                     domain.NewExt(org.OrgName),
	}
	unitConversionRepository, _, _ := factory.FastPgUnitConversion(transactionContext, 0)

	if unitConversion, err := unitConversionRepository.Save(newUnitConversion); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	} else {
		if err := transactionContext.CommitTransaction(); err != nil {
			return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
		}
		return unitConversion, nil
	}
}

// 返回单位换算服务
func (unitConversionService *UnitConversionService) GetUnitConversion(getUnitConversionQuery *query.GetUnitConversionQuery) (interface{}, error) {
	if err := getUnitConversionQuery.ValidateQuery(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	//var unitConversionRepository domain.UnitConversionRepository
	var unitConversion *domain.UnitConversion
	_, unitConversion, err = factory.FastPgUnitConversion(transactionContext, getUnitConversionQuery.UnitConversionId)
	if err != nil {
		return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
	}
	var productMaterial *domain.ProductMaterial
	if unitConversion.Material.ProductMaterialId > 0 {
		_, productMaterial, err = factory.FastProductMaterial(transactionContext, unitConversion.Material.ProductMaterialId)
		if err != nil {
			return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
		}
	}
	if err := transactionContext.CommitTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	result := &dto.UnitConversionDto{}
	result.LoadDto(unitConversion, 0, productMaterial)
	return result, nil

}

// 返回单位换算服务列表
func (unitConversionService *UnitConversionService) ListUnitConversion(listUnitConversionQuery *query.ListUnitConversionQuery) (interface{}, error) {
	if err := listUnitConversionQuery.ValidateQuery(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	var unitConversionRepository domain.UnitConversionRepository
	if value, err := factory.CreateUnitConversionRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	}); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	} else {
		unitConversionRepository = value
	}
	if count, unitConversions, err := unitConversionRepository.Find(tool_funs.SimpleStructToMap(listUnitConversionQuery)); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	} else {
		if err := transactionContext.CommitTransaction(); err != nil {
			return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
		}
		return map[string]interface{}{
			"count":           count,
			"unitConversions": unitConversions,
		}, nil
	}
}

// 移除单位换算服务
func (unitConversionService *UnitConversionService) RemoveUnitConversion(removeUnitConversionCommand *command.RemoveUnitConversionCommand) (interface{}, error) {
	if err := removeUnitConversionCommand.ValidateCommand(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	var unitConversionRepository domain.UnitConversionRepository
	if value, err := factory.CreateUnitConversionRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	}); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	} else {
		unitConversionRepository = value
	}
	unitConversion, err := unitConversionRepository.FindOne(map[string]interface{}{"unitConversionId": removeUnitConversionCommand.UnitConversionId})
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	if unitConversion == nil {
		return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeUnitConversionCommand.UnitConversionId)))
	}
	if unitConversion, err := unitConversionRepository.Remove(unitConversion); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	} else {
		if err := transactionContext.CommitTransaction(); err != nil {
			return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
		}
		return unitConversion, nil
	}
}

// 移除单位换算服务
func (unitConversionService *UnitConversionService) BatchRemoveUnitConversion(cmd *command.BatchRemoveUnitConversionCommand) (interface{}, error) {
	if err := cmd.ValidateCommand(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	var unitConversionRepository domain.UnitConversionRepository
	if value, err := factory.CreateUnitConversionRepository(map[string]interface{}{
		"transactionContext": transactionContext,
	}); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	} else {
		unitConversionRepository = value
	}
	for i := range cmd.IdList {
		id := cmd.IdList[i]
		unitConversion, err := unitConversionRepository.FindOne(map[string]interface{}{"unitConversionId": id})
		if err != nil {
			return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
		}
		if unitConversion == nil {
			return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%d", id))
		}
		if _, err := unitConversionRepository.Remove(unitConversion); err != nil {
			return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
		}
	}
	if err := transactionContext.CommitTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	return struct {
	}{}, nil

}

// 更新单位换算服务
func (unitConversionService *UnitConversionService) UpdateUnitConversion(cmd *command.UpdateUnitConversionCommand) (interface{}, error) {
	if err := cmd.ValidateCommand(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	var unitConversionRepository domain.UnitConversionRepository
	var unitConversion *domain.UnitConversion
	unitConversionRepository, unitConversion, err = factory.FastPgUnitConversion(transactionContext, cmd.UnitConversionId)

	var workStation *domain.WorkStation
	_, workStation, err = factory.FastPgWorkstation(transactionContext, cmd.WorkshopId, cmd.LineId, cmd.SectionId)
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}

	var userService = domainService.NewUserService()
	var org *domain.Org
	org, err = userService.Organization(unitConversion.OrgId)
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}

	unitConversion.WorkStation = workStation
	unitConversion.Material = cmd.Material
	unitConversion.FromUnitQuantity = cmd.FromUnitQuantity
	unitConversion.ToUnitQuantity = cmd.ToUnitQuantity
	unitConversion.IntelligentWeighingFlag = cmd.IntelligentWeighingFlag
	unitConversion.Ext = domain.NewExt(org.OrgName)

	if err := unitConversion.Update(utils.ObjectToMap(cmd)); err != nil {
		return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
	}
	if unitConversion, err := unitConversionRepository.Save(unitConversion); err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	} else {
		if err := transactionContext.CommitTransaction(); err != nil {
			return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
		}
		return unitConversion, nil
	}
}

// 返回单位换算服务列表
func (unitConversionService *UnitConversionService) SearchUnitConversion(operateInfo *domain.OperateInfo, listUnitConversionQuery *query.SearchUnitConversionQuery) (int64, interface{}, error) {
	if err := listUnitConversionQuery.ValidateQuery(); err != nil {
		return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	unitConversionRepository, _, _ := factory.FastPgUnitConversion(transactionContext, 0)
	count, unitConversions, err := unitConversionRepository.Find(utils.ObjectToMap(listUnitConversionQuery))
	if err != nil {
		return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}

	var mapProductMaterial = make(map[int]*domain.ProductMaterial, 0)
	productMaterialIds := domain.UnitConversions(unitConversions).ProductMaterialIds()
	if len(productMaterialIds) > 0 {
		productMaterialRepository, _, _ := factory.FastProductMaterial(transactionContext, 0)
		_, productMaterials, err := productMaterialRepository.Find(map[string]interface{}{"productMaterialIds": productMaterialIds})
		if err != nil {
			return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
		}
		mapProductMaterial = domain.ProductMaterials(productMaterials).ToMapById()
	}

	var result = make([]*dto.UnitConversionDto, 0)
	for i := range unitConversions {
		item := unitConversions[i]
		newItem := &dto.UnitConversionDto{}
		newItem.LoadDto(item, operateInfo.OrgId, mapProductMaterial[item.Material.ProductMaterialId])
		result = append(result, newItem)
	}

	if err := transactionContext.CommitTransaction(); err != nil {
		return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	return count, result, nil
}

// 返回单位换算服务列表
func (unitConversionService *UnitConversionService) SearchMaterial(operateInfo *domain.OperateInfo, listUnitConversionQuery *query.SearchMaterialsQuery) (int64, interface{}, error) {
	if err := listUnitConversionQuery.ValidateQuery(); err != nil {
		return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	unitConversionRepository, _, _ := factory.FastPgUnitConversion(transactionContext, 0)
	count, unitConversions, err := unitConversionRepository.Find(utils.ObjectToMap(listUnitConversionQuery))
	if err != nil {
		return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	if err := transactionContext.CommitTransaction(); err != nil {
		return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}

	var mapProductMaterial = make(map[int]*domain.ProductMaterial, 0)
	productMaterialIds := domain.UnitConversions(unitConversions).ProductMaterialIds()
	if len(productMaterialIds) > 0 {
		productMaterialRepository, _, _ := factory.FastProductMaterial(transactionContext, 0)
		_, productMaterials, err := productMaterialRepository.Find(map[string]interface{}{"productMaterialIds": productMaterialIds})
		if err != nil {
			return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
		}
		mapProductMaterial = domain.ProductMaterials(productMaterials).ToMapById()
	}

	var result = make([]*dto.MaterialUnitConversionDto, 0)
	for i := range unitConversions {
		item := unitConversions[i]
		newItem := &dto.MaterialUnitConversionDto{}
		newItem.LoadDto(item, mapProductMaterial[item.Material.ProductMaterialId])
		result = append(result, newItem)
	}
	return count, map[string]interface{}{
		"materials": result,
	}, nil
}

func NewUnitConversionService(options map[string]interface{}) *UnitConversionService {
	newUnitConversionService := &UnitConversionService{}
	return newUnitConversionService
}