123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538 |
- package order
- import (
- "errors"
- "fmt"
- "time"
- "zhiyuan/models"
- "zhiyuan/models/final"
- "zhiyuan/pkg/app"
- "zhiyuan/pkg/db"
- orderParam "zhiyuan/pkg/param/order"
- "zhiyuan/pkg/utils"
- "zhiyuan/services/admin"
- "zhiyuan/services/aftersale"
- "zhiyuan/services/form"
- "zhiyuan/services/sms"
- "zhiyuan/services/structs"
- "zhiyuan/services/user"
- )
- var ASOrder models.ASOrder
- var ASOrderDetail models.ASOrderDetail
- var ASPickWork final.MatPickWork
- func GetList(where map[string]interface{}, fields []string, page app.Page, retVal interface{}) ([]*models.ASOrder, error) {
- if page.PageNum > 0 && page.PageSize > 0 {
- where["_limit"] = db.GetOffset(uint(page.PageNum), uint(page.PageSize))
- }
- return ASOrder.GetMulti(where, fields, retVal)
- }
- func GetLists(where map[string]string, param map[string]interface{}, page app.Page, retVal interface{}) error {
- if page.PageNum > 0 && page.PageSize > 0 {
- where["_page_num"] = db.ToString(page.PageNum)
- where["_page_size"] = db.ToString(page.PageSize)
- }
- sql := "SELECT o.* FROM zy_as_order o"
- return db.GetMultiRaw(sql, where, param, retVal)
- }
- func GetListWidthVisit(where map[string]string, param map[string]interface{}, page app.Page, retVal interface{}) error {
- if page.PageNum > 0 && page.PageSize > 0 {
- where["_page_num"] = db.ToString(page.PageNum)
- where["_page_size"] = db.ToString(page.PageSize)
- }
- sql := "SELECT o.* FROM zy_as_order o LEFT JOIN zy_as_order_visit v ON o.id=v.order_id AND v.deleted_at=0"
- return db.GetMultiRaw(sql, where, param, retVal)
- }
- func GetListWidthForceCompleted(where map[string]string, param map[string]interface{}, retVal interface{}) error {
- sql := "SELECT o.*, if(o.state=90,90,if(o.is_force=0,o.state,100)) as `cstate`, if(o.finish_state=1 and UNIX_TIMESTAMP()>o.end_time,1,0) as `repair_timeout` FROM zy_as_order o"
- return db.GetMultiRaw(sql, where, param, retVal)
- }
- func GetListWidthDetail(where map[string]string, param map[string]interface{}, retVal interface{}) error {
- sql := "SELECT o.*, if(o.state=90,90,if(o.is_force=0,o.state,100)) as `cstate`, if(o.finish_state=1 and UNIX_TIMESTAMP()>o.end_time,1,0) as `repair_timeout`, d.province, d.city, d.region, d.address, d.content, d.pics, d.remarks FROM zy_as_order o LEFT JOIN zy_as_order_detail d ON o.id=d.order_id"
- return db.GetMultiRaw(sql, where, param, retVal)
- }
- func GetCountWidthDetail(where string, param map[string]interface{}) (int64, error) {
- sql := "zy_as_order o LEFT JOIN zy_as_order_detail d ON o.id=d.order_id WHERE " + where
- return db.CountRaw(sql, param)
- }
- func Count(where map[string]interface{}) (int64, error) {
- return db.Count(ASOrder.TableName(), where)
- }
- func GetOneWithDetail(where string, param map[string]interface{}, retVal interface{}) error {
- sql := "SELECT o.*, d.province, d.city, d.region, d.address, d.content, d.pics FROM zy_as_order o LEFT JOIN zy_as_order_detail d ON o.id=d.order_id"
- return db.GetMultiRaw(sql, map[string]string{"where": where, "_page_size": "1", "_page_num": "1"}, param, retVal)
- }
- func GetInfoByID(id int, fields []string, retVal interface{}) (*models.ASOrder, error) {
- return ASOrder.GetOne(map[string]interface{}{"id": id}, fields, retVal)
- }
- func GetWorkInfoByID(id int, fields []string, retVal interface{}) (*final.MatPickWork, error) {
- return ASPickWork.GetOne(map[string]interface{}{"id": id}, fields, retVal)
- }
- func Del(id int) error {
- _, err := db.DeleteSoft(ASOrder.TableName(), map[string]interface{}{"id": id})
- return err
- }
- func Add(form form.OrderAdd) (int, error) {
- // 添加订单
- orderMap := map[string]interface{}{
- "order_no": utils.RandomOrder("10", 2),
- "main_type": form.MainType,
- "sub_type": form.SubType,
- "state": orderParam.State.Created.ID,
- "house_id": form.HouseID,
- "type": form.Typ,
- }
- if form.Typ == 1 {
- o, err := ASOrder.GetOne(map[string]interface{}{
- "house_id": form.HouseID,
- "state not in": []int{orderParam.State.Completed.ID, orderParam.State.Revoked.ID},
- "deleted_at": 0,
- }, nil, nil)
- if err != nil {
- return 0, err
- }
- if o != nil {
- return 0, errors.New("该房屋存在未完结的报修")
- }
- }
- var houseInfo *structs.HouseList
- if _, err := user.GetHouseInfoByID(form.HouseID, nil, &houseInfo); err != nil {
- return 0, errors.New("房屋信息有误")
- }
- /*is := false
- uid := 0
- for i, userid := range strings.Split(houseInfo.UserIDs, ",") {
- id, _ := db.ToInt64(userid)
- if i == 0 {
- uid = int(id)
- }
- if int(id) == form.UserID {
- is = true
- }
- }
- if form.UserID > 0 && !is {
- return 0, errors.New("房屋信息不匹配")
- }
- if form.UserID > 0 {
- uid = form.UserID
- }*/
- /*if form.UserID > 0 && houseInfo.UserID != form.UserID {
- return 0, errors.New("房屋信息不匹配")
- }
- orderMap["user_id"] = uid
- if userInfo, _ := user.GetOne(map[string]interface{}{"id": uid}, nil, nil); userInfo == nil {
- return 0, errors.New("用户不存在")
- } else {
- orderMap["link_name"] = userInfo.Name
- orderMap["link_phone"] = userInfo.Phone
- }
- if utils.ToInt64(houseInfo.WarrantyStart) > 0 {
- var typeInfo *structs.WarrantyType
- aftersale.GetTypeOne(map[string]interface{}{"id": form.MainType}, nil, &typeInfo)
- user.GetWarrantyPeriod(utils.ToInt64(houseInfo.WarrantyStart), typeInfo, houseInfo)
- orderMap["warranty_start"] = houseInfo.WarrantyStart
- orderMap["warranty_end"] = typeInfo.WarrantyEnd
- orderMap["in_warranty"] = typeInfo.InWarranty
- }
- if userInfo, err := user.GetOne(map[string]interface{}{"id": uid}, nil, nil); err == nil {
- //if userInfo, err := user.GetOne(map[string]interface{}{"id": houseInfo.UserID}, nil, nil); err == nil {
- orderMap["site_id"] = userInfo.SiteID
- }*/
- if form.UserID > 0 && houseInfo.UserID != form.UserID {
- return 0, errors.New("房屋信息不匹配")
- }
- orderMap["user_id"] = houseInfo.UserID
- orderMap["link_name"] = houseInfo.LinkName
- orderMap["link_phone"] = houseInfo.LinkPhone
- if utils.ToInt64(houseInfo.WarrantyStart) > 0 {
- var typeInfo *structs.WarrantyType
- aftersale.GetTypeOne(map[string]interface{}{"id": form.MainType}, nil, &typeInfo)
- user.GetWarrantyPeriod(utils.ToInt64(houseInfo.WarrantyStart), typeInfo, houseInfo)
- orderMap["warranty_start"] = houseInfo.WarrantyStart
- orderMap["warranty_end"] = typeInfo.WarrantyEnd
- orderMap["in_warranty"] = typeInfo.InWarranty
- }
- if userInfo, err := user.GetOne(map[string]interface{}{"id": houseInfo.UserID}, nil, nil); err == nil {
- orderMap["site_id"] = userInfo.SiteID
- }
- orderID, err := db.InsertOne(ASOrder.TableName(), orderMap)
- if err != nil {
- return 0, errors.New("添加订单失败")
- }
- // 添加订单明细
- detailMap := map[string]interface{}{
- "order_id": orderID,
- "address": houseInfo.Address,
- "content": form.Content,
- "pics": form.Pics,
- }
- _, err = db.InsertOne(ASOrderDetail.TableName(), detailMap)
- if err != nil {
- return 0, errors.New("添加订单明细失败")
- }
- // 添加订单 event
- err = AddEvent(EventForm{OrderID: utils.ToInt(orderID), OrderState: orderParam.State.Created.ID})
- if err != nil {
- return 0, err
- }
- return utils.ToInt(orderID), nil
- }
- func Revoke(form form.OrderRevoke, id int) error {
- orderInfo, err := GetInfoByID(id, nil, nil)
- if err != nil {
- return err
- }
- if form.UserID > 0 && orderInfo.UserID != form.UserID {
- return errors.New("没有权限撤销该工单")
- }
- if !utils.IsContain(orderParam.Allow.Revoke, orderInfo.State) {
- return errors.New("该工单不允许撤销")
- }
- _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{"state": orderParam.State.Revoked.ID})
- if err != nil {
- return err
- }
- // 添加订单 event
- return AddEvent(EventForm{
- OrderID: id,
- OrderState: orderParam.State.Revoked.ID,
- Content: "撤销原因:" + form.Content,
- Servicer: form.Servicer,
- })
- }
- func Suspend(form form.OrderSuspend, id int) error {
- orderInfo, err := GetInfoByID(id, nil, nil)
- if err != nil {
- return err
- }
- if !utils.IsContain(orderParam.Allow.Suspend, orderInfo.State) {
- return errors.New("该工单不允许待定")
- }
- _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{"state": orderParam.State.Suspending.ID})
- if err != nil {
- return err
- }
- // 添加订单 event
- return AddEvent(EventForm{
- OrderID: id,
- OrderState: orderParam.State.Suspending.ID,
- Content: "待定原因:" + form.Content,
- Servicer: form.Servicer,
- })
- }
- func Check(form form.OrderCheck, id int) error {
- orderInfo, err := GetInfoByID(id, nil, nil)
- if err != nil {
- return err
- }
- if !utils.IsContain(orderParam.Allow.Check, orderInfo.State) {
- return errors.New("该工单不允许审核")
- }
- _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{
- "state": orderParam.State.Checked.ID,
- "maintenance_remark": form.Remark,
- })
- if err != nil {
- return err
- }
- // 添加订单 event
- return AddEvent(EventForm{
- OrderID: id,
- OrderState: orderParam.State.Checked.ID,
- Servicer: form.Servicer,
- Content: form.Remark,
- })
- }
- func Remark(form form.OrderRemark, id int) error {
- db.Update(ASOrderDetail.TableName(), map[string]interface{}{"order_id": id}, map[string]interface{}{"remarks": form.Content})
- return nil
- }
- func Issue(form form.OrderIssue, id int) error {
- orderInfo, err := GetInfoByID(id, nil, nil)
- if err != nil {
- return err
- }
- DelIssueByOrder(id)
- issueList := make([]map[string]interface{}, 0)
- for _, v := range form.IssueList {
- issueMap := map[string]interface{}{
- "order_id": id,
- "director": v.Director,
- "issue_id": v.IssueID,
- "issue_desc": v.IssueDesc,
- "brand": v.Brand,
- "leader": orderInfo.Leader,
- "in_warranty": orderInfo.InWarranty,
- }
- if v.Director == 1 && v.Brand == 0 {
- return errors.New("材料商问题需要选择主材品牌")
- }
- issueList = append(issueList, issueMap)
- }
- AddMultiIssue(issueList)
- _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{"is_issue": 1})
- return err
- }
- func Complete(form form.OrderComplete, id int) error {
- orderInfo, err := GetInfoByID(id, nil, nil)
- if err != nil {
- return err
- }
- force := form.IsForce
- if form.IsForce > 0 {
- if !admin.CheckAuth([]string{"aftersale:order:force_complete"}, form.Servicer) || !utils.IsContain(orderParam.Allow.ForceComplete, orderInfo.State) {
- return errors.New("该工单不允许强制完结")
- }
- } else if !utils.IsContain(orderParam.Allow.Complete, orderInfo.State) {
- return errors.New("该工单不允许完结")
- }
- fmt.Println(orderInfo)
- if orderInfo.Leader == 0 {
- return errors.New("该工单还没有分配")
- }
- data := map[string]interface{}{
- "is_force": force,
- "statement_time": time.Now().Unix(),
- }
- if force == 0 {
- data["state"] = orderParam.State.Completed.ID
- }
- _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, data)
- if err != nil {
- return err
- }
- // 添加订单 event
- return AddEvent(EventForm{
- OrderID: id,
- OrderState: orderParam.State.Completed.ID,
- Servicer: form.Servicer,
- })
- }
- func ReAllot(form form.OrderAllot, id int) error {
- orderInfo, err := GetInfoByID(id, nil, nil)
- if err != nil {
- return err
- }
- if !utils.IsContain(orderParam.Allow.ReAllot, orderInfo.State) {
- return errors.New("该工单不允许重新分配")
- }
- if orderInfo.Leader == 0 {
- return errors.New("该工单还未分配")
- }
- _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{
- "leader": form.Leader,
- "state": orderParam.State.Allotted.ID,
- "dispatch_time": time.Now().Unix(),
- })
- if err != nil {
- return err
- }
- // 发送派单短信
- SendAllotSms(form.Leader)
- AddTypeVisit(id, time.Now().Unix(), 1)
- // 获取之前的 event
- eventInfo, err := GetEventInfo(map[string]interface{}{
- "order_id": id,
- "order_state": orderParam.State.Allotted.ID,
- }, nil, nil)
- if err != nil || orderInfo == nil {
- return errors.New("获取工单进度失败")
- }
- // 添加订单 event
- return AddEvent(EventForm{
- EventID: eventInfo.ID,
- OrderID: id,
- OrderState: orderParam.State.Allotted.ID,
- Servicer: form.Servicer,
- Leader: form.Leader,
- })
- }
- func Allot(form form.OrderAllot, id int) error {
- orderInfo, err := GetInfoByID(id, nil, nil)
- if err != nil {
- return err
- }
- if orderInfo.Leader > 0 {
- return ReAllot(form, id)
- }
- if !utils.IsContain(orderParam.Allow.Allot, orderInfo.State) {
- return errors.New("该工单不允许分配")
- }
- typeInfo, _ := aftersale.GetTypeOne(map[string]interface{}{"id": orderInfo.MainType}, nil, nil)
- now := time.Now()
- data := map[string]interface{}{
- "state": orderParam.State.Allotted.ID,
- "leader": form.Leader,
- "dispatch_time": now.Unix(),
- }
- if typeInfo.RepairDays != 0 {
- data["start_time"] = now.Unix()
- data["end_time"] = now.AddDate(0, 0, typeInfo.RepairDays).Unix()
- data["finish_state"] = 1
- }
- _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, data)
- if err != nil {
- return err
- }
- AddTypeVisit(id, time.Now().Unix(), 1)
- // 发送派单短信
- SendAllotSms(form.Leader)
- // 添加订单 event
- return AddEvent(EventForm{
- OrderID: id,
- OrderState: orderParam.State.Allotted.ID,
- Servicer: form.Servicer,
- Leader: form.Leader,
- })
- }
- func SendAllotSms(leader int) {
- go func() {
- if adminInfo, _ := admin.GetOne(map[string]interface{}{"id": leader}, []string{"phone"}, nil); adminInfo != nil {
- sms.SendAftersaleOrderAllot(adminInfo.Phone)
- }
- }()
- }
- func Schedule(form form.OrderSchedule, id int) error {
- orderInfo, err := GetInfoByID(id, nil, nil)
- if err != nil {
- return err
- }
- formatTime := utils.DateParseUnix(form.Date, "Y-m-d H:i")
- if formatTime == 0 {
- return errors.New("日期格式有误")
- }
- if !utils.IsContain(orderParam.Allow.Repairing, orderInfo.State) {
- return errors.New("工单状态有误")
- }
- _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{
- "state": orderParam.State.Repairing.ID,
- "schedule_time": formatTime,
- })
- if err != nil {
- return err
- }
- AddTypeVisit(id, int64(formatTime), 2)
- // 添加订单 event
- return AddEvent(EventForm{
- OrderID: id,
- OrderState: orderParam.State.Repairing.ID,
- Leader: form.Leader,
- Date: form.Date,
- })
- }
- func Confirm(id int, userID int) error {
- orderInfo, err := GetInfoByID(id, nil, nil)
- if err != nil {
- return err
- }
- if userID > 0 && orderInfo.UserID != userID {
- return errors.New("只能操作自己的订单")
- }
- if !utils.IsContain(orderParam.Allow.Confirm, orderInfo.State) {
- return errors.New("该工单不允许确认完成")
- }
- _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{
- "state": orderParam.State.Confirmed.ID,
- })
- if err != nil {
- return err
- }
- // 添加订单 event
- return AddEvent(EventForm{
- OrderID: id,
- OrderState: orderParam.State.Confirmed.ID,
- })
- }
- func SupConfirm(id int, adminID int) error {
- orderInfo, err := GetInfoByID(id, nil, nil)
- if err != nil {
- return err
- }
- if !utils.IsContain(orderParam.Allow.SupConfirm, orderInfo.State) {
- return errors.New("该工单不允许监理确认")
- }
- _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{
- "state": orderParam.State.SupConfirmed.ID,
- "supervisor": adminID,
- "taking_time": time.Now().Unix(),
- })
- if err != nil {
- return err
- }
- // 添加订单 event
- return AddEvent(EventForm{
- OrderID: id,
- OrderState: orderParam.State.SupConfirmed.ID,
- Leader: adminID,
- })
- }
- func Repaired(id int, adminID int) error {
- orderInfo, err := GetInfoByID(id, nil, nil)
- if err != nil {
- return err
- }
- if orderInfo.Leader != adminID {
- return errors.New("只能完成自己的订单")
- }
- if orderInfo.RepairID == 0 {
- return errors.New("请先填写反馈")
- }
- if !utils.IsContain(orderParam.Allow.Repaired, orderInfo.State) {
- return errors.New("订单状态有误")
- }
- _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{
- "state": orderParam.State.Repaired.ID,
- })
- if err != nil {
- return err
- }
- // 添加订单 event
- return AddEvent(EventForm{
- OrderID: id,
- OrderState: orderParam.State.Repaired.ID,
- Leader: adminID,
- })
- }
|