package service import ( "XT_New/models" "errors" "fmt" "github.com/jinzhu/gorm" "math" "strconv" "strings" "time" ) //耗材出库 func ConsumablesGoodDelivery(orgID int64, patient_id int64, record_time int64, goods *models.DialysisBeforePrepare, warehouseOut *models.WarehouseOut, count int64) (err error) { //开事务 var deliver_number int64 = 0 var stock_number int64 = 0 var maxNumber int64 = 0 deliver_number = goods.Count // 根据先进先出原则,查询最先入库的批次,进行出库 // 如果没有对应的库存,则报错 warehouse, err := FindFirstWarehousingInfoByStock(goods.GoodId, goods.GoodTypeId, goods.StorehouseId) if err != nil { return errors.New("库存数量不足") } stock_number = warehouse.StockCount // 当库存数量大于或等于出库数量的话,则正常出库该批次 if stock_number >= deliver_number { maxNumber = goods.Count //出库 warehouse.StockCount = warehouse.StockCount - maxNumber warehouse.Mtime = time.Now().Unix() if warehouse.StockCount < 0 { return errors.New("库存数量不足") } errThree := UpDateWarehouseInfoByStock(&warehouse) if errThree != nil { return errThree } //更新his_prescripton_project出库状态值 UpdateHisPrescriptionProjectStatus(goods.GoodId, record_time, orgID, patient_id) //查询剩余库存 goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID) var sum_count int64 for _, item := range goodList { sum_count += item.StockCount } warehouseOutInfo := &models.WarehouseOutInfo{ WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber, WarehouseOutId: warehouseOut.ID, WarehouseInfotId: warehouse.ID, Status: 1, Ctime: time.Now().Unix(), Remark: warehouse.Remark, OrgId: orgID, Type: 1, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, IsSys: 1, SysRecordTime: record_time, GoodTypeId: goods.GoodTypeId, GoodId: goods.GoodId, PatientId: patient_id, Number: warehouse.Number, LicenseNumber: warehouse.LicenseNumber, Price: warehouse.PackingPrice, ExpiryDate: warehouse.ExpiryDate, ProductDate: warehouse.ProductDate, ProjectId: goods.ProjectId, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: goods.StorehouseId, IsCheck: 1, OverCount: sum_count, RegisterNumber: warehouse.RegisterNumber, } warehouseOutInfo.Count = count if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.ProjectId) warehouseOutInfo.Price = goodsInfo.PackingPrice } _, errcodes := GetWarehouseOutInfoIsExistOne(goods.GoodId, patient_id, record_time, goods.ProjectId) if errcodes == gorm.ErrRecordNotFound { errOne := AddSigleWarehouseOutInfo(warehouseOutInfo) if errOne != nil { return errOne } } else if errcodes == nil { outInfoOne, _ := GetWarehouseOutInfoIsExistTwo(goods.GoodId, patient_id, record_time, goods.ProjectId) if count != outInfoOne.Count { UpdatedWarehouseOutInfo(warehouseOutInfo, goods.GoodId, patient_id, record_time, goods.ProjectId) } } lastOut, _ := FindWarehouseOutInfoByPatientId(patient_id, record_time, goods.GoodId, orgID) //查询已经出库的数据 flowGood, _ := GetStockFlowIsBatchNumber(warehouse.ID, patient_id, record_time, goods.GoodId) var out_count int64 var out_count_one int64 for _, item := range flowGood { out_count += item.Count } //查询退库数据 flowGoodTwo, _ := GetStockFlowIsBatchNumberThree(patient_id, record_time, goods.GoodId) for _, item := range flowGoodTwo { out_count_one += item.Count } //如果本次出库数据大于历史出库数据 新增1条流水 if count > (out_count - out_count_one) { flow := models.VmStockFlow{ WarehouseOutId: warehouseOut.ID, WarehousingId: warehouse.ID, GoodId: goods.GoodId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, Count: count - out_count + out_count_one, Price: warehouse.PackingPrice, Status: 1, Ctime: time.Now().Unix(), UserOrgId: orgID, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, LicenseNumber: warehouse.LicenseNumber, IsEdit: 2, Creator: warehouseOut.Creater, SystemTime: record_time, ConsumableType: 3, WarehouseOutDetailId: lastOut.ID, WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber, IsSys: 1, PatientId: patient_id, ProjectId: goods.ProjectId, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: goods.StorehouseId, OverCount: sum_count, BuyPrice: warehouse.Price, RegisterNumber: warehouse.RegisterNumber, } if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.ProjectId) flow.Price = goodsInfo.PackingPrice flow.BuyPrice = goodsInfo.BuyPrice } errThre := CreateStockFlowOne(flow) if errThre != nil { return errThre } } //如果本次出库数据小于历史出库数据 新增1条退库流水 if count < (out_count - out_count_one) { operation_time := time.Now().Unix() //创建退库单 timeStr := time.Now().Format("2006-01-02") timeArr := strings.Split(timeStr, "-") total, _ := FindAllCancelStockTotal(orgID) total = total + 1 orderNumber := "CKTKD" + strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000" + strconv.FormatInt(total, 10) cancelStock := models.CancelStock{ OrderNumber: orderNumber, OperaTime: operation_time, OrgId: orgID, Creater: warehouseOut.Creater, Ctime: time.Now().Unix(), Status: 1, ReturnTime: record_time, Type: 1, StorehouseId: goods.StorehouseId, IsCheck: 1, } _, msgerrkonde := GetCancelStockDetailByOrderNumberOne(record_time, orgID) if msgerrkonde == gorm.ErrRecordNotFound { AddSigleCancelStock(&cancelStock) } cancel, _ := GetLastCancelStockById(orgID) manufacturer, _ := GetManufactureById(warehouse.Manufacturer) deaerler, _ := GetDealerById(warehouse.Dealer) cancelStockInfo := models.CancelStockInfo{ GoodId: goods.GoodId, CancelStockId: cancel.ID, GoodTypeId: goods.GoodTypeId, Count: out_count - out_count_one - count, Price: warehouse.PackingPrice, Total: 0, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, Ctime: time.Now().Unix(), Status: 1, OrgId: orgID, OrderNumber: cancel.OrderNumber, Type: 0, Dealer: deaerler.DealerName, Manufacturer: manufacturer.ManufacturerName, Number: warehouse.Number, RegisterAccount: "", Remark: "", WarehouseInfoId: warehouse.ID, PatientId: patient_id, RecordDate: record_time, StorehouseId: goods.StorehouseId, IsCheck: 1, } if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.ProjectId) cancelStockInfo.Price = goodsInfo.PackingPrice } CreateCancelStockInfoOne(&cancelStockInfo) cancelInfo, _ := GetLastCancelStockInfoByGoodId(goods.GoodId) flow := models.VmStockFlow{ WarehousingId: warehouse.ID, GoodId: goods.GoodId, Number: warehouse.Number, LicenseNumber: warehouse.LicenseNumber, Count: out_count - out_count_one - count, UserOrgId: orgID, PatientId: patient_id, SystemTime: record_time, ConsumableType: 7, IsSys: 1, WarehousingOrder: "", WarehouseOutId: lastOut.WarehouseOutId, WarehouseOutOrderNumber: lastOut.WarehouseOutOrderNumber, IsEdit: 0, CancelStockId: cancel.ID, CancelOrderNumber: cancel.OrderNumber, Manufacturer: manufacturer.ID, Dealer: 0, Creator: warehouseOut.Creater, UpdateCreator: 0, Status: 1, Ctime: time.Now().Unix(), Mtime: 0, Price: warehouse.PackingPrice, WarehousingDetailId: warehouse.ID, WarehouseOutDetailId: lastOut.ID, CancelOutDetailId: cancelInfo.ID, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, StorehouseId: goods.StorehouseId, BuyPrice: warehouse.Price, ProjectId: goods.ProjectId, OverCount: sum_count, RegisterNumber: warehouse.RegisterNumber, } if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.ProjectId) flow.Price = goodsInfo.PackingPrice flow.BuyPrice = goodsInfo.BuyPrice } CreateStockFlowOne(flow) } details := models.BloodAutomaticReduceDetail{ WarehouseOutId: lastOut.ID, WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber, PatientId: patient_id, Ctime: time.Now().Unix(), Mtime: time.Now().Unix(), Status: 1, RecordTime: record_time, OrgId: orgID, GoodId: goods.GoodId, GoodTypeId: goods.GoodTypeId, Count: count, ProjectId: goods.ProjectId, StorehouseId: goods.StorehouseId, } ////查询该耗材已经出库的数量 _, errcode := GetAutoMaticReduceDetailTwenty(orgID, patient_id, record_time, goods.GoodId, goods.GoodTypeId) if errcode == gorm.ErrRecordNotFound { errTwo := CreateAutoReduceRecord(&details) if errTwo != nil { return errTwo } } else if errcode == nil { DeleteAutoRedeceDetailTwo(orgID, patient_id, record_time, goods.GoodId, goods.GoodTypeId) CreateAutoReduceRecord(&details) } return nil } else { // 当刚批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库 warehouse.StockCount = 0 warehouse.Mtime = time.Now().Unix() errThree := UpDateWarehouseInfoByStock(&warehouse) if errThree != nil { return errThree } goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID) var sum_count int64 for _, item := range goodList { sum_count += item.StockCount } warehouseOutInfo := &models.WarehouseOutInfo{ WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber, WarehouseOutId: warehouseOut.ID, WarehouseInfotId: warehouse.ID, Status: 1, Ctime: time.Now().Unix(), Remark: warehouse.Remark, OrgId: orgID, Type: 1, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, IsSys: 1, SysRecordTime: record_time, GoodTypeId: goods.GoodTypeId, GoodId: goods.GoodId, PatientId: patient_id, Number: warehouse.Number, LicenseNumber: warehouse.LicenseNumber, Price: warehouse.PackingPrice, ExpiryDate: warehouse.ExpiryDate, ProductDate: warehouse.ProductDate, ProjectId: goods.ProjectId, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: goods.StorehouseId, IsCheck: 1, OverCount: sum_count, RegisterNumber: warehouse.RegisterNumber, } warehouseOutInfo.Count = stock_number if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.ProjectId) warehouseOutInfo.Price = goodsInfo.PackingPrice } _, errcodes := GetWarehouseOutInfoIsExistOne(goods.GoodId, patient_id, record_time, goods.ProjectId) //fmt.Println("errcodes23332322332323223", errcodes, goods.ProjectId) if errcodes == gorm.ErrRecordNotFound { errOne := AddSigleWarehouseOutInfo(warehouseOutInfo) if errOne != nil { return errOne } } else if errcodes == nil { goods.Count = deliver_number - stock_number //更新数量为 该批次剩余数量 + 还有未出的数量 warehouseOutInfo.Count = stock_number outInfoOne, _ := GetWarehouseOutInfoIsExistTwo(goods.GoodId, patient_id, record_time, goods.ProjectId) if count != outInfoOne.Count { UpdatedWarehouseOutInfo(warehouseOutInfo, goods.GoodId, patient_id, record_time, goods.ProjectId) } } lastOut, _ := FindWarehouseOutInfoByPatientId(patient_id, record_time, goods.GoodId, orgID) //查询该该批次已经出库的数据 flowGood, _ := GetStockFlowIsBatchNumber(warehouse.ID, patient_id, record_time, goods.GoodId) var out_count int64 var out_count_one int64 for _, item := range flowGood { out_count += item.Count } flowGoodTwo, _ := GetStockFlowIsBatchNumberThree(patient_id, record_time, goods.GoodId) for _, item := range flowGoodTwo { out_count_one += item.Count } //如果出库数量 大于 历史出库数据 新增1条流水 if count > out_count-out_count_one { flow := models.VmStockFlow{ WarehouseOutId: warehouseOut.ID, WarehousingId: warehouse.ID, GoodId: goods.GoodId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, Count: stock_number, Price: warehouse.PackingPrice, Status: 1, Ctime: time.Now().Unix(), UserOrgId: orgID, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, LicenseNumber: warehouse.LicenseNumber, IsEdit: 2, Creator: warehouseOut.Creater, SystemTime: record_time, ConsumableType: 3, WarehouseOutDetailId: lastOut.ID, WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber, IsSys: 1, PatientId: patient_id, ProjectId: goods.ProjectId, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: goods.StorehouseId, OverCount: sum_count, BuyPrice: warehouse.Price, RegisterNumber: warehouse.RegisterNumber, } if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.ProjectId) flow.Price = goodsInfo.PackingPrice flow.BuyPrice = goodsInfo.BuyPrice } errThre := CreateStockFlowOne(flow) if errThre != nil { return errThre } } //退库 if count < out_count-out_count_one { operation_time := time.Now().Unix() //创建退库单 timeStr := time.Now().Format("2006-01-02") timeArr := strings.Split(timeStr, "-") total, _ := FindAllCancelStockTotal(orgID) total = total + 1 orderNumber := "CKTKD" + strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000" + strconv.FormatInt(total, 10) cancelStock := models.CancelStock{ OrderNumber: orderNumber, OperaTime: operation_time, OrgId: orgID, Creater: warehouseOut.Creater, Ctime: time.Now().Unix(), Status: 1, ReturnTime: record_time, Type: 1, StorehouseId: goods.StorehouseId, IsCheck: 1, } _, msgerrkonde := GetCancelStockDetailByOrderNumberOne(record_time, orgID) if msgerrkonde == gorm.ErrRecordNotFound { AddSigleCancelStock(&cancelStock) } cancel, _ := GetLastCancelStockById(orgID) manufacturer, _ := GetManufactureById(warehouse.Manufacturer) deaerler, _ := GetDealerById(warehouse.Dealer) cancelStockInfo := models.CancelStockInfo{ GoodId: goods.GoodId, CancelStockId: cancel.ID, GoodTypeId: goods.GoodTypeId, Count: out_count - out_count_one - count, Price: warehouse.PackingPrice, Total: 0, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, Ctime: time.Now().Unix(), Status: 1, OrgId: orgID, OrderNumber: cancel.OrderNumber, Type: 0, Dealer: deaerler.DealerName, Manufacturer: manufacturer.ManufacturerName, Number: warehouse.Number, RegisterAccount: "", Remark: "", WarehouseInfoId: warehouse.ID, PatientId: patient_id, RecordDate: record_time, StorehouseId: goods.StorehouseId, IsCheck: 1, } if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.ProjectId) cancelStockInfo.Price = goodsInfo.PackingPrice } CreateCancelStockInfoOne(&cancelStockInfo) cancelInfo, _ := GetLastCancelStockInfoByGoodId(goods.GoodId) flow := models.VmStockFlow{ WarehousingId: warehouse.ID, GoodId: goods.GoodId, Number: warehouse.Number, LicenseNumber: warehouse.LicenseNumber, Count: out_count - count, UserOrgId: orgID, PatientId: patient_id, SystemTime: record_time, ConsumableType: 7, IsSys: 1, WarehousingOrder: "", WarehouseOutId: lastOut.WarehouseOutId, WarehouseOutOrderNumber: lastOut.WarehouseOutOrderNumber, IsEdit: 0, CancelStockId: cancel.ID, CancelOrderNumber: cancel.OrderNumber, Manufacturer: manufacturer.ID, Dealer: 0, Creator: warehouseOut.Creater, UpdateCreator: 0, Status: 1, Ctime: time.Now().Unix(), Mtime: 0, Price: warehouse.PackingPrice, WarehousingDetailId: warehouse.ID, WarehouseOutDetailId: lastOut.ID, CancelOutDetailId: cancelInfo.ID, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, StorehouseId: goods.StorehouseId, BuyPrice: warehouse.Price, ProjectId: goods.ProjectId, OverCount: sum_count, RegisterNumber: warehouse.RegisterNumber, } if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.ProjectId) flow.Price = goodsInfo.PackingPrice flow.BuyPrice = goodsInfo.BuyPrice } CreateStockFlowOne(flow) } // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作 goods.Count = deliver_number - stock_number ConsumablesGoodDelivery(orgID, patient_id, record_time, goods, warehouseOut, count) } return nil } func FindWarehouseOutInfoByPatientId(patient_id int64, record_time int64, good_id int64, org_id int64) (models.WarehouseOutInfo, error) { outInfo := models.WarehouseOutInfo{} err := XTReadDB().Where("patient_id = ? and sys_record_time = ? and good_id = ? and org_id = ? and status = 1", patient_id, record_time, good_id, org_id).Last(&outInfo).Error return outInfo, err } func FindWarehouseOutInfoByPatientIdTwo(patient_id int64, record_time int64, good_id int64, org_id int64, project_id int64) (models.WarehouseOutInfo, error) { outInfo := models.WarehouseOutInfo{} err := XTReadDB().Where("patient_id = ? and sys_record_time = ? and good_id = ? and org_id = ? and status = 1 and project_id = ?", patient_id, record_time, good_id, org_id, project_id).Last(&outInfo).Error return outInfo, err } func UpdateDrugStockCount(drug_id int64, org_id int64, storehouse_id int64, flush_count int64) error { drug := models.XtDrugStockCount{} ut := XTWriteDB().Begin() err := ut.Model(&drug).Where("drug_id = ? and user_org_id = ? and storehouse_id = ? and status = 1", drug_id, org_id, storehouse_id).Update(map[string]interface{}{"flush_count": flush_count}).Error if err != nil { ut.Rollback() return err } ut.Commit() return err } func AddDrugCount(drug_id int64, org_id int64, storehouse_id int64, out_count int64) error { ut := XTWriteDB().Begin() err := ut.Model(&models.XtDrugStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and drug_id = ?", storehouse_id, org_id, drug_id).UpdateColumn("sum_out_count", gorm.Expr("sum_out_count + ?", out_count)).Error if err != nil { ut.Rollback() return err } err = ut.Model(&models.XtDrugStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and drug_id = ?", storehouse_id, org_id, drug_id).UpdateColumn("sum_act_out_count", gorm.Expr("sum_act_out_count + ?", out_count)).Error if err != nil { ut.Rollback() return err } ut.Commit() return err } func ReduceDrugCount(drug_id int64, org_id int64, storehouse_id int64, out_count int64) error { ut := XTWriteDB().Begin() err := ut.Model(&models.XtDrugStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and drug_id = ?", storehouse_id, org_id, drug_id).UpdateColumn("sum_out_count", gorm.Expr("sum_out_count - ?", out_count)).Error if err != nil { ut.Rollback() return err } err = ut.Model(&models.XtDrugStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and drug_id = ?", storehouse_id, org_id, drug_id).UpdateColumn("sum_act_out_count", gorm.Expr("sum_act_out_count - ?", out_count)).Error if err != nil { ut.Rollback() return err } ut.Commit() return err } func ReduceDrugCountTwo(drug_id int64, org_id int64, storehouse_id int64, out_count int64) error { ut := XTWriteDB().Begin() err := ut.Model(&models.XtDrugStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and drug_id = ?", storehouse_id, org_id, drug_id).UpdateColumn("sum_out_count", gorm.Expr("sum_out_count - ?", out_count)).Error if err != nil { ut.Rollback() return err } ut.Commit() return err } // 药品自动出库 递归方式 func BloodDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DoctorAdvice) (err error) { // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量 var deliver_number int64 = 0 var stock_number int64 = 0 prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64) count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64) var drug_price float64 if advice.PrescribingNumberUnit == drup.MaxUnit { deliver_number = count * drup.MinNumber } else { deliver_number = count } if advice.PrescribingNumberUnit == drup.MaxUnit { drug_price = drup.RetailPrice } fmt.Println(drug_price) if advice.PrescribingNumberUnit == drup.MinUnit { drug_price = drup.MinPrice } if advice.PrescribingNumberUnit != drup.MaxUnit || advice.PrescribingNumberUnit != drup.MinUnit { drug_price = drup.RetailPrice } // 根据先进先出原则,查询最先入库的批次,进行出库 // 如果没有对应的库存,则报错 storeConfig, _ := GetAllStoreHouseConfig(advice.UserOrgId) lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut) if lastWarehouse.StockMinNumber >= drup.MinNumber { var stockMax int64 var stockMin int64 stockMax = lastWarehouse.StockMinNumber / drup.MinNumber stockMin = lastWarehouse.StockMinNumber % drup.MinNumber ChangeMaxNumber(lastWarehouse.ID, stockMax) UpdateMinNumber(lastWarehouse.ID, stockMin) } warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut) if err != nil { return err } // 将该批次的剩余库存数量转换为拆零数量 stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber // 当库存数量大于或等于出库数量的话,则正常出库该批次 if stock_number >= deliver_number { var maxNumber int64 = 0 var minNumber int64 = 0 maxNumber = deliver_number / drup.MinNumber minNumber = deliver_number % drup.MinNumber if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit { minNumber = maxNumber } if drup.MaxUnit != drup.MinUnit { if warehouse.StockMaxNumber < maxNumber && warehouse.StockMinNumber < minNumber { return errors.New("库存数量不足") } } warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber if warehouse.StockMaxNumber < 0 { warehouse.StockMaxNumber = 0 } if warehouse.StockMinNumber < 0 { warehouse.StockMinNumber = 0 } warehouse.Mtime = time.Now().Unix() if warehouse.StockMinNumber < minNumber { warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1 warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber } else { if minNumber > 0 { warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber } if minNumber == 0 && maxNumber != 1 && warehouse.StockMaxNumber <= 0 { if warehouse.StockMinNumber > 0 { warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number } } } if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit { if (warehouse.StockMinNumber - deliver_number) > 0 { warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number } } if drup.MaxUnit != drup.MinUnit { if warehouse.StockMaxNumber < 0 && warehouse.StockMinNumber < 0 { return errors.New("库存数量不足") } } if warehouse.StockMinNumber <= 0 { warehouse.StockMinNumber = 0 } //扣减库存数据 errThree := UpDateDrugWarehouseInfoByStock(&warehouse) if errThree != nil { return errThree } //查询剩余库存 stockInfo, _ := GetDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId) var sum_count int64 for _, its := range stockInfo { if its.MaxUnit == drup.MaxUnit { its.StockMaxNumber = its.StockMaxNumber * drup.MinNumber } sum_count += its.StockMaxNumber + its.StockMinNumber } warehouseOutInfo := &models.DrugWarehouseOutInfo{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, Status: 1, Ctime: time.Now().Unix(), Remark: warehouse.Remark, OrgId: orgID, Type: 1, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, IsSys: 1, SysRecordTime: advice.RecordDate, DrugId: advice.DrugId, Number: warehouse.Number, BatchNumber: warehouse.BatchNumber, Price: warehouse.RetailPrice, CountUnit: drup.MinUnit, RetailPrice: warehouse.RetailPrice, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, PatientId: advice.PatientId, Count: deliver_number, //出最小单位 WarehouseInfoId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, OverCount: sum_count, AdviceId: advice.ID, } //查询今日该药品该患者是否有出库数据 lastDrugOutInfo, errThreeCode := GetNewDrugWarehouseOutInfo(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId) if errThreeCode == gorm.ErrRecordNotFound { errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo) if errOne != nil { return errOne } } if errThreeCode == nil { errThree := UpdateSigleDrugWarehouseOutInfo(lastDrugOutInfo.ID, warehouseOutInfo) if errThree != nil { return errThree } } var out_count int64 var cancel_count int64 //查询出库数据 infoCountList, _ := FindDrugWarehouseOutInfoCount(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID) //查询退库数据 cancelInfoList, _ := FindDrugCancelOutInfo(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID) for _, item := range infoCountList { out_count += item.Count } for _, item := range cancelInfoList { cancel_count += item.Count } //如果本次出库数据大于历史出库数据 新增1条流水 if deliver_number > (out_count - cancel_count) { drugflow := models.DrugFlow{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, DrugId: advice.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, Count: deliver_number - (out_count - cancel_count), //按最小单位计算, Price: warehouse.RetailPrice, Status: 1, Ctime: time.Now().Unix(), UserOrgId: orgID, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, BatchNumber: warehouse.BatchNumber, MaxUnit: drup.MinUnit, ConsumableType: 3, IsEdit: 1, Creator: advice.ExecutionStaff, IsSys: 1, PatientId: advice.PatientId, SystemTime: advice.AdviceDate, WarehousingDetailId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, WarehouseOutDetailId: lastDrugOutInfo.ID, OverCount: sum_count, AdviceId: advice.ID, LastPrice: warehouse.Price, } CreateDrugFlowOne(drugflow) //出库数量相加 AddDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count) } //如果本次出库数据小于历史出库数据 新增1条退库流水 if deliver_number < (out_count - cancel_count) { operation_time := time.Now().Unix() ctime := time.Now().Unix() timeStr := time.Now().Format("2006-01-02") timeArr := strings.Split(timeStr, "-") total, _ := FindAllDrugCancelStockTotal(advice.UserOrgId) total = total + 1 orderNumber := "CKTKD" + strconv.FormatInt(advice.UserOrgId, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000" + strconv.FormatInt(total, 10) cancelStock := models.DrugCancelStock{ OrderNumber: orderNumber, OperaTime: operation_time, OrgId: advice.UserOrgId, Creater: advice.ExecutionStaff, Ctime: ctime, Status: 1, ReturnTime: advice.AdviceDate, Dealer: 0, Manufacturer: 0, Type: 1, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } _, errCode := FindDrugCancelStock(advice.AdviceDate, advice.UserOrgId) if errCode == gorm.ErrRecordNotFound { AddSigleDrugCancelStock(&cancelStock) } lastDrugCancelStock, _ := FindLastDrugCancelStock(advice.AdviceDate, advice.UserOrgId) manufactureName, _ := GetManufactureById(warehouse.Manufacturer) dealer, _ := GetDealerById(warehouse.Dealer) cancelInfo, _ := GetLastDrugCancelStockById(advice.UserOrgId) cancelStockInfo := models.DrugCancelStockInfo{ OrderNumber: cancelInfo.OrderNumber, CancelStockId: lastDrugCancelStock.ID, DrugId: advice.DrugId, Count: (out_count - cancel_count) - deliver_number, Status: 1, Ctime: ctime, OrgId: advice.UserOrgId, Type: 1, Manufacturer: manufactureName.ManufacturerName, Dealer: dealer.DealerName, Total: 0, RetailPrice: warehouse.RetailPrice, RetailTotalPrice: warehouse.RetailTotalPrice, Price: warehouse.Price, RegisterAccount: "", Remark: warehouse.Remark, BatchNumber: warehouse.BatchNumber, MaxUnit: drup.MinUnit, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, BatchNumberId: warehouse.ID, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } CreatedCancelStock(cancelStockInfo) flow := models.DrugFlow{ WarehousingId: warehouse.ID, DrugId: warehouse.DrugId, Number: "", BatchNumber: warehouse.BatchNumber, Count: (out_count - cancel_count) - deliver_number, UserOrgId: advice.UserOrgId, PatientId: advice.PatientId, SystemTime: advice.AdviceDate, ConsumableType: 7, IsSys: 1, WarehousingOrder: "", WarehouseOutId: 0, WarehouseOutOrderNumber: "", IsEdit: 0, CancelStockId: cancelStock.ID, CancelOrderNumber: cancelStock.OrderNumber, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, Creator: advice.ExecutionStaff, UpdateCreator: 0, Status: 1, Ctime: time.Now().Unix(), Mtime: 0, Price: warehouse.RetailPrice, WarehousingDetailId: warehouse.ID, WarehouseOutDetailId: 0, CancelOutDetailId: lastDrugCancelStock.ID, ExpireDate: warehouse.ExpiryDate, ProductDate: warehouse.ProductDate, MaxUnit: drup.MinUnit, MinUnit: "", AdviceId: advice.ID, StorehouseId: storeConfig.DrugStorehouseOut, LastPrice: warehouse.Price, } CreateDrugFlowOne(flow) AddCancelSumCountOne(storeConfig.DrugStorehouseOut, advice.DrugId, advice.UserOrgId, flow.Count) //出库数量减 ReduceDrugCountTwo(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, flow.Count) } //查询是否存在数据 details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: time.Now().Unix(), Mtime: time.Now().Unix(), Status: 1, RecordTime: advice.RecordDate, OrgId: orgID, DrugId: advice.DrugId, Count: deliver_number, CountUnit: drup.MinUnit, WarehouseInfoId: warehouse.ID, StorehouseId: storeConfig.DrugStorehouseOut, AdviceId: advice.ID, } errTwo := AddSigleDrugAutoReduceRecordInfo(details) if errTwo != nil { return errTwo } return nil } else { info := models.XtDrugWarehouseInfo{ ID: warehouse.ID, WarehousingId: warehouse.WarehousingId, DrugId: warehouse.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, WarehousingCount: warehouse.WarehousingCount, Price: warehouse.RetailPrice, TotalPrice: warehouse.TotalPrice, Dealer: warehouse.Dealer, Manufacturer: warehouse.Manufacturer, Remark: warehouse.Remark, Ctime: warehouse.Ctime, Mtime: warehouse.Mtime, Status: 1, OrgId: warehouse.OrgId, IsReturn: warehouse.IsReturn, WarehousingOrder: warehouse.WarehousingOrder, Type: warehouse.Type, RetailPrice: warehouse.RetailPrice, RetailTotalPrice: warehouse.RetailPrice, StockMaxNumber: 0, StockMinNumber: 0, BatchNumber: warehouse.BatchNumber, MaxUnit: warehouse.MaxUnit, WarehousingInfoId: warehouse.WarehousingInfoId, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } //扣减库存 errThree := UpDateDrugWarehouseInfoByStock(&info) if errThree != nil { return errThree } //查询剩余库存 stockInfo, _ := GetDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId) var sum_count int64 for _, its := range stockInfo { if its.MaxUnit == drup.MaxUnit { its.StockMaxNumber = its.StockMaxNumber * drup.MinNumber } sum_count += its.StockMaxNumber + its.StockMinNumber } // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库 warehouseOutInfo := &models.DrugWarehouseOutInfo{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, Status: 1, Ctime: time.Now().Unix(), Remark: warehouse.Remark, OrgId: orgID, Type: 1, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, IsSys: 1, SysRecordTime: advice.RecordDate, DrugId: advice.DrugId, Number: warehouse.Number, BatchNumber: warehouse.BatchNumber, Price: warehouse.RetailPrice, CountUnit: drup.MinUnit, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, PatientId: advice.PatientId, Count: stock_number, WarehouseInfoId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, OverCount: sum_count, AdviceId: advice.ID, } //查询是否存在出库数据 _, errCode := GetSigleDrugWarehouseOutInfoSix(advice.PatientId, advice.AdviceDate, orgID, advice.ID) if errCode == gorm.ErrRecordNotFound { errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo) if errOne != nil { return errOne } } if errCode == nil { UpdateSingleDrugWarehouseOutInfo(advice.PatientId, advice.AdviceDate, orgID, warehouseOutInfo) } lastDrugOutInfo, _ := FindLastDrugWarehouseOutInfo(orgID) details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: time.Now().Unix(), Mtime: time.Now().Unix(), Status: 1, RecordTime: advice.RecordDate, OrgId: orgID, DrugId: advice.DrugId, Count: stock_number, CountUnit: drup.MinUnit, WarehouseInfoId: warehouse.ID, StorehouseId: storeConfig.DrugStorehouseOut, AdviceId: advice.ID, } _, errcodeThree := FindDrugAutoReduceRecordInfo(advice.PatientId, advice.RecordDate, advice.DrugId) if errcodeThree == gorm.ErrRecordNotFound { errTwo := AddSigleDrugAutoReduceRecordInfo(details) if errTwo != nil { return errTwo } } if errcodeThree == nil { UpdateDrugAutoReduceRecordInfo(advice.PatientId, advice.RecordDate, advice.DrugId, details) } var out_count int64 var cancel_count int64 //查询出库数据 infoCountList, _ := FindDrugWarehouseOutInfoCount(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID) //查询退库数据 cancelInfoList, _ := FindDrugCancelOutInfo(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID) for _, item := range infoCountList { out_count += item.Count } for _, item := range cancelInfoList { cancel_count += item.Count } //如果本次出库数据大于历史出库数据 新增1条流水 if deliver_number > (out_count - cancel_count) { drugflow := models.DrugFlow{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, DrugId: advice.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, Count: stock_number, Price: warehouse.RetailPrice, Status: 1, Ctime: time.Now().Unix(), UserOrgId: orgID, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, BatchNumber: warehouse.BatchNumber, MaxUnit: drup.MinUnit, ConsumableType: 3, IsEdit: 1, Creator: advice.ExecutionStaff, IsSys: 1, PatientId: advice.PatientId, WarehousingDetailId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, WarehouseOutDetailId: lastDrugOutInfo.ID, OverCount: sum_count, AdviceId: advice.ID, } CreateDrugFlowOne(drugflow) //出库数量相加 AddDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count) } if deliver_number < (out_count - cancel_count) { operation_time := time.Now().Unix() ctime := time.Now().Unix() timeStr := time.Now().Format("2006-01-02") timeArr := strings.Split(timeStr, "-") total, _ := FindAllDrugCancelStockTotal(advice.UserOrgId) total = total + 1 orderNumber := "CKTKD" + strconv.FormatInt(advice.UserOrgId, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000" + strconv.FormatInt(total, 10) cancelStock := models.DrugCancelStock{ OrderNumber: orderNumber, OperaTime: operation_time, OrgId: advice.UserOrgId, Creater: advice.ExecutionStaff, Ctime: ctime, Status: 1, ReturnTime: advice.AdviceDate, Dealer: 0, Manufacturer: 0, Type: 1, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } _, errCode := FindDrugCancelStock(advice.AdviceDate, advice.UserOrgId) if errCode == gorm.ErrRecordNotFound { AddSigleDrugCancelStock(&cancelStock) } lastDrugCancelStock, _ := FindLastDrugCancelStock(advice.AdviceDate, advice.UserOrgId) manufactureName, _ := GetManufactureById(warehouse.Manufacturer) dealer, _ := GetDealerById(warehouse.Dealer) cancelInfo, _ := GetLastDrugCancelStockById(advice.UserOrgId) cancelStockInfo := models.DrugCancelStockInfo{ OrderNumber: cancelInfo.OrderNumber, CancelStockId: lastDrugCancelStock.ID, DrugId: advice.DrugId, Count: (out_count - cancel_count) - deliver_number, Status: 1, Ctime: ctime, OrgId: advice.UserOrgId, Type: 1, Manufacturer: manufactureName.ManufacturerName, Dealer: dealer.DealerName, Total: 0, RetailPrice: warehouse.RetailPrice, RetailTotalPrice: warehouse.RetailTotalPrice, Price: warehouse.Price, RegisterAccount: "", Remark: warehouse.Remark, BatchNumber: warehouse.BatchNumber, MaxUnit: drup.MinUnit, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, BatchNumberId: warehouse.ID, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } CreatedCancelStock(cancelStockInfo) flow := models.DrugFlow{ WarehousingId: warehouse.ID, DrugId: warehouse.DrugId, Number: "", BatchNumber: warehouse.BatchNumber, Count: (out_count - cancel_count) - deliver_number, UserOrgId: advice.UserOrgId, PatientId: advice.PatientId, SystemTime: advice.AdviceDate, ConsumableType: 7, IsSys: 1, WarehousingOrder: "", WarehouseOutId: 0, WarehouseOutOrderNumber: "", IsEdit: 0, CancelStockId: cancelStock.ID, CancelOrderNumber: cancelStock.OrderNumber, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, Creator: advice.ExecutionStaff, UpdateCreator: 0, Status: 1, Ctime: time.Now().Unix(), Mtime: 0, Price: warehouse.Price, WarehousingDetailId: warehouse.ID, WarehouseOutDetailId: 0, CancelOutDetailId: lastDrugCancelStock.ID, ExpireDate: warehouse.ExpiryDate, ProductDate: warehouse.ProductDate, MaxUnit: drup.MinUnit, MinUnit: "", AdviceId: advice.ID, StorehouseId: storeConfig.DrugStorehouseOut, } CreateDrugFlowOne(flow) AddCancelSumCountOne(storeConfig.DrugStorehouseOut, advice.DrugId, advice.UserOrgId, flow.Count) ReduceDrugCountTwo(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, flow.Count) } // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作 prescribingNumber_two_temp := deliver_number - stock_number overPlusNumber := float64(prescribingNumber_two_temp) advice.PrescribingNumber = float64(prescribingNumber_two_temp) advice.PrescribingNumberUnit = drup.MinUnit BloodDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice) } return } // 药品自动出库 递归方式 func BloodHisDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo) (err error) { // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量 var deliver_number int64 = 0 var stock_number int64 = 0 prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64) count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64) var drug_price float64 if advice.PrescribingNumberUnit == drup.MaxUnit { deliver_number = count * drup.MinNumber } else { deliver_number = count } if advice.PrescribingNumberUnit == drup.MaxUnit { drug_price = drup.RetailPrice } fmt.Println(drug_price) if advice.PrescribingNumberUnit == drup.MinUnit { drug_price = drup.MinPrice } if advice.PrescribingNumberUnit != drup.MaxUnit || advice.PrescribingNumberUnit != drup.MinUnit { drug_price = drup.RetailPrice } // 根据先进先出原则,查询最先入库的批次,进行出库 // 如果没有对应的库存,则报错 storeConfig, _ := GetAllStoreHouseConfig(advice.UserOrgId) lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut) if lastWarehouse.StockMinNumber >= drup.MinNumber { var stockMax int64 var stockMin int64 stockMax = lastWarehouse.StockMinNumber / drup.MinNumber stockMin = lastWarehouse.StockMinNumber % drup.MinNumber ChangeMaxNumber(lastWarehouse.ID, stockMax) UpdateMinNumber(lastWarehouse.ID, stockMin) } warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut) if err != nil { return err } // 将该批次的剩余库存数量转换为拆零数量 // 将该批次的剩余库存数量转换为拆零数量 if warehouse.MaxUnit == drup.MaxUnit && drup.MaxUnit != drup.MinUnit { //fmt.Println("进来1") stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber //fmt.Println("剩余库存1", stock_number) } if warehouse.MaxUnit == drup.MinUnit && drup.MaxUnit != drup.MinUnit { //fmt.Println("进来2") stock_number = warehouse.StockMaxNumber + warehouse.StockMinNumber //fmt.Println("剩余库存2", stock_number) } if warehouse.MaxUnit == drup.MaxUnit && drup.MaxUnit == drup.MinUnit { //fmt.Println("进来3") stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber //fmt.Println("剩余库存3", stock_number) } //fmt.Println("剩余库存23333333333333333333333333333wo", stock_number) //fmt.Println("出库数量2333333333333333333333333333333333333wo", deliver_number) // 当库存数量大于或等于出库数量的话,则正常出库该批次 if stock_number >= deliver_number { var maxNumber int64 = 0 var minNumber int64 = 0 maxNumber = deliver_number / drup.MinNumber minNumber = deliver_number % drup.MinNumber if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit { minNumber = maxNumber } if drup.MaxUnit != drup.MinUnit { if warehouse.StockMaxNumber < maxNumber && warehouse.StockMinNumber < minNumber { return errors.New("库存数量不足") } } if drup.MinUnit == warehouse.MaxUnit && drup.MaxUnit != drup.MinUnit { warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber*drup.MinNumber } if drup.MaxUnit == warehouse.MaxUnit && drup.MaxUnit != drup.MinUnit { warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber } if drup.MaxUnit == warehouse.MaxUnit && drup.MaxUnit == drup.MinUnit { warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber } if warehouse.StockMaxNumber < 0 { warehouse.StockMaxNumber = 0 } if warehouse.StockMinNumber < 0 { warehouse.StockMinNumber = 0 } warehouse.Mtime = time.Now().Unix() fmt.Println("minnU目标而332322323323233223323223我", minNumber) fmt.Println("max_number232232332232322wo", maxNumber) fmt.Println(" warehouse.StockMinNumber", warehouse.StockMinNumber) if warehouse.StockMinNumber < minNumber { warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1 if warehouse.MaxUnit != warehouse.MinUnit { warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber } } else { if minNumber > 0 { if (warehouse.StockMinNumber - minNumber) >= 0 { warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber } } if minNumber == 0 && maxNumber != 1 && warehouse.StockMaxNumber <= 0 { if warehouse.StockMinNumber > 0 { if warehouse.StockMinNumber-deliver_number >= 0 { warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number } } } } if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit { if (warehouse.StockMinNumber - deliver_number) >= 0 { warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number } } if drup.MaxUnit != drup.MinUnit { if warehouse.StockMaxNumber < 0 && warehouse.StockMinNumber < 0 { return errors.New("库存数量不足") } } if warehouse.StockMinNumber <= 0 { warehouse.StockMinNumber = 0 } //扣减库存数据 errThree := UpDateDrugWarehouseInfoByStock(&warehouse) if errThree != nil { return errThree } //查询剩余库存 stockInfo, _ := GetDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId) var sum_count int64 for _, its := range stockInfo { if its.MaxUnit == drup.MaxUnit { its.StockMaxNumber = its.StockMaxNumber * drup.MinNumber } sum_count += its.StockMaxNumber + its.StockMinNumber } warehouseOutInfo := &models.DrugWarehouseOutInfo{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, Status: 1, Ctime: time.Now().Unix(), Remark: warehouse.Remark, OrgId: orgID, Type: 1, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, IsSys: 1, SysRecordTime: advice.RecordDate, DrugId: advice.DrugId, Number: warehouse.Number, BatchNumber: warehouse.BatchNumber, Price: warehouse.RetailPrice, CountUnit: drup.MinUnit, RetailPrice: warehouse.RetailPrice, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, PatientId: advice.PatientId, Count: deliver_number, //出最小单位 WarehouseInfoId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, OverCount: sum_count, AdviceId: advice.ID, } //查询今日该药品该患者是否有出库数据 lastDrugOutInfo, _ := GetNewDrugWarehouseOutInfoSix(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID) fmt.Println("lastDrugOutInfowwowowowoowowowowowowowowo", lastDrugOutInfo.ID) if lastDrugOutInfo.ID == 0 { errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo) if errOne != nil { return errOne } } if lastDrugOutInfo.ID > 0 { var his_count int64 if lastDrugOutInfo.CountUnit == drup.MaxUnit { his_count = lastDrugOutInfo.Count * drup.MinNumber } if lastDrugOutInfo.CountUnit == drup.MinUnit { his_count = lastDrugOutInfo.Count } if deliver_number != his_count { errThree := UpdateSigleDrugWarehouseOutInfo(lastDrugOutInfo.ID, warehouseOutInfo) if errThree != nil { return errThree } } } var out_count int64 var cancel_count int64 //查询出库数据 infoCountList, _ := FindDrugWarehouseOutInfoCount(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID) //查询退库数据 cancelInfoList, _ := FindDrugCancelOutInfo(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID) for _, item := range infoCountList { out_count += item.Count } for _, item := range cancelInfoList { cancel_count += item.Count } fmt.Println("deliver_number", deliver_number) fmt.Println("out_count", out_count) fmt.Println("cancel_count", cancel_count) //如果本次出库数据大于历史出库数据 新增1条流水 if deliver_number > (out_count - cancel_count) { drugflow := models.DrugFlow{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, DrugId: advice.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, Count: deliver_number - (out_count - cancel_count), //按最小单位计算, Price: warehouse.RetailPrice, Status: 1, Ctime: time.Now().Unix(), UserOrgId: orgID, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, BatchNumber: warehouse.BatchNumber, MaxUnit: drup.MinUnit, ConsumableType: 3, IsEdit: 1, Creator: advice.ExecutionStaff, IsSys: 1, PatientId: advice.PatientId, SystemTime: advice.AdviceDate, WarehousingDetailId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, WarehouseOutDetailId: lastDrugOutInfo.ID, OverCount: sum_count, AdviceId: advice.ID, LastPrice: warehouse.Price, } CreateDrugFlowOne(drugflow) //出库数量相加 AddDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count) } //如果本次出库数据小于历史出库数据 新增1条退库流水 if deliver_number < (out_count - cancel_count) { operation_time := time.Now().Unix() ctime := time.Now().Unix() timeStr := time.Now().Format("2006-01-02") timeArr := strings.Split(timeStr, "-") total, _ := FindAllDrugCancelStockTotal(advice.UserOrgId) total = total + 1 orderNumber := "CKTKD" + strconv.FormatInt(advice.UserOrgId, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000" + strconv.FormatInt(total, 10) cancelStock := models.DrugCancelStock{ OrderNumber: orderNumber, OperaTime: operation_time, OrgId: advice.UserOrgId, Creater: advice.ExecutionStaff, Ctime: ctime, Status: 1, ReturnTime: advice.AdviceDate, Dealer: 0, Manufacturer: 0, Type: 1, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } _, errCode := FindDrugCancelStock(advice.AdviceDate, advice.UserOrgId) if errCode == gorm.ErrRecordNotFound { AddSigleDrugCancelStock(&cancelStock) } lastDrugCancelStock, _ := FindLastDrugCancelStock(advice.AdviceDate, advice.UserOrgId) manufactureName, _ := GetManufactureById(warehouse.Manufacturer) dealer, _ := GetDealerById(warehouse.Dealer) cancelInfo, _ := GetLastDrugCancelStockById(advice.UserOrgId) cancelStockInfo := models.DrugCancelStockInfo{ OrderNumber: cancelInfo.OrderNumber, CancelStockId: lastDrugCancelStock.ID, DrugId: advice.DrugId, Count: (out_count - cancel_count) - deliver_number, Status: 1, Ctime: ctime, OrgId: advice.UserOrgId, Type: 1, Manufacturer: manufactureName.ManufacturerName, Dealer: dealer.DealerName, Total: 0, RetailPrice: warehouse.RetailPrice, RetailTotalPrice: warehouse.RetailTotalPrice, Price: warehouse.Price, RegisterAccount: "", Remark: warehouse.Remark, BatchNumber: warehouse.BatchNumber, MaxUnit: drup.MinUnit, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, BatchNumberId: warehouse.ID, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } CreatedCancelStock(cancelStockInfo) flow := models.DrugFlow{ WarehousingId: warehouse.ID, DrugId: warehouse.DrugId, Number: "", BatchNumber: warehouse.BatchNumber, Count: out_count - cancel_count - deliver_number, UserOrgId: advice.UserOrgId, PatientId: advice.PatientId, SystemTime: advice.AdviceDate, ConsumableType: 7, IsSys: 0, WarehousingOrder: "", WarehouseOutId: 0, WarehouseOutOrderNumber: "", IsEdit: 0, CancelStockId: cancelStock.ID, CancelOrderNumber: cancelStock.OrderNumber, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, Creator: advice.ExecutionStaff, UpdateCreator: 0, Status: 1, Ctime: time.Now().Unix(), Mtime: 0, Price: warehouse.RetailPrice, WarehousingDetailId: warehouse.ID, WarehouseOutDetailId: 0, CancelOutDetailId: lastDrugCancelStock.ID, ExpireDate: warehouse.ExpiryDate, ProductDate: warehouse.ProductDate, MaxUnit: drup.MinUnit, MinUnit: "", AdviceId: advice.ID, StorehouseId: storeConfig.DrugStorehouseOut, LastPrice: warehouse.Price, OverCount: sum_count, } CreateDrugFlowOne(flow) AddCancelSumCountOne(storeConfig.DrugStorehouseOut, advice.DrugId, advice.UserOrgId, flow.Count) ReduceDrugCountTwo(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, flow.Count) } //查询是否存在数据 details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: time.Now().Unix(), Mtime: time.Now().Unix(), Status: 1, RecordTime: advice.RecordDate, OrgId: orgID, DrugId: advice.DrugId, Count: deliver_number, CountUnit: drup.MinUnit, WarehouseInfoId: warehouse.ID, StorehouseId: storeConfig.DrugStorehouseOut, AdviceId: advice.ID, } errTwo := AddSigleDrugAutoReduceRecordInfo(details) if errTwo != nil { return errTwo } return nil } else { info := models.XtDrugWarehouseInfo{ ID: warehouse.ID, WarehousingId: warehouse.WarehousingId, DrugId: warehouse.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, WarehousingCount: warehouse.WarehousingCount, Price: warehouse.RetailPrice, TotalPrice: warehouse.TotalPrice, Dealer: warehouse.Dealer, Manufacturer: warehouse.Manufacturer, Remark: warehouse.Remark, Ctime: warehouse.Ctime, Mtime: warehouse.Mtime, Status: 1, OrgId: warehouse.OrgId, IsReturn: warehouse.IsReturn, WarehousingOrder: warehouse.WarehousingOrder, Type: warehouse.Type, RetailPrice: warehouse.RetailPrice, RetailTotalPrice: warehouse.RetailPrice, StockMaxNumber: 0, StockMinNumber: 0, BatchNumber: warehouse.BatchNumber, MaxUnit: warehouse.MaxUnit, WarehousingInfoId: warehouse.WarehousingInfoId, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } //扣减库存 errThree := UpDateDrugWarehouseInfoByStock(&info) if errThree != nil { return errThree } //查询剩余库存 stockInfo, _ := GetDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId) var sum_count int64 for _, its := range stockInfo { if its.MaxUnit == drup.MaxUnit { its.StockMaxNumber = its.StockMaxNumber * drup.MinNumber } sum_count += its.StockMaxNumber + its.StockMinNumber } // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库 warehouseOutInfo := &models.DrugWarehouseOutInfo{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, Status: 1, Ctime: time.Now().Unix(), Remark: warehouse.Remark, OrgId: orgID, Type: 1, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, IsSys: 1, SysRecordTime: advice.RecordDate, DrugId: advice.DrugId, Number: warehouse.Number, BatchNumber: warehouse.BatchNumber, Price: warehouse.RetailPrice, CountUnit: drup.MinUnit, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, PatientId: advice.PatientId, Count: stock_number, WarehouseInfoId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, OverCount: sum_count, AdviceId: advice.ID, } //查询是否存在出库数据 _, errCode := GetSigleDrugWarehouseOutInfo(advice.PatientId, advice.AdviceDate, orgID) if errCode == gorm.ErrRecordNotFound { fmt.Println("j你俩3233223323232323233wo") errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo) if errOne != nil { return errOne } } if errCode == nil { lastDrugOutInfo, _ := GetSigleDrugWarehouseOutInfoOne(advice.PatientId, advice.AdviceDate, orgID) var his_count int64 if lastDrugOutInfo.CountUnit == drup.MaxUnit { his_count = lastDrugOutInfo.Count * drup.MinNumber } if lastDrugOutInfo.CountUnit == drup.MinUnit { his_count = lastDrugOutInfo.Count } if deliver_number != his_count { errThree := UpdateSingleDrugWarehouseOutInfoSix(advice.PatientId, advice.AdviceDate, orgID, warehouseOutInfo, advice.ID) if errThree != nil { return errThree } } } lastDrugOutInfo, _ := FindLastDrugWarehouseOutInfo(orgID) details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: time.Now().Unix(), Mtime: time.Now().Unix(), Status: 1, RecordTime: advice.RecordDate, OrgId: orgID, DrugId: advice.DrugId, Count: stock_number, CountUnit: drup.MinUnit, WarehouseInfoId: warehouse.ID, StorehouseId: storeConfig.DrugStorehouseOut, AdviceId: advice.ID, } _, errcodeThree := FindDrugAutoReduceRecordInfo(advice.PatientId, advice.RecordDate, advice.DrugId) if errcodeThree == gorm.ErrRecordNotFound { errTwo := AddSigleDrugAutoReduceRecordInfo(details) if errTwo != nil { return errTwo } } if errcodeThree == nil { UpdateDrugAutoReduceRecordInfo(advice.PatientId, advice.RecordDate, advice.DrugId, details) } var out_count int64 var cancel_count int64 //查询出库数据 infoCountList, _ := FindDrugWarehouseOutInfoCount(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID) //查询退库数据 cancelInfoList, _ := FindDrugCancelOutInfo(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID) for _, item := range infoCountList { out_count += item.Count } for _, item := range cancelInfoList { cancel_count += item.Count } //如果本次出库数据大于历史出库数据 新增1条流水 if deliver_number > (out_count - cancel_count) { drugflow := models.DrugFlow{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, DrugId: advice.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, Count: stock_number, Price: warehouse.RetailPrice, Status: 1, Ctime: time.Now().Unix(), UserOrgId: orgID, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, BatchNumber: warehouse.BatchNumber, MaxUnit: drup.MinUnit, ConsumableType: 3, IsEdit: 1, Creator: advice.ExecutionStaff, IsSys: 1, PatientId: advice.PatientId, WarehousingDetailId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, WarehouseOutDetailId: lastDrugOutInfo.ID, OverCount: sum_count, AdviceId: advice.ID, LastPrice: warehouse.Price, SystemTime: advice.AdviceDate, } CreateDrugFlowOne(drugflow) //出库数量相加 AddDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count) } if deliver_number < (out_count - cancel_count) { operation_time := time.Now().Unix() ctime := time.Now().Unix() timeStr := time.Now().Format("2006-01-02") timeArr := strings.Split(timeStr, "-") total, _ := FindAllDrugCancelStockTotal(advice.UserOrgId) total = total + 1 orderNumber := "CKTKD" + strconv.FormatInt(advice.UserOrgId, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000" + strconv.FormatInt(total, 10) cancelStock := models.DrugCancelStock{ OrderNumber: orderNumber, OperaTime: operation_time, OrgId: advice.UserOrgId, Creater: advice.ExecutionStaff, Ctime: ctime, Status: 1, ReturnTime: advice.AdviceDate, Dealer: 0, Manufacturer: 0, Type: 1, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } _, errCode := FindDrugCancelStock(advice.AdviceDate, advice.UserOrgId) if errCode == gorm.ErrRecordNotFound { AddSigleDrugCancelStock(&cancelStock) } lastDrugCancelStock, _ := FindLastDrugCancelStock(advice.AdviceDate, advice.UserOrgId) manufactureName, _ := GetManufactureById(warehouse.Manufacturer) dealer, _ := GetDealerById(warehouse.Dealer) cancelInfo, _ := GetLastDrugCancelStockById(advice.UserOrgId) cancelStockInfo := models.DrugCancelStockInfo{ OrderNumber: cancelInfo.OrderNumber, CancelStockId: lastDrugCancelStock.ID, DrugId: advice.DrugId, Count: (out_count - cancel_count) - deliver_number, Status: 1, Ctime: ctime, OrgId: advice.UserOrgId, Type: 1, Manufacturer: manufactureName.ManufacturerName, Dealer: dealer.DealerName, Total: 0, RetailPrice: warehouse.RetailPrice, RetailTotalPrice: warehouse.RetailTotalPrice, Price: warehouse.Price, RegisterAccount: "", Remark: warehouse.Remark, BatchNumber: warehouse.BatchNumber, MaxUnit: drup.MinUnit, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, BatchNumberId: warehouse.ID, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } CreatedCancelStock(cancelStockInfo) flow := models.DrugFlow{ WarehousingId: warehouse.ID, DrugId: warehouse.DrugId, Number: "", BatchNumber: warehouse.BatchNumber, Count: out_count - cancel_count - deliver_number, UserOrgId: advice.UserOrgId, PatientId: advice.PatientId, SystemTime: advice.AdviceDate, ConsumableType: 7, IsSys: 0, WarehousingOrder: "", WarehouseOutId: 0, WarehouseOutOrderNumber: "", IsEdit: 0, CancelStockId: cancelStock.ID, CancelOrderNumber: cancelStock.OrderNumber, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, Creator: advice.ExecutionStaff, UpdateCreator: 0, Status: 1, Ctime: time.Now().Unix(), Mtime: 0, Price: warehouse.RetailPrice, WarehousingDetailId: warehouse.ID, WarehouseOutDetailId: 0, CancelOutDetailId: lastDrugCancelStock.ID, ExpireDate: warehouse.ExpiryDate, ProductDate: warehouse.ProductDate, MaxUnit: drup.MinUnit, MinUnit: "", AdviceId: advice.ID, StorehouseId: storeConfig.DrugStorehouseOut, LastPrice: warehouse.Price, OverCount: sum_count, } CreateDrugFlowOne(flow) //退库数量增加 AddCancelSumCountOne(storeConfig.DrugStorehouseOut, advice.DrugId, advice.UserOrgId, flow.Count) ReduceDrugCountTwo(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, flow.Count) } // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作 prescribingNumber_two_temp := deliver_number - stock_number overPlusNumber := float64(prescribingNumber_two_temp) advice.PrescribingNumber = float64(prescribingNumber_two_temp) advice.PrescribingNumberUnit = drup.MinUnit BloodHisDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice) } return } func GetSigleDrugWarehouseOutInfoSix(patient_id int64, advice_date int64, orgid int64, advice_id int64) (*models.XtDrugWarehouseOutInfo, error) { info := models.XtDrugWarehouseOutInfo{} var err error err = XTReadDB().Where("patient_id = ? and advice_date = ? and org_id = ? and status = 1 and advice_id =?", patient_id, advice_date, orgid, advice_id).Find(&info).Error if err == gorm.ErrRecordNotFound { return nil, err } if err != nil { return nil, err } return &info, nil } func GetSigleDrugWarehouseOutInfo(patient_id int64, advice_date int64, orgid int64) (*models.XtDrugWarehouseOutInfo, error) { info := models.XtDrugWarehouseOutInfo{} var err error err = XTReadDB().Where("patient_id = ? and sys_record_time = ? and org_id = ? and status = 1", patient_id, advice_date, orgid).Find(&info).Error if err == gorm.ErrRecordNotFound { return nil, err } if err != nil { return nil, err } return &info, nil } func GetSigleDrugWarehouseOutInfoOne(patient_id int64, advice_date int64, orgid int64) (models.XtDrugWarehouseOutInfo, error) { info := models.XtDrugWarehouseOutInfo{} err = XTReadDB().Where("patient_id = ? and advice_date = ? and org_id = ? and status = 1", patient_id, advice_date, orgid).Find(&info).Error return info, err } func UpdateSingleDrugWarehouseOutInfoSix(patient_id int64, advice_date int64, orgid int64, info *models.DrugWarehouseOutInfo, advice_id int64) error { err := XTWriteDB().Model(&models.XtDrugWarehouseOutInfo{}).Where("patient_id = ? and sys_record_time = ? and org_id = ? and advice_id = ?", patient_id, advice_date, orgid, advice_id).Update(map[string]interface{}{"count": info.Count, "price": info.Price, "total_price": info.TotalPrice, "product_date": info.ProductDate, "expiry_date": info.ExpiryDate, "remark": info.Remark, "dealer": info.Dealer, "manufacturer": info.Manufacturer, "retail_price": info.RetailPrice, "number": info.Number, "batch_number": info.BatchNumber, "count_unit": info.CountUnit, "warehouse_info_id": info.WarehouseInfoId, "storehouse_id": info.StorehouseId}).Error return err } func UpdateSingleDrugWarehouseOutInfo(patient_id int64, advice_date int64, orgid int64, info *models.DrugWarehouseOutInfo) error { err := XTWriteDB().Model(&models.XtDrugWarehouseOutInfo{}).Where("patient_id = ? and advice_date = ? and org_id = ?", patient_id, advice_date, orgid).Update(map[string]interface{}{"count": info.Count, "price": info.Price, "total_price": info.TotalPrice, "product_date": info.ProductDate, "expiry_date": info.ExpiryDate, "remark": info.Remark, "dealer": info.Dealer, "manufacturer": info.Manufacturer, "retail_price": info.RetailPrice, "number": info.Number, "batch_number": info.BatchNumber, "count_unit": info.CountUnit, "warehouse_info_id": info.WarehouseInfoId, "storehouse_id": info.StorehouseId}).Error return err } func FindDrugAutoReduceRecordInfo(patient_id int64, advice_date int64, orgid int64) (*models.DrugAutomaticReduceDetail, error) { detail := models.DrugAutomaticReduceDetail{} var err error err = XTReadDB().Where("patient_id = ? and record_time = ? and org_id = ?", patient_id, advice_date, orgid).Find(&detail).Error if err == gorm.ErrRecordNotFound { return nil, err } if err != nil { return nil, err } return &detail, nil } func UpdateDrugAutoReduceRecordInfo(patient_id int64, record_date int64, drug_id int64, detail *models.DrugAutomaticReduceDetail) error { err := XTWriteDB().Model(&models.DrugAutomaticReduceDetail{}).Where("patient_id = ? and record_date = ? and drug_id = ?", patient_id, record_date, drug_id).Update(map[string]interface{}{"patient_id": detail.PatientId, "record_time": detail.RecordTime, "drug_id": detail.DrugId, "count": detail.Count, "count_unit": detail.CountUnit, "warehouse_info_id": detail.WarehouseInfoId, "advice_id": detail.AdviceId, "storehouse_id": detail.StorehouseId}).Error return err } func GetNewDrugWarehouseOutInfoSix(drugid int64, patient_id int64, record_date int64, org_id int64, advice_id int64, warehouse_info_id int64) (models.DrugWarehouseOutInfo, error) { info := models.DrugWarehouseOutInfo{} var err error err = XTReadDB().Where("drug_id = ? and patient_id = ? and sys_record_time = ? and org_id = ? and status = 1 and advice_id = ? and warehouse_info_id = ?", drugid, patient_id, record_date, org_id, advice_id, warehouse_info_id).Find(&info).Error return info, err } func GetNewDrugWarehouseOutInfo(drugid int64, patient_id int64, record_date int64, org_id int64) (models.DrugWarehouseOutInfo, error) { info := models.DrugWarehouseOutInfo{} var err error err = XTReadDB().Where("drug_id = ? and patient_id = ? and sys_record_time = ? and org_id = ? and status = 1 ", drugid, patient_id, record_date, org_id).Find(&info).Error return info, err } func UpdateSigleDrugWarehouseOutInfo(id int64, info *models.DrugWarehouseOutInfo) error { err := XTWriteDB().Model(models.DrugWarehouseOutInfo{}).Where("id = ? and status = 1", id).Update(map[string]interface{}{"warehouse_out_id": info.WarehouseOutId, "count": info.Count, "count_unit": info.CountUnit, "price": info.Price, "total_price": info.TotalPrice, "product_date": info.ProductDate, "expiry_date": info.ExpiryDate, "mtime": time.Now().Unix(), "remark": info.Remark, "dealer": info.Dealer, "manufacturer": info.Manufacturer, "retail_price": info.RetailPrice, "retail_total_price": info.RetailTotalPrice, "warehouse_info_id": info.WarehouseInfoId, "number": info.Number, "batch_number": info.BatchNumber, "advice_id": info.AdviceId, "storehouse_id": info.StorehouseId, "last_price": info.LastPrice, "over_count": info.OverCount}).Error return err } func UpdateSigleDrugWarehouseOutInfoTwo(id int64, info *models.DrugWarehouseOutInfo) error { err := XTWriteDB().Model(models.DrugWarehouseOutInfo{}).Where("id = ? and status = 1", id).Update(map[string]interface{}{"warehouse_out_id": info.WarehouseOutId, "count": info.Count, "count_unit": info.CountUnit, "price": info.Price, "total_price": info.TotalPrice, "product_date": info.ProductDate, "expiry_date": info.ExpiryDate, "mtime": time.Now().Unix(), "remark": info.Remark, "dealer": info.Dealer, "manufacturer": info.Manufacturer, "retail_price": info.RetailPrice, "retail_total_price": info.RetailTotalPrice, "warehouse_info_id": info.WarehouseInfoId, "number": info.Number, "batch_number": info.BatchNumber, "advice_id": info.AdviceId, "storehouse_id": info.StorehouseId, "last_price": info.LastPrice}).Error return err } func FindDrugWarehouseOutInfoCount(drugid int64, patient_id int64, record_date int64, org_id int64, advice_id int64) (flow []*models.DrugFlow, err error) { err = XTReadDB().Where("drug_id = ? and patient_id = ? and system_time = ? and user_org_id = ? and consumable_type = 3 and status = 1 and advice_id = ?", drugid, patient_id, record_date, org_id, advice_id).Find(&flow).Error return flow, err } func FindDrugCancelOutInfo(drugid int64, patient_id int64, record_date int64, org_id int64, advice_id int64) (flow []*models.DrugFlow, err error) { err = XTReadDB().Where("drug_id = ? and patient_id = ? and system_time = ? and user_org_id = ? and consumable_type = 7 and status = 1 and advice_id = ?", drugid, patient_id, record_date, org_id, advice_id).Find(&flow).Error return flow, err } func FindDrugCancelStock(return_date int64, org_id int64) (*models.DrugCancelStock, error) { stock := models.DrugCancelStock{} var err error err = XTReadDB().Where("return_date = ? and org_id = ? and status = 1", return_date, org_id).Find(&stock).Error if err == gorm.ErrRecordNotFound { return nil, err } if err != nil { return nil, err } return &stock, nil } func FindLastDrugCancelStock(advice_date int64, org_id int64) (models.DrugCancelStock, error) { cancelStock := models.DrugCancelStock{} err := XTReadDB().Where("return_date = ? and org_id = ? and status = 1", advice_date, org_id).Find(&cancelStock).Error return cancelStock, err } func GetAllSumDrugWarehouseOut(patient_id int64, user_org_id int64, advice_date int64) (advice []*models.HisDoctorAdvice, err error) { err = XTReadDB().Where("patient_id = ? and user_org_id = ? and advice_date = ? and status = 1", patient_id, user_org_id, advice_date).Find(&advice).Error return advice, err } func UpdateDrugWarehouseOutByPatientId(patient_id int64, advice_date int64, orgid int64, info models.DrugWarehouseOutInfo) error { err := XTWriteDB().Model(&models.DrugWarehouseOutInfo{}).Where("patient_id = ? and sys_record_time = ? and org_id = ? and status = 1", patient_id, advice_date, orgid).Update(map[string]interface{}{"count": info.Count, "count_unit": info.CountUnit}).Error return err } func FindeGoodInfo(orgid int64, id int64) (models.GoodInformation, error) { information := models.GoodInformation{} err := XTReadDB().Where("org_id = ? and id = ? and status = 1", orgid, id).Find(&information).Error return information, err } func UpdateHisPrescriptionProjectStatus(project_id int64, record_time int64, user_org_id int64, patient_id int64) (models.HisPrescriptionProject, error) { project := models.HisPrescriptionProject{} err := XTWriteDB().Model(&project).Where("project_id = ? and record_date = ? and user_org_id = ? and patient_id = ? and status = 1", project_id, record_time, user_org_id, patient_id).Update(map[string]interface{}{"is_out": 1}).Error return project, err } // 药品自动出库 递归方式 func HisSettleDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo) (err error) { // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量 var deliver_number int64 = 0 var stock_number int64 = 0 prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64) count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64) var drug_price float64 if advice.PrescribingNumberUnit == drup.MaxUnit { deliver_number = count * drup.MinNumber } else { deliver_number = count } if advice.PrescribingNumberUnit == drup.MaxUnit { drug_price = drup.RetailPrice } fmt.Println(drug_price) if advice.PrescribingNumberUnit == drup.MinUnit { drug_price = drup.MinPrice } if advice.PrescribingNumberUnit != drup.MaxUnit || advice.PrescribingNumberUnit != drup.MinUnit { drug_price = drup.RetailPrice } // 根据先进先出原则,查询最先入库的批次,进行出库 // 如果没有对应的库存,则报错 storeConfig, _ := GetAllStoreHouseConfig(advice.UserOrgId) lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut) if lastWarehouse.StockMinNumber >= drup.MinNumber { var stockMax int64 var stockMin int64 stockMax = lastWarehouse.StockMinNumber / drup.MinNumber stockMin = lastWarehouse.StockMinNumber % drup.MinNumber ChangeMaxNumber(lastWarehouse.ID, stockMax) UpdateMinNumber(lastWarehouse.ID, stockMin) } warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut) if err != nil { return err } // 将该批次的剩余库存数量转换为拆零数量 // 将该批次的剩余库存数量转换为拆零数量 if warehouse.MaxUnit == drup.MaxUnit && drup.MaxUnit != drup.MinUnit { stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber } if warehouse.MaxUnit == drup.MinUnit && drup.MaxUnit != drup.MinUnit { stock_number = warehouse.StockMaxNumber + warehouse.StockMinNumber } if warehouse.MaxUnit == drup.MaxUnit && drup.MaxUnit == drup.MinUnit { stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber } // 当库存数量大于或等于出库数量的话,则正常出库该批次 if stock_number >= deliver_number { var maxNumber int64 = 0 var minNumber int64 = 0 maxNumber = deliver_number / drup.MinNumber minNumber = deliver_number % drup.MinNumber if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit { minNumber = maxNumber } if drup.MaxUnit != drup.MinUnit { if warehouse.StockMaxNumber < maxNumber && warehouse.StockMinNumber < minNumber { return errors.New("库存数量不足") } } if drup.MinUnit == warehouse.MaxUnit && drup.MaxUnit != drup.MinUnit { warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber*drup.MinNumber } if drup.MaxUnit == warehouse.MaxUnit && drup.MaxUnit != drup.MinUnit { warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber } if drup.MaxUnit == warehouse.MaxUnit && drup.MaxUnit == drup.MinUnit { warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber } if warehouse.StockMaxNumber < 0 { warehouse.StockMaxNumber = 0 } if warehouse.StockMinNumber < 0 { warehouse.StockMinNumber = 0 } warehouse.Mtime = time.Now().Unix() fmt.Println("minnU目标而332322323323233223323223我", minNumber) fmt.Println("max_number232232332232322wo", maxNumber) fmt.Println(" warehouse.StockMinNumber", warehouse.StockMinNumber) if warehouse.StockMinNumber < minNumber { warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1 if warehouse.MaxUnit != warehouse.MinUnit { warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber } } else { if minNumber > 0 { if (warehouse.StockMinNumber - minNumber) >= 0 { warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber } } if minNumber == 0 && maxNumber != 1 && warehouse.StockMaxNumber <= 0 { if warehouse.StockMinNumber > 0 { if warehouse.StockMinNumber-deliver_number >= 0 { warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number } } } } if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit { if (warehouse.StockMinNumber - deliver_number) >= 0 { warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number } } if drup.MaxUnit != drup.MinUnit { if warehouse.StockMaxNumber < 0 && warehouse.StockMinNumber < 0 { return errors.New("库存数量不足") } } if warehouse.StockMinNumber <= 0 { warehouse.StockMinNumber = 0 } //扣减库存数据 errThree := UpDateDrugWarehouseInfoByStock(&warehouse) if errThree != nil { return errThree } //查询剩余库存 stockInfo, _ := GetDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId) var sum_count int64 for _, its := range stockInfo { if its.MaxUnit == drup.MaxUnit { its.StockMaxNumber = its.StockMaxNumber * drup.MinNumber } sum_count += its.StockMaxNumber + its.StockMinNumber } warehouseOutInfo := &models.DrugWarehouseOutInfo{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, Status: 1, Ctime: time.Now().Unix(), Remark: warehouse.Remark, OrgId: orgID, Type: 5, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, IsSys: 1, SysRecordTime: advice.RecordDate, DrugId: advice.DrugId, Number: warehouse.Number, BatchNumber: warehouse.BatchNumber, Price: warehouse.RetailPrice, CountUnit: drup.MinUnit, RetailPrice: warehouse.RetailPrice, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, PatientId: advice.PatientId, Count: deliver_number, //出最小单位 WarehouseInfoId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, OverCount: sum_count, AdviceId: advice.ID, OrderId: warehouseout.OrderId, } //查询今日该药品该患者是否有出库数据 lastDrugOutInfo, _ := GetNewDrugWarehouseOutInfoSix(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID) if lastDrugOutInfo.ID == 0 { errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo) if errOne != nil { return errOne } } if lastDrugOutInfo.ID > 0 { var his_count int64 if lastDrugOutInfo.CountUnit == drup.MaxUnit { his_count = lastDrugOutInfo.Count * drup.MinNumber } if lastDrugOutInfo.CountUnit == drup.MinUnit { his_count = lastDrugOutInfo.Count } if deliver_number != his_count { errThree := UpdateSigleDrugWarehouseOutInfo(lastDrugOutInfo.ID, warehouseOutInfo) if errThree != nil { return errThree } } } var out_count int64 var cancel_count int64 //查询出库数据 infoCountList, _ := FindDrugWarehouseOutInfoCount(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID) //查询退库数据 cancelInfoList, _ := FindDrugCancelOutInfo(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID) for _, item := range infoCountList { out_count += item.Count } for _, item := range cancelInfoList { cancel_count += item.Count } fmt.Println("deliver_number", deliver_number) fmt.Println("out_count", out_count) fmt.Println("cancel_count", cancel_count) //如果本次出库数据大于历史出库数据 新增1条流水 if deliver_number > (out_count - cancel_count) { drugflow := models.DrugFlow{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, DrugId: advice.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, Count: deliver_number - (out_count - cancel_count), //按最小单位计算, Price: warehouse.RetailPrice, Status: 1, Ctime: time.Now().Unix(), UserOrgId: orgID, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, BatchNumber: warehouse.BatchNumber, MaxUnit: drup.MinUnit, ConsumableType: 15, IsEdit: 1, Creator: advice.ExecutionStaff, IsSys: 1, PatientId: advice.PatientId, SystemTime: advice.AdviceDate, WarehousingDetailId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, WarehouseOutDetailId: lastDrugOutInfo.ID, OverCount: sum_count, AdviceId: advice.ID, LastPrice: warehouse.Price, OrderId: warehouseout.OrderId, } CreateDrugFlowOne(drugflow) //出库数量相加 AddDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count) } //如果本次出库数据小于历史出库数据 新增1条退库流水 if deliver_number < (out_count - cancel_count) { operation_time := time.Now().Unix() ctime := time.Now().Unix() timeStr := time.Now().Format("2006-01-02") timeArr := strings.Split(timeStr, "-") total, _ := FindAllDrugCancelStockTotal(advice.UserOrgId) total = total + 1 orderNumber := "CKTKD" + strconv.FormatInt(advice.UserOrgId, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000" + strconv.FormatInt(total, 10) cancelStock := models.DrugCancelStock{ OrderNumber: orderNumber, OperaTime: operation_time, OrgId: advice.UserOrgId, Creater: advice.ExecutionStaff, Ctime: ctime, Status: 1, ReturnTime: advice.AdviceDate, Dealer: 0, Manufacturer: 0, Type: 5, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, OrderId: warehouseout.OrderId, } _, errCode := FindDrugCancelStock(advice.AdviceDate, advice.UserOrgId) if errCode == gorm.ErrRecordNotFound { AddSigleDrugCancelStock(&cancelStock) } lastDrugCancelStock, _ := FindLastDrugCancelStock(advice.AdviceDate, advice.UserOrgId) manufactureName, _ := GetManufactureById(warehouse.Manufacturer) dealer, _ := GetDealerById(warehouse.Dealer) cancelInfo, _ := GetLastDrugCancelStockById(advice.UserOrgId) cancelStockInfo := models.DrugCancelStockInfo{ OrderNumber: cancelInfo.OrderNumber, CancelStockId: lastDrugCancelStock.ID, DrugId: advice.DrugId, Count: (out_count - cancel_count) - deliver_number, Status: 1, Ctime: ctime, OrgId: advice.UserOrgId, Type: 5, Manufacturer: manufactureName.ManufacturerName, Dealer: dealer.DealerName, Total: 0, RetailPrice: warehouse.RetailPrice, RetailTotalPrice: warehouse.RetailTotalPrice, Price: warehouse.Price, RegisterAccount: "", Remark: warehouse.Remark, BatchNumber: warehouse.BatchNumber, MaxUnit: drup.MinUnit, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, BatchNumberId: warehouse.ID, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, OrderId: warehouseout.OrderId, } CreatedCancelStock(cancelStockInfo) flow := models.DrugFlow{ WarehousingId: warehouse.ID, DrugId: warehouse.DrugId, Number: "", BatchNumber: warehouse.BatchNumber, Count: out_count - cancel_count - deliver_number, UserOrgId: advice.UserOrgId, PatientId: advice.PatientId, SystemTime: advice.AdviceDate, ConsumableType: 16, IsSys: 0, WarehousingOrder: "", WarehouseOutId: 0, WarehouseOutOrderNumber: "", IsEdit: 0, CancelStockId: cancelStock.ID, CancelOrderNumber: cancelStock.OrderNumber, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, Creator: advice.ExecutionStaff, UpdateCreator: 0, Status: 1, Ctime: time.Now().Unix(), Mtime: 0, Price: warehouse.RetailPrice, WarehousingDetailId: warehouse.ID, WarehouseOutDetailId: 0, CancelOutDetailId: lastDrugCancelStock.ID, ExpireDate: warehouse.ExpiryDate, ProductDate: warehouse.ProductDate, MaxUnit: drup.MinUnit, MinUnit: "", AdviceId: advice.ID, StorehouseId: storeConfig.DrugStorehouseOut, LastPrice: warehouse.Price, OverCount: sum_count, OrderId: warehouseout.OrderId, } CreateDrugFlowOne(flow) AddCancelSumCountOne(storeConfig.DrugStorehouseOut, advice.DrugId, advice.UserOrgId, flow.Count) ReduceDrugCountTwo(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, flow.Count) } //查询是否存在数据 details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: time.Now().Unix(), Mtime: time.Now().Unix(), Status: 1, RecordTime: advice.RecordDate, OrgId: orgID, DrugId: advice.DrugId, Count: deliver_number, CountUnit: drup.MinUnit, WarehouseInfoId: warehouse.ID, StorehouseId: storeConfig.DrugStorehouseOut, AdviceId: advice.ID, } errTwo := AddSigleDrugAutoReduceRecordInfo(details) if errTwo != nil { return errTwo } return nil } else { info := models.XtDrugWarehouseInfo{ ID: warehouse.ID, WarehousingId: warehouse.WarehousingId, DrugId: warehouse.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, WarehousingCount: warehouse.WarehousingCount, Price: warehouse.RetailPrice, TotalPrice: warehouse.TotalPrice, Dealer: warehouse.Dealer, Manufacturer: warehouse.Manufacturer, Remark: warehouse.Remark, Ctime: warehouse.Ctime, Mtime: warehouse.Mtime, Status: 1, OrgId: warehouse.OrgId, IsReturn: warehouse.IsReturn, WarehousingOrder: warehouse.WarehousingOrder, Type: warehouse.Type, RetailPrice: warehouse.RetailPrice, RetailTotalPrice: warehouse.RetailPrice, StockMaxNumber: 0, StockMinNumber: 0, BatchNumber: warehouse.BatchNumber, MaxUnit: warehouse.MaxUnit, WarehousingInfoId: warehouse.WarehousingInfoId, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } //扣减库存 errThree := UpDateDrugWarehouseInfoByStock(&info) if errThree != nil { return errThree } //查询剩余库存 stockInfo, _ := GetDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId) var sum_count int64 for _, its := range stockInfo { if its.MaxUnit == drup.MaxUnit { its.StockMaxNumber = its.StockMaxNumber * drup.MinNumber } sum_count += its.StockMaxNumber + its.StockMinNumber } // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库 warehouseOutInfo := &models.DrugWarehouseOutInfo{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, Status: 1, Ctime: time.Now().Unix(), Remark: warehouse.Remark, OrgId: orgID, Type: 5, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, IsSys: 1, SysRecordTime: advice.RecordDate, DrugId: advice.DrugId, Number: warehouse.Number, BatchNumber: warehouse.BatchNumber, Price: warehouse.RetailPrice, CountUnit: drup.MinUnit, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, PatientId: advice.PatientId, Count: stock_number, WarehouseInfoId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, OverCount: sum_count, AdviceId: advice.ID, OrderId: warehouseout.OrderId, } //查询是否存在出库数据 _, errCode := GetSigleDrugWarehouseOutInfo(advice.PatientId, advice.AdviceDate, orgID) if errCode == gorm.ErrRecordNotFound { errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo) if errOne != nil { return errOne } } if errCode == nil { lastDrugOutInfo, _ := GetSigleDrugWarehouseOutInfoOne(advice.PatientId, advice.AdviceDate, orgID) var his_count int64 if lastDrugOutInfo.CountUnit == drup.MaxUnit { his_count = lastDrugOutInfo.Count * drup.MinNumber } if lastDrugOutInfo.CountUnit == drup.MinUnit { his_count = lastDrugOutInfo.Count } if deliver_number != his_count { errThree := UpdateSingleDrugWarehouseOutInfoSix(advice.PatientId, advice.AdviceDate, orgID, warehouseOutInfo, advice.ID) if errThree != nil { return errThree } } } lastDrugOutInfo, _ := FindLastDrugWarehouseOutInfo(orgID) details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: time.Now().Unix(), Mtime: time.Now().Unix(), Status: 1, RecordTime: advice.RecordDate, OrgId: orgID, DrugId: advice.DrugId, Count: stock_number, CountUnit: drup.MinUnit, WarehouseInfoId: warehouse.ID, StorehouseId: storeConfig.DrugStorehouseOut, AdviceId: advice.ID, } _, errcodeThree := FindDrugAutoReduceRecordInfo(advice.PatientId, advice.RecordDate, advice.DrugId) if errcodeThree == gorm.ErrRecordNotFound { errTwo := AddSigleDrugAutoReduceRecordInfo(details) if errTwo != nil { return errTwo } } if errcodeThree == nil { UpdateDrugAutoReduceRecordInfo(advice.PatientId, advice.RecordDate, advice.DrugId, details) } var out_count int64 var cancel_count int64 //查询出库数据 infoCountList, _ := FindDrugWarehouseOutInfoCount(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID) //查询退库数据 cancelInfoList, _ := FindDrugCancelOutInfo(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID) for _, item := range infoCountList { out_count += item.Count } for _, item := range cancelInfoList { cancel_count += item.Count } //如果本次出库数据大于历史出库数据 新增1条流水 if deliver_number > (out_count - cancel_count) { drugflow := models.DrugFlow{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, DrugId: advice.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, Count: stock_number, Price: warehouse.RetailPrice, Status: 1, Ctime: time.Now().Unix(), UserOrgId: orgID, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, BatchNumber: warehouse.BatchNumber, MaxUnit: drup.MinUnit, ConsumableType: 15, IsEdit: 1, Creator: advice.ExecutionStaff, IsSys: 1, PatientId: advice.PatientId, WarehousingDetailId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, WarehouseOutDetailId: lastDrugOutInfo.ID, OverCount: sum_count, AdviceId: advice.ID, LastPrice: warehouse.Price, SystemTime: advice.AdviceDate, OrderId: warehouseout.OrderId, } CreateDrugFlowOne(drugflow) //出库数量相加 AddDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count) } if deliver_number < (out_count - cancel_count) { operation_time := time.Now().Unix() ctime := time.Now().Unix() timeStr := time.Now().Format("2006-01-02") timeArr := strings.Split(timeStr, "-") total, _ := FindAllDrugCancelStockTotal(advice.UserOrgId) total = total + 1 orderNumber := "CKTKD" + strconv.FormatInt(advice.UserOrgId, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000" + strconv.FormatInt(total, 10) cancelStock := models.DrugCancelStock{ OrderNumber: orderNumber, OperaTime: operation_time, OrgId: advice.UserOrgId, Creater: advice.ExecutionStaff, Ctime: ctime, Status: 1, ReturnTime: advice.AdviceDate, Dealer: 0, Manufacturer: 0, Type: 5, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, OrderId: warehouseout.OrderId, } _, errCode := FindDrugCancelStock(advice.AdviceDate, advice.UserOrgId) if errCode == gorm.ErrRecordNotFound { AddSigleDrugCancelStock(&cancelStock) } lastDrugCancelStock, _ := FindLastDrugCancelStock(advice.AdviceDate, advice.UserOrgId) manufactureName, _ := GetManufactureById(warehouse.Manufacturer) dealer, _ := GetDealerById(warehouse.Dealer) cancelInfo, _ := GetLastDrugCancelStockById(advice.UserOrgId) cancelStockInfo := models.DrugCancelStockInfo{ OrderNumber: cancelInfo.OrderNumber, CancelStockId: lastDrugCancelStock.ID, DrugId: advice.DrugId, Count: (out_count - cancel_count) - deliver_number, Status: 1, Ctime: ctime, OrgId: advice.UserOrgId, Type: 5, Manufacturer: manufactureName.ManufacturerName, Dealer: dealer.DealerName, Total: 0, RetailPrice: warehouse.RetailPrice, RetailTotalPrice: warehouse.RetailTotalPrice, Price: warehouse.Price, RegisterAccount: "", Remark: warehouse.Remark, BatchNumber: warehouse.BatchNumber, MaxUnit: drup.MinUnit, ProductDate: warehouse.ProductDate, ExpiryDate: warehouse.ExpiryDate, BatchNumberId: warehouse.ID, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, OrderId: warehouseout.OrderId, } CreatedCancelStock(cancelStockInfo) flow := models.DrugFlow{ WarehousingId: warehouse.ID, DrugId: warehouse.DrugId, Number: "", BatchNumber: warehouse.BatchNumber, Count: out_count - cancel_count - deliver_number, UserOrgId: advice.UserOrgId, PatientId: advice.PatientId, SystemTime: advice.AdviceDate, ConsumableType: 16, IsSys: 0, WarehousingOrder: "", WarehouseOutId: 0, WarehouseOutOrderNumber: "", IsEdit: 0, CancelStockId: cancelStock.ID, CancelOrderNumber: cancelStock.OrderNumber, Manufacturer: warehouse.Manufacturer, Dealer: warehouse.Dealer, Creator: advice.ExecutionStaff, UpdateCreator: 0, Status: 1, Ctime: time.Now().Unix(), Mtime: 0, Price: warehouse.RetailPrice, WarehousingDetailId: warehouse.ID, WarehouseOutDetailId: 0, CancelOutDetailId: lastDrugCancelStock.ID, ExpireDate: warehouse.ExpiryDate, ProductDate: warehouse.ProductDate, MaxUnit: drup.MinUnit, MinUnit: "", AdviceId: advice.ID, StorehouseId: storeConfig.DrugStorehouseOut, LastPrice: warehouse.Price, OverCount: sum_count, OrderId: warehouseout.OrderId, } CreateDrugFlowOne(flow) //退库数量增加 AddCancelSumCountOne(storeConfig.DrugStorehouseOut, advice.DrugId, advice.UserOrgId, flow.Count) ReduceDrugCountTwo(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, flow.Count) } // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作 prescribingNumber_two_temp := deliver_number - stock_number overPlusNumber := float64(prescribingNumber_two_temp) advice.PrescribingNumber = float64(prescribingNumber_two_temp) advice.PrescribingNumberUnit = drup.MinUnit HisSettleDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice) } return }