reward_standard.go 7.7 KB
package domain

import (
	"errors"
	"fmt"
	"strconv"
	"time"
)

// RewardStandard 奖惩标准
type RewardStandard struct {
	Id             int               `json:"id"`             //奖惩标准id
	CompanyId      int               `json:"companyId"`      //企业id
	OrgId          int               `json:"orgId"`          //组织ID
	Workshop       SimpleWorkshop    `json:"workshop"`       //车间id
	ProductLine    SimpleProductLine `json:"productLine"`    //生产线
	ProductSection ProductSection    `json:"ProductSection"` //工段
	Remark         string            `json:"remark"`         //备注
	TargetType     int               `json:"targetType"`     //指标类别 1:产效 2:合格率 3:安全事故 4:质量事故 5:异物次数
	TargeVal1      string            `json:"targeVal1"`      //填写的指标值1
	TargeVal2      string            `json:"targeVal2"`      //填写的指标值2
	TargeVal3      string            `json:"targeVal3"`      //填写的指标值3
	TargeVal4      string            `json:"targeVal4"`      //填写的指标值4
	CreatedAt      time.Time         `json:"createdAt"`      //创建时间
	UpdatedAt      time.Time         `json:"updatedAt"`      //更新时间
	DeletedAt      *time.Time        `json:"-"`              //删除时间
}

/*
填写的指标值描述
产效=> 功: 大于等于 x kg/小时;过:小于 x kg/小时
合格率=> 功:大于等于 x% ;过:小于 x%
安全事故 => 功:小于等于 x 次 或者 损失小于等于 x 元;过:大于 x 次 或 损失大于 x 元
质量事故 => 功:小于等于 x 次 或者 损失 小于等于 x 元;过:大于 x 次 或者 损失大于 x 元
异物次数 => 功:发现金属小于等于 x 次 或者 发现非金属小于等于 x 次
		   过:发现金属大于 x 次 或 发现非金数大于 x 次

*/

type RewardStandardRepository interface {
	Save(param *RewardStandard) (*RewardStandard, error)
	Remove(param *RewardStandard) (*RewardStandard, error)
	FindOne(queryOptions map[string]interface{}) (*RewardStandard, error)
	Find(queryOptions map[string]interface{}) (int64, []*RewardStandard, error)
}

// 指标类别 1:产效 2:合格率 3:安全事故 4:质量事故 5:异物次数
const (
	TargetType1 int = 1
	TargetType2 int = 2
	TargetType3 int = 3
	TargetType4 int = 4
	TargetType5 int = 5
)

// UpdateTarge 更新指标内容
func (m *RewardStandard) UpdateTarge(targetType int, targeVal1 string, targeVal2 string, targeVal3 string, targeVal4 string) error {
	switch targetType {
	case TargetType1, TargetType2:
		if len(targeVal1) == 0 || len(targeVal2) == 0 {
			return errors.New("功过指标内容不能为空")
		}
		_, err := strconv.Atoi(targeVal1)
		if err != nil {
			return errors.New("功过指标内容需要为整数")
		}
		_, err = strconv.Atoi(targeVal2)
		if err != nil {
			return errors.New("功过指标内容需要为整数")
		}
		m.TargetType = targetType
		m.TargeVal1 = targeVal1
		m.TargeVal2 = targeVal2
		m.TargeVal3 = ""
		m.TargeVal4 = ""
	case TargetType3, TargetType4, TargetType5:
		if len(targeVal1) == 0 || len(targeVal2) == 0 || len(targeVal3) == 0 || len(targeVal4) == 0 {
			return errors.New("功过指标内容不能为空")
		}
		_, err := strconv.Atoi(targeVal1)
		if err != nil {
			return errors.New("功过指标内容需要为整数")
		}
		_, err = strconv.Atoi(targeVal2)
		if err != nil {
			return errors.New("功过指标内容需要为整数")
		}
		_, err = strconv.Atoi(targeVal3)
		if err != nil {
			return errors.New("功过指标内容需要为整数")
		}
		_, err = strconv.Atoi(targeVal4)
		if err != nil {
			return errors.New("功过指标内容需要为整数")
		}
		m.TargetType = targetType
		m.TargeVal1 = targeVal1
		m.TargeVal2 = targeVal2
		m.TargeVal3 = targeVal3
		m.TargeVal4 = targeVal4
	default:
		return errors.New("指标类型填写错误")

	}
	return nil
}

// TargetTypeName
func (m *RewardStandard) TargetTypeName() string {
	switch m.TargetType {
	case TargetType1:
		return "产效"
	case TargetType2:
		return "合格率"
	case TargetType3:
		return "安全事故"
	case TargetType4:
		return "质量事故"
	case TargetType5:
		return "异物次数"
	}
	return ""
}

