converseService.go 24 KB

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