Răsfoiți Sursa

修改接收报文处理

liushuai 5 ani în urmă
părinte
comite
ebc02b4dd5

+ 60 - 39
src/dashoo.cn/genepoint_srv/business/converseService/converseService.go

@@ -2,6 +2,7 @@ package converseService
 
 import (
 	"crypto/md5"
+	"database/sql"
 	"fmt"
 	"github.com/gogf/gf/os/glog"
 	"log"
@@ -174,7 +175,7 @@ func (this *ConverseService) GenerateRequestEntity(taskType int, task_id string)
 	case 2:
 		requestName = "rack_retrieving"
 		break
-	case 3,8:
+	case 3, 8:
 		requestName = "tube_storing"
 		break
 	case 4:
@@ -202,19 +203,19 @@ func (this *ConverseService) GenerateRequestEntity(taskType int, task_id string)
 // 按类型进行任务处理
 func (this *ConverseService) HandleTaskDetail(taskType int, entity *RequestEntity, detail *Sample_Storage_Task) {
 	switch taskType {
-	case 1://冻存盒 入库
+	case 1: //冻存盒 入库
 		handleRackStore(entity, detail)
 		break
-	case 2:	//冻存盒出库
+	case 2: //冻存盒出库
 		handleRackRetrieve(entity, detail)
 		break
-	case 3,8: //冻存管
+	case 3, 8: //冻存管
 		handleTubeStore(entity, detail)
 		break
-	case 4:// 冻存管出库
+	case 4: // 冻存管出库
 		handleTubeRetrieve(entity, detail)
 		break
-	case 5:  // 获取设备库存情况及冻存盒信息
+	case 5: // 获取设备库存情况及冻存盒信息
 		handleQueryRack(entity, detail)
 		break
 	case 6: // 根据冻存盒编号查询冻存管信息
@@ -297,6 +298,7 @@ func handleTubeStore(entity *RequestEntity, detail *Sample_Storage_Task) {
 		entity.Data.Operation_mode = detail.OperaMode
 	}
 
+	// 盒子存在追加样本
 	if entity.Data.Task_data != nil {
 		ones = entity.Data.Task_data.([]Single)
 		for idx, value := range ones {
@@ -316,6 +318,7 @@ func handleTubeStore(entity *RequestEntity, detail *Sample_Storage_Task) {
 		}
 	}
 
+	// 盒子不存在新加盒子及管信息
 	if !exist {
 		var one Single
 		//one.Rack = 101			//测试临时使用
@@ -383,6 +386,29 @@ func handleQueryTube(entity *RequestEntity, detail *Sample_Storage_Task) {
 	entity.Data.Tube_id = detail.BarCode
 }
 
+// 查询申请单详情下状态,存在一条子任务失败的情况,则整个申请单状态为失败
+func (this *ConverseService) StatusModifyWithDetail(task_id string) error {
+	status := SUCCESS
+	// 关联查询申请详情表,申请主表中指定申请单下执行状态不为success的申请详情数量
+	total, err := this.DBE.Table(TABLE_APPLY_DETAIL + " a, " + TABLE_SAMPLE_APPLY + "b ").Where(" a.parentid = b.Id and b.entryno = '" + task_id + "' and a.taskstatus <> " + strconv.Itoa(SUCCESS)).Count()
+	if err != nil && err != sql.ErrNoRows {
+		return err
+	}
+	// 存在未执行成功的子任务
+	if total > 0 {
+		status = FAILED
+	}
+
+	// 更新任务状态
+	updTaskSql := "UPDATE " + TABLE_TAST + " SET statuscode = '" + strconv.Itoa(status) + "' WHERE task_id = '" + task_id + "'"
+	_, err = this.DBE.Exec(updTaskSql)
+
+	// 更新申请主表状态
+	updApplySql := "UPDATE " + TABLE_SAMPLE_APPLY + " SET taskstatus = '" + strconv.Itoa(status) + "' WHERE entryno = '" + task_id + "'"
+	_, err = this.DBE.Exec(updApplySql)
+	return err
+}
+
 //修改任务表状态码
 func (this *ConverseService) TaskStatusModify(statusCode int, task_id string) error {
 	sql := "UPDATE " + TABLE_TAST + " SET statuscode = '" + strconv.Itoa(statusCode) + "' WHERE task_id = '" + task_id + "'"
@@ -398,20 +424,19 @@ func (this *ConverseService) SampleApplyStatusModify(statusCode int, entryNo str
 }
 
 //2020/12/18新增  根据当前任务报文返回状态批量更新当前任务下所有的样本状态
-func (this *ConverseService)SampleApplyDetailStatusModify(statusCode int , entryNo string) error {
+func (this *ConverseService) SampleApplyDetailStatusModify(statusCode int, entryNo string) error {
 
 	//获取出入库单Id
 	getId := "SELECT id FROM " + TABLE_SAMPLE_APPLY + " WHERE entryno = '" + entryNo + "'"
 	var idList []Id
 	err := this.DBE.SQL(getId).Find(&idList)
 	//批量更新全部成功或失败的任务样本状态
-	sql:= "UPDATE " + TABLE_APPLY_DETAIL + " SET taskstatus = '" + strconv.Itoa(statusCode) + "' WHERE parentid = '" + strconv.Itoa(idList[0].Id) + "'"
-	_,err = this.DBE.Exec(sql)
+	sql := "UPDATE " + TABLE_APPLY_DETAIL + " SET taskstatus = '" + strconv.Itoa(statusCode) + "' WHERE parentid = '" + strconv.Itoa(idList[0].Id) + "'"
+	_, err = this.DBE.Exec(sql)
 
-	return  err
+	return err
 }
 
-
 ////批量更新全部成功或失败的任务样本状态
 //func (this *ConverseService)SampleApplyDetailStatusBatchModify(statusCode int , entryNo string) error {
 //
@@ -534,7 +559,6 @@ func (this *ConverseService) GetApplyMain(entryNo string) Bank_Apply_Main {
 	return entity
 }
 
-
 //根据出入库单信息判断任务信息, 并修改样本状态
 func (this *ConverseService) ModifySampleStatusByApplyMainInfo(entryNo string, resp string, entity ResponseEntity) {
 
@@ -542,17 +566,17 @@ func (this *ConverseService) ModifySampleStatusByApplyMainInfo(entryNo string, r
 	var operaIds, abnormalIds, taskType string
 	if applyMain.ApplyType == TASK_TUBE_STORING && strings.Contains(resp, "_storing") {
 		taskType = "tube_storing" //  冻存管入库
+		// 获取返回报文中成功的样本 和失败的样本
 		operaIds, abnormalIds = this.getOperaSampleIdsStr(applyMain.ApplyType, applyMain.Id, resp, entity)
 
 		//获取报文中的 盒子信息
 		var Rack_id string = entity.Data.Actual_data[0].Rack_id
-		glog.Info("冻存盒盒子编号:",Rack_id)
+		glog.Info("冻存盒盒子编号:", Rack_id)
 		// 获取报文中的 位置信息和 样本编码
-		var  tubes   = entity.Data.Actual_data[0].Tubes
-		glog.Info("样本位置信息:",tubes)
+		var tubes = entity.Data.Actual_data[0].Tubes
+		glog.Info("样本位置信息:", tubes)
 		//新增方法 更新位置信息
-		defer this.UpdatePosition(Rack_id,tubes)
-
+		defer this.UpdatePosition(Rack_id, tubes)
 
 	} else if applyMain.ApplyType == TASK_TUBE_RETREIVING && strings.Contains(resp, "_storing") {
 		//lite设备 部分管子出库
@@ -572,46 +596,44 @@ func (this *ConverseService) ModifySampleStatusByApplyMainInfo(entryNo string, r
 	}
 }
 
-
 //  20201026 卢传敏新增根据返回报文,更新位置信息
 /**
  * rack_id 盒子编号
  * tubes 报文中返回的 位置和样本条码
  */
-func (this *ConverseService) UpdatePosition(rack_id string ,tubes []Tube){
+func (this *ConverseService) UpdatePosition(rack_id string, tubes []Tube) {
 	// 根据返回的报文中的盒子标识,获取盒子类型
-	sql := "select RowNum,ColumnNum from bank_box where Barcode ='"+rack_id+"'"
+	sql := "select RowNum,ColumnNum from bank_box where Barcode ='" + rack_id + "'"
 	var box Box
 	this.DBE.SQL(sql).Get(&box)
-	RowNum    := box.RowNum
+	RowNum := box.RowNum
 	ColumnNum := box.ColumnNum
-	glog.Info("冻存盒的行数:",RowNum,";冻存盒的列数:",ColumnNum)
-	for i:=0;i<len(tubes);i++ {
+	glog.Info("冻存盒的行数:", RowNum, ";冻存盒的列数:", ColumnNum)
+	for i := 0; i < len(tubes); i++ {
 		no := tubes[i].No
 		id := tubes[i].Id
-		glog.Info("样本在盒子中的位置:",no,";样本条码: ",id)
+		glog.Info("样本在盒子中的位置:", no, ";样本条码: ", id)
 		//计算管子在盒子中的坐标
-		var box_x,box_y int
-
-		if no%RowNum ==0{// 如果 取余数为0 则 证明该数是能被  10 整除的数  为该行 最后一个孔位
-			box_y =10
-			box_x = no/RowNum
-		}else{
-			box_y =no%RowNum
-			box_x = (no/RowNum)+1
+		var box_x, box_y int
+
+		if no%RowNum == 0 { // 如果 取余数为0 则 证明该数是能被  10 整除的数  为该行 最后一个孔位
+			box_y = 10
+			box_x = no / RowNum
+		} else {
+			box_y = no % RowNum
+			box_x = (no / RowNum) + 1
 		}
 
-		glog.Info("管子在盒子中的位置坐标为:",box_y,";",box_x)
-		var position = utils.NumberToLetter(box_x)+utils.ToStr(box_y)
-		sql ="update bank_sample set Position = '"+utils.ToStr(box_y)+";"+utils.ToStr(box_x)+"' ,PositionInfo  = concat( REVERSE(SUBSTR(REVERSE(PositionInfo) FROM INSTR(REVERSE(PositionInfo),'-')+1)),'-"+position+"' ) where barcode ='"+id+"' "
+		glog.Info("管子在盒子中的位置坐标为:", box_y, ";", box_x)
+		var position = utils.NumberToLetter(box_x) + utils.ToStr(box_y)
+		sql = "update bank_sample set Position = '" + utils.ToStr(box_y) + ";" + utils.ToStr(box_x) + "' ,PositionInfo  = concat( REVERSE(SUBSTR(REVERSE(PositionInfo) FROM INSTR(REVERSE(PositionInfo),'-')+1)),'-" + position + "' ) where barcode ='" + id + "' "
 		//执行sql 更新位置和坐标信息
 		this.DBE.Exec(sql)
 	}
 }
 
-
 //获取当前操作样本的id, 正常和异常的
-func (this *ConverseService) getOperaSampleIdsStr(applyType, parentId int, resp string, entity ResponseEntity) (actualIds string, abnormalIds string,) {
+func (this *ConverseService) getOperaSampleIdsStr(applyType, parentId int, resp string, entity ResponseEntity) (actualIds string, abnormalIds string) {
 
 	//获取出入库单中所有样本信息
 	var list []Bank_Apply_Detail
@@ -832,7 +854,7 @@ func (s *ConverseService) GetReason(cause Cause, equipmentName string) string {
 	var reasonStr string
 	switch cause.Reason {
 	case 1:
-		reasonStr = "存储位不够;"
+		reasonStr = staticVariable
 		break
 	case 2:
 		reasonStr = "单次任务涉及的冻存盒数量超出限制;"
@@ -912,4 +934,3 @@ func RecordDeviceData(list []List_Data) {
 	svc := GetConverseService(utils.DBE)
 	svc.InsertEntity(data)
 }
-

+ 34 - 28
src/dashoo.cn/genepoint_srv/controllers/converse/converse.go

@@ -26,13 +26,13 @@ func (this *ConverseController) SearchDatabase() map[string]*RequestEntity {
 
 	//依次处理每一条新任务信息
 	for _, value := range tasks {
-		var  time int64 = time.Now().Unix()
+		var time int64 = time.Now().Unix()
 
-		 taskid :=value.Task_id +"_"+ strconv.FormatInt(time,10)
-		 log.Println("taskid:",taskid)
+		taskid := value.Task_id + "_" + strconv.FormatInt(time, 10)
+		log.Println("taskid:", taskid)
 		//如果没有任务实体, 则创建新任务实体
 		if _, ok := reqMap[value.Task_id]; !ok {
-			entity := svc.GenerateRequestEntity(value.Task_type, /*value.Task_id*/taskid)
+			entity := svc.GenerateRequestEntity(value.Task_type /*value.Task_id*/, taskid)
 			reqMap[value.Task_id] = entity
 		}
 		//处理任务详细
@@ -67,6 +67,16 @@ func (this *ConverseController) SendMessage(req *RequestEntity, conn *websocket.
 	}
 }
 
+// 根据子任务结果修改状态,子任务中有一个失败,则整个申请单为失败状态
+func (this *ConverseController) StatusModifyWithDetail(task_id string) error {
+	svc := GetConverseService(utils.DBE)
+	err := svc.StatusModifyWithDetail(task_id)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
 // 修改任务状态码
 func (this *ConverseController) StatusModify(statusCode int, task_id string) error {
 	svc := GetConverseService(utils.DBE)
@@ -83,9 +93,12 @@ func (this *ConverseController) StatusModify(statusCode int, task_id string) err
 
 	// 2020/12/18 卢传敏新增,修复多条报文返回的问题,同时处理 任务中样本的状态和任务状态不一致的问题
 	// 根据任务报文返回的执行状态 修改出入库单中的 样本的任务状态
-	err = svc.SampleApplyDetailStatusModify(statusCode, task_id)
-	if err != nil {
-		return err
+	// 状态码不为成功/失败(成功/失败状态会根据响应报文单独处理状态更改),则批量更新样本申请表状态
+	if statusCode != SUCCESS && statusCode != FAILED {
+		err = svc.SampleApplyDetailStatusModify(statusCode, task_id)
+		if err != nil {
+			return err
+		}
 	}
 
 	//if statusCode == SUCCESS || statusCode == REJECT {
@@ -120,7 +133,7 @@ func (this *ConverseController) HandleMessage(n int, message []byte) {
 
 	resp := res.Response
 	result := res.Result
-	taskId := strings.Split(res.Data.Task_id,"_")[0]
+	taskId := strings.Split(res.Data.Task_id, "_")[0]
 	isEnd := res.Data.Is_end
 	taskType := res.Data.Type
 
@@ -138,47 +151,40 @@ func (this *ConverseController) HandleMessage(n int, message []byte) {
 	var err error
 	//如果正常响应且任务执行成功则修改任务状态为成功
 	if result == 200 {
-		if taskType == "end" {
-			log.Println(">>>>>>>>>>修改成功状态>>>>>>>>>>")
-			if isEnd {
-				err = this.StatusModify(SUCCESS, taskId)
-			}
-			svc := GetConverseService(utils.DBE)
-			svc.ModifySampleStatusByApplyMainInfo(taskId, resp, res)
+		if taskType == "end" || taskType == "abnormal_end" {
+			log.Println(">>>>>>>>>>任务[" + taskId + "]结束(" + taskType + ")处理(是否全部结束:" + utils.ToStr(isEnd) + ")>>>>>>>>>>")
 
-			//this.SampleAllStatusModify(res,SUCCESS)
-		} else if taskType == "abnormal_end" {
+			// 所有入库单下子任务已完成,根据样本申请状态(有一个不为成功则更新为失败状态)更新申请单,任务状态
 			if isEnd {
-				log.Println("----------修改失败状态----------")
-				//保存异常信息
+				err = this.StatusModifyWithDetail(taskId)
+			}
+			//若非正常结束,保存异常信息
+			if taskType == "abnormal_end" {
 				this.SaveExcepMsg(res, taskId)
-				err = this.StatusModify(FAILED, taskId)
 			}
+			//处理任务下申请
 			svc := GetConverseService(utils.DBE)
 			svc.ModifySampleStatusByApplyMainInfo(taskId, resp, res)
-			//this.SamplePartsStatusModify(res)
+			//this.SampleAllStatusModify(res,SUCCESS)
 		} else if taskType == "task_activate" {
-			log.Println(">>>>>>>>>>修改激活状态>>>>>>>>>>")
+			log.Println(">>>>>>>>>>任务[" + taskId + "]激活>>>>>>>>>>")
 			if res.Data.Status == 3 {
 				err = this.StatusModify(REJECT, taskId)
 			} else {
 				err = this.StatusModify(ACTIVE, taskId)
 			}
 		} else if taskType == "accept" {
-			log.Println(">>>>>>>>>>修改接受状态>>>>>>>>>>")
+			log.Println(">>>>>>>>>>任务[" + taskId + "]接受>>>>>>>>>>")
 			err = this.StatusModify(ACCEPT, taskId)
 		} else if taskType == "running" {
-			log.Println(">>>>>>>>>>修改执行中状态>>>>>>>>>>")
+			log.Println(">>>>>>>>>>任务[" + taskId + "]执行中>>>>>>>>>>")
 			err = this.StatusModify(RUNNING, taskId)
 		}
 	} else if result == 300 && taskType == "reject" {
-		log.Println("----------修改失败状态----------")
+		log.Println("----------任务[" + taskId + "]任务拒绝----------")
 		//保存异常信息
 		this.SaveExcepMsg(res, taskId)
 		err = this.StatusModify(REJECT, taskId)
-		//this.SampleAllStatusModify(res,REJECT)
-		svc := GetConverseService(utils.DBE)
-		svc.ModifySampleAllRejectStatus(res)
 	}
 
 	if err != nil {