// ShowTargeReward 功过指标描述,功劳
func (m *RewardStandard) ShowTargeReward() string {
	show := ""
	switch m.TargetType {
	case TargetType1:
		show = fmt.Sprintf(">=%skg/小时", m.TargeVal1)
	case TargetType2:
		show = fmt.Sprintf(">=%s%%", m.TargeVal1)
	case TargetType3:
		show = fmt.Sprintf("<=%s次或损失<=%s元", m.TargeVal1, m.TargeVal2)
	case TargetType4:
		show = fmt.Sprintf("<=%s次或损失<=%s元", m.TargeVal1, m.TargeVal2)
	case TargetType5:
		show = fmt.Sprintf("金属<=%s次或非金属<=%s", m.TargeVal1, m.TargeVal2)
	}
	return show
}

// ShowTargeFault 功过指标描述,过失
func (m *RewardStandard) ShowTargeFault() string {
	show := ""
	switch m.TargetType {
	case TargetType1:
		show = fmt.Sprintf("<%skg/小时", m.TargeVal2)
	case TargetType2:
		show = fmt.Sprintf("<%s%%", m.TargeVal2)
	case TargetType3:
		show = fmt.Sprintf(">%s次或损失>%s元", m.TargeVal3, m.TargeVal4)
	case TargetType4:
		show = fmt.Sprintf("<=%s次或损失>%s元", m.TargeVal3, m.TargeVal4)
	case TargetType5:
		show = fmt.Sprintf("金属>%s次或非金属>%s", m.TargeVal3, m.TargeVal4)
	}
	return show
}

// 判定功过, 指标类别 1:产效
// param1 产效值
// 功过结果 0 无,1 功 ,-1 过;
func (m *RewardStandard) VerdictTargetType1(param1 float64) int {
	val1, _ := strconv.ParseFloat(m.TargeVal1, 64)
	val2, _ := strconv.ParseFloat(m.TargeVal2, 64)
	result := 0
	if param1 > val1 {
		result = 1
	} else if param1 < val2 {
		result = -1
	}
	return result
}

// 判定功过, 指标类别 2:合格率
// param1 合格率
// 功过结果 0 无,1 功 ,-1 过;
func (m *RewardStandard) VerdictTargetType2(param1 float64) int {
	val1, _ := strconv.ParseFloat(m.TargeVal1, 64)
	val2, _ := strconv.ParseFloat(m.TargeVal2, 64)
	result := 0
	if param1 > val1 {
		result = 1
	} else if param1 < val2 {
		result = -1
	}
	return result
}

// 判定功过, 指标类别 3:安全事故;
// param1 安全事故次数;
// param1 损失金额;
// 功过结果 0 无,1 功 ,-1 过;
func (m *RewardStandard) VerdictTargetType3(param1 int, param2 float64) int {
	val1, _ := strconv.Atoi(m.TargeVal1)
	val2, _ := strconv.ParseFloat(m.TargeVal2, 64)
	result := 0
	//判定功
	if param1 <= val1 {
		result = 1
	}
	if param2 <= val2 {
		result = 1
	}
	//判定过
	val3, _ := strconv.Atoi(m.TargeVal3)
	val4, _ := strconv.ParseFloat(m.TargeVal4, 64)

	if param1 > val3 {
		result = -1
	}
	if param2 > val4 {
		result = -1
	}
	return result
}

// 判定功过, 指标类别 4:质量事故;
// param1 质量事故 次数;
// param1 损失金额;
// 功过结果 0 无,1 功 ,-1 过;
func (m *RewardStandard) VerdictTargetType4(param1 int, param2 float64) int {
	val1, _ := strconv.Atoi(m.TargeVal1)
	val2, _ := strconv.ParseFloat(m.TargeVal2, 64)
	result := 0
	//判定功
	if param1 <= val1 {
		result = 1
	}
	if param2 <= val2 {
		result = 1
	}
	//判定过
	val3, _ := strconv.Atoi(m.TargeVal3)
	val4, _ := strconv.ParseFloat(m.TargeVal4, 64)

	if param1 > val3 {
		result = -1
	}
	if param2 > val4 {
		result = -1
	}
	return result
}

// 判定功过, 指标类别 5:异物次数;
// param1 金属异物 次数;
// param2 非金属 次数;
// 功过结果 0 无,1 功 ,-1 过;
func (m *RewardStandard) VerdictTargetType5(param1 int, param2 int) int {
	val1, _ := strconv.Atoi(m.TargeVal1)
	val2, _ := strconv.Atoi(m.TargeVal2)
	result := 0
	//判定功
	if param1 <= val1 {
		result = 1
	}
	if param2 <= val2 {
		result = 1
	}
	//判定过
	val3, _ := strconv.Atoi(m.TargeVal3)
	val4, _ := strconv.Atoi(m.TargeVal4)

	if param1 > val3 {
		result = -1
	}
	if param2 > val4 {
		result = -1
	}
	return result
}