作者 yangfu

feat: 领料、退料统计

正在显示 43 个修改的文件 包含 2416 行增加10 行删除
... ... @@ -13,6 +13,7 @@ require (
github.com/go-redis/redis v6.15.7+incompatible
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/uuid v1.3.0
github.com/hibiken/asynq v0.21.0
github.com/imkira/go-interpol v1.1.0 // indirect
github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7
github.com/moul/http2curl v1.0.0 // indirect
... ... @@ -29,6 +30,7 @@ require (
github.com/yudai/gojsondiff v1.0.0 // indirect
github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect
github.com/yudai/pp v2.0.1+incompatible // indirect
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1
golang.org/x/text v0.3.6
)
... ...
... ... @@ -61,6 +61,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dchest/siphash v1.2.1/go.mod h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBlVnOnt4=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU=
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
... ... @@ -112,6 +114,8 @@ github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8w
github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U=
github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
github.com/go-redis/redis/v8 v8.11.2 h1:WqlSpAwz8mxDSMCvbyz1Mkiqe0LE5OY4j3lgkvu1Ts0=
github.com/go-redis/redis/v8 v8.11.2/go.mod h1:DLomh7y2e3ggQXQLd1YgmvIfecPJoFl7WU5SOQ/r06M=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
... ... @@ -154,8 +158,9 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
... ... @@ -163,6 +168,7 @@ github.com/google/gops v0.3.7/go.mod h1:bj0cwMmX1X4XIJFTjR99R5sCxNssNJ8HebFNvoQl
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
... ... @@ -180,6 +186,8 @@ github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hibiken/asynq v0.21.0 h1:uH9XogJhjq/S39E0/DEPWLZQ6hHJ73UiblZTe4RzHwA=
github.com/hibiken/asynq v0.21.0/go.mod h1:tyc63ojaW8SJ5SBm8mvI4DDONsguP5HE85EEl4Qr5Ig=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/iancoleman/strcase v0.1.2/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk=
... ... @@ -266,6 +274,7 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=
github.com/onsi/ginkgo v1.15.2 h1:l77YT15o814C2qVL47NOyjV/6RbaP7kKdrvZnxQ3Org=
github.com/onsi/ginkgo v1.15.2/go.mod h1:Dd6YFfwBW84ETqqtL0CPyPXillHgY6XhQH3uuCCTr/o=
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
... ... @@ -273,6 +282,7 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
github.com/onsi/gomega v1.11.0 h1:+CqWgvj0OZycCaqclBD1pxKHAU+tOkHmQIWvDHq2aug=
github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
... ... @@ -314,6 +324,8 @@ github.com/richardlehane/mscfb v1.0.3 h1:rD8TBkYWkObWO0oLDFCbwMeZ4KoalxQy+QgniCj
github.com/richardlehane/mscfb v1.0.3/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
github.com/richardlehane/msoleps v1.0.1 h1:RfrALnSNXzmXLbGct/P2b4xkFz4e8Gmj/0Vj9M9xC1o=
github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
... ... @@ -340,6 +352,8 @@ github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
... ... @@ -432,6 +446,8 @@ go.opentelemetry.io/otel/trace v0.19.0/go.mod h1:4IXiNextNOpPnRlI4ryK69mn5iC84bj
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/automaxprocs v1.3.0 h1:II28aZoGdaglS5vVNnspf28lnZpXScxtIozx1lAjdb0=
go.uber.org/automaxprocs v1.3.0/go.mod h1:9CWT6lKIep8U41DDaPiH6eFscnTyjfTANNQNx6LrIcA=
go.uber.org/goleak v0.10.0 h1:G3eWbSNIskeRqtsN/1uI5B+eP73y3JUuBsv9AZjehb4=
go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
... ... @@ -540,6 +556,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
... ...
... ... @@ -2,6 +2,7 @@ package main
import (
"fmt"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/task"
"github.com/beego/beego/v2/server/web"
"github.com/linmadan/egglib-go/log/logrus"
... ... @@ -34,9 +35,11 @@ func main() {
log.Logger.AddHook(bw)
redis.InitRedis()
go mqtt.Start()
go task.Run()
cron := crontab.NewCrontabService(nil)
cron.StartCrontabTask()
defer cron.StopCrontabTask()
log.Logger.Info("server start!")
web.Run()
log.Logger.Info("server stop!")
}
... ...
... ... @@ -140,7 +140,7 @@ func FastPgProductGroup(transactionContext application.TransactionContext, id in
rep = value
}
if id > 0 {
if mod, err = rep.FindOne(map[string]interface{}{"productJobId": id}); err != nil {
if mod, err = rep.FindOne(map[string]interface{}{"productGroupId": id}); err != nil {
if err == domain.ErrorNotFound {
return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该生产班组不存在")
}
... ... @@ -169,7 +169,7 @@ func FastPgProduct(transactionContext application.TransactionContext, id int, op
rep = value
}
if id > 0 {
if mod, err = rep.FindOne(map[string]interface{}{"productJobId": id}); err != nil {
if mod, err = rep.FindOne(map[string]interface{}{"productId": id}); err != nil {
if err == domain.ErrorNotFound {
return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该产品不存在")
}
... ... @@ -195,7 +195,7 @@ func FastPgDevice(transactionContext application.TransactionContext, id int, opt
rep = value
}
if id > 0 {
if mod, err = rep.FindOne(map[string]interface{}{"productJobId": id}); err != nil {
if mod, err = rep.FindOne(map[string]interface{}{"deviceId": id}); err != nil {
if err == domain.ErrorNotFound {
return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该设备档案不存在")
}
... ... @@ -221,7 +221,7 @@ func FastPgProductCalendar(transactionContext application.TransactionContext, id
rep = value
}
if id > 0 {
if mod, err = rep.FindOne(map[string]interface{}{"productJobId": id}); err != nil {
if mod, err = rep.FindOne(map[string]interface{}{"productCalendar": id}); err != nil {
if err == domain.ErrorNotFound {
return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该车间日历不存在")
}
... ... @@ -247,7 +247,7 @@ func FastPgUnitConversion(transactionContext application.TransactionContext, id
rep = value
}
if id > 0 {
if mod, err = rep.FindOne(map[string]interface{}{"productJobId": id}); err != nil {
if mod, err = rep.FindOne(map[string]interface{}{"unitConversionId": id}); err != nil {
if err == domain.ErrorNotFound {
return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该单位换算不存在")
}
... ... @@ -309,6 +309,32 @@ func FastPgAttendance(transactionContext application.TransactionContext, id int,
return rep, mod, err
}
// FastPgProductRecord 快速返回生产记录
//
// transactionContext 事务
// id 对象唯一标识
func FastPgProductRecord(transactionContext application.TransactionContext, id int, options ...option) (domain.ProductRecordRepository, *domain.ProductRecord, error) {
var rep domain.ProductRecordRepository
var mod *domain.ProductRecord
var err error
if value, err := CreateProductRecordRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
rep = value
}
if id > 0 {
if mod, err = rep.FindOne(map[string]interface{}{"productRecordId": id}); err != nil {
if err == domain.ErrorNotFound {
return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该记录不存在")
}
return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
}
return rep, mod, err
}
/***** 2.配置 *****/
type FastOptions struct {
... ...
... ... @@ -85,3 +85,11 @@ func CreateWorkshopRepository(options map[string]interface{}) (domain.WorkshopRe
}
return repository.NewWorkshopRepository(transactionContext)
}
func CreateEmployeeProductRecordRepository(options map[string]interface{}) (domain.EmployeeProductRecordRepository, error) {
var transactionContext *pg.TransactionContext
if value, ok := options["transactionContext"]; ok {
transactionContext = value.(*pg.TransactionContext)
}
return repository.NewEmployeeProductRecordRepository(transactionContext)
}
... ...
package command
import (
"fmt"
"reflect"
"strings"
"github.com/beego/beego/v2/core/validation"
)
type ApproveProductRecordCommand struct {
// 生产记录ID
ProductRecordId int `cname:"生产记录ID" json:"productRecordId" valid:"Required"`
// 审核人
ApproveUserId int `cname:"审核人" json:"approveUserId" valid:"Required"`
// 审核后重量
WeighAfter float64 `cname:"审核后重量" json:"weighAfter" valid:"Required"`
// 审核时间
ApproveAt string `cname:"审核时间" json:"approveAt" valid:"Required"`
}
func (approveProductRecordCommand *ApproveProductRecordCommand) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (approveProductRecordCommand *ApproveProductRecordCommand) ValidateCommand() error {
valid := validation.Validation{}
b, err := valid.Valid(approveProductRecordCommand)
if err != nil {
return err
}
if !b {
elem := reflect.TypeOf(approveProductRecordCommand).Elem()
for _, validErr := range valid.Errors {
field, isExist := elem.FieldByName(validErr.Field)
if isExist {
return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
} else {
return fmt.Errorf(validErr.Message)
}
}
}
return nil
}
... ...
package command
import (
"fmt"
"reflect"
"strings"
"github.com/beego/beego/v2/core/validation"
)
type CreateProductRecordCommand struct {
// 生产记录ID
ProductRecordId int `cname:"生产记录ID" json:"productRecordId" valid:"Required"`
}
func (createProductRecordCommand *CreateProductRecordCommand) Valid(validation *validation.Validation) {
validation.SetError("CustomValid", "未实现的自定义认证")
}
func (createProductRecordCommand *CreateProductRecordCommand) ValidateCommand() error {
valid := validation.Validation{}
b, err := valid.Valid(createProductRecordCommand)
if err != nil {
return err
}
if !b {
elem := reflect.TypeOf(createProductRecordCommand).Elem()
for _, validErr := range valid.Errors {
field, isExist := elem.FieldByName(validErr.Field)
if isExist {
return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
} else {
return fmt.Errorf(validErr.Message)
}
}
}
return nil
}
... ...
package command
import (
"fmt"
"github.com/beego/beego/v2/core/validation"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"reflect"
"strings"
)
type ProductRecordStaticsCommand struct {
*domain.ProductRecord
}
// Type is a string value that indicates the type of the task.
//func (t *ProductRecordStaticsCommand) Type() string
// Payload is the data needed for task execution.
//func (t *ProductRecordStaticsCommand) Payload() []byte
func (removeProductRecordCommand *ProductRecordStaticsCommand) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (removeProductRecordCommand *ProductRecordStaticsCommand) ValidateCommand() error {
valid := validation.Validation{}
b, err := valid.Valid(removeProductRecordCommand)
if err != nil {
return err
}
if !b {
elem := reflect.TypeOf(removeProductRecordCommand).Elem()
for _, validErr := range valid.Errors {
field, isExist := elem.FieldByName(validErr.Field)
if isExist {
return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
} else {
return fmt.Errorf(validErr.Message)
}
}
}
return nil
}
... ...
package command
import (
"fmt"
"reflect"
"strings"
"github.com/beego/beego/v2/core/validation"
)
type RemoveProductRecordCommand struct {
// 生产记录ID
ProductRecordId int `cname:"生产记录ID" json:"productRecordId" valid:"Required"`
}
func (removeProductRecordCommand *RemoveProductRecordCommand) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (removeProductRecordCommand *RemoveProductRecordCommand) ValidateCommand() error {
valid := validation.Validation{}
b, err := valid.Valid(removeProductRecordCommand)
if err != nil {
return err
}
if !b {
elem := reflect.TypeOf(removeProductRecordCommand).Elem()
for _, validErr := range valid.Errors {
field, isExist := elem.FieldByName(validErr.Field)
if isExist {
return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
} else {
return fmt.Errorf(validErr.Message)
}
}
}
return nil
}
... ...
package command
import (
"fmt"
"reflect"
"strings"
"github.com/beego/beego/v2/core/validation"
)
type UpdateProductRecordCommand struct {
// 生产记录ID
ProductRecordId int `cname:"生产记录ID" json:"productRecordId" valid:"Required"`
}
func (updateProductRecordCommand *UpdateProductRecordCommand) Valid(validation *validation.Validation) {
validation.SetError("CustomValid", "未实现的自定义认证")
}
func (updateProductRecordCommand *UpdateProductRecordCommand) ValidateCommand() error {
valid := validation.Validation{}
b, err := valid.Valid(updateProductRecordCommand)
if err != nil {
return err
}
if !b {
elem := reflect.TypeOf(updateProductRecordCommand).Elem()
for _, validErr := range valid.Errors {
field, isExist := elem.FieldByName(validErr.Field)
if isExist {
return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
} else {
return fmt.Errorf(validErr.Message)
}
}
}
return nil
}
... ...
package dto
import "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
type EmployeeProductRecordDto struct {
// 员工产能记录ID
EmployeeProductRecordId int `json:"employeeProductRecordId"`
// 生产工人
ProductWorker *domain.User `json:"productWorker,omitempty"`
*domain.WorkStation
// 生产日期
//ProductDate string `json:"productDate"`
// 计划的产品名称
PlanProductName string `json:"planProductName,omitempty"`
// 批号
BatchNumber string `json:"batchNumber,omitempty"`
// 参与类型 1:正常 2:支援
ParticipateType int `json:"participateType"`
// 产能
ProductWeigh float64 `json:"productWeigh"`
// 二级品产能
SecondLevelWeigh float64 `json:"secondLevelWeigh"`
// 创建时间
CreatedAt string `json:"createdAt,omitempty"`
// 组织名称
OrgName string `json:"orgName"`
// 权限标识 (当前登录组织匹配为true,否则false)
AuthFlag bool `json:"authFlag"`
// 合格率 百分比
QualificationRate int `json:"qualificationRate"`
}
func (d *EmployeeProductRecordDto) LoadDto(m *domain.EmployeeProductRecord, orgId int) *EmployeeProductRecordDto {
d.EmployeeProductRecordId = m.EmployeeProductRecordId
d.ProductWorker = m.ProductWorker
d.WorkStation = m.WorkStation
d.PlanProductName = m.ProductRecordInfo.PlanProductName
d.BatchNumber = m.ProductRecordInfo.BatchNumber
d.ParticipateType = m.ParticipateType
d.ProductWeigh = m.RealProductWeigh()
d.SecondLevelWeigh = m.SecondLevelWeigh
d.QualificationRate = m.QualificationRate()
d.CreatedAt = m.CreatedAt.Format("06-01-02")
d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId)
if m.Ext != nil {
d.OrgName = m.Ext.OrgName
}
return d
}
... ...
package dto
import (
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"time"
)
// 二级品记录
type ProductLevelTwoRecord struct {
// 生产记录ID
ProductRecordId int `json:"productRecordId,omitempty"`
// 生产工人
ProductWorker *domain.User `json:"productWorker,omitempty"`
*domain.WorkStation
// 上班班次 1:全天 2:白班 4:中班 8:夜班
WorkOn int `json:"workOn"`
// 产能 - 审核前
WeighBefore float64 `json:"weighBefore"`
// 产能-审核后
WeighAfter float64 `json:"weighAfter"`
// 审核状态 1:未审核 2:已审核
ApproveStatus int64 `json:"approveStatus"`
// 审核时间
ApproveAt string `json:"approveAt"`
// 计划的产品名称
PlanProductName string `json:"planProductName,omitempty"`
// 批号
BatchNumber string `json:"batchNumber,omitempty"`
// 创建时间
CreatedAt string `json:"createdAt,omitempty"`
// 组织名称
OrgName string `json:"orgName"`
// 权限标识 (当前登录组织匹配为true,否则false)
AuthFlag bool `json:"authFlag"`
}
func (d *ProductLevelTwoRecord) LoadDto(m *domain.ProductRecord, orgId int) *ProductLevelTwoRecord {
d.ProductRecordId = m.ProductRecordId
d.ProductWorker = m.ProductWorker
d.WorkStation = m.WorkStation
d.WeighBefore = m.ProductRecordInfo.WeighBefore
d.WeighAfter = m.ProductRecordInfo.WeighAfter
d.ApproveStatus = m.ProductRecordInfo.ApproveStatus
if m.ProductRecordInfo.ApproveAt > 0 {
d.ApproveAt = time.Unix(m.ProductRecordInfo.ApproveAt, 0).Format("2006-01-02 15:04:05")
}
d.PlanProductName = m.ProductRecordInfo.PlanProductName
d.BatchNumber = m.ProductRecordInfo.BatchNumber
d.CreatedAt = m.CreatedAt.Format("2006-01-02")
d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId)
if m.Ext != nil {
d.OrgName = m.Ext.OrgName
}
return d
}
... ...
package query
import (
"fmt"
"reflect"
"strings"
"github.com/beego/beego/v2/core/validation"
)
type GetProductRecordQuery struct {
// 生产记录ID
ProductRecordId int `cname:"生产记录ID" json:"productRecordId" valid:"Required"`
}
func (getProductRecordQuery *GetProductRecordQuery) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (getProductRecordQuery *GetProductRecordQuery) ValidateQuery() error {
valid := validation.Validation{}
b, err := valid.Valid(getProductRecordQuery)
if err != nil {
return err
}
if !b {
elem := reflect.TypeOf(getProductRecordQuery).Elem()
for _, validErr := range valid.Errors {
field, isExist := elem.FieldByName(validErr.Field)
if isExist {
return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
} else {
return fmt.Errorf(validErr.Message)
}
}
}
return nil
}
... ...
package query
import (
"fmt"
"reflect"
"strings"
"github.com/beego/beego/v2/core/validation"
)
type ListProductRecordQuery struct {
// 查询偏离量
Offset int `cname:"查询偏离量" json:"offset" valid:"Required"`
// 查询限制
Limit int `cname:"查询限制" json:"limit" valid:"Required"`
}
func (listProductRecordQuery *ListProductRecordQuery) Valid(validation *validation.Validation) {
//validation.SetError("CustomValid", "未实现的自定义认证")
}
func (listProductRecordQuery *ListProductRecordQuery) ValidateQuery() error {
valid := validation.Validation{}
b, err := valid.Valid(listProductRecordQuery)
if err != nil {
return err
}
if !b {
elem := reflect.TypeOf(listProductRecordQuery).Elem()
for _, validErr := range valid.Errors {
field, isExist := elem.FieldByName(validErr.Field)
if isExist {
return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
} else {
return fmt.Errorf(validErr.Message)
}
}
}
return nil
}
... ...
package query
import (
"fmt"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
"reflect"
"strings"
"time"
"github.com/beego/beego/v2/core/validation"
)
type SearchEmployeeProductRecordQuery struct {
// 查询偏离量
Offset int `cname:"查询偏离量" json:"offset"`
// 查询限制
Limit int `cname:"查询限制" json:"limit"`
// 当前公司
CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"`
// 当前登录的组织
OrgId int `cname:"当前登录的组织" json:"orgId,omitempty"`
// 匹配多个组织
InOrgIds []int `cname:"匹配多个组织" json:"inOrgIds,omitempty"`
// 页码
PageNumber int `cname:"页码" json:"pageNumber,omitempty"`
// 页数
PageSize int `cname:"页数" json:"pageSize,omitempty"`
// 车间名称
WorkshopName string `cname:"车间名称" json:"workshopName,omitempty"`
// 生产线名称
LineName string `cname:"生产线名称" json:"lineName,omitempty"`
// 工段名称
SectionName string `cname:"工段名称" json:"sectionName,omitempty"`
// 姓名
UserName string `cname:"姓名" json:"userName"`
// 员工类型 1:固定 2:派遣 3.临时
EmployeeType string `cname:"员工类型 1:固定 2:派遣 3.临时" json:"employeeType"`
// 开始时间
BeginTime string `cname:"开始时间" json:"beginTime"`
// 结束时间
EndTime string `cname:"结束时间" json:"endTime"`
// 开始时间
ProductBeginTime time.Time `cname:"开始时间" json:"productBeginTime"`
// 结束时间
ProductEndTime time.Time `cname:"结束时间" json:"productEndTime"`
}
func (cmd *SearchEmployeeProductRecordQuery) Valid(validation *validation.Validation) {
cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize)
var err error
if len(cmd.BeginTime) > 0 {
if cmd.ProductBeginTime, err = time.Parse("2006-01-02 15:04:05", cmd.BeginTime); err != nil {
log.Logger.Error(err.Error())
validation.Error("开始时间有误")
return
}
}
if len(cmd.EndTime) > 0 {
if cmd.ProductEndTime, err = time.Parse("2006-01-02 15:04:05", cmd.EndTime); err != nil {
log.Logger.Error(err.Error())
validation.Error("结束时间有误")
return
}
}
}
func (cmd *SearchEmployeeProductRecordQuery) ValidateQuery() error {
valid := validation.Validation{}
b, err := valid.Valid(cmd)
if err != nil {
return err
}
if !b {
elem := reflect.TypeOf(cmd).Elem()
for _, validErr := range valid.Errors {
field, isExist := elem.FieldByName(validErr.Field)
if isExist {
return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
} else {
return fmt.Errorf(validErr.Message)
}
}
}
return nil
}
... ...
package query
import (
"fmt"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"reflect"
"strings"
"github.com/beego/beego/v2/core/validation"
)
type SearchProductRecordQuery struct {
// 查询偏离量
Offset int `cname:"查询偏离量" json:"offset"`
// 查询限制
Limit int `cname:"查询限制" json:"limit"`
// 当前公司
CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"`
// 当前登录的组织
OrgId int `cname:"当前登录的组织" json:"orgId,omitempty"`
// 匹配多个组织
InOrgIds []int `cname:"匹配多个组织" json:"inOrgIds,omitempty"`
// 页码
PageNumber int `cname:"页码" json:"pageNumber,omitempty"`
// 页数
PageSize int `cname:"页数" json:"pageSize,omitempty"`
// 车间名称
WorkshopName string `cname:"车间名称" json:"workshopName"`
// 批号
BatchNumber string `cname:"批号" json:"batchNumber"`
// 姓名
UserName string `cname:"姓名" json:"userName"`
}
func (cmd *SearchProductRecordQuery) Valid(validation *validation.Validation) {
cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize)
}
func (cmd *SearchProductRecordQuery) ValidateQuery() error {
valid := validation.Validation{}
b, err := valid.Valid(cmd)
if err != nil {
return err
}
if !b {
elem := reflect.TypeOf(cmd).Elem()
for _, validErr := range valid.Errors {
field, isExist := elem.FieldByName(validErr.Field)
if isExist {
return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
} else {
return fmt.Errorf(validErr.Message)
}
}
}
return nil
}
... ...
package query
import (
"fmt"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
"reflect"
"strings"
"time"
"github.com/beego/beego/v2/core/validation"
)
type SearchWorkshopProductRecordQuery struct {
// 查询偏离量
Offset int `cname:"查询偏离量" json:"offset"`
// 查询限制
Limit int `cname:"查询限制" json:"limit"`
// 当前公司
CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"`
// 当前登录的组织
OrgId int `cname:"当前登录的组织" json:"orgId,omitempty"`
// 匹配多个组织
InOrgIds []int `cname:"匹配多个组织" json:"inOrgIds,omitempty"`
// 页码
PageNumber int `cname:"页码" json:"pageNumber,omitempty"`
// 页数
PageSize int `cname:"页数" json:"pageSize,omitempty"`
// 品名
PlanProductName string `cname:"品名" json:"planProductName,omitempty"`
// 工段名称
SectionName string `cname:"工段名称" json:"sectionName,omitempty"`
// 开始时间
BeginTime string `cname:"开始时间" json:"beginTime"`
// 结束时间
EndTime string `cname:"结束时间" json:"endTime"`
// 开始时间
ProductBeginTime time.Time `cname:"开始时间" json:"productBeginTime"`
// 结束时间
ProductEndTime time.Time `cname:"结束时间" json:"productEndTime"`
}
func (cmd *SearchWorkshopProductRecordQuery) Valid(validation *validation.Validation) {
cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize)
var err error
if len(cmd.BeginTime) > 0 {
if cmd.ProductBeginTime, err = time.Parse("2006-01-02 15:04:05", cmd.BeginTime); err != nil {
log.Logger.Error(err.Error())
validation.Error("开始时间有误")
return
}
}
if len(cmd.EndTime) > 0 {
if cmd.ProductEndTime, err = time.Parse("2006-01-02 15:04:05", cmd.EndTime); err != nil {
log.Logger.Error(err.Error())
validation.Error("结束时间有误")
return
}
}
}
func (cmd *SearchWorkshopProductRecordQuery) ValidateQuery() error {
valid := validation.Validation{}
b, err := valid.Valid(cmd)
if err != nil {
return err
}
if !b {
elem := reflect.TypeOf(cmd).Elem()
for _, validErr := range valid.Errors {
field, isExist := elem.FieldByName(validErr.Field)
if isExist {
return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
} else {
return fmt.Errorf(validErr.Message)
}
}
}
return nil
}
... ...
package service
import (
"github.com/linmadan/egglib-go/core/application"
pgTransaction "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/productRecord/dto"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/query"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
)
// 返回员工生产记录服务列表
func (productRecordService *ProductRecordService) SearchEmployeeProductRecord(operateInfo *domain.OperateInfo, listProductRecordQuery *query.SearchEmployeeProductRecordQuery) (int64, interface{}, error) {
if err := listProductRecordQuery.ValidateQuery(); err != nil {
return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
//var productRecordRepository domain.ProductRecordRepository
//productRecordRepository,_,_ = factory.FastPgProductRecord(transactionContext,0)
productRecordRepository, _ := dao.NewEmployeeProductRecordDao(transactionContext.(*pgTransaction.TransactionContext))
options := utils.ObjectToMap(listProductRecordQuery)
count, productRecords, err := productRecordRepository.SearchEmployeeProductRecord(options)
if err != nil {
return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if err := transactionContext.CommitTransaction(); err != nil {
return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
var result = make([]*dto.EmployeeProductRecordDto, 0)
for i := range productRecords {
item := productRecords[i]
newItem := &dto.EmployeeProductRecordDto{}
newItem.LoadDto(item, operateInfo.OrgId)
result = append(result, newItem)
}
return count, result, nil
}
... ...
package service
import (
"fmt"
"github.com/linmadan/egglib-go/core/application"
pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
"github.com/linmadan/egglib-go/utils/tool_funs"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/command"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/dto"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/query"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
"time"
)
// 生产记录服务
type ProductRecordService struct {
}
// 生产记录审核
func (productRecordService *ProductRecordService) ApproveProductRecord(cmd *command.ApproveProductRecordCommand) (interface{}, error) {
if err := cmd.ValidateCommand(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
svr, err := domainService.NewPGProductRecordService(transactionContext.(*pgTransaction.TransactionContext))
if _, err = svr.Approve(cmd.ProductRecordId, cmd.ApproveUserId, cmd.WeighAfter, time.Now()); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return struct{}{}, nil
}
// 创建生产记录服务
func (productRecordService *ProductRecordService) CreateProductRecord(createProductRecordCommand *command.CreateProductRecordCommand) (interface{}, error) {
if err := createProductRecordCommand.ValidateCommand(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
newProductRecord := &domain.ProductRecord{
ProductRecordId: createProductRecordCommand.ProductRecordId,
}
var productRecordRepository domain.ProductRecordRepository
if value, err := factory.CreateProductRecordRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
productRecordRepository = value
}
if productRecord, err := productRecordRepository.Save(newProductRecord); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return productRecord, nil
}
}
// 返回生产记录服务
func (productRecordService *ProductRecordService) GetProductRecord(getProductRecordQuery *query.GetProductRecordQuery) (interface{}, error) {
if err := getProductRecordQuery.ValidateQuery(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
var productRecordRepository domain.ProductRecordRepository
if value, err := factory.CreateProductRecordRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
productRecordRepository = value
}
productRecord, err := productRecordRepository.FindOne(map[string]interface{}{"productRecordId": getProductRecordQuery.ProductRecordId})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if productRecord == nil {
return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(getProductRecordQuery.ProductRecordId)))
} else {
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
var result = &dto.ProductLevelTwoRecord{}
return result.LoadDto(productRecord, productRecord.OrgId), nil
}
}
// 返回生产记录服务列表
func (productRecordService *ProductRecordService) ListProductRecord(listProductRecordQuery *query.ListProductRecordQuery) (interface{}, error) {
if err := listProductRecordQuery.ValidateQuery(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
var productRecordRepository domain.ProductRecordRepository
if value, err := factory.CreateProductRecordRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
productRecordRepository = value
}
if count, productRecords, err := productRecordRepository.Find(tool_funs.SimpleStructToMap(listProductRecordQuery)); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return map[string]interface{}{
"count": count,
"productRecords": productRecords,
}, nil
}
}
// 移除生产记录服务
func (productRecordService *ProductRecordService) RemoveProductRecord(removeProductRecordCommand *command.RemoveProductRecordCommand) (interface{}, error) {
if err := removeProductRecordCommand.ValidateCommand(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
var productRecordRepository domain.ProductRecordRepository
if value, err := factory.CreateProductRecordRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
productRecordRepository = value
}
productRecord, err := productRecordRepository.FindOne(map[string]interface{}{"productRecordId": removeProductRecordCommand.ProductRecordId})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if productRecord == nil {
return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeProductRecordCommand.ProductRecordId)))
}
if productRecord, err := productRecordRepository.Remove(productRecord); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return productRecord, nil
}
}
// 更新生产记录服务
func (productRecordService *ProductRecordService) UpdateProductRecord(updateProductRecordCommand *command.UpdateProductRecordCommand) (interface{}, error) {
if err := updateProductRecordCommand.ValidateCommand(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
var productRecordRepository domain.ProductRecordRepository
if value, err := factory.CreateProductRecordRepository(map[string]interface{}{
"transactionContext": transactionContext,
}); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
productRecordRepository = value
}
productRecord, err := productRecordRepository.FindOne(map[string]interface{}{"productRecordId": updateProductRecordCommand.ProductRecordId})
if err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if productRecord == nil {
return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(updateProductRecordCommand.ProductRecordId)))
}
if err := productRecord.Update(tool_funs.SimpleStructToMap(updateProductRecordCommand)); err != nil {
return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
}
if productRecord, err := productRecordRepository.Save(productRecord); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
} else {
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return productRecord, nil
}
}
// 返回生产记录服务列表
func (productRecordService *ProductRecordService) SearchProductRecord(operateInfo *domain.OperateInfo, listProductRecordQuery *query.SearchProductRecordQuery) (int64, interface{}, error) {
if err := listProductRecordQuery.ValidateQuery(); err != nil {
return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
var productRecordRepository domain.ProductRecordRepository
productRecordRepository, _, _ = factory.FastPgProductRecord(transactionContext, 0)
count, productRecords, err := productRecordRepository.Find(utils.ObjectToMap(listProductRecordQuery))
if err != nil {
return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if err := transactionContext.CommitTransaction(); err != nil {
return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
var result = make([]*dto.ProductLevelTwoRecord, 0)
for i := range productRecords {
item := productRecords[i]
newItem := &dto.ProductLevelTwoRecord{}
newItem.LoadDto(item, operateInfo.OrgId)
result = append(result, newItem)
}
return count, result, nil
}
// 生产记录统计
func (productRecordService *ProductRecordService) ProductRecordStatics(cmd *command.ProductRecordStaticsCommand) (interface{}, error) {
if err := cmd.ValidateCommand(); err != nil {
return nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
var _ domain.ProductRecordRepository
var productRecord *domain.ProductRecord = cmd.ProductRecord
//_,productRecord,err = factory.FastPgProductRecord(transactionContext,cmd.ProductRecordId)
//if err!=nil{
// log.Logger.Error(err.Error())
// return nil, nil
//}
//
if productRecord == nil {
return nil, nil
}
svr, _ := domainService.NewPGProductRecordService(transactionContext.(*pgTransaction.TransactionContext))
if _, err = svr.EmployeeProductStatics(productRecord); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if err := transactionContext.CommitTransaction(); err != nil {
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
return nil, nil
}
func NewProductRecordService(options map[string]interface{}) *ProductRecordService {
newProductRecordService := &ProductRecordService{}
return newProductRecordService
}
... ...
package service
import (
"github.com/linmadan/egglib-go/core/application"
pgTransaction "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/productRecord/dto"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/query"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
)
// 返回员工生产记录服务列表
func (productRecordService *ProductRecordService) SearchWorkshopProductRecord(operateInfo *domain.OperateInfo, listProductRecordQuery *query.SearchWorkshopProductRecordQuery) (int64, interface{}, error) {
if err := listProductRecordQuery.ValidateQuery(); err != nil {
return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
}
transactionContext, err := factory.CreateTransactionContext(nil)
if err != nil {
return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
if err := transactionContext.StartTransaction(); err != nil {
return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
defer func() {
transactionContext.RollbackTransaction()
}()
//var productRecordRepository domain.ProductRecordRepository
//productRecordRepository,_,_ = factory.FastPgProductRecord(transactionContext,0)
productRecordRepository, _ := dao.NewEmployeeProductRecordDao(transactionContext.(*pgTransaction.TransactionContext))
options := utils.ObjectToMap(listProductRecordQuery)
count, productRecords, err := productRecordRepository.SearchEmployeeProductRecord(options)
if err != nil {
return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
if err := transactionContext.CommitTransaction(); err != nil {
return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
}
var result = make([]*dto.EmployeeProductRecordDto, 0)
for i := range productRecords {
item := productRecords[i]
newItem := &dto.EmployeeProductRecordDto{}
newItem.LoadDto(item, operateInfo.OrgId)
result = append(result, newItem)
}
return count, result, nil
}
... ...
... ... @@ -10,6 +10,8 @@ var (
DISABLE_REPOSITORY_CACHE = false
// 缓存过期时间 单位秒
REPOSITORY_CACHE_EXPIRE = 30 * 60
REDIS_ADDRESS = ""
)
func init() {
... ... @@ -29,4 +31,5 @@ func init() {
if os.Getenv("DISABLE_REPOSITORY_CACHE") != "" {
DISABLE_REPOSITORY_CACHE = true
}
REDIS_ADDRESS = REDIS_HOST + ":" + REDIS_PORT
}
... ...
package domain
import "time"
const (
ParticipateNormal = 1
ParticipateSupport = 2
)
// 员工生产记录
type EmployeeProductRecord struct {
// 企业id
CompanyId int `json:"companyId,omitempty"`
// 组织ID
OrgId int `json:"orgId,omitempty"`
// 员工产能记录ID
EmployeeProductRecordId int `json:"employeeProductRecordId"`
// 工作位置
WorkStation *WorkStation `json:"workStation"`
// 上班班次 1:全天 2:白班 4:中班 8:夜班
WorkOn int `json:"workOn"`
// 参与类型 1:正常 2:支援
ParticipateType int `json:"participateType"`
// 产能
ProductWeigh float64 `json:"productWeigh"`
// 二级品产能
SecondLevelWeigh float64 `json:"secondLevelWeigh"`
// 创建时间
CreatedAt time.Time `json:"createdAt"`
// 更新时间
UpdatedAt time.Time `json:"updatedAt"`
// 删除时间
DeletedAt time.Time `json:"deletedAt"`
// 扩展
Ext *Ext `json:"ext"`
// 版本号
Version int `json:"version"`
// 生产记录信息
ProductRecordInfo *EmployeeProductRecordInfo `json:"productRecordInfo"`
// 生产工人
ProductWorker *User `comment:"生产工人"`
}
type EmployeeProductRecordInfo struct {
// 生产日期
ProductDate string `json:"productDate"`
// 原始上报数据
//OriginalWeigh float64 `json:"originalWeigh,omitempty"`
// 换算后的产能
//Weigh float64 `json:"weigh"`
// 产能 - 审核前
//WeighBefore float64 `json:"weighBefore"`
// 产能-审核后
//WeighAfter float64 `json:"weighAfter"`
// 审核状态 1:未审核 2:已审核
//ApproveStatus int64 `json:"approveStatus"`
// 审核时间
//ApproveAt int64 `json:"approveAt"`
// 审核人
//ApproveUser *User `json:"approveUser"`
// 物料信息
//Material *UnitConversion `json:"material,omitempty"`
// 生产计划信息(批次)
//ProductPlan *ProductPlan `json:"productPlan,omitempty"`
// 单位换算ID
//UnitConversionId int `json:"unitConversionId,omitempty"`
// 生产计划ID
ProductPlanId int `json:"productPlanId,omitempty"`
// 计划的产品名称
PlanProductName string `json:"planProductName,omitempty"`
// 批号
BatchNumber string `json:"batchNumber,omitempty"`
// 生产小组ID
ProductGroupId int `json:"productGroupId,omitempty"`
}
type EmployeeProductRecordRepository interface {
Save(employeeProductRecord *EmployeeProductRecord) (*EmployeeProductRecord, error)
Remove(employeeProductRecord *EmployeeProductRecord) (*EmployeeProductRecord, error)
FindOne(queryOptions map[string]interface{}) (*EmployeeProductRecord, error)
Find(queryOptions map[string]interface{}) (int64, []*EmployeeProductRecord, error)
}
func (employeeProductRecord *EmployeeProductRecord) Identify() interface{} {
if employeeProductRecord.EmployeeProductRecordId == 0 {
return nil
}
return employeeProductRecord.EmployeeProductRecordId
}
func (employeeProductRecord *EmployeeProductRecord) Update(data map[string]interface{}) error {
return nil
}
func (employeeProductRecord *EmployeeProductRecord) UpdateProductWeigh(weigh float64, productRecordType int) {
if productRecordType == RecordTypeSecondLevelWeigh {
employeeProductRecord.SecondLevelWeigh += weigh
}
if productRecordType == RecordTypeReceiveMaterial {
employeeProductRecord.ProductWeigh += weigh
}
if productRecordType == RecordTypeReturnMaterial {
employeeProductRecord.ProductWeigh -= weigh
}
employeeProductRecord.UpdatedAt = time.Now()
employeeProductRecord.Version += 1
}
func (employeeProductRecord *EmployeeProductRecord) RealProductWeigh() float64 {
return employeeProductRecord.ProductWeigh - employeeProductRecord.SecondLevelWeigh
}
func (employeeProductRecord *EmployeeProductRecord) QualificationRate() int {
if employeeProductRecord.ProductWeigh == employeeProductRecord.SecondLevelWeigh {
return 0
}
result := int((employeeProductRecord.ProductWeigh - employeeProductRecord.SecondLevelWeigh) * 100 / employeeProductRecord.ProductWeigh)
return result
}
... ...
package domain
import "time"
import (
"errors"
"fmt"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
"time"
)
const (
RecordTypeReceiveMaterial = 1 // 领料
... ... @@ -57,3 +62,23 @@ func (productRecord *ProductRecord) Identify() interface{} {
func (productRecord *ProductRecord) Update(data map[string]interface{}) error {
return nil
}
func (productRecord *ProductRecord) Approve(approveUser *User, weighAfter float64, approveAt time.Time) error {
if productRecord.ProductRecordInfo.ApproveAt > 0 {
return errors.New("已审核")
}
if weighAfter <= 0 {
return errors.New("审核后重量必须大于0")
}
productRecord.ProductRecordInfo.ApproveAt = approveAt.Unix()
productRecord.ProductRecordInfo.ApproveStatus = ProductRecordApproved
productRecord.ProductRecordInfo.ApproveUser = approveUser
productRecord.ProductRecordInfo.WeighAfter = weighAfter
productRecord.ProductRecordInfo.Weigh = weighAfter
productRecord.UpdatedAt = time.Now()
return nil
}
func TaskKeyPatternProductRecordStatics() string {
return fmt.Sprintf("%v:task:product-record:statics", constant.CACHE_PREFIX)
}
... ...
... ... @@ -7,15 +7,17 @@ type ProductRecordInfo struct {
// 原始上报数据
OriginalWeigh float64 `json:"originalWeigh,omitempty"`
// 换算后的产能
Weigh float64 `json:"weigh,omitempty"`
Weigh float64 `json:"weigh"`
// 产能 - 审核前
WeighBefore float64 `json:"weighBefore,omitempty"`
WeighBefore float64 `json:"weighBefore"`
// 产能-审核后
WeighAfter float64 `json:"weighAfter,omitempty"`
WeighAfter float64 `json:"weighAfter"`
// 审核状态 1:未审核 2:已审核
ApproveStatus int64 `json:"approveStatus"`
// 审核时间
ApproveAt int64 `json:"approveAt"`
// 审核人
ApproveUser *User `json:"approveUser"`
// 物料信息
//Material *UnitConversion `json:"material,omitempty"`
// 生产计划信息(批次)
... ...
package dao
import (
"fmt"
"github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform"
"time"
)
type AttendanceRecordDao struct {
transactionContext *pgTransaction.TransactionContext
}
func NewAttendanceRecordDao(transactionContext *pgTransaction.TransactionContext) (*AttendanceRecordDao, error) {
if transactionContext == nil {
return nil, fmt.Errorf("transactionContext参数不能为nil")
} else {
return &AttendanceRecordDao{
transactionContext: transactionContext,
}, nil
}
}
// 生产工段的考勤记录
func (dao *AttendanceRecordDao) ProductWorkStationAttendanceRecord(companyId, orgId int, workStationId string, productTime time.Time) (int64, []*domain.ProductAttendanceRecord, error) {
tx := dao.transactionContext.PgTx
var productAttendanceRecordModels []*models.ProductAttendanceRecord
productAttendanceRecords := make([]*domain.ProductAttendanceRecord, 0)
query := sqlbuilder.BuildQuery(tx.Model(&productAttendanceRecordModels), map[string]interface{}{})
query.Where("company_id = ?", companyId)
query.Where("org_id = ?", orgId)
query.Where("work_station->>'workStationId' = ?", workStationId)
query.Where("sign_in <= ?", productTime)
query.Where("sign_out >= ?", productTime)
query.SetOffsetAndLimit(domain.MaxQueryRow)
query.SetOrderDirect("product_attendance_id", "DESC")
if count, err := query.SelectAndCount(); err != nil {
return 0, productAttendanceRecords, err
} else {
for _, productAttendanceRecordModel := range productAttendanceRecordModels {
if productAttendanceRecord, err := transform.TransformToProductAttendanceRecordDomainModelFromPgModels(productAttendanceRecordModel); err != nil {
return 0, productAttendanceRecords, err
} else {
productAttendanceRecords = append(productAttendanceRecords, productAttendanceRecord)
}
}
return int64(count), productAttendanceRecords, nil
}
}
... ...
package dao
import (
"fmt"
"github.com/go-pg/pg/v10"
"github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform"
"time"
)
type EmployeeProductRecordDao struct {
transactionContext *pgTransaction.TransactionContext
}
func NewEmployeeProductRecordDao(transactionContext *pgTransaction.TransactionContext) (*EmployeeProductRecordDao, error) {
if transactionContext == nil {
return nil, fmt.Errorf("transactionContext参数不能为nil")
} else {
return &EmployeeProductRecordDao{
transactionContext: transactionContext,
}, nil
}
}
// 员工对应批次的生产记录 (生产日期)
func (dao *EmployeeProductRecordDao) WorkerProductRecord(companyId, orgId, planId, workerId int, productTime time.Time) (*domain.EmployeeProductRecord, error) {
tx := dao.transactionContext.PgTx
employeeProductRecordModel := new(models.EmployeeProductRecord)
query := sqlbuilder.BuildQuery(tx.Model(employeeProductRecordModel), map[string]interface{}{})
query.Where("company_id = ?", companyId)
query.Where("org_id = ?", orgId)
query.Where("product_worker ->>'userId' = '?'", workerId)
query.Where("product_record_info ->>'productPlanId' = '?'", planId)
query.Where("product_record_info ->>'productDate' = ?", productTime.Format("2006-01-02"))
if err := query.First(); err != nil {
if err.Error() == "pg: no rows in result set" {
return nil, domain.ErrorNotFound
} else {
return nil, err
}
}
if employeeProductRecordModel.EmployeeProductRecordId == 0 {
return nil, domain.ErrorNotFound
} else {
return transform.TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel)
}
}
func (dao *EmployeeProductRecordDao) SearchEmployeeProductRecord(queryOptions map[string]interface{}) (int64, []*domain.EmployeeProductRecord, error) {
tx := dao.transactionContext.PgTx
var employeeProductRecordModels []*models.EmployeeProductRecord
employeeProductRecords := make([]*domain.EmployeeProductRecord, 0)
query := sqlbuilder.BuildQuery(tx.Model(&employeeProductRecordModels), queryOptions)
query.SetWhereByQueryOption("company_id = ?", "companyId")
query.SetWhereByQueryOption("org_id = ?", "orgId")
if v, ok := queryOptions["inOrgIds"]; ok && len(v.([]int)) > 0 {
query.Where(`org_id in (?)`, pg.In(v))
}
if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 {
query.Where(fmt.Sprintf(`work_station->>'workshopName' like '%%%v%%'`, v))
}
if v, ok := queryOptions["lineName"]; ok && len(v.(string)) > 0 {
query.Where(fmt.Sprintf(`work_station->>'lineName' like '%%%v%%'`, v))
}
if v, ok := queryOptions["sectionName"]; ok && len(v.(string)) > 0 {
query.Where(fmt.Sprintf(`work_station->>'sectionName' like '%%%v%%'`, v))
}
if v, ok := queryOptions["userName"]; ok && len(v.(string)) > 0 {
query.Where(fmt.Sprintf(`product_worker->>'userName' like '%%%v%%'`, v))
}
if v, ok := queryOptions["employeeType"]; ok && len(v.(string)) > 0 {
query.Where(fmt.Sprintf(`product_worker->>'employeeType' = '%v'`, v))
}
if v, ok := queryOptions["productBeginTime"]; ok && !((v.(time.Time)).IsZero()) {
query.Where("created_at>=?", v.(time.Time))
}
if v, ok := queryOptions["productEndTime"]; ok && !((v.(time.Time)).IsZero()) {
query.Where("created_at<?", v.(time.Time))
}
query.SetOffsetAndLimit(domain.MaxQueryRow)
query.SetOrderDirect("employee_product_record_id", "DESC")
if count, err := query.SelectAndCount(); err != nil {
return 0, employeeProductRecords, err
} else {
for _, employeeProductRecordModel := range employeeProductRecordModels {
if employeeProductRecord, err := transform.TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel); err != nil {
return 0, employeeProductRecords, err
} else {
employeeProductRecords = append(employeeProductRecords, employeeProductRecord)
}
}
return int64(count), employeeProductRecords, nil
}
}
// 车间生产记录
func (dao *EmployeeProductRecordDao) SearchWorkshopProductRecord(queryOptions map[string]interface{}) (int64, []*domain.EmployeeProductRecord, error) {
tx := dao.transactionContext.PgTx
var employeeProductRecordModels []*models.EmployeeProductRecord
employeeProductRecords := make([]*domain.EmployeeProductRecord, 0)
query := sqlbuilder.BuildQuery(tx.Model(&employeeProductRecordModels), queryOptions)
query.SetWhereByQueryOption("company_id = ?", "companyId")
query.SetWhereByQueryOption("org_id = ?", "orgId")
if v, ok := queryOptions["inOrgIds"]; ok && len(v.([]int)) > 0 {
query.Where(`org_id in (?)`, pg.In(v))
}
if v, ok := queryOptions["sectionName"]; ok && len(v.(string)) > 0 {
query.Where(fmt.Sprintf(`work_station->>'sectionName' like '%%%v%%'`, v))
}
if v, ok := queryOptions["planProductName"]; ok && len(v.(string)) > 0 {
query.Where(fmt.Sprintf(`product_record_info->>'planProductName' like '%%%v%%'`, v))
}
if v, ok := queryOptions["productBeginTime"]; ok && !((v.(time.Time)).IsZero()) {
query.Where("created_at>=?", v.(time.Time))
}
if v, ok := queryOptions["productEndTime"]; ok && !((v.(time.Time)).IsZero()) {
query.Where("created_at<?", v.(time.Time))
}
query.Group("company_id,org_id,work_station->>'workStationId',product_record_info->>'productPlanId'")
query.SetOffsetAndLimit(domain.MaxQueryRow)
//query.SetOrderDirect("employee_product_record_id", "DESC")
if count, err := query.SelectAndCount(); err != nil {
return 0, employeeProductRecords, err
} else {
for _, employeeProductRecordModel := range employeeProductRecordModels {
if employeeProductRecord, err := transform.TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel); err != nil {
return 0, employeeProductRecords, err
} else {
employeeProductRecords = append(employeeProductRecords, employeeProductRecord)
}
}
return int64(count), employeeProductRecords, nil
}
}
... ...
... ... @@ -2,8 +2,11 @@ package domainService
import (
"fmt"
"github.com/hibiken/asynq"
"github.com/linmadan/egglib-go/core/application"
pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
"github.com/linmadan/egglib-go/utils/json"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
... ... @@ -119,9 +122,55 @@ func (ptr *PGProductRecordService) SubmitProductRecord(productRecordType int, qu
if record, err = productRecordRepository.Save(record); err != nil {
return nil, err
}
// 发送Job
if productRecordType == domain.RecordTypeReceiveMaterial || productRecordType == domain.RecordTypeReturnMaterial {
// 发送Job
if err = SendProductRecordStaticsJob(record); err != nil {
return nil, err
}
}
return nil, nil
}
// Approve 审核生产记录 (二级品审核)
func (ptr *PGProductRecordService) Approve(productRecordId int, approveUserId int, weighAfter float64, approveAt time.Time) (interface{}, error) {
productRecordRepository, err := repository.NewProductRecordRepository(ptr.transactionContext)
var productRecord *domain.ProductRecord
productRecord, err = productRecordRepository.FindOne(map[string]interface{}{"productRecordId": productRecordId})
if err != nil {
return nil, err
}
var user *domain.User
userService := NewUserService()
user, err = userService.User(approveUserId)
if err != nil {
return nil, err
}
if err = productRecord.Approve(user, weighAfter, approveAt); err != nil {
return nil, err
}
if _, err = productRecordRepository.Save(productRecord); err != nil {
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
}
// 发送Job
if err = SendProductRecordStaticsJob(productRecord); err != nil {
return nil, err
}
return struct{}{}, nil
}
func SendProductRecordStaticsJob(productRecord *domain.ProductRecord) error {
task := asynq.NewTask(domain.TaskKeyPatternProductRecordStatics(), []byte(json.MarshalToString(productRecord)))
client := asynq.NewClient(asynq.RedisClientOpt{Addr: constant.REDIS_ADDRESS})
_, err := client.Enqueue(task)
return err
}
func NewPGProductRecordService(transactionContext *pgTransaction.TransactionContext) (*PGProductRecordService, error) {
if transactionContext == nil {
return nil, fmt.Errorf("transactionContext参数不能为nil")
... ...
package domainService
import (
"fmt"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
"time"
)
const (
ProductSection1 = "打料"
ProductSection2 = "成型"
ProductSection3 = "穿串"
ProductSection4 = "包装"
)
//EmployeeProductStatics 员工产能统计
func (ptr *PGProductRecordService) EmployeeProductStatics(productRecord *domain.ProductRecord) (interface{}, error) {
var (
workshopRepository, _ = repository.NewWorkshopRepository(ptr.transactionContext)
productPlanRepository, _ = repository.NewProductPlanRepository(ptr.transactionContext)
productGroupRepository, _ = repository.NewProductGroupRepository(ptr.transactionContext)
employeeProductRecordRepository, _ = repository.NewEmployeeProductRecordRepository(ptr.transactionContext)
)
var (
cid = productRecord.CompanyId
oid = productRecord.OrgId
planId = productRecord.ProductRecordInfo.ProductPlanId
productPlan *domain.ProductPlan
err error
)
switch productRecord.WorkStation.SectionName {
case ProductSection1:
if productRecord.ProductRecordType == domain.RecordTypeSecondLevelWeigh {
//查询生产记录 批次、生产日期、下(成型)所有二级品
// 更新打料的二级品需要再一次更新成型的二级品
if section, err := FindSectionByName(workshopRepository, productRecord.WorkStation.WorkshopId, productRecord.WorkStation.LineId, ProductSection2); err == nil && section != nil {
nextProductRecord := *productRecord
nextProductRecord.WorkStation.SectionName = ProductSection2
nextProductRecord.WorkStation.SectionId = section.SectionId
ptr.EmployeeProductStatics(&nextProductRecord)
}
}
break
case ProductSection2:
break
case ProductSection3:
break
case ProductSection4: //个人特殊处理
return ptr.personalProductStatics(productRecord)
default:
return nil, nil //ptr.personalProductStatics(productRecord)
}
productPlan, err = productPlanRepository.FindOne(map[string]interface{}{"productPlanId": planId})
if err != nil {
return nil, err
}
// 集体
// 1.查询员工 -》 员工打卡记录 工位+打卡日期
// 2.打卡记录的时间区间 在生产记录上报的时间范围内
attendanceRecordDao, _ := dao.NewAttendanceRecordDao(ptr.transactionContext)
_, attendanceRecords, err := attendanceRecordDao.ProductWorkStationAttendanceRecord(cid, oid, productRecord.WorkStation.WorkStationId, productRecord.CreatedAt)
if err != nil || len(attendanceRecords) == 0 {
return nil, err
}
// 2.1 判断是否是支援类型 有打卡记录,员工是否是属于该工段的员工
groupMembers, groupMembersKeyFunc := FindGroupMembers(productGroupRepository, cid, oid, productRecord.WorkStation.WorkStationId)
employeeProductRecordDao, _ := dao.NewEmployeeProductRecordDao(ptr.transactionContext)
for i := 0; i < len(attendanceRecords); i++ {
r := attendanceRecords[i]
participateType := domain.ParticipateNormal
if _, ok := groupMembers[groupMembersKeyFunc(r.ProductWorker.UserId)]; !ok {
participateType = domain.ParticipateSupport
}
var employeeProductRecord *domain.EmployeeProductRecord
employeeProductRecord, err = employeeProductRecordDao.WorkerProductRecord(cid, oid, productRecord.ProductRecordInfo.ProductPlanId, r.ProductWorker.UserId, productRecord.CreatedAt)
if err == domain.ErrorNotFound {
employeeProductRecord = newEmployeeProductRecord(productRecord, participateType, productPlan, r.ProductWorker)
} else {
log.Logger.Error(err.Error())
continue
}
employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType)
if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil {
// TODO:异常处理
log.Logger.Error(fmt.Sprintf("生产记录:[%v] 员工:[%v] 处理异常:%v", productRecord.ProductRecordId, r.ProductWorker.UserId, err.Error()))
continue
}
}
// 3.查询员工产能记录 -》员工 批次+工位+批次生产日期 (有 更新产能数据、没有插入一条产能数据)
// 4.更新产能 (产能、二级品) (特殊工段处理 打料、成型)
// 个人
return nil, nil
}
// newEmployeeProductRecord 员工生产记录
func newEmployeeProductRecord(productRecord *domain.ProductRecord, participateType int, productPlan *domain.ProductPlan, worker *domain.User) *domain.EmployeeProductRecord {
record := &domain.EmployeeProductRecord{
CompanyId: productRecord.CompanyId,
OrgId: productRecord.OrgId,
WorkStation: productRecord.WorkStation,
WorkOn: productPlan.WorkOn,
ParticipateType: participateType,
ProductWeigh: 0,
SecondLevelWeigh: 0,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
Ext: productPlan.Ext,
Version: 1,
ProductRecordInfo: &domain.EmployeeProductRecordInfo{
ProductDate: productRecord.CreatedAt.Format("2006-01-02"),
ProductPlanId: productRecord.ProductRecordInfo.ProductPlanId,
PlanProductName: productRecord.ProductRecordInfo.PlanProductName,
BatchNumber: productRecord.ProductRecordInfo.BatchNumber,
ProductGroupId: productRecord.ProductRecordInfo.ProductGroupId,
},
ProductWorker: worker,
}
// 打料、成型有初始值
if productRecord.WorkStation.SectionName == ProductSection1 || productRecord.WorkStation.SectionName == ProductSection2 {
record.ProductWeigh = productPlan.PlanDevoted.Weight
}
return record
}
// 按名称查询工段
func FindSectionByName(workshopRepository domain.WorkshopRepository, workshopId, lineId int, equalName string) (*domain.ProductSection, error) {
var workshop *domain.Workshop
var err error
if workshop, err = workshopRepository.FindOne(map[string]interface{}{"workshopId": workshopId}); err != nil {
return nil, err
}
sections, _ := workshop.FindLine(lineId)
for i := range sections.ProductSections {
sec := sections.ProductSections[i]
if sec.Removed == domain.Deleted {
continue
}
if sec.SectionName == equalName {
return sec, nil
}
}
return nil, fmt.Errorf("not found section")
}
// 查询组成员
func FindGroupMembers(productGroupRepository domain.ProductGroupRepository, companyId, orgId int, workStationId string) (map[string]*domain.User, func(int) string) {
var result = make(map[string]*domain.User)
var keyFunc = func(userId int) string {
return fmt.Sprintf("%v", userId)
}
_, groups, err := productGroupRepository.Find(map[string]interface{}{"companyId": companyId, "orgId": orgId, "workStationId": workStationId})
if err != nil {
return result, keyFunc
}
for i := range groups {
//g:=groups[i]
for j := range groups[i].GroupMembers {
u := groups[i].GroupMembers[j]
result[keyFunc(u.UserId)] = u
}
}
return result, keyFunc
}
// 个人生产记录统计
func (ptr *PGProductRecordService) personalProductStatics(productRecord *domain.ProductRecord) (interface{}, error) {
var (
//workshopRepository,_=repository.NewWorkshopRepository(ptr.transactionContext)
productPlanRepository, _ = repository.NewProductPlanRepository(ptr.transactionContext)
productGroupRepository, _ = repository.NewProductGroupRepository(ptr.transactionContext)
employeeProductRecordRepository, _ = repository.NewEmployeeProductRecordRepository(ptr.transactionContext)
)
var (
cid = productRecord.CompanyId
oid = productRecord.OrgId
planId = productRecord.ProductRecordInfo.ProductPlanId
productPlan *domain.ProductPlan
err error
)
// 2.1 判断是否是支援类型 有打卡记录,员工是否是属于该工段的员工
groupMembers, groupMembersKeyFunc := FindGroupMembers(productGroupRepository, cid, oid, productRecord.WorkStation.WorkStationId)
employeeProductRecordDao, _ := dao.NewEmployeeProductRecordDao(ptr.transactionContext)
productPlan, err = productPlanRepository.FindOne(map[string]interface{}{"productPlanId": planId})
if err != nil {
return nil, err
}
participateType := domain.ParticipateNormal
if _, ok := groupMembers[groupMembersKeyFunc(productRecord.ProductWorker.UserId)]; !ok {
participateType = domain.ParticipateSupport
}
var employeeProductRecord *domain.EmployeeProductRecord
employeeProductRecord, err = employeeProductRecordDao.WorkerProductRecord(cid, oid, productRecord.ProductRecordInfo.ProductPlanId, productRecord.ProductWorker.UserId, productRecord.CreatedAt)
if err == domain.ErrorNotFound {
employeeProductRecord = newEmployeeProductRecord(productRecord, participateType, productPlan, productRecord.ProductWorker)
}
employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType)
if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil {
// TODO:异常处理
log.Logger.Error(fmt.Sprintf("生产记录:[%v] 员工:[%v] 处理异常:%v", productRecord.ProductRecordId, productRecord.ProductWorker.UserId, err.Error()))
}
return nil, nil
}
//WorkshopProductStatics 车间产能统计
func (ptr *PGProductRecordService) WorkshopProductStatics(productRecord *domain.ProductRecord, productPlan *domain.ProductPlan) (interface{}, error) {
return nil, nil
}
... ...
... ... @@ -39,6 +39,7 @@ func init() {
(*models.MaterialK3cloud)(nil),
(*models.MaterialGroupK3cloud)(nil),
(*models.PrdMoK3cloud)(nil),
(*models.EmployeeProductRecord)(nil),
} {
err := DB.Model(model).CreateTable(&orm.CreateTableOptions{
Temp: false,
... ...
package models
import (
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"time"
)
type EmployeeProductRecord struct {
tableName string `comment:"员工生产记录" pg:"manufacture.employee_product_record"`
// 员工产能记录ID
EmployeeProductRecordId int `comment:"员工产能记录ID" pg:"pk:employee_product_record_id"`
// 企业id
CompanyId int `comment:"企业id"`
// 组织ID
OrgId int `comment:"组织ID"`
// 工作位置
WorkStation *domain.WorkStation `comment:"工作位置"`
// 上班班次 1:全天 2:白班 4:中班 8:夜班
WorkOn int `comment:"上班班次 1:全天 2:白班 4:中班 8:夜班"`
// 参与类型 1:正常 2:支援
ParticipateType int `comment:"参与类型 1:正常 2:支援"`
// 产能
ProductWeigh float64 `comment:"产能"`
// 二级品产能
SecondLevelWeigh float64 `comment:"二级品产能"`
// 创建时间
CreatedAt time.Time `comment:"创建时间"`
// 更新时间
UpdatedAt time.Time `comment:"更新时间"`
// 删除时间
DeletedAt time.Time `pg:",soft_delete" comment:"删除时间"`
// 扩展
Ext *domain.Ext `comment:"扩展"`
// 版本号
Version int `comment:"版本号"`
// 生产记录信息
ProductRecordInfo *domain.EmployeeProductRecordInfo `comment:"生产记录信息"`
// 生产工人
ProductWorker *domain.User `comment:"生产工人"`
}
... ...
package transform
import (
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models"
)
func TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel *models.EmployeeProductRecord) (*domain.EmployeeProductRecord, error) {
return &domain.EmployeeProductRecord{
EmployeeProductRecordId: employeeProductRecordModel.EmployeeProductRecordId,
CompanyId: employeeProductRecordModel.CompanyId,
OrgId: employeeProductRecordModel.OrgId,
WorkStation: employeeProductRecordModel.WorkStation,
WorkOn: employeeProductRecordModel.WorkOn,
ParticipateType: employeeProductRecordModel.ParticipateType,
ProductWeigh: employeeProductRecordModel.ProductWeigh,
SecondLevelWeigh: employeeProductRecordModel.SecondLevelWeigh,
CreatedAt: employeeProductRecordModel.CreatedAt,
UpdatedAt: employeeProductRecordModel.UpdatedAt,
DeletedAt: employeeProductRecordModel.DeletedAt,
Ext: employeeProductRecordModel.Ext,
Version: employeeProductRecordModel.Version,
ProductRecordInfo: employeeProductRecordModel.ProductRecordInfo,
ProductWorker: employeeProductRecordModel.ProductWorker,
}, nil
}
... ...
package repository
import (
"fmt"
"github.com/go-pg/pg/v10"
"github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
"github.com/linmadan/egglib-go/utils/snowflake"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform"
)
type EmployeeProductRecordRepository struct {
transactionContext *pgTransaction.TransactionContext
}
func (repository *EmployeeProductRecordRepository) nextIdentify() (int64, error) {
IdWorker, err := snowflake.NewIdWorker(1)
if err != nil {
return 0, err
}
id, err := IdWorker.NextId()
return id, err
}
func (repository *EmployeeProductRecordRepository) Save(employeeProductRecord *domain.EmployeeProductRecord) (*domain.EmployeeProductRecord, error) {
sqlBuildFields := []string{
"employee_product_record_id",
"org_id",
"company_id",
"work_station",
"work_on",
"participate_type",
"product_weigh",
"second_level_weigh",
"created_at",
"updated_at",
"deleted_at",
"ext",
"version",
"product_record_info",
"product_worker",
}
insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlbuilder.RemoveSqlFields(sqlBuildFields, "employee_product_record_id", "deleted_at"))
insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlbuilder.RemoveSqlFields(sqlBuildFields, "employee_product_record_id", "deleted_at"))
returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "employee_product_record_id", "deleted_at")
updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields)
tx := repository.transactionContext.PgTx
if employeeProductRecord.Identify() == nil {
if _, err := tx.QueryOne(
pg.Scan(
&employeeProductRecord.EmployeeProductRecordId,
&employeeProductRecord.CompanyId,
&employeeProductRecord.OrgId,
&employeeProductRecord.WorkStation,
&employeeProductRecord.WorkOn,
&employeeProductRecord.ParticipateType,
&employeeProductRecord.ProductWeigh,
&employeeProductRecord.SecondLevelWeigh,
&employeeProductRecord.CreatedAt,
&employeeProductRecord.UpdatedAt,
&employeeProductRecord.DeletedAt,
&employeeProductRecord.Ext,
&employeeProductRecord.Version,
&employeeProductRecord.ProductRecordInfo,
&employeeProductRecord.ProductWorker,
),
fmt.Sprintf("INSERT INTO manufacture.employee_product_record (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet),
//employeeProductRecord.EmployeeProductRecordId,
employeeProductRecord.CompanyId,
employeeProductRecord.OrgId,
employeeProductRecord.WorkStation,
employeeProductRecord.WorkOn,
employeeProductRecord.ParticipateType,
employeeProductRecord.ProductWeigh,
employeeProductRecord.SecondLevelWeigh,
employeeProductRecord.CreatedAt,
employeeProductRecord.UpdatedAt,
//employeeProductRecord.DeletedAt,
employeeProductRecord.Ext,
employeeProductRecord.Version,
employeeProductRecord.ProductRecordInfo,
employeeProductRecord.ProductWorker,
); err != nil {
return employeeProductRecord, err
}
} else {
if _, err := tx.QueryOne(
pg.Scan(
&employeeProductRecord.EmployeeProductRecordId,
&employeeProductRecord.CompanyId,
&employeeProductRecord.OrgId,
&employeeProductRecord.WorkStation,
&employeeProductRecord.WorkOn,
&employeeProductRecord.ParticipateType,
&employeeProductRecord.ProductWeigh,
&employeeProductRecord.SecondLevelWeigh,
&employeeProductRecord.CreatedAt,
&employeeProductRecord.UpdatedAt,
&employeeProductRecord.DeletedAt,
&employeeProductRecord.Ext,
&employeeProductRecord.Version,
&employeeProductRecord.ProductRecordInfo,
&employeeProductRecord.ProductWorker,
),
fmt.Sprintf("UPDATE manufacture.employee_product_record SET %s WHERE employee_product_record_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet),
//employeeProductRecord.EmployeeProductRecordId,
employeeProductRecord.CompanyId,
employeeProductRecord.OrgId,
employeeProductRecord.WorkStation,
employeeProductRecord.WorkOn,
employeeProductRecord.ParticipateType,
employeeProductRecord.ProductWeigh,
employeeProductRecord.SecondLevelWeigh,
employeeProductRecord.CreatedAt,
employeeProductRecord.UpdatedAt,
//employeeProductRecord.DeletedAt,
employeeProductRecord.Ext,
employeeProductRecord.Version,
employeeProductRecord.ProductRecordInfo,
employeeProductRecord.ProductWorker,
employeeProductRecord.Identify(),
); err != nil {
return employeeProductRecord, err
}
}
return employeeProductRecord, nil
}
func (repository *EmployeeProductRecordRepository) Remove(employeeProductRecord *domain.EmployeeProductRecord) (*domain.EmployeeProductRecord, error) {
tx := repository.transactionContext.PgTx
employeeProductRecordModel := new(models.EmployeeProductRecord)
employeeProductRecordModel.EmployeeProductRecordId = employeeProductRecord.Identify().(int)
if _, err := tx.Model(employeeProductRecordModel).WherePK().Delete(); err != nil {
return employeeProductRecord, err
}
return employeeProductRecord, nil
}
func (repository *EmployeeProductRecordRepository) FindOne(queryOptions map[string]interface{}) (*domain.EmployeeProductRecord, error) {
tx := repository.transactionContext.PgTx
employeeProductRecordModel := new(models.EmployeeProductRecord)
query := sqlbuilder.BuildQuery(tx.Model(employeeProductRecordModel), queryOptions)
query.SetWhereByQueryOption("employee_product_record.employee_product_record_id = ?", "employeeProductRecordId")
if err := query.First(); err != nil {
if err.Error() == "pg: no rows in result set" {
return nil, domain.ErrorNotFound
} else {
return nil, err
}
}
if employeeProductRecordModel.EmployeeProductRecordId == 0 {
return nil, nil
} else {
return transform.TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel)
}
}
func (repository *EmployeeProductRecordRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.EmployeeProductRecord, error) {
tx := repository.transactionContext.PgTx
var employeeProductRecordModels []*models.EmployeeProductRecord
employeeProductRecords := make([]*domain.EmployeeProductRecord, 0)
query := sqlbuilder.BuildQuery(tx.Model(&employeeProductRecordModels), queryOptions)
query.SetOffsetAndLimit(domain.MaxQueryRow)
query.SetOrderDirect("employee_product_record_id", "DESC")
if count, err := query.SelectAndCount(); err != nil {
return 0, employeeProductRecords, err
} else {
for _, employeeProductRecordModel := range employeeProductRecordModels {
if employeeProductRecord, err := transform.TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel); err != nil {
return 0, employeeProductRecords, err
} else {
employeeProductRecords = append(employeeProductRecords, employeeProductRecord)
}
}
return int64(count), employeeProductRecords, nil
}
}
func NewEmployeeProductRecordRepository(transactionContext *pgTransaction.TransactionContext) (*EmployeeProductRecordRepository, error) {
if transactionContext == nil {
return nil, fmt.Errorf("transactionContext参数不能为nil")
} else {
return &EmployeeProductRecordRepository{
transactionContext: transactionContext,
}, nil
}
}
... ...
... ... @@ -143,6 +143,20 @@ func (repository *ProductRecordRepository) Find(queryOptions map[string]interfac
var productRecordModels []*models.ProductRecord
productRecords := make([]*domain.ProductRecord, 0)
query := sqlbuilder.BuildQuery(tx.Model(&productRecordModels), queryOptions)
query.SetWhereByQueryOption("company_id = ?", "companyId")
query.SetWhereByQueryOption("org_id = ?", "orgId")
if v, ok := queryOptions["inOrgIds"]; ok && len(v.([]int)) > 0 {
query.Where(`org_id in (?)`, pg.In(v))
}
if v, ok := queryOptions["userName"]; ok && len(v.(string)) > 0 {
query.Where(fmt.Sprintf(`product_worker->>'userName' like '%%%v%%'`, v))
}
if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 {
query.Where(fmt.Sprintf(`work_station->>'workshopName' like '%%%v%%'`, v))
}
if v, ok := queryOptions["batchNumber"]; ok && len(v.(string)) > 0 {
query.Where(fmt.Sprintf(`product_record_info->>'batchNumber' like '%%%v%%'`, v))
}
query.SetOffsetAndLimit(domain.MaxQueryRow)
query.SetOrderDirect("product_record_id", "DESC")
if count, err := query.SelectAndCount(); err != nil {
... ...
package controllers
import (
"github.com/linmadan/egglib-go/web/beego"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/command"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/query"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/service"
)
type ProductRecordController struct {
beego.BaseController
}
func (controller *ProductRecordController) CreateProductRecord() {
productRecordService := service.NewProductRecordService(nil)
createProductRecordCommand := &command.CreateProductRecordCommand{}
controller.Unmarshal(createProductRecordCommand)
data, err := productRecordService.CreateProductRecord(createProductRecordCommand)
controller.Response(data, err)
}
func (controller *ProductRecordController) UpdateProductRecord() {
productRecordService := service.NewProductRecordService(nil)
updateProductRecordCommand := &command.UpdateProductRecordCommand{}
controller.Unmarshal(updateProductRecordCommand)
productRecordId, _ := controller.GetInt(":productRecordId")
updateProductRecordCommand.ProductRecordId = productRecordId
data, err := productRecordService.UpdateProductRecord(updateProductRecordCommand)
controller.Response(data, err)
}
func (controller *ProductRecordController) GetProductRecord() {
productRecordService := service.NewProductRecordService(nil)
getProductRecordQuery := &query.GetProductRecordQuery{}
productRecordId, _ := controller.GetInt(":productRecordId")
getProductRecordQuery.ProductRecordId = productRecordId
data, err := productRecordService.GetProductRecord(getProductRecordQuery)
controller.Response(data, err)
}
func (controller *ProductRecordController) RemoveProductRecord() {
productRecordService := service.NewProductRecordService(nil)
removeProductRecordCommand := &command.RemoveProductRecordCommand{}
controller.Unmarshal(removeProductRecordCommand)
productRecordId, _ := controller.GetInt(":productRecordId")
removeProductRecordCommand.ProductRecordId = productRecordId
data, err := productRecordService.RemoveProductRecord(removeProductRecordCommand)
controller.Response(data, err)
}
func (controller *ProductRecordController) ListProductRecord() {
productRecordService := service.NewProductRecordService(nil)
listProductRecordQuery := &query.ListProductRecordQuery{}
offset, _ := controller.GetInt("offset")
listProductRecordQuery.Offset = offset
limit, _ := controller.GetInt("limit")
listProductRecordQuery.Limit = limit
data, err := productRecordService.ListProductRecord(listProductRecordQuery)
controller.Response(data, err)
}
func (controller *ProductRecordController) ApproveProductRecord() {
productRecordService := service.NewProductRecordService(nil)
approveProductRecordCommand := &command.ApproveProductRecordCommand{}
controller.Unmarshal(approveProductRecordCommand)
data, err := productRecordService.ApproveProductRecord(approveProductRecordCommand)
controller.Response(data, err)
}
func (controller *ProductRecordController) SearchProductRecord() {
productPlanService := service.NewProductRecordService(nil)
cmd := &query.SearchProductRecordQuery{}
Must(controller.Unmarshal(cmd))
operateInfo := ParseOperateInfo(controller.BaseController)
//cmd.OrgId = operateInfo.OrgId
cmd.CompanyId = operateInfo.CompanyId
cmd.InOrgIds = operateInfo.OrgIds
total, data, err := productPlanService.SearchProductRecord(ParseOperateInfo(controller.BaseController), cmd)
ResponseGrid(controller.BaseController, total, data, err)
}
func (controller *ProductRecordController) SearchEmployeeProductRecord() {
productPlanService := service.NewProductRecordService(nil)
cmd := &query.SearchEmployeeProductRecordQuery{}
Must(controller.Unmarshal(cmd))
operateInfo := ParseOperateInfo(controller.BaseController)
//cmd.OrgId = operateInfo.OrgId
cmd.CompanyId = operateInfo.CompanyId
cmd.InOrgIds = operateInfo.OrgIds
total, data, err := productPlanService.SearchEmployeeProductRecord(ParseOperateInfo(controller.BaseController), cmd)
ResponseGrid(controller.BaseController, total, data, err)
}
... ...
package routers
import (
"github.com/beego/beego/v2/server/web"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/beego/controllers"
)
func init() {
web.Router("/product-records/", &controllers.ProductRecordController{}, "Post:CreateProductRecord")
web.Router("/product-records/:productRecordId", &controllers.ProductRecordController{}, "Put:UpdateProductRecord")
web.Router("/product-records/:productRecordId", &controllers.ProductRecordController{}, "Get:GetProductRecord")
web.Router("/product-records/:productRecordId", &controllers.ProductRecordController{}, "Delete:RemoveProductRecord")
web.Router("/product-records/", &controllers.ProductRecordController{}, "Get:ListProductRecord")
web.Router("/product-records/approve", &controllers.ProductRecordController{}, "Post:ApproveProductRecord")
web.Router("/product-records/search", &controllers.ProductRecordController{}, "Post:SearchProductRecord")
web.Router("/product-records/employee-productive/search", &controllers.ProductRecordController{}, "Post:SearchEmployeeProductRecord")
}
... ...
package task
import (
"context"
"encoding/json"
"fmt"
"github.com/hibiken/asynq"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/command"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/service"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
"os"
"os/signal"
"syscall"
)
func Run() {
srv := asynq.NewServer(
asynq.RedisClientOpt{Addr: ":6379"},
asynq.Config{Concurrency: 1},
)
h := asynq.NewServeMux()
// ... Register handlers
h.HandleFunc(domain.TaskKeyPatternProductRecordStatics(), HandlerProductRecordStatics)
log.Logger.Info("aysnq task running ...")
// Run blocks and waits for os signal to terminate the program.
if err := srv.Run(h); err != nil {
log.Logger.Error(err.Error())
}
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGTERM, syscall.SIGINT)
<-sigs // wait for termination signal
log.Logger.Info("aysnq task stopping ...")
srv.Shutdown()
}
// 生产记录统计
func HandlerProductRecordStatics(c context.Context, t *asynq.Task) error {
productPlanService := service.NewProductRecordService(nil)
cmd := &command.ProductRecordStaticsCommand{}
if err := json.Unmarshal(t.Payload(), cmd); err != nil {
return err
}
log.Logger.Debug(fmt.Sprintf("【生产记录统计】 消费 生产记录ID:%v 类型:%v 工段:%v(%v) 重量:%v", cmd.ProductRecordId, cmd.ProductRecordType,
cmd.WorkStation.SectionName, cmd.WorkStation.WorkStationId, cmd.ProductRecordInfo.Weigh))
_, err := productPlanService.ProductRecordStatics(cmd)
if err != nil {
log.Logger.Error(err.Error())
}
return err
}
... ...
package product_record
import (
"github.com/go-pg/pg/v10"
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
pG "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg"
)
var _ = Describe("生产记录审核", func() {
var productRecordId int64
BeforeEach(func() {
_, err := pG.DB.QueryOne(
pg.Scan(&productRecordId),
"INSERT INTO product_records (product_record_id, company_id, org_id, product_record_type, product_worker, work_station, created_at, updated_at, deleted_at, product_record_info) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING product_record_id",
"testProductRecordId", "testCompanyId", "testOrgId", "testProductRecordType", "testProductWorker", "testWorkStation", "testCreatedAt", "testUpdatedAt", "testDeletedAt", "testProductRecordInfo")
Expect(err).NotTo(HaveOccurred())
})
Describe("生产记录审核", func() {
Context("", func() {
It("", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
body := map[string]interface{}{
"productRecordId": "int",
}
httpExpect.POST("/product-records/approve").
WithJSON(body).
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok").
ContainsKey("data").Value("data").Object()
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM product_records WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...
package product_record
import (
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
pG "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg"
)
var _ = Describe("创建生产记录服务", func() {
Describe("提交数据创建生产记录服务", func() {
Context("提交正确的新生产记录数据", func() {
It("返回生产记录数据", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
body := map[string]interface{}{
"productRecordId": "int",
}
httpExpect.POST("/product-records/").
WithJSON(body).
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok").
ContainsKey("data").Value("data").Object().
ContainsKey("productRecordId").ValueNotEqual("productRecordId", BeZero())
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM product_records WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...
package product_record
import (
"github.com/go-pg/pg/v10"
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
pG "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg"
)
var _ = Describe("返回生产记录服务", func() {
var productRecordId int64
BeforeEach(func() {
_, err := pG.DB.QueryOne(
pg.Scan(&productRecordId),
"INSERT INTO product_records (product_record_id, company_id, org_id, product_record_type, product_worker, work_station, created_at, updated_at, deleted_at, product_record_info) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING product_record_id",
"testProductRecordId", "testCompanyId", "testOrgId", "testProductRecordType", "testProductWorker", "testWorkStation", "testCreatedAt", "testUpdatedAt", "testDeletedAt", "testProductRecordInfo")
Expect(err).NotTo(HaveOccurred())
})
Describe("根据productRecordId参数返回生产记录", func() {
Context("传入有效的productRecordId", func() {
It("返回生产记录数据", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
httpExpect.GET("/product-records/{productRecordId}").
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok").
ContainsKey("data").Value("data").Object()
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM product_records WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...
package product_record
import (
"github.com/go-pg/pg/v10"
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
pG "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg"
)
var _ = Describe("返回生产记录服务列表", func() {
var productRecordId int64
BeforeEach(func() {
_, err := pG.DB.QueryOne(
pg.Scan(&productRecordId),
"INSERT INTO product_records (product_record_id, company_id, org_id, product_record_type, product_worker, work_station, created_at, updated_at, deleted_at, product_record_info) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING product_record_id",
"testProductRecordId", "testCompanyId", "testOrgId", "testProductRecordType", "testProductWorker", "testWorkStation", "testCreatedAt", "testUpdatedAt", "testDeletedAt", "testProductRecordInfo")
Expect(err).NotTo(HaveOccurred())
})
Describe("根据参数返回生产记录列表", func() {
Context("传入有效的参数", func() {
It("返回生产记录数据列表", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
httpExpect.GET("/product-records/").
WithQuery("offset", "int").
WithQuery("limit", "int").
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok").
ContainsKey("data").Value("data").Object().
ContainsKey("count").ValueEqual("count", 1).
ContainsKey("productRecords").Value("productRecords").Array()
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM product_records WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...
package product_record
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/beego/beego/v2/server/web"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
_ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application"
_ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg"
_ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/beego"
)
func TestProductRecord(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Beego Port ProductRecord Correlations Test Case Suite")
}
var handler http.Handler
var server *httptest.Server
var _ = BeforeSuite(func() {
handler = web.BeeApp.Handlers
server = httptest.NewServer(handler)
})
var _ = AfterSuite(func() {
server.Close()
})
... ...
package product_record
import (
"github.com/go-pg/pg/v10"
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
pG "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg"
)
var _ = Describe("移除生产记录服务", func() {
var productRecordId int64
BeforeEach(func() {
_, err := pG.DB.QueryOne(
pg.Scan(&productRecordId),
"INSERT INTO product_records (product_record_id, company_id, org_id, product_record_type, product_worker, work_station, created_at, updated_at, deleted_at, product_record_info) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING product_record_id",
"testProductRecordId", "testCompanyId", "testOrgId", "testProductRecordType", "testProductWorker", "testWorkStation", "testCreatedAt", "testUpdatedAt", "testDeletedAt", "testProductRecordInfo")
Expect(err).NotTo(HaveOccurred())
})
Describe("根据参数移除生产记录服务", func() {
Context("传入有效的productRecordId", func() {
It("返回被移除生产记录的数据", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
httpExpect.DELETE("/product-records/{productRecordId}").
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok").
ContainsKey("data").Value("data").Object()
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM product_records WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...
package product_record
import (
"github.com/go-pg/pg/v10"
"net/http"
"github.com/gavv/httpexpect"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
pG "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg"
)
var _ = Describe("更新生产记录服务", func() {
var productRecordId int64
BeforeEach(func() {
_, err := pG.DB.QueryOne(
pg.Scan(&productRecordId),
"INSERT INTO product_records (product_record_id, company_id, org_id, product_record_type, product_worker, work_station, created_at, updated_at, deleted_at, product_record_info) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING product_record_id",
"testProductRecordId", "testCompanyId", "testOrgId", "testProductRecordType", "testProductWorker", "testWorkStation", "testCreatedAt", "testUpdatedAt", "testDeletedAt", "testProductRecordInfo")
Expect(err).NotTo(HaveOccurred())
})
Describe("提交数据更新生产记录服务", func() {
Context("提交正确的生产记录数据", func() {
It("返回更新后的生产记录数据", func() {
httpExpect := httpexpect.New(GinkgoT(), server.URL)
body := map[string]interface{}{}
httpExpect.PUT("/product-records/{productRecordId}").
WithJSON(body).
Expect().
Status(http.StatusOK).
JSON().
Object().
ContainsKey("code").ValueEqual("code", 0).
ContainsKey("msg").ValueEqual("msg", "ok").
ContainsKey("data").Value("data").Object().
ContainsKey("productRecordId").ValueEqual("productRecordId", productRecordId)
})
})
})
AfterEach(func() {
_, err := pG.DB.Exec("DELETE FROM product_records WHERE true")
Expect(err).NotTo(HaveOccurred())
})
})
... ...