order.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862
  1. package servicer
  2. import (
  3. "time"
  4. "zhiyuan/pkg/app"
  5. orderParam "zhiyuan/pkg/param/order"
  6. "zhiyuan/pkg/utils"
  7. "zhiyuan/services/admin"
  8. "zhiyuan/services/aftersale"
  9. "zhiyuan/services/aftersale/order"
  10. "zhiyuan/services/form"
  11. "zhiyuan/services/material/brand"
  12. "zhiyuan/services/region"
  13. "github.com/gin-gonic/gin"
  14. )
  15. func OrderList(c *gin.Context) {
  16. page := app.HandlePageNum(c)
  17. where := map[string]string{
  18. "where": " o.deleted_at=0",
  19. "_group_by": "o.id",
  20. "_order_by": "o.id desc",
  21. }
  22. param := make(map[string]interface{})
  23. param["admin_id"] = c.GetInt("adminID")
  24. //where := map[string]interface{}{"deleted_at": 0, "_orderby": "id desc"}
  25. states := make([]int, 0)
  26. tabIndex := utils.ToInt(c.Query("tab_index"))
  27. id := utils.ToInt(c.Query("id"))
  28. if id > 0 {
  29. where["where"] = where["where"] + " AND o.id = {{id}}"
  30. param["id"] = id
  31. //where["id"] = id
  32. }
  33. switch tabIndex {
  34. case 0:
  35. states = append(states, orderParam.State.Created.ID)
  36. case 1:
  37. states = append(states,
  38. orderParam.State.Checked.ID,
  39. orderParam.State.Suspending.ID,
  40. )
  41. case 2:
  42. states = append(states,
  43. orderParam.State.Allotted.ID,
  44. orderParam.State.SupConfirmed.ID,
  45. orderParam.State.Repairing.ID,
  46. orderParam.State.Repaired.ID,
  47. orderParam.State.Confirmed.ID,
  48. )
  49. case 3:
  50. states = append(states,
  51. orderParam.State.Completed.ID,
  52. orderParam.State.ForceCompleted.ID,
  53. )
  54. }
  55. if tabIndex >= 0 {
  56. where["where"] = where["where"] + " AND if(o.state=90,90,if(o.is_force=0,o.state,100)) in {{states}}"
  57. param["states"] = states
  58. //where["if(state=90,90,if(is_force=0,state,100)) in"] = states
  59. }
  60. // site_id
  61. if adminInfo := admin.GetAdminCache(c.GetInt("adminID")); adminInfo.SiteID > 0 {
  62. where["where"] = where["where"] + " AND o.site_id = {{site_id}}"
  63. param["site_id"] = adminInfo.SiteID
  64. //where["site_id"] = adminInfo.SiteID
  65. }
  66. dayDate := utils.GetZeroTime(time.Now()).Unix()
  67. listType := utils.ToInt(c.Query("list_type"))
  68. if listType == 1 {
  69. where["where"] = where["where"] + " AND (o.created_at between {{mindate}} and {{maxdate}})"
  70. param["mindate"] = dayDate
  71. param["maxdate"] = dayDate + 86399
  72. //where["created_at between"] = []interface{}{dayDate, dayDate + 86399}
  73. } else if listType == 2 {
  74. where["where"] = where["where"] + " AND (v.visit_time between {{mindate}} and {{maxdate}}) AND v.state=1"
  75. param["mindate"] = dayDate
  76. param["maxdate"] = dayDate + 86399
  77. //where["recent_visit_time between"] = []interface{}{dayDate, dayDate + 86399}
  78. }
  79. leaderID := utils.ToInt(c.Query("leader_id"))
  80. if leaderID > 0 {
  81. where["where"] = where["where"] + " AND o.leader = {{leader}}"
  82. param["leader"] = leaderID
  83. //where["leader"] = leaderID
  84. }
  85. keyword := c.Query("keyword")
  86. if keyword != "" {
  87. where["where"] = where["where"] + " AND (o.link_name like {{keyword}} or o.link_phone like {{keyword}})"
  88. param["keyword"] = "%" + keyword + "%"
  89. /*where["_or"] = []map[string]interface{}{
  90. {"link_name like": "%" + keyword + "%"},
  91. {"link_phone like": "%" + keyword + "%"},
  92. }*/
  93. }
  94. type Auth struct {
  95. Check bool `json:"check"`
  96. Allot bool `json:"allot"`
  97. ReAllot bool `json:"re_allot"`
  98. Delete bool `json:"delete"`
  99. Suspend bool `json:"suspend"`
  100. Complete bool `json:"complete"`
  101. }
  102. type Admin struct {
  103. ID int `json:"id"`
  104. UserName string `json:"username"`
  105. Phone string `json:"phone"`
  106. }
  107. type OrderList struct {
  108. ID int `json:"id"`
  109. OrderNo string `json:"order_no"`
  110. MainType int `json:"main_type"`
  111. SubType int `json:"sub_type"`
  112. Type string `json:"type"`
  113. LinkName string `json:"link_name"`
  114. LinkPhone string `json:"link_phone"`
  115. Address string `json:"address"`
  116. Content string `json:"content"`
  117. Pics []string `json:"pics"`
  118. RepairID int `json:"repair_id"`
  119. State int `json:"state"`
  120. StateName string `json:"state_name"`
  121. StateColor string `json:"state_color"`
  122. IsIssue int `json:"is_issue"`
  123. Auth Auth `json:"auth"`
  124. CreatedAt string `json:"created_at"`
  125. Leader int `json:"leader"`
  126. LeaderInfo *Admin `json:"leader_info"`
  127. RecentVisitTime string `json:"recent_visit_time"`
  128. WarrantyStart string `json:"warranty_start"`
  129. WarrantyEnd string `json:"warranty_end"`
  130. WarrantyPeriod string `json:"warranty_period"`
  131. IsForce int `json:"is_force"`
  132. }
  133. orderList := make([]OrderList, 0)
  134. //_, err := order.GetList(where, nil, page, &orderList)
  135. err := order.GetListWidthVisit(where, param, page, &orderList)
  136. if err != nil {
  137. app.Error(c, err.Error())
  138. return
  139. }
  140. orderIds := make([]int, 0)
  141. for _, v := range orderList {
  142. orderIds = append(orderIds, v.ID)
  143. }
  144. adminIds := make([]int, 0)
  145. for _, v := range orderList {
  146. orderIds = append(orderIds, v.ID)
  147. if v.Leader > 0 {
  148. adminIds = append(adminIds, v.Leader)
  149. }
  150. }
  151. // 订单详细信息
  152. type OrderDetailList struct {
  153. OrderID int `json:"order_id"`
  154. Province int `json:"province"`
  155. City int `json:"city"`
  156. Region int `json:"region"`
  157. Address string `json:"address"`
  158. Content string `json:"content"`
  159. Pics string `json:"pics"`
  160. }
  161. orderDetailList := make([]OrderDetailList, 0)
  162. detailMap := make(map[int]OrderDetailList, 0)
  163. regionCodes := make([]int, 0)
  164. if len(orderIds) > 0 {
  165. _, err = order.GetDetailList(map[string]interface{}{"order_id in ": orderIds}, nil, app.Page{}, &orderDetailList)
  166. for _, v := range orderDetailList {
  167. detailMap[v.OrderID] = v
  168. regionCodes = append(regionCodes, v.Region, v.City, v.Province)
  169. }
  170. }
  171. regionMap, err := region.GetNameByCodes(regionCodes)
  172. if err != nil {
  173. app.Error(c, err.Error())
  174. return
  175. }
  176. orderTypeMap := aftersale.GetTypeMapByCache()
  177. orderStatusList := utils.ParseSliceMap(orderParam.Params.State, "id")
  178. adminMap := make(map[int]*Admin, 0)
  179. if len(adminIds) > 0 {
  180. adminList := make([]*Admin, 0)
  181. if _, err := admin.GetAdmins(map[string]interface{}{"id in": adminIds}, []string{"id, username, phone"}, app.Page{}, &adminList); err == nil {
  182. for _, v := range adminList {
  183. adminMap[v.ID] = v
  184. }
  185. }
  186. }
  187. for k, v := range orderList {
  188. if detail, ok := detailMap[v.ID]; ok {
  189. v.Content = detail.Content
  190. v.Pics = utils.ParseImgStr(detail.Pics)
  191. v.Address = region.GetFullAddressByCodes(detail.Province, detail.City, detail.Region, detail.Address, "", regionMap)
  192. }
  193. if v.State != orderParam.State.Completed.ID && v.IsForce != 0 {
  194. v.State = orderParam.State.ForceCompleted.ID
  195. }
  196. v.StateName = utils.ToStr(orderStatusList[utils.ToStr(v.State)]["name"])
  197. v.StateColor = utils.ToStr(orderStatusList[utils.ToStr(v.State)]["color"])
  198. v.CreatedAt = utils.DateS(v.CreatedAt, "YYYY-MM-DD")
  199. v.Type = orderTypeMap[v.MainType] + "/" + orderTypeMap[v.SubType]
  200. v.Auth = Auth{
  201. Check: utils.IsContain(orderParam.Allow.Check, v.State),
  202. Allot: utils.IsContain(orderParam.Allow.Allot, v.State),
  203. ReAllot: v.State != orderParam.State.Suspending.ID && utils.IsContain(orderParam.Allow.ReAllot, v.State),
  204. Delete: utils.IsContain(orderParam.Allow.Delete, v.State),
  205. Suspend: utils.IsContain(orderParam.Allow.Suspend, v.State),
  206. Complete: utils.IsContain(orderParam.Allow.Complete, v.State),
  207. }
  208. if v.Leader > 0 && adminMap[v.Leader] != nil {
  209. v.LeaderInfo = adminMap[v.Leader]
  210. } else {
  211. v.LeaderInfo = &Admin{}
  212. }
  213. if v.WarrantyStart != "0" {
  214. v.WarrantyPeriod = utils.DateS(v.WarrantyStart, "YYYY-MM-DD") + " 至 " + utils.DateS(v.WarrantyEnd, "YYYY-MM-DD")
  215. } else {
  216. v.WarrantyPeriod = "保修期外"
  217. }
  218. v.RecentVisitTime = utils.DateS(v.RecentVisitTime, "YYYY-MM-DD")
  219. orderList[k] = v
  220. }
  221. app.Success(c, orderList)
  222. }
  223. func OrderCheck(c *gin.Context) {
  224. id := utils.StrTo(c.Param("id")).MustInt()
  225. if id <= 0 {
  226. app.Error(c, "工单 id 有误")
  227. return
  228. }
  229. var form form.OrderCheck
  230. if app.Bind(c, &form) != nil {
  231. return
  232. }
  233. form.Servicer = c.GetInt("adminID")
  234. err := order.Check(form, id)
  235. if err != nil {
  236. app.Error(c, err.Error())
  237. return
  238. }
  239. app.Success(c, nil)
  240. }
  241. func OrderComplete(c *gin.Context) {
  242. id := utils.StrTo(c.Param("id")).MustInt()
  243. if id <= 0 {
  244. app.Error(c, "工单 id 有误")
  245. return
  246. }
  247. var form form.OrderComplete
  248. if app.Bind(c, &form) != nil {
  249. return
  250. }
  251. form.Servicer = c.GetInt("adminID")
  252. err := order.Complete(form, id)
  253. if err != nil {
  254. app.Error(c, err.Error())
  255. return
  256. }
  257. app.Success(c, nil)
  258. }
  259. func OrderAllot(c *gin.Context) {
  260. id := utils.StrTo(c.Param("id")).MustInt()
  261. if id <= 0 {
  262. app.ErrorMsg(c, "无效的订单ID", nil)
  263. return
  264. }
  265. var form form.OrderAllot
  266. if app.Bind(c, &form) != nil {
  267. return
  268. }
  269. form.Servicer = c.GetInt("adminID")
  270. if err := order.Allot(form, id); err != nil {
  271. app.ErrorMsg(c, err.Error(), nil)
  272. return
  273. }
  274. app.Success(c, nil)
  275. }
  276. func OrderSuspend(c *gin.Context) {
  277. id := utils.StrTo(c.Param("id")).MustInt()
  278. if id <= 0 {
  279. app.ErrorMsg(c, "无效的订单ID", nil)
  280. return
  281. }
  282. var form form.OrderSuspend
  283. if app.Bind(c, &form) != nil {
  284. return
  285. }
  286. form.Servicer = c.GetInt("adminID")
  287. if err := order.Suspend(form, id); err != nil {
  288. app.ErrorMsg(c, err.Error(), nil)
  289. return
  290. }
  291. app.Success(c, nil)
  292. }
  293. func OrderVisitInfo(c *gin.Context) {
  294. id := utils.StrTo(c.Param("id")).MustInt()
  295. if id <= 0 {
  296. app.Error(c, "id 有误")
  297. return
  298. }
  299. type Visit struct {
  300. ID int `json:"id"`
  301. OrderID int `json:"order_id"`
  302. State int `json:"state"`
  303. Type1 int `json:"type1"`
  304. Type2 int `json:"type2"`
  305. Type3 int `json:"type3"`
  306. Type4 int `json:"type4"`
  307. ContactState int `json:"contact_state"`
  308. StateName string `json:"state_name"`
  309. VisitTime string `json:"visit_time"`
  310. Content string `json:"content"`
  311. FinishedAt string `json:"finished_at"`
  312. }
  313. var visitInfo *Visit
  314. if _, err := order.GetVisit(map[string]interface{}{"id": id}, nil, &visitInfo); err != nil {
  315. app.Error(c, err.Error())
  316. }
  317. visitInfo.VisitTime = utils.DateS(visitInfo.VisitTime, "YYYY-MM-DD")
  318. visitInfo.FinishedAt = utils.DateS(visitInfo.FinishedAt, "YYYY-MM-DD")
  319. app.Success(c, visitInfo)
  320. }
  321. func OrderVisitAdd(c *gin.Context) {
  322. var form form.OrderVisitAdd
  323. if app.Bind(c, &form) != nil {
  324. return
  325. }
  326. if err := order.AddVisit(form); err != nil {
  327. app.Error(c, err.Error())
  328. return
  329. }
  330. app.Success(c, nil)
  331. }
  332. func OrderVisitEdit(c *gin.Context) {
  333. id := utils.StrTo(c.Param("id")).MustInt()
  334. if id <= 0 {
  335. app.Error(c, "工单 id 有误")
  336. return
  337. }
  338. var form form.OrderVisitEdit
  339. if app.Bind(c, &form) != nil {
  340. return
  341. }
  342. if err := order.FinishVisit(form, id); err != nil {
  343. app.Error(c, err.Error())
  344. return
  345. }
  346. app.Success(c, nil)
  347. }
  348. func OrderVisitDel(c *gin.Context) {
  349. id := utils.StrTo(c.Param("id")).MustInt()
  350. if id <= 0 {
  351. app.Error(c, "工单 id 有误")
  352. return
  353. }
  354. err := order.DelVisit(id)
  355. if err != nil {
  356. app.Error(c, err.Error())
  357. return
  358. }
  359. app.Success(c, nil)
  360. }
  361. func OrderDel(c *gin.Context) {
  362. id := utils.StrTo(c.Param("id")).MustInt()
  363. if id <= 0 {
  364. app.Error(c, "工单 id 有误")
  365. return
  366. }
  367. err := order.Del(id)
  368. if err != nil {
  369. app.Error(c, err.Error())
  370. return
  371. }
  372. app.Success(c, nil)
  373. }
  374. func OrderInfo(c *gin.Context) {
  375. id := utils.StrTo(c.Param("id")).MustInt()
  376. if id <= 0 {
  377. app.Error(c, "工单 id 有误")
  378. return
  379. }
  380. type Admin struct {
  381. ID int `json:"id"`
  382. UserName string `json:"username"`
  383. Phone string `json:"phone"`
  384. }
  385. type OrderInfo struct {
  386. ID int `json:"id"`
  387. OrderNo string `json:"order_no"`
  388. MainType int `json:"main_type"`
  389. SubType int `json:"sub_type"`
  390. Type string `json:"type"`
  391. LinkName string `json:"link_name"`
  392. LinkPhone string `json:"link_phone"`
  393. Province int `json:"province"`
  394. City int `json:"city"`
  395. Region int `json:"region"`
  396. Address string `json:"address"`
  397. Content string `json:"content"`
  398. Pics string `json:"pics"`
  399. PicList []string `json:"pic_list"`
  400. State int `json:"state"`
  401. StateName string `json:"state_name"`
  402. StateColor string `json:"state_color"`
  403. CreatedAt string `json:"created_at"`
  404. Leader int `json:"leader"`
  405. LeaderInfo *Admin `json:"leader_info"`
  406. RecentVisitTime string `json:"recent_visit_time"`
  407. WarrantyStart string `json:"warranty_start"`
  408. WarrantyEnd string `json:"warranty_end"`
  409. WarrantyPeriod string `json:"warranty_period"`
  410. MaintenanceRemark string `json:"maintenance_remark"`
  411. StartTime string `json:"start_time"`
  412. EndTime string `json:"end_time"`
  413. FinishTime string `json:"finish_time"`
  414. }
  415. var orderInfo OrderInfo
  416. err := order.GetOneWithDetail("o.id={{id}}", map[string]interface{}{"id": id}, &orderInfo)
  417. if err != nil {
  418. app.Error(c, err.Error())
  419. return
  420. }
  421. adminIds := make([]int, 0)
  422. if orderInfo.Leader > 0 {
  423. adminIds = append(adminIds, orderInfo.Leader)
  424. }
  425. adminMap := make(map[int]*Admin, 0)
  426. if len(adminIds) > 0 {
  427. adminList := make([]*Admin, 0)
  428. if _, err := admin.GetAdmins(map[string]interface{}{"id in": adminIds}, []string{"id, username, phone"}, app.Page{}, &adminList); err == nil {
  429. for _, v := range adminList {
  430. adminMap[v.ID] = v
  431. }
  432. }
  433. }
  434. if orderInfo.Leader > 0 && adminMap[orderInfo.Leader] != nil {
  435. orderInfo.LeaderInfo = adminMap[orderInfo.Leader]
  436. } else {
  437. orderInfo.LeaderInfo = &Admin{}
  438. }
  439. orderTypeMap := aftersale.GetTypeMapByCache()
  440. orderStatusList := utils.ParseSliceMap(orderParam.Params.State, "id")
  441. orderInfo.PicList = utils.ParseImgStr(orderInfo.Pics)
  442. orderInfo.Address = region.GetFullAddressByCodes(orderInfo.Province, orderInfo.City, orderInfo.Region, orderInfo.Address, "", nil)
  443. orderInfo.StateName = utils.ToStr(orderStatusList[utils.ToStr(orderInfo.State)]["name"])
  444. orderInfo.StateColor = utils.ToStr(orderStatusList[utils.ToStr(orderInfo.State)]["color"])
  445. orderInfo.CreatedAt = utils.DateS(orderInfo.CreatedAt, "YYYY-MM-DD")
  446. orderInfo.Type = orderTypeMap[orderInfo.MainType] + "/" + orderTypeMap[orderInfo.SubType]
  447. orderInfo.RecentVisitTime = utils.DateS(orderInfo.RecentVisitTime, "YYYY-MM-DD")
  448. orderInfo.StartTime = utils.DateS(orderInfo.StartTime, "YYYY-MM-DD HH:mm")
  449. orderInfo.EndTime = utils.DateS(orderInfo.EndTime, "YYYY-MM-DD HH:mm")
  450. orderInfo.FinishTime = utils.DateS(orderInfo.FinishTime, "YYYY-MM-DD HH:mm")
  451. if orderInfo.WarrantyStart != "0" {
  452. orderInfo.WarrantyPeriod = utils.DateS(orderInfo.WarrantyStart, "YYYY-MM-DD") + " 至 " + utils.DateS(orderInfo.WarrantyEnd, "YYYY-MM-DD")
  453. } else {
  454. orderInfo.WarrantyPeriod = "保修期外"
  455. }
  456. // 订单事件
  457. type Event struct {
  458. Title string `json:"title"`
  459. Content string `json:"content"`
  460. Pics string `json:"pics"`
  461. PicList []string `json:"pic_list"`
  462. CreatedAt string `json:"created_at"`
  463. }
  464. eventList := make([]*Event, 0)
  465. if _, err = order.GetEventList(map[string]interface{}{"order_id": id, "_orderby": "created_at desc", "event_type": 1}, nil, &eventList); err != nil {
  466. app.Error(c, err.Error())
  467. return
  468. }
  469. for k, v := range eventList {
  470. v.CreatedAt = utils.DateS(v.CreatedAt, "YYYY-MM-DD HH:mm")
  471. v.PicList = utils.ParseImgStr(v.Pics)
  472. eventList[k] = v
  473. }
  474. // 维修信息
  475. type Repair struct {
  476. ID int `json:"id"`
  477. WorkerName string `json:"worker_name"`
  478. WorkerPhone string `json:"worker_phone"`
  479. ScheduleTime string `json:"schedule_time"`
  480. FinishedAt string `json:"finished_at"`
  481. Content string `json:"content"`
  482. Duration float64 `json:"duration"`
  483. Pics string `json:"pics"`
  484. PicList []string `json:"pic_list"`
  485. State int `json:"state"`
  486. StateName string `json:"state_name"`
  487. CreatedAt string `json:"created_at"`
  488. AuditType int `json:"audit_type"`
  489. AuditState int `json:"audit_state"`
  490. AuditAt string `json:"audit_at"`
  491. AuditRemark string `json:"audit_remark"`
  492. }
  493. repairList := make([]*Repair, 0)
  494. if _, err = order.GetRepairList(map[string]interface{}{"order_id": id, "_orderby": "created_at desc"}, nil, &repairList); err != nil {
  495. app.Error(c, err.Error())
  496. return
  497. }
  498. repairStatusList := utils.ParseSliceMap(orderParam.Params.RepairState, "id")
  499. for _, v := range repairList {
  500. v.CreatedAt = utils.DateS(v.CreatedAt, "YYYY-MM-DD HH:mm")
  501. v.ScheduleTime = utils.DateS(v.ScheduleTime, "YYYY-MM-DD HH:mm")
  502. v.FinishedAt = utils.DateS(v.FinishedAt, "YYYY-MM-DD HH:mm")
  503. v.PicList = utils.ParseImgStr(v.Pics)
  504. v.StateName = utils.ToStr(repairStatusList[utils.ToStr(v.State)]["name"])
  505. v.AuditAt = utils.DateS(v.AuditAt, "YYYY-MM-DD HH:mm")
  506. }
  507. // 回访信息
  508. type Visit struct {
  509. ID int `json:"id"`
  510. OrderID int `json:"order_id"`
  511. State int `json:"state"`
  512. Type1 int `json:"type1"`
  513. Type2 int `json:"type2"`
  514. Type3 int `json:"type3"`
  515. Type4 int `json:"type4"`
  516. StateName string `json:"state_name"`
  517. VisitTime string `json:"visit_time"`
  518. Content string `json:"content"`
  519. FinishedAt string `json:"finished_at"`
  520. }
  521. visitList := make([]*Visit, 0)
  522. if _, err := order.GetVisits(map[string]interface{}{"order_id": id, "_orderby": "created_at desc", "deleted_at": 0}, nil, &visitList); err != nil {
  523. app.Error(c, err.Error())
  524. }
  525. for _, v := range visitList {
  526. if v.State == 1 {
  527. v.StateName = "未完成"
  528. } else {
  529. v.StateName = "已完成"
  530. }
  531. v.VisitTime = utils.DateS(v.VisitTime, "YYYY-MM-DD")
  532. v.FinishedAt = utils.DateS(v.FinishedAt, "YYYY-MM-DD")
  533. }
  534. // 完结信息
  535. type Issue struct {
  536. ID int `json:"id"`
  537. Director int `json:"director"`
  538. DirectorName string `json:"director_name"`
  539. IssueID int `json:"issue_id"`
  540. IssueName string `json:"issue_name"`
  541. IssueDesc string `json:"issue_desc"`
  542. Brand int `json:"brand"`
  543. BrandName string `json:"brand_name"`
  544. CreatedAt string `json:"created_at"`
  545. }
  546. issueList := make([]*Issue, 0)
  547. if _, err := order.GetIssues(map[string]interface{}{"order_id": id, "_orderby": "created_at desc"}, nil, &issueList); err != nil {
  548. app.Error(c, err.Error())
  549. }
  550. issueMap := aftersale.GetIssueMapByCache()
  551. directorList := utils.ParseSliceMap(orderParam.Params.IssueDirector, "id")
  552. brandIds := make([]int, 0)
  553. for _, v := range issueList {
  554. brandIds = utils.AppendUniqueInt(brandIds, v.Brand)
  555. }
  556. brandMap := make(map[int]string)
  557. if len(brandIds) > 0 {
  558. if brandList, err := brand.GetList(map[string]interface{}{"id in": brandIds}, nil, app.Page{}, nil); err == nil {
  559. for _, v := range brandList {
  560. brandMap[v.ID] = v.BrandName
  561. }
  562. }
  563. }
  564. for _, v := range issueList {
  565. if issueName, ok := issueMap[v.IssueID]; ok {
  566. v.IssueName = issueName
  567. }
  568. v.DirectorName = utils.ToStr(directorList[utils.ToStr(v.Director)]["name"])
  569. if brandName, ok := brandMap[v.Brand]; ok {
  570. v.BrandName = brandName
  571. }
  572. v.CreatedAt = utils.DateS(v.CreatedAt, "YYYY-MM-DD")
  573. }
  574. res := gin.H{
  575. "info": orderInfo,
  576. "repair": repairList,
  577. "event": eventList,
  578. "visit": visitList,
  579. "issue": issueList,
  580. }
  581. app.Success(c, res)
  582. }
  583. func RepairCheckList(c *gin.Context) {
  584. page := app.HandlePageNum(c)
  585. where := map[string]string{
  586. "where": " o.deleted_at=0 and r.audit_type != 0",
  587. "_group_by": "r.id",
  588. "_order_by": "r.id desc",
  589. }
  590. param := make(map[string]interface{})
  591. auditState := utils.ToInt(c.Query("audit_state"))
  592. if auditState > 0 {
  593. where["where"] = where["where"] + " AND r.audit_state = {{auditState}}"
  594. param["auditState"] = auditState - 1
  595. }
  596. keyword := c.Query("keyword")
  597. if keyword != "" {
  598. where["where"] = where["where"] + " AND (o.link_name like {{keyword}} or o.link_phone like {{keyword}})"
  599. param["keyword"] = "%" + keyword + "%"
  600. }
  601. type Admin struct {
  602. ID int `json:"id"`
  603. UserName string `json:"username"`
  604. Phone string `json:"phone"`
  605. }
  606. type RepairList struct {
  607. ID int `json:"id"`
  608. OrderId int `json:"order_id"`
  609. WorkerName string `json:"worker_name"`
  610. WorkerPhone string `json:"worker_phone"`
  611. ScheduleTime string `json:"schedule_time"`
  612. FinishedAt string `json:"finished_at"`
  613. Content string `json:"content"`
  614. Duration float64 `json:"duration"`
  615. Pics string `json:"pics"`
  616. PicList []string `json:"pic_list"`
  617. State int `json:"state"`
  618. StateName string `json:"state_name"`
  619. CreatedAt string `json:"created_at"`
  620. AuditType int `json:"audit_type"`
  621. AuditState int `json:"audit_state"`
  622. AuditAt string `json:"audit_at"`
  623. OrderNo string `json:"order_no"`
  624. MainType int `json:"main_type"`
  625. SubType int `json:"sub_type"`
  626. Type string `json:"type"`
  627. LinkName string `json:"link_name"`
  628. LinkPhone string `json:"link_phone"`
  629. Address string `json:"address"`
  630. DetailContent string `json:"detail_content"`
  631. DetailPics string `json:"detail_pics"`
  632. OrderCreatedAt string `json:"order_created_at"`
  633. Leader int `json:"leader"`
  634. LeaderInfo *Admin `json:"leader_info"`
  635. WarrantyStart string `json:"warranty_start"`
  636. WarrantyEnd string `json:"warranty_end"`
  637. WarrantyPeriod string `json:"warranty_period"`
  638. IsForce int `json:"is_force"`
  639. EndTime string `json:"end_time"`
  640. }
  641. repairList := make([]RepairList, 0)
  642. err := order.GetListWidthOrder(where, param, page, &repairList)
  643. if err != nil {
  644. app.Error(c, err.Error())
  645. return
  646. }
  647. adminIds := make([]int, 0)
  648. for _, v := range repairList {
  649. if v.Leader > 0 {
  650. adminIds = append(adminIds, v.Leader)
  651. }
  652. }
  653. orderTypeMap := aftersale.GetTypeMapByCache()
  654. adminMap := make(map[int]*Admin, 0)
  655. if len(adminIds) > 0 {
  656. adminList := make([]*Admin, 0)
  657. if _, err := admin.GetAdmins(map[string]interface{}{"id in": adminIds}, []string{"id, username, phone"}, app.Page{}, &adminList); err == nil {
  658. for _, v := range adminList {
  659. adminMap[v.ID] = v
  660. }
  661. }
  662. }
  663. repairStatusList := utils.ParseSliceMap(orderParam.Params.RepairState, "id")
  664. for k, v := range repairList {
  665. v.PicList = utils.ParseImgStr(v.Pics)
  666. v.CreatedAt = utils.DateS(v.CreatedAt, "YYYY-MM-DD")
  667. v.Type = orderTypeMap[v.MainType] + "/" + orderTypeMap[v.SubType]
  668. if v.Leader > 0 && adminMap[v.Leader] != nil {
  669. v.LeaderInfo = adminMap[v.Leader]
  670. } else {
  671. v.LeaderInfo = &Admin{}
  672. }
  673. if v.WarrantyStart != "0" {
  674. v.WarrantyPeriod = utils.DateS(v.WarrantyStart, "YYYY-MM-DD") + " 至 " + utils.DateS(v.WarrantyEnd, "YYYY-MM-DD")
  675. } else {
  676. v.WarrantyPeriod = "保修期外"
  677. }
  678. v.ScheduleTime = utils.DateS(v.ScheduleTime, "YYYY-MM-DD")
  679. v.CreatedAt = utils.DateS(v.CreatedAt, "YYYY-MM-DD")
  680. v.OrderCreatedAt = utils.DateS(v.OrderCreatedAt, "YYYY-MM-DD")
  681. v.EndTime = utils.DateS(v.EndTime, "YYYY-MM-DD HH:mm")
  682. v.FinishedAt = utils.DateS(v.FinishedAt, "YYYY-MM-DD HH:mm")
  683. v.AuditAt = utils.DateS(v.AuditAt, "YYYY-MM-DD HH:mm")
  684. v.StateName = utils.ToStr(repairStatusList[utils.ToStr(v.State)]["name"])
  685. repairList[k] = v
  686. }
  687. app.Success(c, repairList)
  688. }
  689. func RepairCheck(c *gin.Context) {
  690. id := utils.StrTo(c.Param("id")).MustInt()
  691. if id <= 0 {
  692. app.Error(c, "工单 id 有误")
  693. return
  694. }
  695. var form form.RepairCheck
  696. if app.Bind(c, &form) != nil {
  697. return
  698. }
  699. err := order.RepairCheck(id, form.State, c.GetInt("adminID"), form.Remark)
  700. if err != nil {
  701. app.Error(c, err.Error())
  702. return
  703. }
  704. app.Success(c, nil)
  705. }
  706. /*
  707. *
  708. 延期工单,是否确认审核
  709. */
  710. func ExtensionCheck(c *gin.Context) {
  711. id := utils.StrTo(c.Param("id")).MustInt()
  712. if id <= 0 {
  713. app.Error(c, "工单 id 有误")
  714. return
  715. }
  716. var form form.RepairCheck
  717. if app.Bind(c, &form) != nil {
  718. return
  719. }
  720. err := order.ExtensionCheck(id, form.State, c.GetInt("adminID"), form.Remark)
  721. if err != nil {
  722. app.Error(c, err.Error())
  723. return
  724. }
  725. app.Success(c, nil)
  726. }
  727. /*
  728. *
  729. todo 延期申请列表
  730. */
  731. func WorkOrderList(c *gin.Context) {
  732. page := app.HandlePageNum(c)
  733. where := map[string]string{
  734. "where": " o.deleted_at=0 ",
  735. //"_group_by": "e.id",
  736. "_order_by": "e.id desc",
  737. }
  738. param := make(map[string]interface{})
  739. auditState := utils.ToInt(c.Query("audit_state"))
  740. if auditState > 0 {
  741. where["where"] = where["where"] + " AND e.audit_state = {{auditState}}"
  742. param["auditState"] = auditState - 1
  743. }
  744. keyword := c.Query("keyword")
  745. if keyword != "" {
  746. where["where"] = where["where"] + " AND (s.village like {{keyword}} )"
  747. param["keyword"] = "%" + keyword + "%"
  748. }
  749. type Admin struct {
  750. ID int `json:"id"`
  751. UserName string `json:"username"`
  752. Phone string `json:"phone"`
  753. }
  754. type WorkExtension struct {
  755. Id int `json:"id"`
  756. WorkId int `json:"work_id"` // 订单id
  757. Duration int `json:"duration"` // 维修耗时
  758. Content string `json:"content"` // 维修反馈
  759. Type int `json:"type"` // 延期类型 0节点延期 1:整体延期
  760. ManagerId int `json:"manager_id"` // 项目经理id
  761. Pictures string `json:"pictures"` // 图片
  762. FinishedAt int `json:"finished_at"` // 完成时间
  763. AuditType int `json:"audit_type"` // 审核类型 0:无需审核 1:变更时间审核 2:完成审核
  764. AuditState int `json:"audit_state"` // 审核状态 0:待审核 1:通过 2:不通过
  765. AuditId int `json:"audit_id"` // 审核人
  766. AuditAt int `json:"audit_at"` // 审核时间
  767. AuditRemark string `json:"audit_remark"` // 审核备注
  768. CreatedAt int `json:"created_at"`
  769. UpdatedAt int `json:"updated_at"`
  770. SiteId int64 `json:"site_id" label:"工地id" type:"int" search:"="` //工地id
  771. Village string `json:"village" label:"工地名称" ` //工地名称
  772. PkgId int64 `json:"pkg_id" label:"套餐id" type:"int" prop:"add edit" search:"="` //套餐id
  773. Pkg int64 `json:"pkg_id" label:"套餐id" type:"int" prop:"add edit" search:"="` //套餐id
  774. PickId int64 `json:"pick_id" label:"套餐节点id" type:"int" prop:"add edit" search:"="` //套餐节点id
  775. WorkerId int64 `json:"worker_id" label:"工人id" type:"int" search:"="` //工人id
  776. RoomType int64 `json:"room_type" label:"一级" type:"int" prop:"add edit" search:"="`
  777. WorkerStartAt int64 `json:"worker_start_at" label:"工人开始时间" prop:"add:false"`
  778. OrderStatus int64 `json:"order_status" type:"int" label:"工人接单状态" prop:"add:false"`
  779. ItemStatus int64 `json:"item_status" type:"int" label:"节点状态" prop:"add:false"` //节点状态:0:未完成 1:已完成
  780. OrderAcceptanceAt int64 `json:"order_acceptance_at"` //工人接单时间
  781. ManageConfirmAt int64 `json:"manager_confirm_at"` //经理确认时间
  782. WorkerConfirmAt int64 `json:"worker_confirm_at"` //工人确认时间
  783. ManagerStatus int64 `json:"manager_status"` //经理确认状态
  784. WorkerStatus int64 `json:"worker_status"` //工人确认状态
  785. Starttime int64 `json:"starttime"` //工地开工时间
  786. Endtime int64 `json:"endtime"` //工地竣工时间
  787. Cycle int64 `json:"cycle"` //工期
  788. PickName string `json:"pick_name"`
  789. Standard string `json:"standard"`
  790. ManagerInfo *Admin `json:"manager_info"`
  791. }
  792. workExtension := make([]WorkExtension, 0)
  793. err := order.GetListWidthOrder(where, param, page, &workExtension)
  794. if err != nil {
  795. app.Error(c, err.Error())
  796. return
  797. }
  798. managerIds := make([]int, 0)
  799. for _, v := range workExtension {
  800. if v.ManagerId > 0 {
  801. managerIds = append(managerIds, v.ManagerId)
  802. }
  803. }
  804. adminMap := make(map[int]*Admin, 0)
  805. if len(managerIds) > 0 {
  806. adminList := make([]*Admin, 0)
  807. if _, err := admin.GetAdmins(map[string]interface{}{"id in": managerIds}, []string{"id, username, phone"}, app.Page{}, &adminList); err == nil {
  808. for _, v := range adminList {
  809. adminMap[v.ID] = v
  810. }
  811. }
  812. }
  813. for k, v := range workExtension {
  814. if v.ManagerId > 0 && adminMap[v.ManagerId] != nil {
  815. v.ManagerInfo = adminMap[v.ManagerId]
  816. } else {
  817. v.ManagerInfo = &Admin{}
  818. }
  819. workExtension[k] = v
  820. }
  821. app.Success(c, workExtension)
  822. }