converseService.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845
  1. package converseService
  2. import (
  3. "crypto/md5"
  4. "fmt"
  5. "log"
  6. "strconv"
  7. "strings"
  8. "time"
  9. "github.com/go-xorm/xorm"
  10. "dashoo.cn/utils"
  11. . "dashoo.cn/utils/db"
  12. )
  13. const CU = 1
  14. const EE = 1
  15. const POS = 1
  16. const LTU = 1
  17. const GROUP = 1
  18. const TABLE_TAST = "sample_storage_task"
  19. const TABLE_SAMPLE_APPLY = "bank_apply_main"
  20. const TABLE_DETAIL = "bank_apply_detail"
  21. const TABLE_SHELF = "bank_shelf"
  22. const TABLE_BOX = "bank_box"
  23. const TABLE_EQUIPMENT = "bank_equipment"
  24. const TABLE_DEVICE_DATA = "GenePoint_Device_Report_Data"
  25. const TABLE_SAMPLE = "bank_sample"
  26. const TABLE_APPLY_DETAIL = "bank_apply_detail"
  27. const STATUS_LOCKED = "1"
  28. const STATUS_UNLOCK = "0"
  29. const RK_PASS = "2"
  30. const CK_PASS_ONHOLD = "3" //保留位置
  31. const CK_PASS_DONE = "4" //已归档
  32. type ConverseService struct {
  33. ServiceBase
  34. }
  35. type ConverseSessionService struct {
  36. SessionBase
  37. }
  38. func GetConverseService(xormEngine *xorm.Engine) *ConverseService {
  39. s := new(ConverseService)
  40. s.DBE = xormEngine
  41. return s
  42. }
  43. func GetConverseSessionService(session *xorm.Session) *ConverseSessionService {
  44. s := new(ConverseSessionService)
  45. s.Session = session
  46. return s
  47. }
  48. //建立会话
  49. func (this *ConverseService) GetSessionSetupRequest(utc string) *RequestEntity {
  50. var request = "session_setup"
  51. var reqData RequestData
  52. reqData.Key = this.GetKeyBaseOnTime(utc)
  53. reqData.Client = "lims"
  54. var entity = this.GetRequestEntity(request, utc, reqData)
  55. return entity
  56. }
  57. //生成请求报文
  58. func (this *ConverseService) GetRequestEntity(request string, utc string, data RequestData) *RequestEntity {
  59. var entity RequestEntity
  60. entity.Request = request
  61. entity.Time = utc
  62. entity.Data = data
  63. return &entity
  64. }
  65. // 获取身份验证key
  66. // key的信息按照生物样本存储系统分配的私钥字符串+请求报文中的time字段的值进行MD5加密
  67. func (this *ConverseService) GetKeyBaseOnTime(utc string) string {
  68. privateKey := "ZGlzdHJp23Yn4V06b3I6OGQ5NjllZWY2ZWNhZDNjMjlhM2E2MjkyODBlNjg2Y2YwYzNmNWQ1YTg2YWZmM2Nh3MTIwMjB3454jOTIzYWRjNmM5M4g"
  69. unencoded := privateKey + utc
  70. byte := md5.Sum([]byte(unencoded))
  71. encode := fmt.Sprintf("%x", byte)
  72. resultKey := strings.ToUpper(encode)
  73. return resultKey
  74. }
  75. //查询库存冻存盒信息
  76. func (this *ConverseService) CheckStockRackInfo(cu int, rack_id string, utc string) *RequestEntity {
  77. var request = "stock_rack"
  78. var data RequestData
  79. data.Rack_id = rack_id
  80. data.Cu = cu
  81. entity := this.GetRequestEntity(request, utc, data)
  82. return entity
  83. }
  84. //查询库存冻存管信息
  85. func (this *ConverseService) CheckStockTubeInfo(cu int, rack_id, tube_id, utc string) *RequestEntity {
  86. var request = "stock_rack_tube"
  87. var data RequestData
  88. data.Rack_id = rack_id
  89. data.Tube_id = tube_id
  90. data.Cu = cu
  91. entity := this.GetRequestEntity(request, utc, data)
  92. return entity
  93. }
  94. //任务撤销
  95. func (this *ConverseService) CancelTast(utc string, task_id string) *RequestEntity {
  96. var request = "task_change"
  97. var data RequestData
  98. data.Task_id = task_id
  99. data.Status = 1
  100. entity := this.GetRequestEntity(request, utc, data)
  101. return entity
  102. }
  103. //扫描新任务
  104. func (this *ConverseService) ScanNewTaskDetail() []Sample_Storage_Task {
  105. var tasks []Sample_Storage_Task
  106. where := "statuscode = 0"
  107. this.GetEntitysByWhere(TABLE_TAST, where, &tasks)
  108. return tasks
  109. }
  110. //新任务数量
  111. func (this *ConverseService) GetNewTaskBasic() []Sample_Storage_Task {
  112. //var count64 int64
  113. var tasks []Sample_Storage_Task
  114. //sql := "SELECT COUNT(DISTINCT(task_id)) FROM sample_storage_task WHERE status = 0"
  115. sql := "SELECT task_id, task_type, statuscode FROM " + TABLE_TAST + " GROUP BY task_id, task_type HAVING statuscode = 0"
  116. err := this.DBE.SQL(sql).Find(&tasks)
  117. if err != nil {
  118. log.Println(err)
  119. }
  120. //if len(resultsSlice) > 0 {
  121. // results := resultsSlice[0]
  122. // for _, value := range results {
  123. // count64, _ = strconv.ParseInt(string(value), 10, 64)
  124. // //LogError(err)
  125. // break
  126. // }
  127. //}
  128. //intSTr := strconv.FormatInt(count64,10)
  129. //count,_ := strconv.Atoi(intSTr)
  130. return tasks
  131. }
  132. ////冻存管位置格式转换
  133. //func TransPositionToNo(boxType int, position string) int{
  134. // co := strings.Split(position,";")
  135. // x, _ := strconv.Atoi(co[0])
  136. // y, _ := strconv.Atoi(co[1])
  137. // var no int
  138. // switch boxType {
  139. // case 101,102,103:
  140. // no = (y-1)*14+x
  141. // break
  142. // case 0 :
  143. // no = (y-1)*10+x
  144. // }
  145. // return no
  146. //}
  147. // 生成请求实体,根据任务类型获取requestName
  148. func (this *ConverseService) GenerateRequestEntity(taskType int, task_id string) *RequestEntity {
  149. var requestName string
  150. switch taskType {
  151. case 1:
  152. requestName = "rack_storing"
  153. break
  154. case 2:
  155. requestName = "rack_retrieving"
  156. break
  157. case 3:
  158. requestName = "tube_storing"
  159. break
  160. case 4:
  161. requestName = "tube_retrieving"
  162. break
  163. case 5:
  164. requestName = "stock_rack"
  165. break
  166. case 6:
  167. requestName = "stock_rack_tube"
  168. break
  169. case 7:
  170. requestName = "task_change"
  171. }
  172. utc := time.Now().UTC().Format(time.RFC3339)
  173. var data RequestData
  174. if requestName != "stock_rack" && requestName != "stock_rack_tube" {
  175. data.Task_id = task_id
  176. data.Type = "begin"
  177. }
  178. entity := this.GetRequestEntity(requestName, utc, data)
  179. return entity
  180. }
  181. // 按类型进行任务处理
  182. func (this *ConverseService) HandleTaskDetail(taskType int, entity *RequestEntity, detail *Sample_Storage_Task) {
  183. switch taskType {
  184. case 1:
  185. handleRackStore(entity, detail)
  186. break
  187. case 2:
  188. handleRackRetrieve(entity, detail)
  189. break
  190. case 3:
  191. handleTubeStore(entity, detail)
  192. break
  193. case 4:
  194. handleTubeRetrieve(entity, detail)
  195. break
  196. case 5:
  197. handleQueryRack(entity, detail)
  198. break
  199. case 6:
  200. handleQueryTube(entity, detail)
  201. break
  202. case 7:
  203. handleTaskChange(entity, detail)
  204. }
  205. }
  206. //处理冻存盒入库任务信息
  207. func handleRackStore(entity *RequestEntity, detail *Sample_Storage_Task) {
  208. var ones = make([]Single, 0)
  209. var exist bool
  210. if entity.Data.Task_data != nil {
  211. ones = entity.Data.Task_data.([]Single)
  212. for idx, value := range ones {
  213. if value.Rack_id == detail.BoxBarcode {
  214. var tube Tube
  215. tube.Id = detail.BarCode
  216. ones[idx].Tubes = append(ones[idx].Tubes, tube)
  217. exist = true
  218. }
  219. }
  220. }
  221. if !exist {
  222. var one Single
  223. one.Rack = detail.BoxType
  224. one.Tube = detail.TubeType
  225. one.Rack_id = detail.BoxBarcode
  226. //one.Source.Cu = CU
  227. one.Source.Cu = detail.Cu
  228. one.Source.Ee = EE
  229. one.Source.Pos = POS
  230. //one.Target.Cu = CU
  231. one.Target.Cu = detail.Cu
  232. one.Target.Unit = detail.Unit
  233. one.Target.Pos = detail.Pos
  234. one.Target.Ltu = detail.Ltu
  235. //one.Target.Group = 1
  236. one.Target.Group = detail.Group
  237. if detail.BarCode != "" {
  238. var tube Tube
  239. tube.Id = detail.BarCode
  240. one.Tubes = append(one.Tubes, tube)
  241. } else {
  242. one.Tubes = make([]Tube, 0) //tubes不能为空, 否则Genepoint系统报错
  243. }
  244. ones = append(ones, one)
  245. }
  246. entity.Data.Task_data = ones
  247. }
  248. //处理冻存盒出库任务信息
  249. func handleRackRetrieve(entity *RequestEntity, detail *Sample_Storage_Task) {
  250. var ones []Single
  251. var one Single
  252. one.Tubes = make([]Tube, 0) //tubes不能为空, 否则Genepoint系统报错
  253. if entity.Data.Task_data != nil {
  254. // ones = make([]Single, 0)
  255. //}else{
  256. ones = entity.Data.Task_data.([]Single)
  257. }
  258. one.Rack_id = detail.BoxBarcode
  259. one.Target.Cu = detail.Cu //todo
  260. one.Target.Ee = EE
  261. one.Target.Pos = POS
  262. ones = append(ones, one)
  263. entity.Data.Task_data = ones
  264. }
  265. //处理冻存管入库任务信息
  266. func handleTubeStore(entity *RequestEntity, detail *Sample_Storage_Task) {
  267. var ones []Single
  268. var exist bool
  269. if entity.Data.Operation_mode == "" {
  270. entity.Data.Operation_mode = detail.OperaMode
  271. }
  272. if entity.Data.Task_data != nil {
  273. ones = entity.Data.Task_data.([]Single)
  274. for idx, value := range ones {
  275. if value.Target.Rack_id == detail.BoxBarcode {
  276. var tube Tube
  277. if detail.OperaMode != "auto" {
  278. //tube.T_no = TransPositionToNo(detail.BoxType,detail.Position)
  279. //实际采用,暂时注释掉
  280. tube.T_no = detail.No
  281. }
  282. tube.Id = detail.BarCode
  283. ones[idx].Tubes = append(ones[idx].Tubes, tube)
  284. //value.Tubes = append(value.Tubes,tube)
  285. exist = true
  286. goto label
  287. }
  288. }
  289. }
  290. if !exist {
  291. var one Single
  292. //one.Rack = 101 //测试临时使用
  293. //one.Tube = 201 //测试临时使用
  294. one.Rack = detail.BoxType //样本库系统,没有添加该字段信息逻辑,临时注释
  295. one.Tube = detail.TubeType //样本库系统,没有添加该字段信息逻辑,临时注释
  296. //one.Source.Cu = CU //测试临时使用
  297. one.Source.Cu = detail.Cu
  298. one.Source.Ee = EE
  299. one.Source.Pos = POS
  300. var tube Tube
  301. if detail.OperaMode != "auto" {
  302. one.Target.Cu = detail.Cu
  303. one.Target.Ltu = detail.Ltu
  304. one.Target.Group = detail.Group
  305. one.Target.Unit = detail.Unit
  306. one.Target.Pos = detail.Pos
  307. one.Target.Rack_id = detail.BoxBarcode
  308. //tube.T_no = TransPositionToNo(detail.BoxType,detail.Position)
  309. tube.T_no = detail.No //实际采用,暂时注释掉
  310. }
  311. tube.Id = detail.BarCode
  312. one.Tubes = append(one.Tubes, tube)
  313. ones = append(ones, one)
  314. }
  315. label:
  316. entity.Data.Task_data = ones
  317. }
  318. //处理冻存管出库任务信息
  319. func handleTubeRetrieve(entity *RequestEntity, detail *Sample_Storage_Task) {
  320. var one Single
  321. var exist bool
  322. if entity.Data.Task_data != nil {
  323. one = entity.Data.Task_data.(Single)
  324. exist = true
  325. }
  326. if !exist {
  327. //one.Target.Cu = CU
  328. one.Target.Cu = detail.Cu
  329. one.Target.Ee = EE
  330. one.Target.Pos = POS
  331. }
  332. var tube Tube
  333. tube.Id = detail.BarCode
  334. one.Tubes = append(one.Tubes, tube)
  335. entity.Data.Task_data = one
  336. }
  337. //任务撤销
  338. func handleTaskChange(entity *RequestEntity, detail *Sample_Storage_Task) {
  339. entity.Data.Status = detail.Status
  340. }
  341. //查询冻存盒库存信息
  342. func handleQueryRack(entity *RequestEntity, detail *Sample_Storage_Task) {
  343. entity.Data.Cu = detail.Cu
  344. entity.Data.Rack_id = detail.BoxBarcode
  345. }
  346. //查询冻存管库存信息
  347. func handleQueryTube(entity *RequestEntity, detail *Sample_Storage_Task) {
  348. entity.Data.Rack_id = detail.BoxBarcode
  349. entity.Data.Tube_id = detail.BarCode
  350. }
  351. //修改任务表状态码
  352. func (this *ConverseService) TaskStatusModify(statusCode int, task_id string) error {
  353. sql := "UPDATE " + TABLE_TAST + " SET statuscode = '" + strconv.Itoa(statusCode) + "' WHERE task_id = '" + task_id + "'"
  354. _, err := this.DBE.Exec(sql)
  355. return err
  356. }
  357. // 修改出入库单状态
  358. func (this *ConverseService) SampleApplyStatusModify(statusCode int, entryNo string) error {
  359. sql := "UPDATE " + TABLE_SAMPLE_APPLY + " SET taskstatus = '" + strconv.Itoa(statusCode) + "' WHERE entryno = '" + entryNo + "'"
  360. _, err := this.DBE.Exec(sql)
  361. return err
  362. }
  363. ////批量更新全部成功或失败的任务样本状态
  364. //func (this *ConverseService)SampleApplyDetailStatusBatchModify(statusCode int , entryNo string) error {
  365. //
  366. // //获取出入库单Id
  367. // getId := "SELECT id FROM " + TABLE_SAMPLE_APPLY + " WHERE entryno = '" + entryNo + "'"
  368. // var idList []Id
  369. // err := this.DBE.SQL(getId).Find(&idList)
  370. // //批量更新全部成功或失败的任务样本状态
  371. // sql:= "UPDATE " + TABLE_APPLY_DETAIL + " SET taskstatus = '" + strconv.Itoa(statusCode) + "' WHERE parentid = '" + strconv.Itoa(idList[0].Id) + "'"
  372. // _,err = this.DBE.Exec(sql)
  373. //
  374. // return err
  375. //}
  376. //修改全部样本执行成功状态
  377. //func (this *ConverseService)ModifySampleALLSuccessStatus(res ResponseEntity){
  378. // tubeIds := handleSingleList(res.Data.Actual_data)
  379. // this.handleSampleSuccess(tubeIds, res.Response)
  380. //}
  381. //修改全部样本执行失败状态
  382. //func (this *ConverseService)ModifySampleALLFailedStatus(res ResponseEntity){
  383. // tubeIds := handleSingleList(res.Data.Actual_data)
  384. // this.handleSampleFailed(tubeIds, res.Response)
  385. //}
  386. //任务执行驳回, 修改全部样本失败状态
  387. func (this *ConverseService) ModifySampleAllRejectStatus(res ResponseEntity) error {
  388. //获取出入库单Id
  389. getId := "SELECT id FROM " + TABLE_SAMPLE_APPLY + " WHERE entryno = '" + res.Data.Task_id + "'"
  390. var idList []Id
  391. err := this.DBE.SQL(getId).Find(&idList)
  392. //批量更新全部成功或失败的任务样本状态
  393. sql := "UPDATE " + TABLE_APPLY_DETAIL + " SET taskstatus = '" + strconv.Itoa(REJECT) + "' WHERE parentid = '" + strconv.Itoa(idList[0].Id) + "'"
  394. _, err = this.DBE.Exec(sql)
  395. return err
  396. }
  397. //修改部分样本执行成功部分样本执行失败状态
  398. //func (this *ConverseService)SampleApplyDetailStatusPartsModify(res ResponseEntity){
  399. //
  400. // tubeIds := handleSingleList(res.Data.Actual_data)
  401. // this.handleSampleSuccess(tubeIds, res.Response)
  402. // tubeIds = handleSingleList(res.Data.Abnormal_data.Tubes)
  403. // this.handleSampleFailed(tubeIds, res.Response)
  404. //
  405. //}
  406. //处理single切片
  407. //func handleSingleList(singles []Single) string{
  408. // var tubeIds []string
  409. // for _, data := range singles {
  410. // for _, tube := range data.Tubes {
  411. // if tube.Oper == true {
  412. // tubeIds = append(tubeIds,tube.Id)
  413. // }
  414. // }
  415. // }
  416. // //id拼接成","隔开的字符串
  417. // idStr := "'" + strings.Join(tubeIds,"','") + "'"
  418. // return idStr
  419. //}
  420. //修改样本失败状态
  421. func (this *ConverseService) handleSampleFailed(idsStr string, response string, parentId int) {
  422. updatesql := "UPDATE " + TABLE_APPLY_DETAIL + " SET taskstatus = '" + strconv.Itoa(FAILED) + "' WHERE barcode IN (" + idsStr + ")" + " AND parentid = '" + strconv.Itoa(parentId) + "'"
  423. this.DBE.Exec(updatesql)
  424. }
  425. //处理样本执行成功状态
  426. func (this *ConverseService) handleSampleSuccess(idsStr string, response string, applyMainId int) {
  427. if strings.Contains(response, "_storing") {
  428. this.sampleRKSuccessDBModify(idsStr, applyMainId)
  429. } else if strings.Contains(response, "_retrieving") {
  430. this.sampleCKSuccessDBModify(idsStr, applyMainId)
  431. }
  432. }
  433. //入库成功, 修改样本数据库状态信息
  434. func (this *ConverseService) sampleRKSuccessDBModify(idsStr string, parentId int) error {
  435. updatesql := "UPDATE " + TABLE_APPLY_DETAIL + " SET IsLocked = '" + STATUS_UNLOCK + "', taskstatus = '" + strconv.Itoa(SUCCESS) + "' WHERE barcode IN (" + idsStr + ")" + " AND parentid = '" + strconv.Itoa(parentId) + "'"
  436. updatesql2 := "UPDATE " + TABLE_SAMPLE + " SET IsLocked = '" + STATUS_UNLOCK + "', IState = '" + RK_PASS + "' WHERE barcode IN (" + idsStr + ")"
  437. _, err := this.DBE.Exec(updatesql)
  438. _, err = this.DBE.Exec(updatesql2)
  439. return err
  440. }
  441. //出库成功, 修改样本数据库状态信息
  442. func (this *ConverseService) sampleCKSuccessDBModify(idsStr string, parentId int) error {
  443. var list []Bank_Apply_Detail
  444. var onHold []string
  445. var done []string
  446. err := this.DBE.Where("barcode IN (" + idsStr + ")").Find(&list)
  447. for _, one := range list {
  448. if strconv.Itoa(one.RecoveryId) == CK_PASS_ONHOLD {
  449. onHold = append(onHold, one.BarCode)
  450. } else if strconv.Itoa(one.RecoveryId) == CK_PASS_DONE {
  451. done = append(done, one.BarCode)
  452. }
  453. }
  454. sql := "UPDATE " + TABLE_SAMPLE + " SET istate = '" + CK_PASS_ONHOLD + "', islocked = '" + STATUS_UNLOCK + "' WHERE barcode IN ('" + strings.Join(onHold, "','") + "')"
  455. sql2 := "UPDATE " + TABLE_SAMPLE + " SET istate = '" + CK_PASS_DONE + "', islocked = '" + STATUS_UNLOCK + "', equipmentid = '0', shelfid = '0',boxid= '0', position = '', positioninfo = '' WHERE barcode IN ('" + strings.Join(done, "','") + "')"
  456. sql3 := "UPDATE " + TABLE_APPLY_DETAIL + " SET IsLocked = '" + STATUS_UNLOCK + "', taskstatus = '" + strconv.Itoa(SUCCESS) + "' WHERE barcode IN (" + idsStr + ")" + " AND parentid = '" + strconv.Itoa(parentId) + "'"
  457. _, err = this.DBE.Exec(sql)
  458. _, err = this.DBE.Exec(sql2)
  459. _, err = this.DBE.Exec(sql3)
  460. return err
  461. }
  462. //获取出入库单信息
  463. func (this *ConverseService) GetApplyMain(entryNo string) Bank_Apply_Main {
  464. where := "entryNo = '" + entryNo + "'"
  465. var entity Bank_Apply_Main
  466. this.GetEntity(&entity, where)
  467. return entity
  468. }
  469. //根据出入库单信息判断任务信息, 并修改样本状态
  470. func (this *ConverseService) ModifySampleStatusByApplyMainInfo(entryNo string, resp string, entity ResponseEntity) {
  471. applyMain := this.GetApplyMain(entryNo)
  472. var operaIds, abnormalIds, taskType string
  473. if applyMain.ApplyType == TASK_TUBE_STORING && strings.Contains(resp, "_storing") {
  474. taskType = "tube_storing"
  475. operaIds, abnormalIds = this.getOperaSampleIdsStr(applyMain.ApplyType, applyMain.Id, resp, entity)
  476. } else if applyMain.ApplyType == TASK_TUBE_RETREIVING && strings.Contains(resp, "_storing") {
  477. //lite设备 部分管子出库
  478. taskType = "tube_retrieving"
  479. operaIds, abnormalIds = this.getOperaSampleIdsStr(applyMain.ApplyType, applyMain.Id, resp, entity)
  480. } else if applyMain.ApplyType == TASK_TUBE_RETREIVING && resp == "rack_retrieving" && entity.Data.Is_end {
  481. //lite设备 整盒出库
  482. taskType = "tube_retrieving"
  483. operaIds, abnormalIds = this.getAllSampleIdsFromResEntity(entity)
  484. } else {
  485. return
  486. }
  487. this.handleSampleSuccess(operaIds, taskType, applyMain.Id)
  488. if entity.Data.Type == "abnormal_end" {
  489. this.handleSampleFailed(abnormalIds, taskType, applyMain.Id)
  490. }
  491. }
  492. //获取当前操作样本的id, 正常和异常的
  493. func (this *ConverseService) getOperaSampleIdsStr(applyType, parentId int, resp string, entity ResponseEntity) (actualIds string, abnormalIds string) {
  494. //获取出入库单中所有样本信息
  495. var list []Bank_Apply_Detail
  496. where := " parentid = '" + strconv.Itoa(parentId) + "'"
  497. this.GetEntitysByWhere(TABLE_DETAIL, where, &list)
  498. var sampleIds []string
  499. for _, detail := range list {
  500. sampleIds = append(sampleIds, detail.BarCode)
  501. }
  502. //获取反馈报文中的所有成功样本Id列表
  503. var actualTubeIds []string
  504. for _, single := range entity.Data.Actual_data {
  505. for _, tube := range single.Tubes {
  506. actualTubeIds = append(actualTubeIds, tube.Id)
  507. }
  508. }
  509. //获取反馈报文中的所有异常样本Id列表
  510. var abnormalTubeIds []string
  511. for _, single := range entity.Data.Abnormal_data.Tubes {
  512. abnormalTubeIds = append(abnormalTubeIds, single.Id)
  513. }
  514. var operaTubeIds []string
  515. var failTubeIds []string
  516. if applyType == TASK_TUBE_STORING {
  517. for _, sampleId := range sampleIds {
  518. //操作成功样本Id
  519. for _, tubeId := range actualTubeIds {
  520. if sampleId == tubeId {
  521. operaTubeIds = append(operaTubeIds, tubeId)
  522. break
  523. }
  524. }
  525. //操作失败样本Id
  526. for _, tubeId := range abnormalTubeIds {
  527. if sampleId == tubeId {
  528. failTubeIds = append(failTubeIds, tubeId)
  529. break
  530. }
  531. }
  532. }
  533. }
  534. if applyType == TASK_TUBE_RETREIVING {
  535. for _, sampleId := range sampleIds {
  536. //操作成功样本Id
  537. for index, tubeId := range actualTubeIds {
  538. if index == len(actualTubeIds)-1 && tubeId != sampleId {
  539. operaTubeIds = append(operaTubeIds, sampleId)
  540. }
  541. }
  542. //操作失败样本Id
  543. for _, tubeId := range abnormalTubeIds {
  544. if sampleId == tubeId {
  545. failTubeIds = append(failTubeIds, tubeId)
  546. break
  547. }
  548. }
  549. }
  550. }
  551. actualIds = "'" + strings.Join(operaTubeIds, "','") + "'"
  552. abnormalIds = "'" + strings.Join(failTubeIds, ",") + "'"
  553. return
  554. }
  555. //当任务为rack_retrieving 且 end 时, 获取所有样本Ids
  556. func (this *ConverseService) getAllSampleIdsFromResEntity(entity ResponseEntity) (actualIds string, abnormalIds string) {
  557. //获取反馈报文中的所有成功样本Id列表
  558. var actualTubeIds []string
  559. for _, single := range entity.Data.Actual_data {
  560. for _, tube := range single.Tubes {
  561. actualTubeIds = append(actualTubeIds, tube.Id)
  562. }
  563. }
  564. actualIds = "'" + strings.Join(actualTubeIds, "','") + "'"
  565. abnormalIds = ""
  566. return
  567. }
  568. ////样本状态修改
  569. //func (this *ConverseService)SampleStatusModify(statusCode int , res ResponseEntity){
  570. // if statusCode == SUCCESS {
  571. // this.SampleApplyDetailStatusBatchModify(statusCode, res.Data.Task_id)
  572. // }else if statusCode == REJECT {
  573. // this.SampleApplyDetailStatusBatchModify(FAILED, res.Data.Task_id)
  574. // }else if statusCode == FAILED {
  575. // this.SampleApplyDetailStatusPartsModify(res)
  576. // }
  577. //}
  578. //获取任务原始信息
  579. //func (this *ConverseService) GetBasicTaskInfo(task_id string) ([]Sample_Storage_Task, error){
  580. // sql := `SELECT
  581. // d.EquipmentId,
  582. // e.RowNum e_row,
  583. // e.ColumnNum e_col,
  584. // d.ShelfId,
  585. // s.XStation s_x,
  586. // s.YStation s_y,
  587. // s.RowNum s_row,
  588. // s.ColumnNum s_col,
  589. // d.BoxId,
  590. // b.XStation b_x,
  591. // b.YStation b_y,
  592. // b.RowNum b_row,
  593. // b.ColumnNum b_col,
  594. // d.Position,
  595. // d.BarCode,
  596. // a.EntryNo task_id
  597. // FROM
  598. // ` + TABLE_DETAIL + ` d
  599. // JOIN ` + TABLE_EQUIPMENT + ` e ON d.EquipmentId = e.Id
  600. // JOIN ` + TABLE_SHELF + ` s ON d.ShelfId = s.Id
  601. // JOIN ` + TABLE_BOX + ` b ON d.BoxId = b.Id
  602. // JOIN ` + TABLE_SAMPLE_APPLY + ` a ON d.ParentId = a.Id
  603. // WHERE
  604. // a.EntryNo = '` + task_id + `' AND a.ApplyStatus = '2'`
  605. // var list []Sample_Storage_Task
  606. // err := this.DBE.SQL(sql).Find(&list)
  607. // if err != nil {
  608. // return nil,err
  609. // }
  610. // return list,err
  611. //}
  612. //原始位置信息转换 样本库调用
  613. //func (this *ConverseService) TransferPosition(one *Sample_Storage_Task) {
  614. // one.Unit = (one.S_Y-1)*one.E_Col + one.S_X
  615. // one.Pos = (one.B_Y-1)*one.S_Col + one.B_X
  616. // if one.Position != "" {
  617. // coord := strings.Split(one.Position, ";")
  618. // x, _ := strconv.Atoi(coord[0])
  619. // y, _ := strconv.Atoi(coord[1])
  620. // one.No = (y-1)*one.B_Col + x
  621. // }
  622. // one.Ltu = LTU
  623. // //one.Group = GROUP
  624. //}
  625. //处理任务原始信息 样本库调用
  626. //func (this *ConverseService) HandleTaskInfo(list []Sample_Storage_Task, applyType string) *[]Sample_Storage_Task{
  627. // var resultList []Sample_Storage_Task
  628. // for _, value := range list {
  629. // this.AddTaskType(&value, applyType)
  630. // this.TransferPosition(&value)
  631. // resultList = append(resultList, value)
  632. // }
  633. // return &resultList
  634. //}
  635. //添加任务类型
  636. //func (this *ConverseService) AddTaskType(one *Sample_Storage_Task, applyType string){
  637. // if applyType == "1" {
  638. // one.Task_type = 3 //冻存管入库
  639. // one.OperaMode = "manua"
  640. // }else if applyType == "2" {
  641. // one.Task_type = 4 //冻存管出库
  642. // }
  643. //}
  644. //保存异常信息
  645. func (this *ConverseService) SaveTaskExcepMsg(msg, taskId string) error {
  646. sql := "UPDATE " + TABLE_TAST + " SET exception = '" + msg + "' WHERE task_id = '" + taskId + "'"
  647. _, err := this.DBE.Exec(sql)
  648. return err
  649. }
  650. //保存异常信息
  651. func (this *ConverseService) SaveSampleExcepMsg(msg, entryNo string) error {
  652. sql := "UPDATE " + TABLE_SAMPLE_APPLY + " SET exception = '" + msg + "' WHERE entryno = '" + entryNo + "'"
  653. _, err := this.DBE.Exec(sql)
  654. return err
  655. }
  656. //根据条件删除数据,不记录日志
  657. func (this *ConverseService) DeleteEntityBytbl(tablename string, where string) (err error) {
  658. if where == "" {
  659. where = "1=2"
  660. }
  661. sql := `delete from ` + tablename + ` where ` + where
  662. _, err = this.DBE.Exec(sql)
  663. return
  664. }
  665. //样本库分表
  666. func (s *ConverseSessionService) InsertEntityBytbl(tablename string, entity interface{}) (affected int64, err error) {
  667. affected, err = s.Session.Table(tablename).Insert(entity)
  668. LogError(err)
  669. return
  670. }
  671. //获取设备名称
  672. func (s *ConverseService) GetEquipmentName(cu int) string {
  673. sql := "SELECT name from " + TABLE_EQUIPMENT + " where cu = '" + strconv.Itoa(cu) + "'"
  674. var entity Equipment
  675. s.DBE.SQL(sql).Get(&entity)
  676. return entity.Name
  677. }
  678. //异常信息转换
  679. func (s *ConverseService) HandleCauses(causes []Cause) string {
  680. var exceptInfo string
  681. for _, cause := range causes {
  682. eName := s.GetEquipmentName(cause.Cu)
  683. exceptInfo += s.GetReason(cause, eName)
  684. }
  685. return exceptInfo
  686. }
  687. //根据异常码获取异常原因
  688. func (s *ConverseService) GetReason(cause Cause, equipmentName string) string {
  689. var reasonStr string
  690. switch cause.Reason {
  691. case 1:
  692. reasonStr = "存储位不够;"
  693. break
  694. case 2:
  695. reasonStr = "单次任务涉及的冻存盒数量超出限制;"
  696. break
  697. case 3:
  698. reasonStr = "指定的位置已经被占用或者位置不正确,无法存入;"
  699. break
  700. case 4:
  701. reasonStr = "没有权限对指定位置进行操作;"
  702. break
  703. case 5:
  704. reasonStr = "指定的编号不正确,无法完成操作;"
  705. break
  706. case 6:
  707. reasonStr = "报文数据不完整,缺少冻存管数据;"
  708. break
  709. case 7:
  710. reasonStr = "相同的冻存盒位置只允许有一组报文数据;"
  711. break
  712. case 8:
  713. reasonStr = "半自动设备在不配置转运机器人的情况下,一个存管任务只允许操作一台设备;"
  714. }
  715. if cause.Cu != 0 {
  716. //reasonStr = strconv.Itoa(cause.Cu)+"号设备, " + equipmentName + "," + reasonStr
  717. reasonStr = "设备: " + equipmentName + "," + reasonStr
  718. }
  719. return reasonStr
  720. }
  721. //处理Exceptions异常信息
  722. func (s *ConverseService) HandleExceptions(excepts []Exception) string {
  723. var exceptStr string
  724. for _, except := range excepts {
  725. eName := s.GetEquipmentName(except.Cu)
  726. for _, code := range except.Codes {
  727. //var tempStr = string(except.Cu)+"号设备," + eName + ","
  728. var tempStr = "设备: " + eName + ","
  729. switch code {
  730. case 40200:
  731. tempStr += "移动盒子过程中设备故障,动作失败;"
  732. break
  733. case 40201:
  734. tempStr += "移动盒子过程中目标位置不为空,动作取消;"
  735. break
  736. case 40202:
  737. tempStr += "移动盒子过程中起始位置为空,动作取消;"
  738. break
  739. case 40300:
  740. tempStr += "移动管子过程中设备故障,动作失败;"
  741. break
  742. case 40301:
  743. tempStr = "移动管子过程中目标位置不为空,动作取消;"
  744. break
  745. case 40302:
  746. tempStr = "移动管子过程中起始位置为空,动作取消;"
  747. }
  748. exceptStr += tempStr
  749. }
  750. }
  751. return exceptStr
  752. }
  753. //处理返回设备状态数据, 并存储到数据表里
  754. func RecordDeviceData(list []List_Data) {
  755. t := time.Now()
  756. var data []GenePoint_Device_Report_Data
  757. for _, one := range list {
  758. var piece GenePoint_Device_Report_Data
  759. piece.Cu = one.Cu
  760. piece.Addr = one.Addr
  761. piece.Type = one.Type
  762. piece.Value = one.Value
  763. piece.RecordTime = t
  764. data = append(data, piece)
  765. }
  766. svc := GetConverseService(utils.DBE)
  767. svc.InsertEntity(data)
  768. }