123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- package service
-
- // 三优 检验检查对接
- import (
- "IC/models"
- "IC/utils"
- _ "encoding/json"
- _ "encoding/xml"
- "fmt"
- "github.com/jinzhu/gorm"
- _ "github.com/jinzhu/gorm"
- _ "strconv"
- "strings"
- "time"
- )
-
- type stsylis struct {
- Testno string `gorm:"column:testno " json:"testno "`
- Seqno string `gorm:"column:seqno " json:"seqno "`
- Itemno string `gorm:"column:itemno " json:"itemno "`
- Itemname string `gorm:"column:itemname" json:"itemname"`
- Testresult string `gorm:"column:testresult" json:"testresult"`
- Result1 string `gorm:"column:result1" json:"result1"`
- Result2 string `gorm:"column:result2" json:"result2"`
- Resultflag string `gorm:"column:resultflag" json:"resultflag"`
- Units string `gorm:"column:units" json:"units"`
- Ranges string `gorm:"column:ranges" json:"ranges"`
- Resulttime string `gorm:"column:resulttime" json:"resulttime"`
- Checkman string `gorm:"column:checkman" json:"checkman"`
- Testman string `gorm:"column:testman" json:"testman"`
- Lastmodify string `gorm:"column:lastmodify" json:"lastmodify"`
- Instrument string `gorm:"column:instrument" json:"instrument"`
- Sampleno string `gorm:"column:sampleno" json:"sampleno"`
- Brdh string `gorm:"column:brdh" json:"brdh"`
- Brxm string `gorm:"column:brxm" json:"brxm"`
- Sfxmdh string `gorm:"column:sfxmdh" json:"sfxmdh"`
- Sendflag string `gorm:"column:sendflag" json:"sendflag"`
- Myid string `gorm:"column:myid" json:"myid"`
- Uploadflag string `gorm:"column:uploadflag" json:"uploadflag"`
- }
-
- func (stsylis) TableName() string {
- return "lis_reqresult"
- }
-
- func GetStsyLis(rdb *gorm.DB, synctime time.Time) (record []*stsylis, err error) {
- err = rdb.Model(&stsylis{}).Where("lastmodify >= ? ", synctime).Find(&record).Error
- return
- }
-
- // 根据机构ID和患者姓名获取患者信息
- func GetUserInfoByName(org_id int64, name string) (patients models.Patients, err error) {
- err = readDb.Model(&models.Patients{}).Where("user_org_id = ? and status = 1 and name = ?", org_id, name).First(&patients).Error
- return
- }
-
- // 根据机构ID和检验检查名称获取该检查的project_id,如没有,则创建一个
- func GetStsyProjectID(org_id int64, project_name string, item_name string) (project_id int64, err error) {
- var inspection_reference models.MiddleInspectionReference
- err = readMiddleDb.Model(&models.MiddleInspectionReference{}).Where("org_id = ? and status = 1 and project = ? and item_name = ? ", org_id, project_name, item_name).First(&inspection_reference).Error
- if inspection_reference.ID > 0 {
- return inspection_reference.ProjectId, err
- } else {
- err = readMiddleDb.Table("xt_middle_inspection_reference").Where("org_id=? ", org_id).Select("max(project_id) as project_id").Scan(&inspection_reference).Error
- if inspection_reference.ProjectId > 0 {
- return inspection_reference.ProjectId + 1, err
- } else {
- return 1022301, err
- }
- }
- }
-
- // 根据机构ID和检验检查小项名称获取该检查的item_id,如没有,则创建一个
- func GetStsyItemID(org_id int64, project_name string, item_name string, project_id int64) (item_id int64, err error) {
- var inspection_reference models.MiddleInspectionReference
- err = readMiddleDb.Model(&models.MiddleInspectionReference{}).Where("org_id = ? and status = 1 and project = ? and item_name = ?", org_id, project_name, item_name).First(&inspection_reference).Error
- if inspection_reference.ID > 0 {
- return inspection_reference.ItemId, err
- } else {
- err := readMiddleDb.Table("xt_middle_inspection_reference").Where("org_id = ? and project_id = ? ", org_id, project_id).Select("max(item_id) as item_id").First(&inspection_reference).Error
- if inspection_reference.ItemId > 0 {
- return inspection_reference.ItemId + 1, err
- } else {
- return project_id*100 + 1, err
- }
- }
- }
-
- // 汕头三优血液透析中心
- func SyncStsyLis() (err error) {
- org_id := int64(10223)
-
- org := &models.DataUploadConfig{
- OrgId: org_id,
- DbHost: "192.168.1.209",
- DbPort: "1433",
- DbPass: "Aa123456",
- DbUser: "kyys",
- DbName: "lis2022",
- }
-
- orgDb, err := CreateSqlServiceDB(org.DbHost, org.DbPort, org.DbUser, org.DbPass, org.DbName)
- if err != nil {
- utils.ErrorLog("创建数据库连接失败:%v", err)
- return
- }
-
- // var sync_time int64
- // sync_time = 1627747200
-
- // scpaLis, _ := GetScpaLis(orgDb, sync_time,"512926196302182682")
- // utils.InfoLog("IdCardNo:%v",scpaLis)
-
- // 第一步:获取上一次同步的时间点
- syncLastInfo, _ := GetSyncTimeByOrgIDForYs(org_id)
- var sync_time int64
- if syncLastInfo.ID > 0 {
- sync_time = syncLastInfo.SyncTime
- } else {
- sync_time = 1685548800
- }
-
- SyncTime := time.Unix(sync_time, 0)
-
- fmt.Println(SyncTime)
- // 第二步:获取时间内所有检验结果
- stsyLis, _ := GetStsyLis(orgDb, SyncTime)
-
- if len(stsyLis) > 0 {
- var syncTimeEnd int64
- syncTimeEnd = time.Now().Unix()
- for _, LisInfo := range stsyLis {
- brxm := LisInfo.Brxm
- // 根据姓名获取患者ID
- patient, _ := GetUserInfoByName(org_id, brxm)
- if patient.ID > 0 {
- project_id, _ := GetStsyProjectID(org_id, LisInfo.Instrument, LisInfo.Itemname)
- item_id, _ := GetStsyItemID(org_id, LisInfo.Instrument, LisInfo.Itemname, project_id)
- tx := writeMiddleDb.Begin()
- var inspection models.MiddleInspection
- var inspection_reference models.MiddleInspectionReference
-
- timeLayout := "2006-01-02 15:04"
- loc, _ := time.LoadLocation("Local")
-
- tempTime := strings.Split(LisInfo.Lastmodify, "T")
- tempTime1 := strings.Split(tempTime[1], ".")
- tempRecord := tempTime[0] + " " + tempTime1[0]
-
- recordTime, _ := time.ParseInLocation("2006-01-02 15:04:05", tempRecord, loc)
- recordTimeInt := recordTime.Unix()
- recordTimeStr := time.Unix(recordTimeInt, 0).Format(timeLayout)
-
- var total int
- var RangeOptions string
- var RangeMin string
- var RangeMax string
- var ItemType int
- Range := strings.Split(LisInfo.Ranges, "--")
- if len(Range) > 1 {
- RangeMin = Range[0]
- RangeMax = Range[1]
- ItemType = 1
- } else {
- ItemType = 2
- RangeOptions = LisInfo.Ranges
- }
-
- err = readMiddleDb.Model(&models.MiddleInspectionReference{}).Where("org_id = ? and project_id = ? and item_id = ? and status = 1", org_id, project_id, item_id).Find(&inspection_reference).Count(&total).Error
- if total <= 0 {
- inspection_reference.OrgId = org_id
- inspection_reference.ProjectName = LisInfo.Instrument
- inspection_reference.Project = LisInfo.Instrument
- inspection_reference.ProjectId = project_id
- inspection_reference.ItemName = LisInfo.Itemname
- // inspection_reference.ItemNameAddition = strconv.FormatInt(info.ItemId, 10)
- inspection_reference.ItemId = item_id
- inspection_reference.RangeType = ItemType
- inspection_reference.RangeMin = RangeMin
- inspection_reference.RangeMax = RangeMax
- // inspection_reference.RangeValue = RangeValue
- inspection_reference.RangeOptions = RangeOptions
- inspection_reference.Unit = LisInfo.Units
- inspection_reference.Status = 1
- inspection_reference.CreatedTime = time.Now().Unix()
- inspection_reference.UpdatedTime = time.Now().Unix()
- inspection_reference.InspectDate = recordTimeStr
- inspection_reference.UTime = recordTimeStr
- err = tx.Model(&models.MiddleInspectionReference{}).Create(&inspection_reference).Error
- if err != nil {
- tx.Rollback()
- }
- }
- var itotal int
- err = readMiddleDb.Model(&models.MiddleInspection{}).Where("org_id = ? and project_id = ? and item_id = ? and record_date = ? and patient_id = ? and status = 1", org_id, project_id, item_id, recordTimeStr, patient.ID).Find(&inspection).Count(&itotal).Error
- if itotal <= 0 {
- // inspection.InspectValue = strings.Replace(LisInfo.Testresult, ">", ">", -1)
- // inspection.InspectValue = strings.Replace(LiLisInfo.Testresult, "<", "<", -1)
- inspection.PatientId = patient.ID
- inspection.OrgId = org_id
- inspection.ProjectId = project_id
- inspection.ItemName = inspection_reference.ItemName
- inspection.ProjectName = inspection_reference.ProjectName
- inspection.InspectType = ItemType
- inspection.ItemId = item_id
- inspection.InspectValue = LisInfo.Testresult
- inspection.InspectDate = recordTimeStr
- inspection.RecordDate = recordTimeInt
- // inspection.InspectTips = report.Resultstate
- inspection.Status = 1
- inspection.CreatedTime = time.Now().Unix()
- inspection.UpdatedTime = time.Now().Unix()
- // inspection.UTime = record_date.Format(timeLayout)
- // inspection.HisUserId = strconv.FormatInt(patient_id, 10)
- err = tx.Model(&models.MiddleInspection{}).Create(&inspection).Error
- if err != nil {
- tx.Rollback()
- }
- }
- tx.Commit()
- } else {
- continue
- }
- }
-
- var syncInfo models.MiddleSyncInfo
- syncInfo.OrgId = org_id
- syncInfo.SyncTime = syncTimeEnd
- syncInfo.SyncResultType = 1
- syncInfo.SyncRsultRemark = "同步成功"
- syncInfo.SyncTotalNum = 0
- syncInfo.SyncSuccessNum = 0
- syncInfo.SyncInfo = ""
- syncInfo.CreateTime = time.Now().Unix()
- syncInfo.UpdateTime = time.Now().Unix()
-
- cwderr := CreateSyncInfo(&syncInfo)
- if cwderr != nil {
- utils.ErrorLog("创建同步信息失败:%v", cwderr)
- return
- }
- }
-
- // 第四步:关闭数据库连接
- CloseDB(orgDb)
- SyncToStsytx()
- return
- }
-
- // func deleteMid(tx *gorm.DB) (err error) {
- // err = tx.Exec("UPDATE sgj_xt.xt_drug_cancel_stock as t," +
- // "(SELECT t1.user_org_id as orgid,t1.drug_storehouse_out as id from sgj_xt.xt_storehouse_config as t1," +
- // "(SELECT distinct org_id as orgid FROM sgj_xt.xt_drug_cancel_stock WHERE storehouse_id is NULL or storehouse_id = 0 )t2 " +
- // "WHERE t1.user_org_id = t2.orgid)tmp " +
- // "SET t.storehouse_id = tmp.id,t.mtime = UNIX_TIMESTAMP()" +
- // "WHERE (t.storehouse_id = 0 or t.storehouse_id is null) and t.org_id = tmp.orgid").Error
- // return
- // }
-
- func SyncToStsytx() {
- org_id := int64(10223)
- utils.TraceLog("检验检查同步任务开始执行")
-
- // 第一步:跟进org_id 去中间库查出需要同步的数据
- inspection_references, _ := GetSyncInspectionReferenceByOrgId(org_id)
- inspections, _ := GetSyncInspectionByOrgId(org_id)
-
- // 第二步:将数据同步到业务库
- if len(inspection_references) > 0 {
- for _, inspection_reference := range inspection_references {
- SyncInspectionReference(&inspection_reference)
- }
- }
-
- if len(inspections) > 0 {
- for _, inspection := range inspections {
- SyncInspection(&inspection)
- }
- }
- // 第四步:关闭数据库连接
- utils.SuccessLog("检验检查同步任务完成")
- }
|