123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- package service
- import (
- "errors"
- "fmt"
- "time"
- "gopkg.in/guregu/null.v3"
- "xiaoniaokuaiyan.com/xiaoniao/entity"
- "xiaoniaokuaiyan.com/xiaoniao/util"
- )
- type ProductivityService struct {
- }
- func (srv *ProductivityService) Add(pitem *entity.ProductivityInfo) (interface{}, error) {
- if pitem.Id != 0 {
- return nil, errors.New("productivity info already exists")
- }
- strSql, kv := util.GenerateInsertSqlFromStruct("t_producer_info", pitem)
- db := util.GetWriteSqlDB()
- sqlResult, err := db.NamedExec(strSql, kv)
- if err != nil {
- return nil, err
- }
- if pid, err := sqlResult.LastInsertId(); err != nil {
- return nil, err
- } else {
- pitem.Id = int(pid)
- return pitem, nil
- }
- }
- func (srv *ProductivityService) Update(pitem *entity.ProductivityInfo) (interface{}, error) {
- if pitem.Id <= 0 {
- return nil, errors.New("can not find record")
- }
- strSql, kv := util.GenerateUpdateSqlFromStruct("t_producer_info", pitem, fmt.Sprintf("where id =%d", pitem.Id))
- db := util.GetWriteSqlDB()
- sqlResult, err := db.NamedExec(strSql, kv)
- if err != nil {
- return nil, err
- }
- if ra, err := sqlResult.RowsAffected(); err != nil {
- return nil, err
- } else if ra <= 0 {
- return nil, errors.New("update failed, can not find record ")
- }
- return pitem, nil
- }
- type producerInfo struct {
- GId int `db:"id"`
- GNum int `db:"gnum"`
- RemainNum null.Int `db:"remain_num"`
- PDate null.String `db:"pdate"`
- TimeRange null.String `db:"time_range"`
- }
- const QUERY_DAYS = 30 //todo config
- //var TIME_RANGES = []string{
- // "08:30-09:30",
- // "09:30-10:30",
- // "10:30-11:30",
- // // "11:30-12:30",
- // "12:30-13:30",
- // "13:30-14:30",
- // "14:30-15:30",
- // "15:30-16:30",
- //}
- //20210123 永久修改产能为上午下午
- //20210913 改为早8点
- //var TIME_RANGES = []string{
- // "08:00-12:00",
- // "13:00-16:00",
- //}
- //20220120 万万没想到,又改了
- var TIME_RANGES = []string{
- "08:00-10:00",
- "10:00-15:00",
- }
- //20230420 是啊,再一次修改
- var TIME_RANGES_KONGFU = map[int][]string{
- 100:{"08:00-09:00","09:00-10:00",},
- 200:{"08:00-09:00","09:00-10:00","10:00-11:00","11:00-12:00",},
- 300:{"08:00-12:00","13:00-15:00",},
- }
- var TIME_RANGES_ALIAS = []string{
- "上午",
- "下午",
- }
- type ptValue struct {
- TimeRange string `json:"timeRange"`
- RemainNum int64 `json:"remainNum"`
- }
- type ptValues []*ptValue
- func (srv *ProductivityService) PtList(cityId int, fromDay string, ptType int, kongFuType int ) (interface{}, error) {
- var qDays = QUERY_DAYS
- now, err := time.Parse("2006-01-02", fromDay)
- if err != nil {
- now = time.Now()
- if now.Hour() > 15 {
- now = now.Add(time.Hour * 48)
- } else {
- now = now.Add(time.Hour * 24)
- }
- }
- today := now.Format("2006-01-02")
- var timeRanges []string
- var bl bool
- timeRanges, bl = TIME_RANGES_KONGFU[kongFuType]
- if !bl {
- timeRanges = TIME_RANGES_KONGFU[100]
- }
- if ptType == 1 {
- timeRanges = TIME_RANGES_ALIAS
- } else if ptType == 2 {
- //timeRanges = []string{
- // //"9:00-12:00",
- // //"14:00-17:00",
- // "09:00-12:00",
- // "13:00-16:00",
- //}
-
- qDays = 6
- }
- strSql := "select t1.id, t1.gnum, t2.remain_num, t2.pdate, t2.time_range from (select id, num as gnum from t_producer_config where city_id = ? and type = ?) t1 left join (select * from t_producer_info where pdate > ?) t2 on t1.id = t2.global_id;"
- result := []producerInfo{}
- db := util.GetSqlDB()
- err = db.Select(&result, strSql, cityId, ptType, today)
- if err != nil {
- return nil, err
- }
- if len(result) == 0 {
- return nil, errors.New(fmt.Sprintf("1::have not init config for city: %d", cityId))
- }
- plist := []map[string]interface{}{}
- tempKV := map[string]interface{}{}
- invalidDays := map[string]interface{}{}
- if len(result) > 0 {
- for _, pinfo := range result {
- if pinfo.TimeRange.String == "*" {
- invalidDays[pinfo.PDate.String] = struct{}{}
- continue
- }
- tempKV[pinfo.PDate.String+pinfo.TimeRange.String] = map[string]interface{}{
- "pdate": pinfo.PDate.String,
- "timeRange": pinfo.TimeRange.String,
- "remainNum": pinfo.RemainNum.Int64,
- }
- }
- }
- gnum := result[0].GNum
- for i := 1; i <= qDays; i++ {
- d := time.Duration(int64(time.Hour) * int64(24*i))
- tdate := now.Add(d).Format("2006-01-02")
- if _, ok := invalidDays[tdate]; ok {
- plist = append(plist, map[string]interface{}{
- "pdate": tdate,
- "timeRange": "*",
- "remainNum": int64(0),
- })
- continue
- }
- for _, tr := range timeRanges {
- if v, ok := tempKV[tdate+tr]; ok {
- plist = append(plist, v.(map[string]interface{}))
- continue
- }
- plist = append(plist, map[string]interface{}{
- "pdate": tdate,
- "timeRange": tr,
- "remainNum": int64(gnum),
- })
- }
- }
- var resultList = map[string]ptValues{}
- var (
- pdate string
- )
- for _, pi := range plist {
- val := &ptValue{
- TimeRange: pi["timeRange"].(string),
- RemainNum: pi["remainNum"].(int64),
- }
- pdate = pi["pdate"].(string)
- resultList[pdate] = append(resultList[pdate], val)
- }
- return map[string]interface{}{
- "pt_gid": result[0].GId,
- "pt_list": resultList,
- }, nil
- }
|