package order import ( "errors" "fmt" "time" "zhiyuan/models" "zhiyuan/pkg/db" "zhiyuan/pkg/logger" "zhiyuan/pkg/utils" "zhiyuan/services/form" ) var ASOrderVisit models.ASOrderVisit func GetVisits(where map[string]interface{}, fields []string, retVal interface{}) ([]*models.ASOrderVisit, error) { return ASOrderVisit.GetMulti(where, fields, retVal) } func GetVisit(where map[string]interface{}, fields []string, retVal interface{}) (*models.ASOrderVisit, error) { return ASOrderVisit.GetOne(where, fields, retVal) } func AddVisit(form form.OrderVisitAdd) error { formatTime := utils.DateParseUnix(form.VisitTime, "Y-m-d") if formatTime == 0 { return errors.New("日期格式有误") } visitMap := map[string]interface{}{ "order_id": form.OrderID, "visit_time": formatTime, } if _, err := db.InsertOne(ASOrderVisit.TableName(), visitMap); err != nil { return errors.New("操作失败") } UpdateOrderVisitTime(form.OrderID) return nil } func UpdateOrderVisitTime(orderID int) error { visitTime := 0 if recentVisit, _ := GetVisit(map[string]interface{}{"order_id": orderID, "_orderby": "visit_time ASC", "state": 1, "deleted_at": 0}, nil, nil); recentVisit != nil { visitTime = recentVisit.VisitTime } db.Update(ASOrder.TableName(), map[string]interface{}{"id": orderID}, map[string]interface{}{"recent_visit_time": visitTime}) return nil } func DelVisit(id int) error { visitInfo, err := GetVisit(map[string]interface{}{"id": id}, nil, nil) if err != nil { return err } if visitInfo.Type1 == 1 || visitInfo.Type2 == 1 || visitInfo.Type3 == 1 || visitInfo.Type4 == 1 { return errors.New("不能删除系统安排的回访") } if visitInfo.State != 1 { return errors.New("不能删除已完成的回访") } _, err = db.DeleteSoft(ASOrderVisit.TableName(), map[string]interface{}{"id": id}) return err } func FinishVisit(form form.OrderVisitEdit, id int) error { formatTime := utils.DateParseUnix(form.FinishedAt, "Y-m-d") if formatTime == 0 { return errors.New("日期格式有误") } if _, err := GetVisit(map[string]interface{}{"id": id}, nil, nil); err == nil { //if visitInfo, err := GetVisit(map[string]interface{}{"id": id}, nil, nil); err == nil { //if visitInfo.VisitTime > formatTime { // return errors.New("完成时间不能早于预计时间") //} } else { return errors.New("回访信息有误") } visitMap := map[string]interface{}{ "order_id": form.OrderID, "content": form.Content, "finished_at": formatTime, "state": 2, "contact_state": form.ContactState, } _, err := db.Update(ASOrderVisit.TableName(), map[string]interface{}{"id": id}, visitMap) if err != nil { return errors.New("操作失败") } if form.ContactState == 1 { AddTypeVisit(form.OrderID, int64(formatTime), 1) } else { deleteVisit(form.OrderID, 1) } UpdateOrderVisitTime(form.OrderID) return nil } func AddTypeVisit(orderID int, times int64, typ int) error { t := time.Unix(times+24*60*60, 0).In(time.Local) formatTime := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, time.Local).Unix() logger.Sugar.Infof("formatTime: %v", formatTime) if formatTime == 0 { return errors.New("日期格式有误") } if typ == 3 { o, _ := models.ASOrderVisit{}.GetOne(map[string]interface{}{ "order_id": orderID, "type3": 1, "state": 1, "deleted_at": 0, }, nil, nil) if o != nil { return nil } deleteVisit(orderID, 2) } else { deleteVisit(orderID, typ) } visitMap := map[string]interface{}{ "order_id": orderID, "visit_time": formatTime, } v, _ := models.ASOrderVisit{}.GetOne(map[string]interface{}{ "order_id": orderID, "visit_time": formatTime, "state": 1, "deleted_at": 0, }, nil, nil) for _, n := range []int{1, 2, 3, 4} { t := 0 if v != nil { switch n { case 1: t = v.Type1 case 2: t = v.Type2 case 3: t = v.Type3 case 4: t = v.Type4 } } if typ == n { t = 1 } visitMap[fmt.Sprintf("type%d", n)] = t } if v == nil { if _, err := db.InsertOne(ASOrderVisit.TableName(), visitMap); err != nil { return errors.New("操作失败") } } else { db.Update(ASOrderVisit.TableName(), map[string]interface{}{"id": v.ID}, visitMap) } UpdateOrderVisitTime(orderID) return nil } func deleteVisit(orderID int, typ int) { delValues := []interface{}{time.Now().Unix(), orderID} upFmts := []interface{}{typ, typ} for _, n := range []int{1, 2, 3, 4} { t := 0 if typ == n { t = 1 } else { upFmts = append(upFmts, n) } delValues = append(delValues, t) } db.Exec("UPDATE zy_as_order_visit SET deleted_at=? WHERE (order_id=? and type1=? and type2=? and type3=? and type4=? and state = 1 and deleted_at = 0)", delValues) db.Exec(fmt.Sprintf("UPDATE zy_as_order_visit SET type%d=0 WHERE (order_id=? and type%d=1 and (type%d!=0 or type%d!=0 and type%d!=0) and state = 1 and deleted_at = 0)", upFmts...), []interface{}{orderID}) }