作者 yangfu

feat: 产品信息同步修改

@@ -57,6 +57,9 @@ func (crontabService *CrontabService) initTask() { @@ -57,6 +57,9 @@ func (crontabService *CrontabService) initTask() {
57 57
58 syncProductPlan := task.NewTask("定时同步车间计划", "0 */5 * * * *", SyncProductPlan) 58 syncProductPlan := task.NewTask("定时同步车间计划", "0 */5 * * * *", SyncProductPlan)
59 task.AddTask("SyncProductPlan", syncProductPlan) 59 task.AddTask("SyncProductPlan", syncProductPlan)
  60 +
  61 + syncProduct := task.NewTask("定时同步产品信息", "0 */30 * * * *", SyncProduct)
  62 + task.AddTask("syncProduct", syncProduct)
60 } 63 }
61 64
62 func (crontabService *CrontabService) StartCrontabTask() { 65 func (crontabService *CrontabService) StartCrontabTask() {
  1 +package crontab
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "github.com/linmadan/egglib-go/transaction/pg"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/syncdata"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  11 + "time"
  12 +)
  13 +
  14 +// SyncProduct 定时同步产品
  15 +func SyncProduct(ctx context.Context) error {
  16 + defer func() {
  17 + if r := recover(); r != nil {
  18 + log.Logger.Error(fmt.Sprintf("%v", r))
  19 + }
  20 + }()
  21 + transactionContext, err := factory.CreateTransactionContext(nil)
  22 + if err != nil {
  23 + return err
  24 + }
  25 + if err := transactionContext.StartTransaction(); err != nil {
  26 + return err
  27 + }
  28 + defer func() {
  29 + if err != nil {
  30 + log.Logger.Error("【定时同步产品信息】 失败:" + err.Error())
  31 + }
  32 + transactionContext.RollbackTransaction()
  33 + }()
  34 +
  35 + log.Logger.Debug("【定时同步同步产品信息】 启动")
  36 + pullK3CloudService := syncdata.PullDataK3CloudService{}
  37 + t := ctx.Value("fromTime")
  38 + var fromTime time.Time
  39 + if t != nil {
  40 + if v, ok := t.(time.Time); ok {
  41 + fromTime = v
  42 + }
  43 + }
  44 + if fromTime.IsZero() {
  45 + fromTime, err = redis.GetLastFetchTime(redis.MaterialK3cloudFetchTimeKey())
  46 + if err != nil {
  47 + log.Logger.Error(err.Error())
  48 + return nil
  49 + }
  50 + }
  51 + if err := pullK3CloudService.SyncDataProduct(transactionContext.(*pg.TransactionContext), fromTime); err != nil {
  52 + log.Logger.Error(err.Error())
  53 + return nil
  54 + }
  55 + if err = transactionContext.CommitTransaction(); err != nil {
  56 + return err
  57 + }
  58 + return nil
  59 +}
@@ -12,6 +12,7 @@ import ( @@ -12,6 +12,7 @@ import (
12 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService" 12 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
13 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" 13 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
14 "sort" 14 "sort"
  15 + "strings"
15 "time" 16 "time"
16 ) 17 )
17 18
@@ -85,6 +86,10 @@ func (productGroupService *ProductGroupService) CreateProductGroup(operateInfo * @@ -85,6 +86,10 @@ func (productGroupService *ProductGroupService) CreateProductGroup(operateInfo *
85 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "有重复的生产班组") 86 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "有重复的生产班组")
86 } 87 }
87 88
  89 + if err := productGroupService.MemberInOtherGroup(transactionContext, newProductGroup, members); err != nil {
  90 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  91 + }
  92 +
88 if productGroup, err := productGroupRepository.Save(newProductGroup); err != nil { 93 if productGroup, err := productGroupRepository.Save(newProductGroup); err != nil {
89 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 94 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
90 } else { 95 } else {
@@ -95,6 +100,39 @@ func (productGroupService *ProductGroupService) CreateProductGroup(operateInfo * @@ -95,6 +100,39 @@ func (productGroupService *ProductGroupService) CreateProductGroup(operateInfo *
95 } 100 }
96 } 101 }
97 102
  103 +func (ProductGroupService *ProductGroupService) MemberInOtherGroup(transactionContext application.TransactionContext, group *domain.ProductGroup, members []*domain.User) error {
  104 + if len(members) == 0 {
  105 + return nil
  106 + }
  107 + productGroupRepository, _, _ := factory.FastPgProductGroup(transactionContext, 0)
  108 + _, groups, err := productGroupRepository.Find(map[string]interface{}{"companyId": group.CompanyId, "orgId": group.OrgId})
  109 + if err != nil {
  110 + return err
  111 + }
  112 + if len(groups) == 0 {
  113 + return nil
  114 + }
  115 + var userInGroups = make(map[int]*domain.User)
  116 + for _, v := range groups {
  117 + if group.ProductGroupId > 0 && v.ProductGroupId == group.ProductGroupId {
  118 + continue
  119 + }
  120 + for _, w := range v.GroupMembers {
  121 + userInGroups[w.UserId] = w
  122 + }
  123 + }
  124 + var userExists = make([]string, 0)
  125 + for _, v := range members {
  126 + if u, ok := userInGroups[v.UserId]; ok {
  127 + userExists = append(userExists, u.UserName)
  128 + }
  129 + }
  130 + if len(userExists) > 0 {
  131 + return fmt.Errorf("不可配置 用户:%v ,请先从其他生产班组中移除", strings.Join(userExists, ","))
  132 + }
  133 + return nil
  134 +}
  135 +
