|
@@ -0,0 +1,107 @@
|
|
|
+package label
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "entgo.io/ent/dialect/sql"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+ "wechat-api/ent"
|
|
|
+ "wechat-api/ent/label"
|
|
|
+ "wechat-api/internal/svc"
|
|
|
+ "wechat-api/internal/types"
|
|
|
+
|
|
|
+ "github.com/zeromicro/go-zero/core/logx"
|
|
|
+)
|
|
|
+
|
|
|
+type LabelImportLogic struct {
|
|
|
+ logx.Logger
|
|
|
+ ctx context.Context
|
|
|
+ svcCtx *svc.ServiceContext
|
|
|
+}
|
|
|
+
|
|
|
+func NewLabelImportLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LabelImportLogic {
|
|
|
+ return &LabelImportLogic{
|
|
|
+ Logger: logx.WithContext(ctx),
|
|
|
+ ctx: ctx,
|
|
|
+ svcCtx: svcCtx}
|
|
|
+}
|
|
|
+
|
|
|
+func (l *LabelImportLogic) LabelImport(req *types.LabelImportReq) (resp *types.LabelImportResp, err error) {
|
|
|
+ // todo: add your logic here and delete this line
|
|
|
+ organizationId := l.ctx.Value("organizationId").(uint64)
|
|
|
+ contentString := req.Content
|
|
|
+ // contentString := "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34
|
|
|
+ //逗号分隔contentString
|
|
|
+ contents := strings.Split(contentString, ",")
|
|
|
+ //查找已经存在的标签
|
|
|
+
|
|
|
+ uniqueContents := make(map[string]struct{})
|
|
|
+ for _, tag := range contents {
|
|
|
+ tag = strings.TrimSpace(tag)
|
|
|
+ if tag != "" {
|
|
|
+ uniqueContents[tag] = struct{}{}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ contentList := make([]string, 0, len(uniqueContents))
|
|
|
+ for tag := range uniqueContents {
|
|
|
+ contentList = append(contentList, tag)
|
|
|
+ }
|
|
|
+ existingLabels, err := l.svcCtx.DB.Label.Query().
|
|
|
+ Where(
|
|
|
+ label.NameIn(contentList...),
|
|
|
+ label.OrganizationID(organizationId),
|
|
|
+ ).
|
|
|
+ Select(label.FieldName).
|
|
|
+ All(l.ctx)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ //var toInsert []string
|
|
|
+ existMap := make(map[string]bool)
|
|
|
+ for _, tag := range existingLabels {
|
|
|
+ existMap[tag.Name] = true
|
|
|
+ }
|
|
|
+ labelCreates := make([]*ent.LabelCreate, 0)
|
|
|
+ inserted := make([]string, 0)
|
|
|
+ existed := make([]string, 0)
|
|
|
+ for _, tag := range contentList {
|
|
|
+ if existMap[tag] {
|
|
|
+ existed = append(existed, tag)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if !existMap[tag] {
|
|
|
+ labelCreates = append(labelCreates, l.svcCtx.DB.Label.Create().
|
|
|
+ SetName(tag).
|
|
|
+ SetType(*req.Type).
|
|
|
+ SetStatus(1).
|
|
|
+ SetOrganizationID(organizationId).
|
|
|
+ SetFrom(2).
|
|
|
+ SetMode(1).
|
|
|
+ SetConditions(`{}`).
|
|
|
+ SetCreatedAt(time.Now()).
|
|
|
+ SetUpdatedAt(time.Now()),
|
|
|
+ )
|
|
|
+ }
|
|
|
+ inserted = append(inserted, tag)
|
|
|
+ }
|
|
|
+ if len(labelCreates) > 0 {
|
|
|
+ err := l.svcCtx.DB.Label.CreateBulk(labelCreates...).
|
|
|
+ OnConflict(sql.ConflictColumns(label.FieldName, label.FieldOrganizationID)).
|
|
|
+ DoNothing().
|
|
|
+ Exec(l.ctx)
|
|
|
+ if err != nil {
|
|
|
+ logx.Error("label 批量插入失败", labelCreates)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return &types.LabelImportResp{
|
|
|
+ BaseDataInfo: types.BaseDataInfo{
|
|
|
+ Code: 0,
|
|
|
+ Msg: "success",
|
|
|
+ },
|
|
|
+ Data: types.LabelImportInfo{
|
|
|
+ Inserted: inserted,
|
|
|
+ Existed: existed,
|
|
|
+ },
|
|
|
+ }, nil
|
|
|
+}
|