converseService.go 36 KB

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