作者 yangfu

Merge branch 'dev' into test

... ... @@ -94,6 +94,7 @@ type (
Name string `json:"name,optional"` // 模板名称
TemplateClass string `json:"templateClass,optional"` // 模板分类
Target *int `json:"target,optional"` // 目标 0 全员 1 指定人
TargetUser string `json:"targetUser,optional"` // 目标用户
// BelongTos []int `json:"belongTos,optional"` // 归属
CompanyId int64 `json:",optional"` // 属于企业时有值
UserId int64 `json:",optional"` // 属于个人时有值
... ... @@ -122,6 +123,7 @@ type (
//UserId int64 `json:",optional"` // 属于个人时有值
//BelongTo int `json:"belongTo,optional"` // 模板属于: 1:企业 、2:个人
Name string `json:"name"` // 模板名称
Description string `json:"description"` // 描述
TemplateClass string `json:"templateClass"` // 模板分类
Paragraphs []Paragraph `json:"paragraphs"` // 段落列表
Icon string `json:"icon,optional"` // 图标地址
... ...
... ... @@ -47,7 +47,7 @@ func (l *MiniArticleTemplateSaveLogic) MiniArticleTemplateSave(req *types.Articl
dm.Operator = domain.Operator{
Id: userToken.UserId,
Name: user.Name,
Type: 2,
Type: domain.OperatorTypeUser,
}
if req.BelongTo == int(domain.BelongToCompany) {
dm.BelongTo = domain.BelongToCompany
... ...
... ... @@ -36,6 +36,9 @@ func (l *SystemArticleTemplateBatchDeleteLogic) SystemArticleTemplateBatchDelete
if dm, err = l.svcCtx.ArticleTemplateRepository.FindOne(l.ctx, conn, int64(id)); err != nil {
return xerr.NewErrMsgErr("不存在", err)
}
if dm.TemplateClass == domain.DefaultTemplateClass {
return xerr.NewErrMsgErr("默认模板不可删除", nil)
}
if dm, err = l.svcCtx.ArticleTemplateRepository.Delete(l.ctx, conn, dm); err != nil {
return err
}
... ...
... ... @@ -34,6 +34,9 @@ func (l *SystemArticleTemplateDeleteLogic) SystemArticleTemplateDelete(req *type
if dm, err = l.svcCtx.ArticleTemplateRepository.FindOne(l.ctx, conn, req.Id); err != nil {
return nil, xerr.NewErrMsgErr("不存在", err)
}
if dm.TemplateClass == domain.DefaultTemplateClass {
return nil, xerr.NewErrMsgErr("默认模板不可删除", nil)
}
if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
if dm, err = l.svcCtx.ArticleTemplateRepository.Delete(l.ctx, conn, dm); err != nil {
return err
... ...
... ... @@ -49,7 +49,7 @@ func (l *SystemArticleTemplateSaveLogic) SystemArticleTemplateSave(req *types.Ar
dm.Operator = domain.Operator{
Id: userToken.UserId,
Name: userMe.User.NickName,
Type: 1,
Type: domain.OperatorTypeAdmin,
}
if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
dm, err = l.svcCtx.ArticleTemplateRepository.Insert(l.ctx, conn, dm)
... ... @@ -75,6 +75,7 @@ func NewDomainArticleTemplate(item types.ArticleTemplateItem) *domain.ArticleTem
TargetWhoReview: domain.ArticleTemplateTarget(item.TargetWhoReview),
WhoRead: item.WhoRead,
WhoReview: item.WhoReview,
Sort: 1,
}
}
... ... @@ -83,9 +84,19 @@ func NewTypesArticleTemplate(item *domain.ArticleTemplate) types.ArticleTemplate
lo.ForEach(item.Paragraphs, func(p domain.Paragraph, index int) {
paragraphs = append(paragraphs, NewTypesParagraph(p))
})
// 目前固定,后期有需要添加描述字段
var description string
if item.TemplateClass == domain.DefaultTemplateClass {
if item.Name == "演绎式" {
description = "从分析现象开始,查找发生原因,找出解决方案"
} else if item.Name == "归纳式" {
description = "从个别事务中概括出一般性概念、原则或结论"
}
}
return types.ArticleTemplateItem{
Id: item.Id,
Name: item.Name,
Description: description,
TemplateClass: item.TemplateClass,
Paragraphs: paragraphs,
Icon: item.Icon,
... ...
... ... @@ -36,8 +36,11 @@ func (l *SystemArticleTemplateSearchLogic) SystemArticleTemplateSearch(req *type
if req.Page > 0 && req.Size > 0 {
queryOptions.WithOffsetLimit(req.Page, req.Size)
}
queryOptions.WithKV("name", req.Name).WithKV("templateClass", req.TemplateClass).
WithKV("companyId", req.CompanyId).WithKV("userId", req.UserId)
queryOptions.WithKV("name", req.Name).
WithKV("templateClass", req.TemplateClass).
WithKV("companyId", req.CompanyId).
WithKV("userId", req.UserId).
WithKV("targetUser", req.TargetUser)
if req.Target != nil {
queryOptions.MustWithKV("target", *req.Target)
}
... ...
... ... @@ -103,6 +103,9 @@ func (l *SystemUserInfoLogic) SystemUserInfo(req *types.SystemUserInfoRequest) (
if err != nil {
return nil, err
}
if err = l.initCompanyTemplate(companyId, resp.UserId, resp.UserName); err != nil {
return nil, err
}
return
}
... ... @@ -216,3 +219,54 @@ func (l *SystemUserInfoLogic) initSystemData(companyId int64) error {
}
return nil
}
// 初始化公司模板数据
func (l *SystemUserInfoLogic) initCompanyTemplate(companyId int64, uid int64, uname string) error {
var conn = l.svcCtx.DefaultDBConn()
if companyId <= 0 {
return xerr.NewErrMsgErr("公司id不能为0", nil)
}
total, _, err := l.svcCtx.ArticleTemplateRepository.FindCompanyUnscoped(l.ctx, conn, companyId, domain.NewQueryOptions().WithCountOnly().WithKV("templateClass", domain.DefaultTemplateClass))
if err != nil {
return err
}
if total == 0 {
templateList := []*domain.ArticleTemplate{
NewDefaultArticleTemplate(companyId, "演绎式", uid, uname, 1),
NewDefaultArticleTemplate(companyId, "归纳式", uid, uname, 2),
}
if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
for _, tp := range templateList {
tp, err = l.svcCtx.ArticleTemplateRepository.Insert(l.ctx, conn, tp)
if err != nil {
return err
}
}
return nil
}, true); err != nil {
return xerr.NewErrMsgErr("初始话公司数据失败", err)
}
}
return nil
}
func NewDefaultArticleTemplate(companyId int64, name string, operatorId int64, operatorName string, sort int) *domain.ArticleTemplate {
return &domain.ArticleTemplate{
CompanyId: companyId,
Name: name,
TemplateClass: domain.DefaultTemplateClass,
BelongTo: domain.BelongToCompany,
Paragraphs: []domain.Paragraph{},
Icon: "",
TargetWhoRead: domain.ArticleTemplateAll,
TargetWhoReview: domain.ArticleTemplateAll,
WhoRead: []int64{},
WhoReview: []int64{},
Operator: domain.Operator{
Id: operatorId,
Name: operatorName,
Type: domain.OperatorTypeAdmin,
},
Sort: sort,
}
}
... ...
... ... @@ -1961,6 +1961,7 @@ type ArticleTemplateSearchRequest struct {
Name string `json:"name,optional"` // 模板名称
TemplateClass string `json:"templateClass,optional"` // 模板分类
Target *int `json:"target,optional"` // 目标 0 全员 1 指定人
TargetUser string `json:"targetUser,optional"` // 目标用户
CompanyId int64 `json:",optional"` // 属于企业时有值
UserId int64 `json:",optional"` // 属于个人时有值
}
... ... @@ -1990,6 +1991,7 @@ type ArticleTemplateClassItem struct {
type ArticleTemplateItem struct {
Id int64 `json:"id,optional"` // 唯一标识
Name string `json:"name"` // 模板名称
Description string `json:"description"` // 描述
TemplateClass string `json:"templateClass"` // 模板分类
Paragraphs []Paragraph `json:"paragraphs"` // 段落列表
Icon string `json:"icon,optional"` // 图标地址
... ...
... ... @@ -21,6 +21,7 @@ type ArticleTemplate struct {
WhoRead []int64 `gorm:"type:jsonb;serializer:json" json:",omitempty"` // 谁可以看
WhoReview []int64 `gorm:"type:jsonb;serializer:json" json:",omitempty"` // 查看、评论人
Operator domain.Operator `gorm:"type:jsonb;serializer:json" json:",omitempty"`
Sort int `json:",omitempty"`
CreatedAt int64 `json:",omitempty"`
UpdatedAt int64 `json:",omitempty"`
DeletedAt int64 `json:",omitempty"`
... ...
... ... @@ -120,7 +120,7 @@ func (repository *ArticleTemplateRepository) Find(ctx context.Context, conn tran
total int64
)
queryFunc := func() (interface{}, error) {
tx = tx.Model(&ms).Order("id desc")
tx = tx.Model(&ms).Order("id asc")
if v, ok := queryOptions["companyId"]; ok {
tx.Where("company_id = ? ", v)
}
... ... @@ -133,8 +133,48 @@ func (repository *ArticleTemplateRepository) Find(ctx context.Context, conn tran
if v, ok := queryOptions["templateClass"]; ok {
tx.Where("template_class = ? ", v)
}
if v, ok := queryOptions["target"]; ok {
tx.Where("target_who_read = ? ", v)
//if v, ok := queryOptions["target"]; ok {
// tx.Where("target_who_read = ? ", v)
//}
if v, ok := queryOptions["targetUser"]; ok {
tx.Where(`id in (select a.id from (
select id,json_array_elements_text(who_read::json)::integer user_id from article_template
) a where a.user_id in(
select id from "user" where name like ?
))`, fmt.Sprintf("%%%v%%", v))
}
if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
return dms, tx.Error
}
return dms, nil
}
if _, err := repository.Query(queryFunc); err != nil {
return 0, nil, err
}
for _, item := range ms {
if dm, err := repository.ModelToDomainModel(item); err != nil {
return 0, dms, err
} else {
dms = append(dms, dm)
}
}
return total, dms, nil
}
func (repository *ArticleTemplateRepository) FindCompanyUnscoped(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*domain.ArticleTemplate, error) {
var (
tx = conn.DB()
ms []*models.ArticleTemplate
dms = make([]*domain.ArticleTemplate, 0)
total int64
)
queryFunc := func() (interface{}, error) {
tx = tx.Model(&ms).Unscoped()
tx.Where("company_id = ? ", companyId)
if v, ok := queryOptions["templateClass"]; ok {
tx.Where("template_class = ? ", v)
}
if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
return dms, tx.Error
... ...
... ... @@ -19,6 +19,7 @@ type ArticleTemplate struct {
WhoRead []int64 `json:",omitempty"` // 谁可以看
WhoReview []int64 `json:",omitempty"` // 查看、评论人
Operator Operator `json:",omitempty"` // 操作人(企业时有值)
Sort int `json:",omitempty"` // 排序
CreatedAt int64 `json:",omitempty"`
UpdatedAt int64 `json:",omitempty"`
DeletedAt int64 `json:",omitempty"`
... ... @@ -32,6 +33,8 @@ type ArticleTemplateRepository interface {
Delete(ctx context.Context, conn transaction.Conn, dm *ArticleTemplate) (*ArticleTemplate, error)
FindOne(ctx context.Context, conn transaction.Conn, id int64) (*ArticleTemplate, error)
Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*ArticleTemplate, error)
// FindCompanyUnscoped 公司存在过的模板
FindCompanyUnscoped(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*ArticleTemplate, error)
}
func (m *ArticleTemplate) Identify() interface{} {
... ... @@ -61,6 +64,10 @@ const (
type ArticleTemplateTarget int
const (
ArticleTemplateAll ArticleTarget = 0 //所有人
ArticleTemplateLimit ArticleTarget = 1 //指定的人
ArticleTemplateAll ArticleTemplateTarget = 0 //所有人
ArticleTemplateLimit ArticleTemplateTarget = 1 //指定的人
)
const (
DefaultTemplateClass = "常见论证类"
)
... ...
... ... @@ -51,3 +51,8 @@ type Operator struct {
Name string `json:"name"` // 人员名字
Type int `json:"type"` // 1:系统管理员 2:个人
}
const (
OperatorTypeAdmin = 1
OperatorTypeUser = 2
)
... ...