order.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. package order
  2. import (
  3. "errors"
  4. "fmt"
  5. "time"
  6. "zhiyuan/models"
  7. "zhiyuan/models/final"
  8. "zhiyuan/pkg/app"
  9. "zhiyuan/pkg/db"
  10. orderParam "zhiyuan/pkg/param/order"
  11. "zhiyuan/pkg/utils"
  12. "zhiyuan/services/admin"
  13. "zhiyuan/services/aftersale"
  14. "zhiyuan/services/form"
  15. "zhiyuan/services/sms"
  16. "zhiyuan/services/structs"
  17. "zhiyuan/services/user"
  18. )
  19. var ASOrder models.ASOrder
  20. var ASOrderDetail models.ASOrderDetail
  21. var ASPickWork final.MatPickWork
  22. func GetList(where map[string]interface{}, fields []string, page app.Page, retVal interface{}) ([]*models.ASOrder, error) {
  23. if page.PageNum > 0 && page.PageSize > 0 {
  24. where["_limit"] = db.GetOffset(uint(page.PageNum), uint(page.PageSize))
  25. }
  26. return ASOrder.GetMulti(where, fields, retVal)
  27. }
  28. func GetLists(where map[string]string, param map[string]interface{}, page app.Page, retVal interface{}) error {
  29. if page.PageNum > 0 && page.PageSize > 0 {
  30. where["_page_num"] = db.ToString(page.PageNum)
  31. where["_page_size"] = db.ToString(page.PageSize)
  32. }
  33. sql := "SELECT o.* FROM zy_as_order o"
  34. return db.GetMultiRaw(sql, where, param, retVal)
  35. }
  36. func GetListWidthVisit(where map[string]string, param map[string]interface{}, page app.Page, retVal interface{}) error {
  37. if page.PageNum > 0 && page.PageSize > 0 {
  38. where["_page_num"] = db.ToString(page.PageNum)
  39. where["_page_size"] = db.ToString(page.PageSize)
  40. }
  41. 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"
  42. return db.GetMultiRaw(sql, where, param, retVal)
  43. }
  44. func GetListWidthForceCompleted(where map[string]string, param map[string]interface{}, retVal interface{}) error {
  45. 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"
  46. return db.GetMultiRaw(sql, where, param, retVal)
  47. }
  48. func GetListWidthDetail(where map[string]string, param map[string]interface{}, retVal interface{}) error {
  49. 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"
  50. return db.GetMultiRaw(sql, where, param, retVal)
  51. }
  52. func GetCountWidthDetail(where string, param map[string]interface{}) (int64, error) {
  53. sql := "zy_as_order o LEFT JOIN zy_as_order_detail d ON o.id=d.order_id WHERE " + where
  54. return db.CountRaw(sql, param)
  55. }
  56. func Count(where map[string]interface{}) (int64, error) {
  57. return db.Count(ASOrder.TableName(), where)
  58. }
  59. func GetOneWithDetail(where string, param map[string]interface{}, retVal interface{}) error {
  60. 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"
  61. return db.GetMultiRaw(sql, map[string]string{"where": where, "_page_size": "1", "_page_num": "1"}, param, retVal)
  62. }
  63. func GetInfoByID(id int, fields []string, retVal interface{}) (*models.ASOrder, error) {
  64. return ASOrder.GetOne(map[string]interface{}{"id": id}, fields, retVal)
  65. }
  66. func GetWorkInfoByID(id int, fields []string, retVal interface{}) (*final.MatPickWork, error) {
  67. return ASPickWork.GetOne(map[string]interface{}{"id": id}, fields, retVal)
  68. }
  69. func Del(id int) error {
  70. _, err := db.DeleteSoft(ASOrder.TableName(), map[string]interface{}{"id": id})
  71. return err
  72. }
  73. func Add(form form.OrderAdd) (int, error) {
  74. // 添加订单
  75. orderMap := map[string]interface{}{
  76. "order_no": utils.RandomOrder("10", 2),
  77. "main_type": form.MainType,
  78. "sub_type": form.SubType,
  79. "state": orderParam.State.Created.ID,
  80. "house_id": form.HouseID,
  81. "type": form.Typ,
  82. }
  83. if form.Typ == 1 {
  84. o, err := ASOrder.GetOne(map[string]interface{}{
  85. "house_id": form.HouseID,
  86. "state not in": []int{orderParam.State.Completed.ID, orderParam.State.Revoked.ID},
  87. "deleted_at": 0,
  88. }, nil, nil)
  89. if err != nil {
  90. return 0, err
  91. }
  92. if o != nil {
  93. return 0, errors.New("该房屋存在未完结的报修")
  94. }
  95. }
  96. var houseInfo *structs.HouseList
  97. if _, err := user.GetHouseInfoByID(form.HouseID, nil, &houseInfo); err != nil {
  98. return 0, errors.New("房屋信息有误")
  99. }
  100. /*is := false
  101. uid := 0
  102. for i, userid := range strings.Split(houseInfo.UserIDs, ",") {
  103. id, _ := db.ToInt64(userid)
  104. if i == 0 {
  105. uid = int(id)
  106. }
  107. if int(id) == form.UserID {
  108. is = true
  109. }
  110. }
  111. if form.UserID > 0 && !is {
  112. return 0, errors.New("房屋信息不匹配")
  113. }
  114. if form.UserID > 0 {
  115. uid = form.UserID
  116. }*/
  117. /*if form.UserID > 0 && houseInfo.UserID != form.UserID {
  118. return 0, errors.New("房屋信息不匹配")
  119. }
  120. orderMap["user_id"] = uid
  121. if userInfo, _ := user.GetOne(map[string]interface{}{"id": uid}, nil, nil); userInfo == nil {
  122. return 0, errors.New("用户不存在")
  123. } else {
  124. orderMap["link_name"] = userInfo.Name
  125. orderMap["link_phone"] = userInfo.Phone
  126. }
  127. if utils.ToInt64(houseInfo.WarrantyStart) > 0 {
  128. var typeInfo *structs.WarrantyType
  129. aftersale.GetTypeOne(map[string]interface{}{"id": form.MainType}, nil, &typeInfo)
  130. user.GetWarrantyPeriod(utils.ToInt64(houseInfo.WarrantyStart), typeInfo, houseInfo)
  131. orderMap["warranty_start"] = houseInfo.WarrantyStart
  132. orderMap["warranty_end"] = typeInfo.WarrantyEnd
  133. orderMap["in_warranty"] = typeInfo.InWarranty
  134. }
  135. if userInfo, err := user.GetOne(map[string]interface{}{"id": uid}, nil, nil); err == nil {
  136. //if userInfo, err := user.GetOne(map[string]interface{}{"id": houseInfo.UserID}, nil, nil); err == nil {
  137. orderMap["site_id"] = userInfo.SiteID
  138. }*/
  139. if form.UserID > 0 && houseInfo.UserID != form.UserID {
  140. return 0, errors.New("房屋信息不匹配")
  141. }
  142. orderMap["user_id"] = houseInfo.UserID
  143. orderMap["link_name"] = houseInfo.LinkName
  144. orderMap["link_phone"] = houseInfo.LinkPhone
  145. if utils.ToInt64(houseInfo.WarrantyStart) > 0 {
  146. var typeInfo *structs.WarrantyType
  147. aftersale.GetTypeOne(map[string]interface{}{"id": form.MainType}, nil, &typeInfo)
  148. user.GetWarrantyPeriod(utils.ToInt64(houseInfo.WarrantyStart), typeInfo, houseInfo)
  149. orderMap["warranty_start"] = houseInfo.WarrantyStart
  150. orderMap["warranty_end"] = typeInfo.WarrantyEnd
  151. orderMap["in_warranty"] = typeInfo.InWarranty
  152. }
  153. if userInfo, err := user.GetOne(map[string]interface{}{"id": houseInfo.UserID}, nil, nil); err == nil {
  154. orderMap["site_id"] = userInfo.SiteID
  155. }
  156. orderID, err := db.InsertOne(ASOrder.TableName(), orderMap)
  157. if err != nil {
  158. return 0, errors.New("添加订单失败")
  159. }
  160. // 添加订单明细
  161. detailMap := map[string]interface{}{
  162. "order_id": orderID,
  163. "address": houseInfo.Address,
  164. "content": form.Content,
  165. "pics": form.Pics,
  166. }
  167. _, err = db.InsertOne(ASOrderDetail.TableName(), detailMap)
  168. if err != nil {
  169. return 0, errors.New("添加订单明细失败")
  170. }
  171. // 添加订单 event
  172. err = AddEvent(EventForm{OrderID: utils.ToInt(orderID), OrderState: orderParam.State.Created.ID})
  173. if err != nil {
  174. return 0, err
  175. }
  176. return utils.ToInt(orderID), nil
  177. }
  178. func Revoke(form form.OrderRevoke, id int) error {
  179. orderInfo, err := GetInfoByID(id, nil, nil)
  180. if err != nil {
  181. return err
  182. }
  183. if form.UserID > 0 && orderInfo.UserID != form.UserID {
  184. return errors.New("没有权限撤销该工单")
  185. }
  186. if !utils.IsContain(orderParam.Allow.Revoke, orderInfo.State) {
  187. return errors.New("该工单不允许撤销")
  188. }
  189. _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{"state": orderParam.State.Revoked.ID})
  190. if err != nil {
  191. return err
  192. }
  193. // 添加订单 event
  194. return AddEvent(EventForm{
  195. OrderID: id,
  196. OrderState: orderParam.State.Revoked.ID,
  197. Content: "撤销原因:" + form.Content,
  198. Servicer: form.Servicer,
  199. })
  200. }
  201. func Suspend(form form.OrderSuspend, id int) error {
  202. orderInfo, err := GetInfoByID(id, nil, nil)
  203. if err != nil {
  204. return err
  205. }
  206. if !utils.IsContain(orderParam.Allow.Suspend, orderInfo.State) {
  207. return errors.New("该工单不允许待定")
  208. }
  209. _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{"state": orderParam.State.Suspending.ID})
  210. if err != nil {
  211. return err
  212. }
  213. // 添加订单 event
  214. return AddEvent(EventForm{
  215. OrderID: id,
  216. OrderState: orderParam.State.Suspending.ID,
  217. Content: "待定原因:" + form.Content,
  218. Servicer: form.Servicer,
  219. })
  220. }
  221. func Check(form form.OrderCheck, id int) error {
  222. orderInfo, err := GetInfoByID(id, nil, nil)
  223. if err != nil {
  224. return err
  225. }
  226. if !utils.IsContain(orderParam.Allow.Check, orderInfo.State) {
  227. return errors.New("该工单不允许审核")
  228. }
  229. _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{
  230. "state": orderParam.State.Checked.ID,
  231. "maintenance_remark": form.Remark,
  232. })
  233. if err != nil {
  234. return err
  235. }
  236. // 添加订单 event
  237. return AddEvent(EventForm{
  238. OrderID: id,
  239. OrderState: orderParam.State.Checked.ID,
  240. Servicer: form.Servicer,
  241. Content: form.Remark,
  242. })
  243. }
  244. func Remark(form form.OrderRemark, id int) error {
  245. db.Update(ASOrderDetail.TableName(), map[string]interface{}{"order_id": id}, map[string]interface{}{"remarks": form.Content})
  246. return nil
  247. }
  248. func Issue(form form.OrderIssue, id int) error {
  249. orderInfo, err := GetInfoByID(id, nil, nil)
  250. if err != nil {
  251. return err
  252. }
  253. DelIssueByOrder(id)
  254. issueList := make([]map[string]interface{}, 0)
  255. for _, v := range form.IssueList {
  256. issueMap := map[string]interface{}{
  257. "order_id": id,
  258. "director": v.Director,
  259. "issue_id": v.IssueID,
  260. "issue_desc": v.IssueDesc,
  261. "brand": v.Brand,
  262. "leader": orderInfo.Leader,
  263. "in_warranty": orderInfo.InWarranty,
  264. }
  265. if v.Director == 1 && v.Brand == 0 {
  266. return errors.New("材料商问题需要选择主材品牌")
  267. }
  268. issueList = append(issueList, issueMap)
  269. }
  270. AddMultiIssue(issueList)
  271. _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{"is_issue": 1})
  272. return err
  273. }
  274. func Complete(form form.OrderComplete, id int) error {
  275. orderInfo, err := GetInfoByID(id, nil, nil)
  276. if err != nil {
  277. return err
  278. }
  279. force := form.IsForce
  280. if form.IsForce > 0 {
  281. if !admin.CheckAuth([]string{"aftersale:order:force_complete"}, form.Servicer) || !utils.IsContain(orderParam.Allow.ForceComplete, orderInfo.State) {
  282. return errors.New("该工单不允许强制完结")
  283. }
  284. } else if !utils.IsContain(orderParam.Allow.Complete, orderInfo.State) {
  285. return errors.New("该工单不允许完结")
  286. }
  287. fmt.Println(orderInfo)
  288. if orderInfo.Leader == 0 {
  289. return errors.New("该工单还没有分配")
  290. }
  291. data := map[string]interface{}{
  292. "is_force": force,
  293. "statement_time": time.Now().Unix(),
  294. }
  295. if force == 0 {
  296. data["state"] = orderParam.State.Completed.ID
  297. }
  298. _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, data)
  299. if err != nil {
  300. return err
  301. }
  302. // 添加订单 event
  303. return AddEvent(EventForm{
  304. OrderID: id,
  305. OrderState: orderParam.State.Completed.ID,
  306. Servicer: form.Servicer,
  307. })
  308. }
  309. func ReAllot(form form.OrderAllot, id int) error {
  310. orderInfo, err := GetInfoByID(id, nil, nil)
  311. if err != nil {
  312. return err
  313. }
  314. if !utils.IsContain(orderParam.Allow.ReAllot, orderInfo.State) {
  315. return errors.New("该工单不允许重新分配")
  316. }
  317. if orderInfo.Leader == 0 {
  318. return errors.New("该工单还未分配")
  319. }
  320. _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{
  321. "leader": form.Leader,
  322. "state": orderParam.State.Allotted.ID,
  323. "dispatch_time": time.Now().Unix(),
  324. })
  325. if err != nil {
  326. return err
  327. }
  328. // 发送派单短信
  329. SendAllotSms(form.Leader)
  330. AddTypeVisit(id, time.Now().Unix(), 1)
  331. // 获取之前的 event
  332. eventInfo, err := GetEventInfo(map[string]interface{}{
  333. "order_id": id,
  334. "order_state": orderParam.State.Allotted.ID,
  335. }, nil, nil)
  336. if err != nil || orderInfo == nil {
  337. return errors.New("获取工单进度失败")
  338. }
  339. // 添加订单 event
  340. return AddEvent(EventForm{
  341. EventID: eventInfo.ID,
  342. OrderID: id,
  343. OrderState: orderParam.State.Allotted.ID,
  344. Servicer: form.Servicer,
  345. Leader: form.Leader,
  346. })
  347. }
  348. func Allot(form form.OrderAllot, id int) error {
  349. orderInfo, err := GetInfoByID(id, nil, nil)
  350. if err != nil {
  351. return err
  352. }
  353. if orderInfo.Leader > 0 {
  354. return ReAllot(form, id)
  355. }
  356. if !utils.IsContain(orderParam.Allow.Allot, orderInfo.State) {
  357. return errors.New("该工单不允许分配")
  358. }
  359. typeInfo, _ := aftersale.GetTypeOne(map[string]interface{}{"id": orderInfo.MainType}, nil, nil)
  360. now := time.Now()
  361. data := map[string]interface{}{
  362. "state": orderParam.State.Allotted.ID,
  363. "leader": form.Leader,
  364. "dispatch_time": now.Unix(),
  365. }
  366. if typeInfo.RepairDays != 0 {
  367. data["start_time"] = now.Unix()
  368. data["end_time"] = now.AddDate(0, 0, typeInfo.RepairDays).Unix()
  369. data["finish_state"] = 1
  370. }
  371. _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, data)
  372. if err != nil {
  373. return err
  374. }
  375. AddTypeVisit(id, time.Now().Unix(), 1)
  376. // 发送派单短信
  377. SendAllotSms(form.Leader)
  378. // 添加订单 event
  379. return AddEvent(EventForm{
  380. OrderID: id,
  381. OrderState: orderParam.State.Allotted.ID,
  382. Servicer: form.Servicer,
  383. Leader: form.Leader,
  384. })
  385. }
  386. func SendAllotSms(leader int) {
  387. go func() {
  388. if adminInfo, _ := admin.GetOne(map[string]interface{}{"id": leader}, []string{"phone"}, nil); adminInfo != nil {
  389. sms.SendAftersaleOrderAllot(adminInfo.Phone)
  390. }
  391. }()
  392. }
  393. func Schedule(form form.OrderSchedule, id int) error {
  394. orderInfo, err := GetInfoByID(id, nil, nil)
  395. if err != nil {
  396. return err
  397. }
  398. formatTime := utils.DateParseUnix(form.Date, "Y-m-d H:i")
  399. if formatTime == 0 {
  400. return errors.New("日期格式有误")
  401. }
  402. if !utils.IsContain(orderParam.Allow.Repairing, orderInfo.State) {
  403. return errors.New("工单状态有误")
  404. }
  405. _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{
  406. "state": orderParam.State.Repairing.ID,
  407. "schedule_time": formatTime,
  408. })
  409. if err != nil {
  410. return err
  411. }
  412. AddTypeVisit(id, int64(formatTime), 2)
  413. // 添加订单 event
  414. return AddEvent(EventForm{
  415. OrderID: id,
  416. OrderState: orderParam.State.Repairing.ID,
  417. Leader: form.Leader,
  418. Date: form.Date,
  419. })
  420. }
  421. func Confirm(id int, userID int) error {
  422. orderInfo, err := GetInfoByID(id, nil, nil)
  423. if err != nil {
  424. return err
  425. }
  426. if userID > 0 && orderInfo.UserID != userID {
  427. return errors.New("只能操作自己的订单")
  428. }
  429. if !utils.IsContain(orderParam.Allow.Confirm, orderInfo.State) {
  430. return errors.New("该工单不允许确认完成")
  431. }
  432. _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{
  433. "state": orderParam.State.Confirmed.ID,
  434. })
  435. if err != nil {
  436. return err
  437. }
  438. // 添加订单 event
  439. return AddEvent(EventForm{
  440. OrderID: id,
  441. OrderState: orderParam.State.Confirmed.ID,
  442. })
  443. }
  444. func SupConfirm(id int, adminID int) error {
  445. orderInfo, err := GetInfoByID(id, nil, nil)
  446. if err != nil {
  447. return err
  448. }
  449. if !utils.IsContain(orderParam.Allow.SupConfirm, orderInfo.State) {
  450. return errors.New("该工单不允许监理确认")
  451. }
  452. _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{
  453. "state": orderParam.State.SupConfirmed.ID,
  454. "supervisor": adminID,
  455. "taking_time": time.Now().Unix(),
  456. })
  457. if err != nil {
  458. return err
  459. }
  460. // 添加订单 event
  461. return AddEvent(EventForm{
  462. OrderID: id,
  463. OrderState: orderParam.State.SupConfirmed.ID,
  464. Leader: adminID,
  465. })
  466. }
  467. func Repaired(id int, adminID int) error {
  468. orderInfo, err := GetInfoByID(id, nil, nil)
  469. if err != nil {
  470. return err
  471. }
  472. if orderInfo.Leader != adminID {
  473. return errors.New("只能完成自己的订单")
  474. }
  475. if orderInfo.RepairID == 0 {
  476. return errors.New("请先填写反馈")
  477. }
  478. if !utils.IsContain(orderParam.Allow.Repaired, orderInfo.State) {
  479. return errors.New("订单状态有误")
  480. }
  481. _, err = db.Update(ASOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{
  482. "state": orderParam.State.Repaired.ID,
  483. })
  484. if err != nil {
  485. return err
  486. }
  487. // 添加订单 event
  488. return AddEvent(EventForm{
  489. OrderID: id,
  490. OrderState: orderParam.State.Repaired.ID,
  491. Leader: adminID,
  492. })
  493. }