From 24150b08f83dff9e56d8386b6d79f1733c278a79 Mon Sep 17 00:00:00 2001 From: allanwei Date: Thu, 18 Mar 2021 16:00:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E9=80=9A=E8=BF=87Ar?= =?UTF-8?q?ticle=E6=A0=87=E8=AF=86=E8=8E=B7=E5=8F=96=E7=BC=BA=E9=99=B7?= =?UTF-8?q?=E9=87=87=E9=9B=86=E7=9B=B8=E5=85=B3=E4=BF=A1=E6=81=AF=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grmi/Condition.go | 2 +- grmi/Field.go | 4 + grmi/Predicate.go | 6 +- grmi/grmi.go | 36 +++++- models/qm/DefectGrp.model.go | 13 +- models/qm/View.model.go | 2 + services/qm/View.service.go | 1 + services/qm/implments/View.service.impl.go | 132 +++++++++++++++++++++ web/controllers/qm/qm.go | 3 + 9 files changed, 183 insertions(+), 16 deletions(-) diff --git a/grmi/Condition.go b/grmi/Condition.go index 52450ca..44fa588 100644 --- a/grmi/Condition.go +++ b/grmi/Condition.go @@ -40,7 +40,7 @@ func (self *Condition) BuildPredicates(urlParameters map[string]string) ([]Predi if err != nil { return nil, NewRequestError(err) } - predicates = append(predicates, NewPredicate(item.ColumnName, item.PredicateType, predicateValue)) + predicates = append(predicates, item.NewPredicate(item.PredicateType, predicateValue)) } return predicates, nil } diff --git a/grmi/Field.go b/grmi/Field.go index 7dbafee..a594e4a 100644 --- a/grmi/Field.go +++ b/grmi/Field.go @@ -10,3 +10,7 @@ type Field struct { func NewField(name string, columnName string, urlParameterName string, goType GoType) Field { return Field{name, columnName, urlParameterName, goType} } + +func (field *Field) NewPredicate(predicateType func(Predicate) string, values ...interface{}) Predicate { + return NewPredicate(field.ColumnName, predicateType, values) +} diff --git a/grmi/Predicate.go b/grmi/Predicate.go index b1ba736..c8fbb2f 100644 --- a/grmi/Predicate.go +++ b/grmi/Predicate.go @@ -3,11 +3,11 @@ package grmi type Predicate struct { ColumnName string PredicateType func(Predicate) string - Value interface{} + Values []interface{} } -func NewPredicate(columnName string, predicateType func(Predicate) string, value interface{}) Predicate { - return Predicate{columnName, predicateType, value} +func NewPredicate(columnName string, predicateType func(Predicate) string, values []interface{}) Predicate { + return Predicate{columnName, predicateType, values} } func (self *Predicate) Build() string { diff --git a/grmi/grmi.go b/grmi/grmi.go index a33c278..25c3fd3 100644 --- a/grmi/grmi.go +++ b/grmi/grmi.go @@ -48,28 +48,52 @@ func BindRoutes(party router.Party) { container.BindRoutes(party) } +func MapStrings(source []string, cast func(string) string) []string { + result := make([]string, len(source)) + for index, content := range result { + result[index] = cast(content) + } + return result +} + +func RepeatStrings(content string, count int) []string { + result := make([]string, count) + for index := range result { + result[index] = content + } + return result +} + func Equal(predicate Predicate) string { - return " and " + predicate.ColumnName + " = ?" + return fmt.Sprintf(" and %s = ?", predicate.ColumnName) } func NotEqual(predicate Predicate) string { - return " and " + predicate.ColumnName + " <> ?" + return fmt.Sprintf(" and %s <> ?", predicate.ColumnName) } func Like(predicate Predicate) string { - return " and " + predicate.ColumnName + " like concat('%', ?, '%')" + return fmt.Sprintf(" and %s like concat('%%', ?, '%%')", predicate.ColumnName) } func NotLike(predicate Predicate) string { - return " and " + predicate.ColumnName + " not like concat('%', ?, '%')" + return fmt.Sprintf(" and %s not like concat('%%', ?, '%%')", predicate.ColumnName) } func IsNull(predicate Predicate) string { - return " and " + predicate.ColumnName + " is null ?" + return fmt.Sprintf(" and %s is null", predicate.ColumnName) } func IsNotNull(predicate Predicate) string { - return " and " + predicate.ColumnName + " is not null ?" + return fmt.Sprintf(" and %s is not null", predicate.ColumnName) +} + +func Include(predicate Predicate) string { + return fmt.Sprintf(" and %s in (%s)", predicate.ColumnName, strings.Join(RepeatStrings("?", len(predicate.Values)), ",")) +} + +func Exclude(predicate Predicate) string { + return fmt.Sprintf(" and %s not in (%s)", predicate.ColumnName, strings.Join(RepeatStrings("?", len(predicate.Values)), ",")) } func Approximate(predicate Predicate) string { diff --git a/models/qm/DefectGrp.model.go b/models/qm/DefectGrp.model.go index 427f735..d964e32 100644 --- a/models/qm/DefectGrp.model.go +++ b/models/qm/DefectGrp.model.go @@ -7,12 +7,13 @@ import ( //DefectGrp的实体映射 type DefectGrp struct { - PlantNr int `xorm:"pk int 'PlantNr'" json:"QM_DefectGrp-PlantNr"` - DefectGrpId string `xorm:"pk nvarchar(20) 'DefectGrpId'" json:"QM_DefectGrp-DefectGrpId"` - Descr string `xorm:"nvarchar(100) 'Descr' not null" json:"QM_DefectGrp-Descr"` - LastModify grmi.DateTime `xorm:"datetime 'LastModify' not null updated" json:"QM_DefectGrp-LastModify"` - LastUser string `xorm:"nvarchar(20) 'LastUser' not null" json:"QM_DefectGrp-LastUser"` - CreateTime grmi.DateTime `xorm:"datetime 'CreateTime' not null created" json:"QM_DefectGrp-CreateTime"` + PlantNr int `xorm:"pk int 'PlantNr'" json:"QM_DefectGrp-PlantNr"` + DefectGrpId string `xorm:"pk nvarchar(20) 'DefectGrpId'" json:"QM_DefectGrp-DefectGrpId"` + Descr string `xorm:"nvarchar(100) 'Descr' not null" json:"QM_DefectGrp-Descr"` + LastModify grmi.DateTime `xorm:"datetime 'LastModify' not null updated" json:"QM_DefectGrp-LastModify"` + LastUser string `xorm:"nvarchar(20) 'LastUser' not null" json:"QM_DefectGrp-LastUser"` + CreateTime grmi.DateTime `xorm:"datetime 'CreateTime' not null created" json:"QM_DefectGrp-CreateTime"` + Reasons []DefectReason `xorm:"-" json:"QM_DefectGrp-Reasons"` } //获取DefectGrp的主键 diff --git a/models/qm/View.model.go b/models/qm/View.model.go index 1d5d220..ed6de0d 100644 --- a/models/qm/View.model.go +++ b/models/qm/View.model.go @@ -20,6 +20,8 @@ type View struct { LastModify grmi.DateTime `xorm:"datetime 'LastModify' not null updated" json:"QM_View-LastModify"` LastUser string `xorm:"nvarchar(20) 'LastUser' not null" json:"QM_View-LastUser"` CreateTime grmi.DateTime `xorm:"datetime 'CreateTime' not null created" json:"QM_View-CreateTime"` + Groups []DefectGrp `xorm:"-" json:"QM_View-Groups"` + Areas []ViewValst `xorm:"-" json:"QM_View-Areas"` } //获取View的主键 diff --git a/services/qm/View.service.go b/services/qm/View.service.go index afc041b..675d23d 100644 --- a/services/qm/View.service.go +++ b/services/qm/View.service.go @@ -15,6 +15,7 @@ type ViewService interface { Delete(*models.Usertab, *[]model.View) error Select(*models.Usertab, map[string]string) (interface{}, error) Update(*models.Usertab, *[]model.View) error + ViewsOfArticle(*models.Usertab, string) ([]model.View, error) } func NewViewService() ViewService { diff --git a/services/qm/implments/View.service.impl.go b/services/qm/implments/View.service.impl.go index 7b9926d..8389cef 100644 --- a/services/qm/implments/View.service.impl.go +++ b/services/qm/implments/View.service.impl.go @@ -1,6 +1,7 @@ package implments import ( + dalOfBase "LAPP_GAAS_GFrame_BACKEND/dao/base" dal "LAPP_GAAS_GFrame_BACKEND/dao/qm" "LAPP_GAAS_GFrame_BACKEND/db" "LAPP_GAAS_GFrame_BACKEND/grmi" @@ -219,3 +220,134 @@ func (impl *ViewServiceImplement) Update(user *models.Usertab, entities *[]model } return nil } + +func (impl *ViewServiceImplement) ViewsOfArticle(user *models.Usertab, articleID string) ([]model.View, error) { + + grmi.Log(user, "/C:/Users/Wei Chenglei/source/repos/GAAS_BackEnd/services/qm/implments/QM_View.service.impl.go", "ViewsOfArticle", "查询与指定Article关联的视图") + + engine := db.Eloquent.Master() + session := engine.NewSession() + // 获取Article + articleDAO := dalOfBase.NewArticleDAO(session, user.Pid, user.Userid) + article, err := articleDAO.SelectOne(articleID) + if err != nil { + return nil, err + } + if article == nil { + return nil, grmi.NewBusinessError("不存在指定Article!") + } + // 获取Article和视图的关联 + artViewDAO := dal.NewArtViewDAO(session, user.Pid, user.Userid) + artViews, err := artViewDAO.Select([]grmi.Predicate{meta.ArtView_ArtId.NewPredicate(grmi.Equal, article.ArtId)}, nil) + if err != nil { + return nil, err + } + // 从关联中获取视图标识 + viewIds := make([]interface{}, len(artViews)) + for i, artView := range artViews { + viewIds[i] = artView.ViewId + } + // 获取视图 + viewDAO := dal.NewViewDAO(session, user.Pid, user.Userid) + views, err := viewDAO.Select([]grmi.Predicate{meta.View_ViewId.NewPredicate(grmi.Include, viewIds...)}, nil) + if err != nil { + return nil, err + } + // 构造视图ID与视图的关联,用以将视图区域和缺陷分组关联到视图 + viewMapping := make(map[string]*model.View, len(artViews)) + for index, view := range views { + viewMapping[view.ViewId] = &views[index] + } + // 获取视图区域 + viewValstDAO := dal.NewViewValstDAO(session, user.Pid, user.Userid) + areas, err := viewValstDAO.Select([]grmi.Predicate{meta.ViewValst_ViewId.NewPredicate(grmi.Include, viewIds...)}, nil) + if err != nil { + return nil, err + } + // 将视图区域关联到视图 + for _, area := range areas { + view, ok := viewMapping[area.ViewId] + if ok { + view.Areas = append(view.Areas, area) + } + } + // 获取视图缺陷分组关联 + viewDefectGrplstDAO := dal.NewViewDefectGrplstDAO(session, user.Pid, user.Userid) + viewGroups, err := viewDefectGrplstDAO.Select([]grmi.Predicate{meta.ViewDefectGrplst_ViewId.NewPredicate(grmi.Include, viewIds...)}, nil) + if err != nil { + return nil, err + } + // 1.构造缺陷分组ID到视图ID的映射,用以将缺陷分组关联到视图 + // 2.从关联中获取缺陷分组标识 + group2ViewMapping := make(map[string][]string, len(viewGroups)) + groupIds := make([]interface{}, 0, len(viewGroups)) + for _, viewGroup := range viewGroups { + groupIds = append(groupIds, viewGroup.DefectGrpId) + viewIds, ok := group2ViewMapping[viewGroup.DefectGrpId] + if !ok { + viewIds = make([]string, 0, 10) + } + group2ViewMapping[viewGroup.DefectGrpId] = append(viewIds, viewGroup.ViewId) + } + // 获取缺陷缺陷分组 + defectGrpDAO := dal.NewDefectGrpDAO(session, user.Pid, user.Userid) + groups, err := defectGrpDAO.Select([]grmi.Predicate{meta.DefectGrp_DefectGrpId.NewPredicate(grmi.Include, groupIds...)}, nil) + if err != nil { + return nil, err + } + // 构造缺陷分组ID与缺陷分组的关联,用以将缺陷原因关联到缺陷分组 + groupMapping := make(map[string]*model.DefectGrp, len(groups)) + for index, group := range groups { + groupIds = append(groupIds, group.DefectGrpId) + groupMapping[group.DefectGrpId] = &groups[index] + } + // 获取缺陷分组关联 + defectGrpReasonLstDAO := dal.NewDefectGrpReasonLstDAO(session, user.Pid, user.Userid) + groupReasons, err := defectGrpReasonLstDAO.Select([]grmi.Predicate{meta.DefectGrpReasonLst_DefectGrpId.NewPredicate(grmi.Include, groupIds...)}, nil) + if err != nil { + return nil, err + } + // 1.构造缺陷原因ID到缺陷分组ID的映射,用以将缺陷原因关联到缺陷分组 + // 2.从关联中获取缺陷原因标识 + reason2GroupMapping := make(map[string][]string, len(groupReasons)) + reasonIds := make([]interface{}, 0, len(groupReasons)) + for _, groupReason := range groupReasons { + reasonIds = append(reasonIds, groupReason.DefectReasonId) + groupIds, ok := reason2GroupMapping[groupReason.DefectReasonId] + if !ok { + groupIds = make([]string, 0, 10) + } + reason2GroupMapping[groupReason.DefectReasonId] = append(groupIds, groupReason.DefectGrpId) + } + // 获取缺陷原因 + defectReasonDAO := dal.NewDefectReasonDAO(session, user.Pid, user.Userid) + reasons, err := defectReasonDAO.Select([]grmi.Predicate{meta.DefectReason_DefectReasonId.NewPredicate(grmi.Include, reasonIds...)}, nil) + if err != nil { + return nil, err + } + // 将缺陷原因关联到缺陷分组 + for _, reason := range reasons { + groupIds, ok := reason2GroupMapping[reason.DefectReasonId] + if ok { + for _, groupId := range groupIds { + group, ok := groupMapping[groupId] + if ok { + group.Reasons = append(group.Reasons, reason) + } + } + } + } + // 将缺陷分组关联到视图,放到最后是因为view.Groups的成员是值而不是引用,如果提前填充view.Groups,里面值的Reasons将会是是nil. + for _, group := range groups { + viewIds, ok := group2ViewMapping[group.DefectGrpId] + if ok { + for _, viewId := range viewIds { + view, ok := viewMapping[viewId] + if ok { + view.Groups = append(view.Groups, group) + } + } + } + } + return views, nil +} diff --git a/web/controllers/qm/qm.go b/web/controllers/qm/qm.go index 24398ba..7659650 100644 --- a/web/controllers/qm/qm.go +++ b/web/controllers/qm/qm.go @@ -1,6 +1,7 @@ package qm import ( + "LAPP_GAAS_GFrame_BACKEND/container" "LAPP_GAAS_GFrame_BACKEND/grmi" svr "LAPP_GAAS_GFrame_BACKEND/services/qm" "github.com/kataras/iris/v12/core/router" @@ -197,6 +198,8 @@ func RegisterRoutes() { // defectreason Update // RegisterUpdateOneDefectReason(defectreason, "/updateone", serviceOfDefectReason.UpdateOne) // RegisterUpdateDefectReason(defectreason, "/update", serviceOfDefectReason.Update) + + container.RegisterServiceWithAlias("view", svr.NewViewService) }) }