98 // 返回生产班组服务 136 // 返回生产班组服务
99 func (productGroupService *ProductGroupService) GetProductGroup(getProductGroupQuery *query.GetProductGroupQuery) (interface{}, error) { 137 func (productGroupService *ProductGroupService) GetProductGroup(getProductGroupQuery *query.GetProductGroupQuery) (interface{}, error) {
100 if err := getProductGroupQuery.ValidateQuery(); err != nil { 138 if err := getProductGroupQuery.ValidateQuery(); err != nil {
@@ -329,6 +367,11 @@ func (productGroupService *ProductGroupService) UpdateProductGroup(cmd *command. @@ -329,6 +367,11 @@ func (productGroupService *ProductGroupService) UpdateProductGroup(cmd *command.
329 if err := productGroup.Update(tool_funs.SimpleStructToMap(cmd)); err != nil { 367 if err := productGroup.Update(tool_funs.SimpleStructToMap(cmd)); err != nil {
330 return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error()) 368 return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
331 } 369 }
  370 +
  371 + if err := productGroupService.MemberInOtherGroup(transactionContext, productGroup, members); err != nil {
  372 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  373 + }
  374 +
332 if productGroup, err := productGroupRepository.Save(productGroup); err != nil { 375 if productGroup, err := productGroupRepository.Save(productGroup); err != nil {
333 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 376 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
334 } else { 377 } else {
@@ -456,6 +456,20 @@ func (srv *PullDataK3CloudService) PullPrdMo(timeFilter time.Time) error { @@ -456,6 +456,20 @@ func (srv *PullDataK3CloudService) PullPrdMo(timeFilter time.Time) error {
456 return nil 456 return nil
457 } 457 }
458 458
  459 +// 同步产品
  460 +func (srv *PullDataK3CloudService) SyncDataProduct(ptr *pgTransaction.TransactionContext, fromTime time.Time) error {
  461 + prdMoDao, err := dao.NewMaterialK3cloudDao(ptr)
  462 + if err != nil {
  463 + return err
  464 + }
  465 + var userService = domainService.NewUserService()
  466 + org, err := userService.Organization(constant.MANUFACTURE_DEFAULT_ORGID)
  467 + if err != nil {
  468 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  469 + }
  470 + return prdMoDao.SyncDataProductByTime(fromTime, org.OrgName)
  471 +}
  472 +
459 // 同步生产计划 473 // 同步生产计划
460 func (srv *PullDataK3CloudService) SyncDataProductPlan(ptr *pgTransaction.TransactionContext, fromTime time.Time) error { 474 func (srv *PullDataK3CloudService) SyncDataProductPlan(ptr *pgTransaction.TransactionContext, fromTime time.Time) error {
461 /* 475 /*
@@ -464,7 +478,7 @@ func (srv *PullDataK3CloudService) SyncDataProductPlan(ptr *pgTransaction.Transa @@ -464,7 +478,7 @@ func (srv *PullDataK3CloudService) SyncDataProductPlan(ptr *pgTransaction.Transa
464 3.查询是否有重复的批次号 478 3.查询是否有重复的批次号
465 4.有进行更新,其他的插入 479 4.有进行更新,其他的插入
466 */ 480 */
467 - lastTime, err := redis.GetLastK3CloudFetchTime() 481 + lastTime, err := redis.GetLastFetchTime()
468 if err != nil { 482 if err != nil {
469 return err 483 return err
470 } 484 }
@@ -4,6 +4,7 @@ import ( @@ -4,6 +4,7 @@ import (
4 "fmt" 4 "fmt"
5 "strconv" 5 "strconv"
6 "strings" 6 "strings"
  7 + "time"
7 8
8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" 9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
9 10
@@ -129,6 +130,28 @@ func (d *MaterialK3cloudDao) SyncDataProudct(version int64, orgName string) erro @@ -129,6 +130,28 @@ func (d *MaterialK3cloudDao) SyncDataProudct(version int64, orgName string) erro
129 return err 130 return err
130 } 131 }
131 132
  133 +//SyncDataProudct 同步MaterialK3cloud表数据到Product表
  134 +func (d *MaterialK3cloudDao) SyncDataProductByTime(t time.Time, orgName string) error {
  135 + // -- 插入或者更新
  136 + sql := fmt.Sprintf(`INSERT INTO "manufacture"."product"(
  137 + "company_id", "org_id", "product_id", "product_code", "product_name",
  138 + "product_category", "product_spec", "created_at", "updated_at","ext"
  139 + )
  140 + SELECT %v,%v,"join_product_id","number","name","material_group_name",
  141 + json_build_object('unit',specification),now(),now(),json_build_object('orgName','%v')
  142 + FROM "manufacture"."material_k3cloud" WHERE "modify_date">=? AND "material_group_number" LIKE '05%%'
  143 + ON conflict ( product_id ) DO
  144 + UPDATE
  145 + SET (
  146 + "company_id", "org_id", "product_id", "product_code", "product_name",
  147 + "product_category", "updated_at")=(
  148 + EXCLUDED."company_id", EXCLUDED."org_id",EXCLUDED."product_id",
  149 + EXCLUDED."product_code",EXCLUDED."product_name",EXCLUDED."product_category",
  150 + EXCLUDED."updated_at") `, constant.MANUFACTURE_DEFAULT_COMPANYID, constant.MANUFACTURE_DEFAULT_ORGID, orgName)
  151 + _, err := d.transactionContext.PgTx.Exec(sql, t)
  152 + return err
  153 +}
  154 +
132 func (d *MaterialK3cloudDao) GetLastVersion() (int64, error) { 155 func (d *MaterialK3cloudDao) GetLastVersion() (int64, error) {
133 var materialData []models.MaterialK3cloud 156 var materialData []models.MaterialK3cloud
134 err := d.transactionContext.PgTx.Model(&materialData). 157 err := d.transactionContext.PgTx.Model(&materialData).
@@ -8,11 +8,14 @@ import ( @@ -8,11 +8,14 @@ import (
8 ) 8 )
9 9
10 // 获取每日设备运行数据 10 // 获取每日设备运行数据
11 -func GetLastK3CloudFetchTime() (time.Time, error) { 11 +func GetLastFetchTime(args ...string) (time.Time, error) {
12 client := GetRedis() 12 client := GetRedis()
13 key := K3CloudFetchTimeKey() 13 key := K3CloudFetchTimeKey()
14 result := client.Get(key) 14 result := client.Get(key)
15 t, err := result.Int() 15 t, err := result.Int()
  16 + if len(args) > 0 {
  17 + key = args[0]
  18 + }
16 if err == redis.Nil { 19 if err == redis.Nil {
17 if _, err := client.Set(key, time.Now().Unix(), 0).Result(); err != nil { 20 if _, err := client.Set(key, time.Now().Unix(), 0).Result(); err != nil {
18 return time.Time{}, err 21 return time.Time{}, err
@@ -32,3 +35,8 @@ func K3CloudFetchTimeKey() string { @@ -32,3 +35,8 @@ func K3CloudFetchTimeKey() string {
32 str := fmt.Sprintf("%v:k3clound-data:last-fetch:%v-%v", constant.CACHE_PREFIX, constant.MANUFACTURE_DEFAULT_COMPANYID, constant.MANUFACTURE_DEFAULT_ORGID) 35 str := fmt.Sprintf("%v:k3clound-data:last-fetch:%v-%v", constant.CACHE_PREFIX, constant.MANUFACTURE_DEFAULT_COMPANYID, constant.MANUFACTURE_DEFAULT_ORGID)
33 return str 36 return str
34 } 37 }
  38 +
  39 +func MaterialK3cloudFetchTimeKey() string {
  40 + str := fmt.Sprintf("%v:material-k3clound-data:last-fetch:%v-%v", constant.CACHE_PREFIX, constant.MANUFACTURE_DEFAULT_COMPANYID, constant.MANUFACTURE_DEFAULT_ORGID)
  41 + return str
  42 +}
@@ -81,6 +81,16 @@ func (controller *StatisticsController) TaskHandler() func(ctx *context.Context) @@ -81,6 +81,16 @@ func (controller *StatisticsController) TaskHandler() func(ctx *context.Context)
81 case "7": 81 case "7":
82 crontab.AutoTodayWorkshopPlanCompletionRecord(nil) 82 crontab.AutoTodayWorkshopPlanCompletionRecord(nil)
83 break 83 break
  84 + case "8":
  85 + bc := c.Background()
  86 + t := ctx.Input.Query("t")
  87 + if len(t) != 0 {
  88 + if v, err := time.ParseInLocation("2006-01-02 15:04:05", t, time.Local); err == nil {
  89 + bc = c.WithValue(bc, "fromTime", v)
  90 + }
  91 + }
  92 + crontab.SyncProduct(bc)
  93 + break
84 } 94 }
85 Response(ctx, nil, nil) 95 Response(ctx, nil, nil)
86 } 96 }