作者 yangfu

feat: 产品信息同步修改

... ... @@ -57,6 +57,9 @@ func (crontabService *CrontabService) initTask() {
syncProductPlan := task.NewTask("定时同步车间计划", "0 */5 * * * *", SyncProductPlan)
task.AddTask("SyncProductPlan", syncProductPlan)
syncProduct := task.NewTask("定时同步产品信息", "0 */30 * * * *", SyncProduct)
task.AddTask("syncProduct", syncProduct)
}
func (crontabService *CrontabService) StartCrontabTask() {
... ...
package crontab
import (
"context"
"fmt"
"github.com/linmadan/egglib-go/transaction/pg"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/syncdata"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
"time"
)
// SyncProduct 定时同步产品
func SyncProduct(ctx context.Context) error {
defer func() {
if r := recover(); r != nil {
log.Logger.Error(fmt.Sprintf("%v", r))
}
}()
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return err
}
if err := transactionContext.StartTransaction(); err != nil {
return err
}
defer func() {
if err != nil {
log.Logger.Error("【定时同步产品信息】 失败:" + err.Error())
}
transactionContext.RollbackTransaction()
}()
log.Logger.Debug("【定时同步同步产品信息】 启动")
pullK3CloudService := syncdata.PullDataK3CloudService{}
t := ctx.Value("fromTime")
var fromTime time.Time
if t != nil {
if v, ok := t.(time.Time); ok {
fromTime = v
}
}
if fromTime.IsZero() {
fromTime, err = redis.GetLastFetchTime(redis.MaterialK3cloudFetchTimeKey())
if err != nil {
log.Logger.Error(err.Error())
return nil
}
}
if err := pullK3CloudService.SyncDataProduct(transactionContext.(*pg.TransactionContext), fromTime); err != nil {
log.Logger.Error(err.Error())
return nil
}
if err = transactionContext.CommitTransaction(); err != nil {
return err
}
return nil
}
... ...
... ... @@ -12,6 +12,7 @@ import (
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
"sort"
"strings"
"time"
)
... ... @@ -85,6 +86,10 @@ func (productGroupService *ProductGroupService) CreateProductGroup(operateInfo *
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "有重复的生产班组")
}
if err := productGroupService.MemberInOtherGroup(transactionContext, newProductGroup, members); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if productGroup, err := productGroupRepository.Save(newProductGroup); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
... ... @@ -95,6 +100,39 @@ func (productGroupService *ProductGroupService) CreateProductGroup(operateInfo *
}
}
func (ProductGroupService *ProductGroupService) MemberInOtherGroup(transactionContext application.TransactionContext, group *domain.ProductGroup, members []*domain.User) error {
if len(members) == 0 {
return nil
}
productGroupRepository, _, _ := factory.FastPgProductGroup(transactionContext, 0)
_, groups, err := productGroupRepository.Find(map[string]interface{}{"companyId": group.CompanyId, "orgId": group.OrgId})
if err != nil {
return err
}
if len(groups) == 0 {
return nil
}
var userInGroups = make(map[int]*domain.User)
for _, v := range groups {
if group.ProductGroupId > 0 && v.ProductGroupId == group.ProductGroupId {
continue
}
for _, w := range v.GroupMembers {
userInGroups[w.UserId] = w
}
}
var userExists = make([]string, 0)
for _, v := range members {
if u, ok := userInGroups[v.UserId]; ok {
userExists = append(userExists, u.UserName)
}
}
if len(userExists) > 0 {
return fmt.Errorf("不可配置 用户:%v ,请先从其他生产班组中移除", strings.Join(userExists, ","))
}
return nil
}
// 返回生产班组服务
func (productGroupService *ProductGroupService) GetProductGroup(getProductGroupQuery *query.GetProductGroupQuery) (interface{}, error) {
if err := getProductGroupQuery.ValidateQuery(); err != nil {
... ... @@ -329,6 +367,11 @@ func (productGroupService *ProductGroupService) UpdateProductGroup(cmd *command.
if err := productGroup.Update(tool_funs.SimpleStructToMap(cmd)); err != nil {
return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
}
if err := productGroupService.MemberInOtherGroup(transactionContext, productGroup, members); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if productGroup, err := productGroupRepository.Save(productGroup); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
... ...
... ... @@ -456,6 +456,20 @@ func (srv *PullDataK3CloudService) PullPrdMo(timeFilter time.Time) error {
return nil
}
// 同步产品
func (srv *PullDataK3CloudService) SyncDataProduct(ptr *pgTransaction.TransactionContext, fromTime time.Time) error {
prdMoDao, err := dao.NewMaterialK3cloudDao(ptr)
if err != nil {
return err
}
var userService = domainService.NewUserService()
org, err := userService.Organization(constant.MANUFACTURE_DEFAULT_ORGID)
if err != nil {
return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
return prdMoDao.SyncDataProductByTime(fromTime, org.OrgName)
}
// 同步生产计划
func (srv *PullDataK3CloudService) SyncDataProductPlan(ptr *pgTransaction.TransactionContext, fromTime time.Time) error {
/*
... ... @@ -464,7 +478,7 @@ func (srv *PullDataK3CloudService) SyncDataProductPlan(ptr *pgTransaction.Transa
3.查询是否有重复的批次号
4.有进行更新,其他的插入
*/
lastTime, err := redis.GetLastK3CloudFetchTime()
lastTime, err := redis.GetLastFetchTime()
if err != nil {
return err
}
... ...
... ... @@ -4,6 +4,7 @@ import (
"fmt"
"strconv"
"strings"
"time"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
... ... @@ -129,6 +130,28 @@ func (d *MaterialK3cloudDao) SyncDataProudct(version int64, orgName string) erro
return err
}
//SyncDataProudct 同步MaterialK3cloud表数据到Product表
func (d *MaterialK3cloudDao) SyncDataProductByTime(t time.Time, orgName string) error {
// -- 插入或者更新
sql := fmt.Sprintf(`INSERT INTO "manufacture"."product"(
"company_id", "org_id", "product_id", "product_code", "product_name",
"product_category", "product_spec", "created_at", "updated_at","ext"
)
SELECT %v,%v,"join_product_id","number","name","material_group_name",
json_build_object('unit',specification),now(),now(),json_build_object('orgName','%v')
FROM "manufacture"."material_k3cloud" WHERE "modify_date">=? AND "material_group_number" LIKE '05%%'
ON conflict ( product_id ) DO
UPDATE
SET (
"company_id", "org_id", "product_id", "product_code", "product_name",
"product_category", "updated_at")=(
EXCLUDED."company_id", EXCLUDED."org_id",EXCLUDED."product_id",
EXCLUDED."product_code",EXCLUDED."product_name",EXCLUDED."product_category",
EXCLUDED."updated_at") `, constant.MANUFACTURE_DEFAULT_COMPANYID, constant.MANUFACTURE_DEFAULT_ORGID, orgName)
_, err := d.transactionContext.PgTx.Exec(sql, t)
return err
}
func (d *MaterialK3cloudDao) GetLastVersion() (int64, error) {
var materialData []models.MaterialK3cloud
err := d.transactionContext.PgTx.Model(&materialData).
... ...
... ... @@ -8,11 +8,14 @@ import (
)
// 获取每日设备运行数据
func GetLastK3CloudFetchTime() (time.Time, error) {
func GetLastFetchTime(args ...string) (time.Time, error) {
client := GetRedis()
key := K3CloudFetchTimeKey()
result := client.Get(key)
t, err := result.Int()
if len(args) > 0 {
key = args[0]
}
if err == redis.Nil {
if _, err := client.Set(key, time.Now().Unix(), 0).Result(); err != nil {
return time.Time{}, err
... ... @@ -32,3 +35,8 @@ func K3CloudFetchTimeKey() string {
str := fmt.Sprintf("%v:k3clound-data:last-fetch:%v-%v", constant.CACHE_PREFIX, constant.MANUFACTURE_DEFAULT_COMPANYID, constant.MANUFACTURE_DEFAULT_ORGID)
return str
}
func MaterialK3cloudFetchTimeKey() string {
str := fmt.Sprintf("%v:material-k3clound-data:last-fetch:%v-%v", constant.CACHE_PREFIX, constant.MANUFACTURE_DEFAULT_COMPANYID, constant.MANUFACTURE_DEFAULT_ORGID)
return str
}
... ...
... ... @@ -81,6 +81,16 @@ func (controller *StatisticsController) TaskHandler() func(ctx *context.Context)
case "7":
crontab.AutoTodayWorkshopPlanCompletionRecord(nil)
break
case "8":
bc := c.Background()
t := ctx.Input.Query("t")
if len(t) != 0 {
if v, err := time.ParseInLocation("2006-01-02 15:04:05", t, time.Local); err == nil {
bc = c.WithValue(bc, "fromTime", v)
}
}
crontab.SyncProduct(bc)
break
}
Response(ctx, nil, nil)
}
... ...