converse.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package converse
  2. import (
  3. "encoding/json"
  4. "log"
  5. "strconv"
  6. "strings"
  7. "time"
  8. // "github.com/astaxie/beego"
  9. "github.com/gorilla/websocket"
  10. arrangeService "dashoo.cn/genepoint_srv/business/arrangeService"
  11. . "dashoo.cn/genepoint_srv/business/converseService"
  12. "dashoo.cn/utils"
  13. )
  14. type ConverseController struct {
  15. // beego.Controller
  16. }
  17. //建立会话
  18. func (this *ConverseController) GetConnection(c *websocket.Conn) {
  19. log.Println("建立会话")
  20. svc := GetConverseService(utils.DBE)
  21. utc := time.Now().UTC().Format(time.RFC3339)
  22. req := svc.GetSessionSetupRequest(utc)
  23. msg, _ := json.Marshal(req)
  24. log.Printf("session_setup: %s", msg)
  25. this.SendMessage(req, c)
  26. }
  27. // 查询样本库系统,进行接口任务处理
  28. func (this *ConverseController) SearchDatabase() map[string]*RequestEntity {
  29. log.Println("组装请求数据报文开始---")
  30. svc := GetConverseService(utils.DBE)
  31. asvc := arrangeService.GetArrangeService(utils.DBE)
  32. tasks := svc.ScanNewTaskDetail()
  33. // tasks := svc.GetNewTaskBasic()
  34. var reqMap = make(map[string]*RequestEntity)
  35. //依次处理每一条新任务信息
  36. for _, value := range tasks {
  37. var time int64 = time.Now().Unix()
  38. // add by 徐春林 如果是 库内整理任务, 需要关联新的表查询数据
  39. var user string
  40. if value.Task_type == 9 {
  41. user = asvc.GetOperUser(value.Task_id)
  42. } else {
  43. user = svc.GetOperUser(value.Task_id)
  44. }
  45. taskid := value.Task_id + "@" + strconv.FormatInt(time, 10)
  46. // log.Println("taskid:", taskid)
  47. //如果没有任务实体, 则创建新任务实体
  48. if _, ok := reqMap[value.Task_id]; !ok {
  49. entity := svc.GenerateRequestEntity(value.Task_type /*value.Task_id*/, taskid,user)
  50. reqMap[value.Task_id] = entity
  51. }
  52. //处理任务详细
  53. svc.HandleTaskDetail(value.Task_type, reqMap[value.Task_id], &value)
  54. }
  55. for _, v := range reqMap {
  56. //log.Println("****************************")
  57. m, _ := json.Marshal(v)
  58. log.Println("组装报文成功",string(m))
  59. }
  60. //log.Println("组装请求数据报文:",reqMap)
  61. return reqMap
  62. }
  63. // 发送消息给接口服务
  64. func (this *ConverseController) SendMessage(req *RequestEntity, conn *websocket.Conn) {
  65. err := conn.WriteJSON(&req)
  66. if err != nil {
  67. log.Println("write err:", err)
  68. }
  69. }
  70. // 根据子任务结果修改状态,子任务中有一个失败,则整个申请单为失败状态
  71. func (this *ConverseController) StatusModifyWithDetail(task_id string,res ResponseEntity ) error {
  72. svc := GetConverseService(utils.DBE)
  73. err := svc.StatusModifyWithDetail(task_id,res)
  74. if err != nil {
  75. return err
  76. }
  77. return nil
  78. }
  79. // 修改任务状态码
  80. func (this *ConverseController) StatusModify(statusCode int, task_id string,reqType string) error {
  81. svc := GetConverseService(utils.DBE)
  82. asvc := arrangeService.GetArrangeService(utils.DBE)
  83. //修改任务表任务状态
  84. err := svc.TaskStatusModify(statusCode, task_id)
  85. if err != nil {
  86. return err
  87. }
  88. if reqType == "moving" {
  89. err = asvc.ArrangeMainStatusModify(statusCode, task_id)
  90. if err != nil {
  91. return err
  92. }
  93. if statusCode != SUCCESS && statusCode != FAILED {
  94. err = asvc.ArrangeDetailStatusModify(statusCode, task_id)
  95. if err != nil {
  96. return err
  97. }
  98. }
  99. } else {
  100. //修改出入库任务状态
  101. err = svc.SampleApplyStatusModify(statusCode, task_id)
  102. if err != nil {
  103. return err
  104. }
  105. // 2020/12/18 卢传敏新增,修复多条报文返回的问题,同时处理 任务中样本的状态和任务状态不一致的问题
  106. // 根据任务报文返回的执行状态 修改出入库单中的 样本的任务状态
  107. // 状态码不为成功/失败(成功/失败状态会根据响应报文单独处理状态更改),则批量更新样本申请表状态
  108. if statusCode != SUCCESS && statusCode != FAILED {
  109. err = svc.SampleApplyDetailStatusModify(statusCode, task_id)
  110. if err != nil {
  111. return err
  112. }
  113. }
  114. }
  115. //if statusCode == SUCCESS || statusCode == REJECT {
  116. // svc.SampleApplyDetailStatusBatchModify(statusCode,task_id)
  117. //}
  118. return nil
  119. }
  120. //修改部分执行成功样本状态
  121. //func (this *ConverseController)SamplePartsStatusModify(res ResponseEntity){
  122. // svc := GetConverseService(utils.DBE)
  123. // svc.SampleApplyDetailStatusPartsModify(res)
  124. //}
  125. //修改全部执行成功或失败样本状态
  126. //func (this *ConverseController)SampleAllStatusModify(res ResponseEntity, statusCode int){
  127. // svc := GetConverseService(utils.DBE)
  128. // if statusCode == SUCCESS {
  129. // svc.ModifySampleALLSuccessStatus(res)
  130. // }else if statusCode == FAILED {
  131. // svc.ModifySampleALLFailedStatus(res)
  132. // }else if statusCode == REJECT {
  133. // svc.ModifySampleAllRejectStatus(res)
  134. // }
  135. //}
  136. // 处理基点接口返回的信息
  137. func (this *ConverseController) HandleMessage(n int, message []byte) {
  138. var res ResponseEntity
  139. json.Unmarshal(message, &res)
  140. resp := res.Response
  141. result := res.Result
  142. taskId := strings.Split(res.Data.Task_id, "@")[0]
  143. isEnd := res.Data.Is_end
  144. taskType := res.Data.Type
  145. //调试临时用, 把设备信息打印忽略
  146. //if resp != "report_data" {
  147. // log.Println("res:",&res)
  148. //}
  149. //response := res.Response
  150. //处理设备状态数据
  151. /*if response == "report_data" {
  152. converseService.RecordDeviceData(res.Data.List)
  153. }*/
  154. var err error
  155. //如果正常响应且任务执行成功则修改任务状态为成功
  156. if result == 200 {
  157. if taskType == "end" || taskType == "abnormal_end" {
  158. log.Println(">>>>>>>>>>任务[" + taskId + "]结束(" + taskType + ")处理(是否全部结束:" + utils.ToStr(isEnd) + ")>>>>>>>>>>")
  159. //若非正常结束,保存异常信息
  160. if taskType == "abnormal_end" {
  161. this.SaveExcepMsg(res, taskId, resp)
  162. }
  163. // add by 徐春林 库内整理任务需要单独处理
  164. if resp == "moving"{
  165. asvc := arrangeService.GetArrangeService(utils.DBE)
  166. err = asvc.UpdateArrangeRes(taskId,resp,message)
  167. } else {
  168. //处理任务下申请
  169. svc := GetConverseService(utils.DBE)
  170. svc.ModifySampleStatusByApplyMainInfo(taskId, resp, res)
  171. // 所有入库单下子任务已完成,根据样本申请状态(有一个不为成功则更新为失败状态)更新申请单,任务状态
  172. if isEnd {
  173. err = this.StatusModifyWithDetail(taskId,res)
  174. }
  175. }
  176. //this.SampleAllStatusModify(res,SUCCESS)
  177. } else if taskType == "task_activate" {
  178. log.Println(">>>>>>>>>>任务[" + taskId + "]激活>>>>>>>>>>")
  179. if res.Data.Status == 3 {
  180. err = this.StatusModify(REJECT, taskId,resp)
  181. } else {
  182. err = this.StatusModify(ACTIVE, taskId, resp)
  183. }
  184. } else if taskType == "accept" {
  185. log.Println(">>>>>>>>>>任务[" + taskId + "]接受>>>>>>>>>>")
  186. err = this.StatusModify(ACCEPT, taskId, resp)
  187. } else if taskType == "running" {
  188. log.Println(">>>>>>>>>>任务[" + taskId + "]执行中>>>>>>>>>>")
  189. err = this.StatusModify(RUNNING, taskId, resp)
  190. }
  191. } else if result == 300 && taskType == "reject" {
  192. log.Println("----------任务[" + taskId + "]任务拒绝----------")
  193. //保存异常信息
  194. this.SaveExcepMsg(res, taskId, resp)
  195. err = this.StatusModify(REJECT, taskId, resp)
  196. // 判断如果为盒操作, 需要将 盒解锁, 重新执行时再上锁
  197. if resp == "rack_storing" || resp == "rack_retrieving" {
  198. err = this.UpdateBoxIsLocked(taskId)
  199. }
  200. }
  201. if err != nil {
  202. log.Println(err)
  203. }
  204. }
  205. func (this *ConverseController) UpdateBoxIsLocked(taskId string) error{
  206. svc := GetConverseService(utils.DBE)
  207. err := svc.UpdateBoxIsLocked(taskId)
  208. if err != nil {
  209. return err
  210. }
  211. return nil
  212. }
  213. //保存异常信息
  214. func (this *ConverseController) SaveExcepMsg(res ResponseEntity, taskId ,reqType string) {
  215. svc := GetConverseService(utils.DBE)
  216. //causeByte,_ := json.Marshal(res.Data.Causes)
  217. //causeMsg := string(causeByte)
  218. causeMsg := svc.HandleCauses(res.Data.Causes)
  219. exceptMsg := svc.HandleExceptions(res.Data.Exceptions)
  220. //abnormalByte,_ := json.Marshal(res.Data.Abnormal_data)
  221. //abnormalMsg := string(abnormalByte)
  222. asvc := arrangeService.GetArrangeService(utils.DBE)
  223. var totalMsg string
  224. if causeMsg != "" && exceptMsg == "" {
  225. totalMsg = causeMsg
  226. } else if causeMsg == "" && exceptMsg != "" {
  227. totalMsg = exceptMsg
  228. } else if causeMsg != "" && exceptMsg == "" {
  229. totalMsg = causeMsg + "\\r\\n\\r\\n" + exceptMsg
  230. }
  231. if totalMsg != "" {
  232. svc.SaveTaskExcepMsg(totalMsg, taskId)
  233. // add by 徐春林 库内整理错误信息保存
  234. if reqType == "moving" {
  235. asvc.SaveArrangeExcepMsg(totalMsg, taskId)
  236. } else {
  237. svc.SaveSampleExcepMsg(totalMsg, taskId)
  238. }
  239. } else {
  240. //任务再次执行成功时,删除已有的异常信息
  241. svc.SaveTaskExcepMsg(" ", taskId)
  242. // add by 徐春林 库内整理错误信息保存
  243. if reqType == "moving" {
  244. asvc.SaveArrangeExcepMsg(" ", taskId)
  245. } else {
  246. svc.SaveSampleExcepMsg(" ", taskId)
  247. }
  248. }
  249. }
  250. //清理已完成任务信息
  251. func (this *ConverseController) DeleteAccomplishedTask() error {
  252. where := "statuscode = '" + strconv.Itoa(SUCCESS) + "'"
  253. svc := GetConverseService(utils.DBE)
  254. err := svc.DeleteEntityBytbl(TABLE_TAST, where)
  255. log.Println("===============清除任务信息===============")
  256. if err != nil {
  257. log.Println(err)
  258. return err
  259. }
  260. return nil
  261. }