| | |
| | | import ( |
| | | "errors" |
| | | "github.com/gin-gonic/gin" |
| | | "github.com/shopspring/decimal" |
| | | "gorm.io/gorm" |
| | | "silkserver/controllers/request" |
| | | "silkserver/controllers/response" |
| | |
| | | "silkserver/pkg/logx" |
| | | "silkserver/pkg/structx" |
| | | "silkserver/service" |
| | | "strings" |
| | | ) |
| | | |
| | | type FinenessController struct{} |
| | |
| | | return |
| | | } |
| | | |
| | | silkStandard, err := service.GetSilkRankStandard() |
| | | if err := slf.ParamsCheck(params); err != nil { |
| | | util.ResponseFormat(c, code.RequestParamError, err.Error()) |
| | | return |
| | | } |
| | | |
| | | specArr := strings.Split(params.Spec, "/") |
| | | start, _ := decimal.NewFromString(specArr[0]) |
| | | end, _ := decimal.NewFromString(specArr[1]) |
| | | silkStandard, err := service.GetSilkRankStandard(start, end) |
| | | if err != nil { |
| | | util.ResponseFormat(c, code.RequestParamError, err.Error()) |
| | | return |
| | |
| | | |
| | | endCarMap, err := service.GetWorkshopEndCarMap(params.WorkshopNumber, params.WorkshopGroup) |
| | | if len(endCarMap) == 0 { |
| | | util.ResponseFormat(c, code.RequestParamError, "请对该车间和车组进行车号设置") |
| | | return |
| | | } |
| | | |
| | | if err := slf.ParamsCheck(params); err != nil { |
| | | util.ResponseFormat(c, code.RequestParamError, err.Error()) |
| | | util.ResponseFormat(c, code.RequestParamError, "该车间未配置车号,请在车间管理中配置!") |
| | | return |
| | | } |
| | | |
| | |
| | | }) |
| | | if err != nil { |
| | | util.ResponseFormat(c, code.RequestParamError, "保存失败") |
| | | return |
| | | } |
| | | |
| | | err = service.FinenessCheck(¶ms, silkStandard, endCarMap, isNew) |
| | |
| | | } |
| | | |
| | | func (slf FinenessController) ParamsCheck(params models.FinenessRegister) (err error) { |
| | | if params.Spec == "" || !strings.Contains(params.Spec, "/") { |
| | | return errors.New("规格格式不正确") |
| | | } |
| | | |
| | | specArr := strings.Split(params.Spec, "/") |
| | | |
| | | _, err = decimal.NewFromString(specArr[0]) |
| | | if err != nil { |
| | | return errors.New("规格格式不正确") |
| | | } |
| | | _, err = decimal.NewFromString(specArr[1]) |
| | | if err != nil { |
| | | return errors.New("规格格式不正确") |
| | | } |
| | | |
| | | if params.WorkshopNumber == "" || params.WorkshopGroup == 0 { |
| | | return errors.New("车间车组参数缺失") |
| | | } |
| | | |
| | | if len(params.FinenessList) == 0 { |
| | | return errors.New("纤度列表缺失") |
| | | } |
| | | |
| | | if params.ID == 0 { |
| | | _, err = models.NewFinenessRegisterSearch().SetNumber(params.Number).First() |
| | | if err != gorm.ErrRecordNotFound { |
| | |
| | | return |
| | | } |
| | | |
| | | if params.FinenessRegisterID == 0 { |
| | | util.ResponseFormat(c, code.RequestParamError, "参数缺失") |
| | | return |
| | | } |
| | | |
| | | err = service.FinenessReCheck(¶ms) |
| | | if err != nil { |
| | | logx.Errorf("service.FinenessReCheck err:%v, finenessCheck:%+v", err, params) |
| | |
| | | return slf |
| | | } |
| | | |
| | | func (slf *RawSilkRankStandardSearch) SetFineness(start, end decimal.Decimal) *RawSilkRankStandardSearch { |
| | | slf.StartFineness, slf.EndFineness = start, end |
| | | return slf |
| | | } |
| | | |
| | | func (slf *RawSilkRankStandardSearch) build() *gorm.DB { |
| | | db := slf.Orm.Table(slf.TableName()) |
| | | |
| | |
| | | db = db.Where("id = ?", slf.ID) |
| | | } |
| | | |
| | | if !slf.StartFineness.IsZero() || !slf.EndFineness.IsZero() { |
| | | db = db.Where("start_fineness = ? and end_fineness = ?", slf.StartFineness, slf.EndFineness) |
| | | } |
| | | |
| | | return db |
| | | } |
| | | |
| | |
| | | "silkserver/models" |
| | | "silkserver/utils" |
| | | "sort" |
| | | "strings" |
| | | ) |
| | | |
| | | func FinenessCheck(finenessRegister *models.FinenessRegister, standardMap map[string]*Standard, endCarMap map[int]bool, isNew bool) (err error) { |
| | |
| | | var deviation decimal.Decimal |
| | | var finenessGrade string |
| | | var roundingItemMap = make(map[float32]*models.FinenessRoundingItem, 0) |
| | | lastCarNo = finenessRegister.FinenessList[0].Position |
| | | for _, finenessItem := range finenessRegister.FinenessList { |
| | | roundedHalfFineness := ToRoundedHalfFineness(finenessItem.Fineness) |
| | | if lastCarNo != finenessItem.Position { //每个车号存一个models.FinenessCheckItem |
| | | carCheckNumber = 0 |
| | | lastCarNo = finenessItem.Position |
| | | } |
| | | roundedHalfFineness := ToRoundedHalfFineness(finenessItem.Fineness) //类似四舍五入 |
| | | fineness := decimal.NewFromFloat32(roundedHalfFineness) |
| | | for i := 0; i < finenessItem.Quantity; i++ { |
| | | allFinenessList = append(allFinenessList, fineness) |
| | | } |
| | | personFinenessList = append(personFinenessList, fineness) |
| | | carCheckNumber++ |
| | | if carCheckNumber == constvar.EveryPersonCarCheckNumber { |
| | | carCheckNumber = 0 |
| | | if endCarMap[finenessItem.Position] { //走到了某个人最后的车号,每人算一次偏差和等级 |
| | | deviation = utils.Deviation(personFinenessList) |
| | | finenessGrade = CalcFinenessGrade(item.Deviation, item.TotalDeviation, item.Cleanliness, item.Purity, item.TwiceChange, standardMap) |
| | | personFinenessList = personFinenessList[:0] |
| | | } |
| | | } |
| | | if lastCarNo != finenessItem.Position { //每个车号存一个models.FinenessCheckItem |
| | | roundingItems := make([]*models.FinenessRoundingItem, 0, len(roundingItemMap)) |
| | | for _, v := range roundingItemMap { |
| | | roundingItems = append(roundingItems, &models.FinenessRoundingItem{ |
| | | Fineness: v.Fineness, |
| | | Quantity: v.Quantity, |
| | | }) |
| | | } |
| | | item = &models.FinenessCheckItem{ |
| | | FinenessRegisterID: finenessRegister.ID, |
| | | Position: lastCarNo, |
| | | FinenessRoundingItems: roundingItems, |
| | | Deviation: deviation, |
| | | FinenessGrade: finenessGrade, |
| | | Remark: "", |
| | | } |
| | | |
| | | finenessCheckItems = append(finenessCheckItems, item) |
| | | lastCarNo = finenessItem.Position |
| | | roundingItemMap = make(map[float32]*models.FinenessRoundingItem, 0) |
| | | } |
| | | |
| | | if roundingItemMap[roundedHalfFineness] == nil { |
| | | roundingItemMap[roundedHalfFineness] = &models.FinenessRoundingItem{ |
| | | Fineness: fineness, |
| | |
| | | } |
| | | } else { |
| | | roundingItemMap[roundedHalfFineness].Quantity += finenessItem.Quantity |
| | | } |
| | | |
| | | carCheckNumber++ |
| | | if carCheckNumber == constvar.EveryPersonCarCheckNumber { |
| | | carCheckNumber = 0 |
| | | if endCarMap[finenessItem.Position] { //走到了某个人最后的车号,每人算一次偏差和等级 |
| | | deviation = utils.Deviation(personFinenessList) |
| | | finenessGrade = CalcFinenessGrade(item.Deviation, item.TotalDeviation, item.Cleanliness, item.Purity, item.TwiceChange, standardMap) |
| | | personFinenessList = personFinenessList[:0] |
| | | } else { |
| | | deviation = decimal.Zero |
| | | finenessGrade = "" |
| | | } |
| | | item = MakeFinenessCheckItem(roundingItemMap, finenessRegister.ID, lastCarNo, deviation, finenessGrade) |
| | | finenessCheckItems = append(finenessCheckItems, item) |
| | | roundingItemMap = make(map[float32]*models.FinenessRoundingItem, 0) //重置 |
| | | } |
| | | } |
| | | |
| | |
| | | return err |
| | | } |
| | | |
| | | func MakeFinenessCheckItem(roundingItemMap map[float32]*models.FinenessRoundingItem, finenessRegisterID uint, position int, deviation decimal.Decimal, finenessGrade string) *models.FinenessCheckItem { |
| | | roundingItems := make([]*models.FinenessRoundingItem, 0, len(roundingItemMap)) |
| | | for _, v := range roundingItemMap { |
| | | roundingItems = append(roundingItems, &models.FinenessRoundingItem{ |
| | | Fineness: v.Fineness, |
| | | Quantity: v.Quantity, |
| | | }) |
| | | } |
| | | item := &models.FinenessCheckItem{ |
| | | FinenessRegisterID: finenessRegisterID, |
| | | Position: position, |
| | | FinenessRoundingItems: roundingItems, |
| | | Deviation: deviation, |
| | | FinenessGrade: finenessGrade, |
| | | Remark: "", |
| | | } |
| | | |
| | | return item |
| | | } |
| | | |
| | | type gradeRank struct { |
| | | gradeName string |
| | | gradeRank int |
| | |
| | | checkItemGradeMap := make(map[constvar.CheckItem]string, 5) |
| | | gradeRanks := make([]gradeRank, 0) |
| | | for _, st := range standardMap { |
| | | if st.StartFineness.GreaterThan(deviation) || st.EndFineness.LessThan(deviation) { |
| | | continue |
| | | } |
| | | grade := "" |
| | | for _, pair := range st.ValueList { |
| | | switch st.CheckItem { |
| | |
| | | } |
| | | |
| | | func FinenessReCheck(finenessCheck *models.FinenessCheck) (err error) { |
| | | standardMap, err := GetSilkRankStandard() |
| | | finenessRegister, err := models.NewFinenessRegisterSearch().SetID(finenessCheck.FinenessRegisterID).First() |
| | | if err != nil { |
| | | return err |
| | | } |
| | | specArr := strings.Split(finenessRegister.Spec, "/") |
| | | start, _ := decimal.NewFromString(specArr[0]) |
| | | end, _ := decimal.NewFromString(specArr[1]) |
| | | standardMap, err := GetSilkRankStandard(start, end) |
| | | if err != nil { |
| | | return err |
| | | } |
| | |
| | | constvar.CheckItemMaxDeviation: SortTypeAsc, |
| | | } |
| | | |
| | | func GetSilkRankStandard() (map[string]*Standard, error) { |
| | | rankStandards, err := models.NewRawSilkRankStandardSearch().FindNotTotal() |
| | | func GetSilkRankStandard(startFineness, endFineness decimal.Decimal) (map[string]*Standard, error) { |
| | | rankStandards, err := models.NewRawSilkRankStandardSearch().SetFineness(startFineness, endFineness).FindNotTotal() |
| | | if err != nil { |
| | | return nil, err |
| | | } |