package service import ( "errors" "fmt" "math" "strconv" "strings" "time" "XT_New/models" "XT_New/utils" "github.com/jinzhu/gorm" ) // 耗材出库 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 goods.Count > 0 { 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 } //if orgID == 10265 { // UpdateGoodInfoByPrice(warehouse.GoodId, orgID, warehouse.Price, warehouse.PackingPrice) //} //更新his_prescripton_project出库状态值 UpdateHisPrescriptionProjectStatus(goods.GoodId, record_time, orgID, patient_id) //查询剩余库存 goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID, goods.StorehouseId) 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: record_time, 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, BuyPrice: warehouse.PackingPrice, } warehouseOutInfo.Count = count if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.GoodId) 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: record_time, 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, OperateTime: time.Now().Unix(), } if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.GoodId) 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: record_time, 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.GoodId) 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: record_time, 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, OperateTime: time.Now().Unix(), } if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.GoodId) 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, goods.StorehouseId) 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: record_time, 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.GoodId) 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 { 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: record_time, 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, OperateTime: time.Now().Unix(), } if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.GoodId) 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: record_time, 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.GoodId) 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: record_time, 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, OperateTime: time.Now().Unix(), } if orgID == 9671 || orgID == 10265 { goodsInfo, _ := FindeGoodInfo(orgID, goods.GoodId) 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 FindNewWarehouseOutInfoByPatientIdTwo(patient_id int64, record_time int64, good_id int64, org_id int64, project_id int64, tx *gorm.DB) (models.WarehouseOutInfo, error) { outInfo := models.WarehouseOutInfo{} err := tx.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 if err != gorm.ErrRecordNotFound { if err != nil { tx.Rollback() return outInfo, err } } return outInfo, err } func UpdateDrugStockCount(drug_id int64, org_id int64, storehouse_id int64, flush_count int64) error { drug := models.XtDrugStockCount{} err := XTWriteDB().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 return err } func UpdateNewDrugStockCount(drug_id int64, org_id int64, storehouse_id int64, flush_count int64, tx *gorm.DB) error { drug := models.XtDrugStockCount{} err := tx.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 { tx.Rollback() return err } 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 AddNewDrugCount(drug_id int64, org_id int64, storehouse_id int64, out_count int64, tx *gorm.DB) error { err := tx.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 { tx.Rollback() return err } err = tx.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 { tx.Rollback() return err } return err } func FindOverCount(drug_id int64, org_id int64, storehouse_id int64) (models.XtDrugStockCount, error) { stockCount := models.XtDrugStockCount{} err := XTReadDB().Where("drug_id = ? and user_org_id = ? and storehouse_id=?", drug_id, org_id, storehouse_id).Find(&stockCount).Error return stockCount, err } func FindNewOverCount(drug_id int64, org_id int64, storehouse_id int64, tx *gorm.DB) (models.XtDrugStockCount, error) { stockCount := models.XtDrugStockCount{} err := tx.Where("drug_id = ? and user_org_id = ? and storehouse_id=?", drug_id, org_id, storehouse_id).Find(&stockCount).Error if err != gorm.ErrRecordNotFound { if err != nil { tx.Rollback() return stockCount, err } } return stockCount, err } func UpdateActOut(id int64, sum_in_count int64, flush_count int64, sum_cancel_count int64) error { var sum_out_count int64 sum_out_count = sum_in_count - flush_count var sum_act_out_count int64 sum_act_out_count = sum_out_count + sum_cancel_count err := XTWriteDB().Model(&models.XtDrugStockCount{}).Where("id = ? and status=1", id).Updates(map[string]interface{}{"sum_out_count": sum_out_count, "sum_act_out_count": sum_act_out_count}).Error return err } func UpdateNewActOut(id int64, sum_in_count int64, flush_count int64, sum_cancel_count int64, tx *gorm.DB) error { var sum_out_count int64 sum_out_count = sum_in_count - flush_count var sum_act_out_count int64 sum_act_out_count = sum_out_count + sum_cancel_count err := tx.Model(&models.XtDrugStockCount{}).Where("id = ? and status=1", id).Updates(map[string]interface{}{"sum_out_count": sum_out_count, "sum_act_out_count": sum_act_out_count}).Error if err != nil { tx.Rollback() return err } 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 ReduceNewDrugCountTwo(drug_id int64, org_id int64, storehouse_id int64, out_count int64, tx *gorm.DB) error { err := tx.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 { tx.Rollback() return err } 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, OperateTime: time.Now().Unix(), } 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, OperateTime: time.Now().Unix(), } 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, OperateTime: time.Now().Unix(), } 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, OperateTime: time.Now().Unix(), } 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, hisprescribingNumber float64, unit string) (err error) { //开事务 tx := XTWriteDB().Begin() defer func() { if err != nil { utils.ErrorLog("事务失败,原因为: %v", err) tx.Rollback() } else { tx.Commit() } }() drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "进入出库页面", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量 var deliver_number int64 = 0 var deliver_number_one int64 = 0 var stock_number int64 = 0 prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64) count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64) prescribingNumber_temp_one := strconv.FormatFloat(math.Abs(hisprescribingNumber), 'f', 0, 64) countone, _ := strconv.ParseInt(prescribingNumber_temp_one, 10, 64) var drug_price float64 if advice.PrescribingNumberUnit == drup.MaxUnit { deliver_number = count * drup.MinNumber } else { deliver_number = count } if unit == drup.MaxUnit { deliver_number_one = countone * drup.MinNumber } else { deliver_number_one = countone } 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.MaxUnit != lastWarehouse.MinUnit && drup.MaxUnit != drup.MinUnit && lastWarehouse.MinUnit != "" { 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) } } if lastWarehouse.MaxUnit == lastWarehouse.MinUnit && drup.MaxUnit != drup.MinUnit && lastWarehouse.MinUnit != "" { lastWarehouse.StockMaxNumber = lastWarehouse.StockMaxNumber + lastWarehouse.StockMinNumber ChangeMaxNumberOne(lastWarehouse.ID, lastWarehouse.StockMaxNumber) } warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut) if err != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "查询库存报错", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) 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 { //fmt.Println("金1") warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber*drup.MinNumber } if drup.MaxUnit == warehouse.MaxUnit && drup.MaxUnit != drup.MinUnit { //fmt.Println("金2") warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber } if drup.MaxUnit == warehouse.MaxUnit && drup.MaxUnit == drup.MinUnit { //fmt.Println("金3") 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 if warehouse.MaxUnit != warehouse.MinUnit { warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber } if minNumber == 2 && warehouse.MaxUnit == warehouse.MinUnit && warehouse.StockMinNumber == 0 { warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1 } } 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 && warehouse.MaxUnit != warehouse.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 { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "扣减库存失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) return errThree } //更改字典里面的价格 if advice.UserOrgId == 10265 || advice.UserOrgId == 10215 { if lastWarehouse.RetailPrice > 0 { UpdateBasePrice(lastWarehouse.DrugId, lastWarehouse.RetailPrice) } } //查询剩余库存 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 } if orgID != 10188 && orgID != 10217 && orgID != 3877 { warehouseOutInfo := &models.DrugWarehouseOutInfo{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, Status: 1, Ctime: advice.RecordDate, Mtime: 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) if lastDrugOutInfo.ID == 0 { errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo) if errOne != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "创建出库单失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } } if lastDrugOutInfo.ID > 0 { //删除在新增 UpdateDrugWarehouseOutInfoTen(lastDrugOutInfo.PatientId, lastDrugOutInfo.SysRecordTime, advice.ID) AddSigleDrugWarehouseOutInfo(warehouseOutInfo) } } 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 } if deliver_number_one-(out_count-cancel_count) >= 0 { if (deliver_number_one - out_count - cancel_count) != 0 { if orgID == 10217 || orgID == 10188 || orgID == 3877 { warehouseOutInfo := &models.DrugWarehouseOutInfo{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, Status: 1, Ctime: advice.RecordDate, Mtime: 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_one - (out_count - cancel_count), //出最小单位 WarehouseInfoId: warehouse.ID, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, OverCount: sum_count, AdviceId: advice.ID, } errThreeThrtiy := AddSigleDrugWarehouseOutInfo(warehouseOutInfo) if errThreeThrtiy != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "插入数据报错", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } } lastDrugOutInfo, _ := GetNewDrugWarehouseOutInfoSix(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID) drugflow := models.DrugFlow{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, DrugId: advice.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, Count: deliver_number_one - (out_count - cancel_count), //按最小单位计算, Price: warehouse.RetailPrice, Status: 1, Ctime: advice.AdviceDate, Mtime: 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, OperateTime: time.Now().Unix(), DrugCode: advice.DrugCode, } errThreeTy := CreateDrugFlowOne(drugflow) if errThreeTy != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "创建流水失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } //出库数量相加 errThreeTys := AddDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count) if errThreeTys != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "出库数量相加失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } } } //如果本次出库数据小于历史出库数据 新增1条退库流水 if deliver_number_one-(out_count-cancel_count) < 0 { 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 { errCode := AddSigleDrugCancelStock(&cancelStock) if errCode != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "创建退库单失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } } 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: advice.AdviceDate, Mtime: time.Now().Unix(), 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, } errCodes := CreatedCancelStock(cancelStockInfo) if errCodes != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "创建退库单失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } 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: advice.AdviceDate, Mtime: time.Now().Unix(), 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, OperateTime: time.Now().Unix(), DrugCode: advice.DrugCode, } errCodeflow := CreateDrugFlowOne(flow) if errCodeflow != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "退库流水创建失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } errCodesum := AddCancelSumCountOne(storeConfig.DrugStorehouseOut, advice.DrugId, advice.UserOrgId, flow.Count) if errCodesum != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "增加退库数量失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } errCodereduce := ReduceDrugCountTwo(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, flow.Count) if errCodereduce != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "减少出库数量失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } } //查询是否存在数据 details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: advice.RecordDate, 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 { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "新增自动出库表失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) 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, MinUnit: drup.MinUnit, WarehousingInfoId: warehouse.WarehousingInfoId, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } //扣减库存 errThree := UpDateDrugWarehouseInfoByStock(&info) if errThree != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "第二批次扣减库存失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) 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: advice.RecordDate, Mtime: 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 := GetSigleDrugWarehouseOutInfoTwo(advice.PatientId, advice.AdviceDate, orgID, advice.DrugId) if errCode == gorm.ErrRecordNotFound { errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo) if errOne != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "创建出库表失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) return errOne } } if errCode == nil { lastDrugOutInfo, _ := GetSigleDrugWarehouseOutInfoTwo(advice.PatientId, advice.AdviceDate, orgID, advice.DrugId) 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 { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "更新出库表失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) return errThree } } } lastDrugOutInfo, _ := FindLastDrugWarehouseOutInfo(orgID) details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: advice.AdviceDate, 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 { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "第二批次新增自动出库表失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) return errTwo } } if errcodeThree == nil { errThreeauto := UpdateDrugAutoReduceRecordInfo(advice.PatientId, advice.RecordDate, advice.DrugId, details) if errThreeauto != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "第二批次更新自动出库表失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } } 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: advice.AdviceDate, Mtime: 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, OperateTime: time.Now().Unix(), DrugCode: advice.DrugCode, } 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 { errCodeCancel := AddSigleDrugCancelStock(&cancelStock) if errCodeCancel != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "第二批次新增流水表失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } } 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: advice.AdviceDate, Mtime: time.Now().Unix(), 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, } errCodeCancel := CreatedCancelStock(cancelStockInfo) if errCodeCancel != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "第二批次创建自动退库表失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } 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: advice.AdviceDate, Mtime: time.Now().Unix(), 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, OperateTime: time.Now().Unix(), DrugCode: advice.DrugCode, } errCodeFlows := CreateDrugFlowOne(flow) if errCodeFlows != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "第二批次创建自动退库流水表失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } //退库数量增加 errCodeFlows = AddCancelSumCountOne(storeConfig.DrugStorehouseOut, advice.DrugId, advice.UserOrgId, flow.Count) if errCodeFlows != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "第二批次创建自动退库流水表失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } errCodereduce := ReduceDrugCountTwo(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, flow.Count) if errCodereduce != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "第二批次减少库存表失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } } // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作 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, hisprescribingNumber, unit) } 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 GetSigleDrugWarehouseOutInfoTwo(patient_id int64, advice_date int64, orgid int64, drug_id 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 and drug_id = ? and is_sys=1", patient_id, advice_date, orgid, drug_id).Find(&info).Error if err == gorm.ErrRecordNotFound { return nil, err } if err != nil { return nil, err } return &info, nil } func GetNewSigleDrugWarehouseOutInfoTwo(patient_id int64, advice_date int64, orgid int64, drug_id int64, tx *gorm.DB) (*models.XtDrugWarehouseOutInfo, error) { info := models.XtDrugWarehouseOutInfo{} var err error err = tx.Where("patient_id = ? and sys_record_time = ? and org_id = ? and status = 1 and drug_id = ? and is_sys=1", patient_id, advice_date, orgid, drug_id).Find(&info).Error if err != gorm.ErrRecordNotFound { if err != nil { tx.Rollback() return &info, nil } } 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 sys_record_time = ? 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 = ? and status= 1", 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 UpdateNewSingleDrugWarehouseOutInfoSix(patient_id int64, advice_date int64, orgid int64, info *models.DrugWarehouseOutInfo, advice_id int64, tx *gorm.DB) error { err := tx.Model(&models.XtDrugWarehouseOutInfo{}).Where("patient_id = ? and sys_record_time = ? and org_id = ? and advice_id = ? and status= 1", 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 if err != gorm.ErrRecordNotFound { if err != nil { tx.Rollback() return err } } 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 FindNewDrugAutoReduceRecordInfo(patient_id int64, advice_date int64, orgid int64, tx *gorm.DB) (*models.DrugAutomaticReduceDetail, error) { detail := models.DrugAutomaticReduceDetail{} var err error err = tx.Where("patient_id = ? and record_time = ? and org_id = ?", patient_id, advice_date, orgid).Find(&detail).Error if err != gorm.ErrRecordNotFound { if err != nil { tx.Rollback() return &detail, nil } } 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_time = ? 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 UpdateNewDrugAutoReduceRecordInfo(patient_id int64, record_date int64, drug_id int64, detail *models.DrugAutomaticReduceDetail, tx *gorm.DB) error { err := tx.Model(&models.DrugAutomaticReduceDetail{}).Where("patient_id = ? and record_time = ? 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 if err != nil { tx.Rollback() return err } 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 GetNewNewDrugWarehouseOutInfoSix(drugid int64, patient_id int64, record_date int64, org_id int64, advice_id int64, warehouse_info_id int64, tx *gorm.DB) (models.DrugWarehouseOutInfo, error) { info := models.DrugWarehouseOutInfo{} err = tx.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 if err != gorm.ErrRecordNotFound { if err != nil { tx.Rollback() return info, err } } 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 FindNewDrugWarehouseOutInfoCount(drugid int64, patient_id int64, record_date int64, org_id int64, advice_id int64, tx *gorm.DB) (flow []*models.DrugFlow, err error) { err = tx.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 if err != gorm.ErrRecordNotFound { if err != nil { tx.Rollback() return flow, err } } return flow, err } func FindDrugSettleWarehouseOutInfoCount(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 = 15 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 FindNewDrugCancelOutInfo(drugid int64, patient_id int64, record_date int64, org_id int64, advice_id int64, tx *gorm.DB) (flow []*models.DrugFlow, err error) { err = tx.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 if err != gorm.ErrRecordNotFound { if err != nil { tx.Rollback() return flow, err } } return flow, err } func FindDrugCancelStock(return_date int64, org_id int64) (*models.DrugCancelStock, error) { stock := models.DrugCancelStock{} var err error err = XTReadDB().Where("return_time = ? 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 FindNewDrugCancelStock(return_date int64, org_id int64, tx *gorm.DB) (*models.DrugCancelStock, error) { stock := models.DrugCancelStock{} var err error err = tx.Where("return_time = ? and org_id = ? and status = 1", return_date, org_id).Find(&stock).Error if err != gorm.ErrRecordNotFound { if err != nil { tx.Rollback() return &stock, nil } } return &stock, nil } func FindLastDrugCancelStock(advice_date int64, org_id int64) (models.DrugCancelStock, error) { cancelStock := models.DrugCancelStock{} err := XTReadDB().Where("return_time = ? and org_id = ? and status = 1", advice_date, org_id).Find(&cancelStock).Error return cancelStock, err } func FindNewLastDrugCancelStock(advice_date int64, org_id int64, tx *gorm.DB) (models.DrugCancelStock, error) { cancelStock := models.DrugCancelStock{} err := tx.Where("return_time = ? and org_id = ? and status = 1", advice_date, org_id).Find(&cancelStock).Error if err != gorm.ErrRecordNotFound { if err != nil { tx.Rollback() return cancelStock, err } } 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 FindeNewGoodInfo(orgid int64, id int64, tx *gorm.DB) (models.GoodInformation, error) { information := models.GoodInformation{} err := tx.Where("org_id = ? and id = ? and status = 1", orgid, id).Find(&information).Error if err != gorm.ErrRecordNotFound { if err != nil { tx.Rollback() return information, err } } 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 } // 药品自动出库 递归方式 deliver_number_one已经转成最小数量 func HisSettleDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo, deliver_number_one int64) (err error) { // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量 var deliver_number int64 = 0 //var deliver_number_one int64 = 0 var stock_number int64 = 0 prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64) count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64) //prescribingCount_temp := strconv.FormatFloat(math.Abs(prescribingCount), 'f', 0, 64) //prescribe_count, _ := strconv.ParseInt(prescribingCount_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 { // deliver_number_one = prescribe_count * drup.MinNumber // //} else { // deliver_number_one = prescribe_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 && lastWarehouse.MaxUnit != lastWarehouse.MinUnit { 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() if warehouse.MaxUnit != warehouse.MinUnit { 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 warehouse.MinUnit == warehouse.MaxUnit { if warehouse.StockMaxNumber > 0 && warehouse.StockMinNumber == 0 && warehouse.StockMaxNumber >= minNumber { warehouse.StockMaxNumber = warehouse.StockMaxNumber - minNumber } if warehouse.StockMaxNumber == 0 && warehouse.StockMinNumber > 0 && warehouse.StockMinNumber >= minNumber { warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber } if warehouse.StockMaxNumber > 0 && warehouse.StockMinNumber > 0 && (warehouse.StockMaxNumber+warehouse.StockMinNumber) > minNumber { var out_false int64 = 0 if warehouse.StockMinNumber >= minNumber { warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber out_false = 1 } if warehouse.StockMinNumber < minNumber && out_false == 0 { var over_total int64 over_total = warehouse.StockMinNumber warehouse.StockMinNumber = 0 warehouse.StockMaxNumber = warehouse.StockMaxNumber - (minNumber - over_total) } } } 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 { //warehouseOutInfo.Count = deliver_number_one errThree := UpdateSigleDrugWarehouseOutInfo(lastDrugOutInfo.ID, warehouseOutInfo) if errThree != nil { return errThree } } } var out_count int64 var cancel_count int64 //查询出库数据 infoCountList, _ := FindDrugSettleWarehouseOutInfoCount(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_one", deliver_number_one) fmt.Println("out_count", out_count) fmt.Println("cancel_count", cancel_count) //如果本次出库数据大于历史出库数据 新增1条流水 //if deliver_number_one > (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_one - (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) // //} // //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, //按最小单位计算, // 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) // //} // //fmt.Println("出库数据", deliver_number_one) //fmt.Println("马文强out_count233232232ooqw", out_count) //fmt.Println("马cancel_count33232232ooqw", cancel_count) ////如果本次出库数据小于历史出库数据 新增1条退库流水 //if deliver_number_one < (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: lastDrugCancelStock.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: 7, // IsSys: 0, // WarehousingOrder: "", // WarehouseOutId: 0, // WarehouseOutOrderNumber: "", // IsEdit: 0, // CancelStockId: cancelStock.ID, // CancelOrderNumber: lastDrugCancelStock.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, } //查询是否存在出库数据 lastDrugOutInfoTwo, _ := GetNewDrugWarehouseOutInfoSix(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID) if lastDrugOutInfoTwo.ID == 0 { errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo) if errOne != nil { return errOne } } if lastDrugOutInfoTwo.ID > 0 { 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, _ := FindDrugSettleWarehouseOutInfoCount(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) fmt.Println("out_coutn233232322323wo", cancel_count) fmt.Println("out_count99988233232", out_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) { fmt.Println("即那里3232232323") 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: 7, IsSys: 0, WarehousingOrder: "", WarehouseOutId: 0, WarehouseOutOrderNumber: "", IsEdit: 0, CancelStockId: cancelStock.ID, CancelOrderNumber: lastDrugCancelStock.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 fmt.Println("剩余库存9999999233232", overPlusNumber) HisSettleDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice, deliver_number_one) } return } func UpdateDrugWarehouseOutInfoTen(patient_id int64, sys_record_time int64, advice_id int64) error { err := XTWriteDB().Model(&models.DrugWarehouseOutInfo{}).Where("patient_id = ? and sys_record_time = ? and status=1 and advice_id = ?", patient_id, sys_record_time, advice_id).Updates(map[string]interface{}{"status": 0}).Error return err } func UpdateNewDrugWarehouseOutInfoTen(patient_id int64, sys_record_time int64, advice_id int64, tx *gorm.DB) error { err := tx.Model(&models.DrugWarehouseOutInfo{}).Where("patient_id = ? and sys_record_time = ? and status=1 and advice_id = ?", patient_id, sys_record_time, advice_id).Updates(map[string]interface{}{"status": 0}).Error if err != nil { tx.Rollback() return err } return err } func UpdateBasePrice(id int64, min_price float64) error { err := XTWriteDB().Model(models.XtBaseDrug{}).Where("id = ? and status =1", id).Updates(map[string]interface{}{"min_price": min_price}).Error return err } func UpdateNewBasePrice(id int64, min_price float64, tx *gorm.DB) error { err := tx.Model(models.XtBaseDrug{}).Where("id = ? and status =1", id).Updates(map[string]interface{}{"min_price": min_price}).Error if err != nil { tx.Rollback() return err } return err } func UpdateGoodInfoByPrice(id int64, org_id int64, price float64, packingprice float64) error { err := XTWriteDB().Model(&models.GoodInfo{}).Where("id=? and org_id = ? and status =1", id, org_id).Updates(map[string]interface{}{"buy_price": price, "packing_price": packingprice}).Error return err } func NewBloodHisDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo, hisprescribingNumber float64, unit string, tx *gorm.DB) (err error) { // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量 var deliver_number int64 = 0 var deliver_number_one int64 = 0 var stock_number int64 = 0 //fmt.Println(deliver_number) //fmt.Println(deliver_number_one) //fmt.Println(stock_number) prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64) count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64) prescribingNumber_temp_one := strconv.FormatFloat(math.Abs(hisprescribingNumber), 'f', 0, 64) countone, _ := strconv.ParseInt(prescribingNumber_temp_one, 10, 64) var drug_price float64 if advice.PrescribingNumberUnit == drup.MaxUnit { deliver_number = count * drup.MinNumber } else { deliver_number = count } if unit == drup.MaxUnit { deliver_number_one = countone * drup.MinNumber } else { deliver_number_one = countone } 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, _ := GetNewAllStoreHouseConfig(advice.UserOrgId, tx) lastWarehouse, _ := FindNewLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut, tx) if lastWarehouse.MaxUnit != lastWarehouse.MinUnit && drup.MaxUnit != drup.MinUnit && lastWarehouse.MinUnit != "" { if lastWarehouse.StockMinNumber >= drup.MinNumber { var stockMax int64 var stockMin int64 stockMax = lastWarehouse.StockMinNumber / drup.MinNumber stockMin = lastWarehouse.StockMinNumber % drup.MinNumber ChangeNewMaxNumber(lastWarehouse.ID, stockMax, tx) UpdateNewMinNumber(lastWarehouse.ID, stockMin, tx) } } if lastWarehouse.MaxUnit == lastWarehouse.MinUnit && drup.MaxUnit != drup.MinUnit && lastWarehouse.MinUnit != "" { lastWarehouse.StockMaxNumber = lastWarehouse.StockMaxNumber + lastWarehouse.StockMinNumber ChangeNewMaxNumberOne(lastWarehouse.ID, lastWarehouse.StockMaxNumber, tx) } warehouse, _ := FindNewLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut, tx) // 将该批次的剩余库存数量转换为拆零数量 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() if warehouse.StockMinNumber < minNumber { warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1 if warehouse.MaxUnit != warehouse.MinUnit { warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber } if minNumber == 2 && warehouse.MaxUnit == warehouse.MinUnit && warehouse.StockMinNumber == 0 { warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1 } } 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 && warehouse.MaxUnit != warehouse.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 } //扣减库存数据 UpDateNewDrugWarehouseInfoByStock(&warehouse, tx) ////查询剩余库存 stockInfo, _ := GetNewDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId, tx) 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: advice.RecordDate, Mtime: 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, _ := GetNewNewDrugWarehouseOutInfoSix(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID, tx) if lastDrugOutInfo.ID == 0 { //删除在新增 UpdateNewDrugWarehouseOutInfoTen(lastDrugOutInfo.PatientId, lastDrugOutInfo.SysRecordTime, advice.ID, tx) AddNewSigleDrugWarehouseOutInfo(warehouseOutInfo, tx) } if lastDrugOutInfo.ID > 0 { //删除在新增 UpdateNewDrugWarehouseOutInfoTen(lastDrugOutInfo.PatientId, lastDrugOutInfo.SysRecordTime, advice.ID, tx) AddNewSigleDrugWarehouseOutInfo(warehouseOutInfo, tx) } // var out_count int64 var cancel_count int64 //查询出库数据 infoCountList, _ := FindNewDrugWarehouseOutInfoCount(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, tx) //查询退库数据 cancelInfoList, _ := FindNewDrugCancelOutInfo(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, tx) for _, item := range infoCountList { out_count += item.Count } for _, item := range cancelInfoList { cancel_count += item.Count } fmt.Println("已经出库数据", out_count) fmt.Println("已经退库数据", cancel_count) fmt.Println("当前正在出库的数据", deliver_number_one) fmt.Println("差", deliver_number_one-out_count-cancel_count) //如果本次出库数据大于历史出库数据 新增1条退库流水 if deliver_number_one-(out_count-cancel_count) >= 0 { if (deliver_number_one - out_count - cancel_count) != 0 { lastDrugOutInfo, _ := GetNewNewDrugWarehouseOutInfoSix(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID, tx) drugflow := models.DrugFlow{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, DrugId: advice.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, Count: deliver_number_one - (out_count - cancel_count), //按最小单位计算, Price: warehouse.RetailPrice, Status: 1, Ctime: advice.AdviceDate, Mtime: 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, } CreateNewDrugFlowOne(drugflow, tx) AddNewDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count, tx) } } //如果本次出库数据小于历史出库数据 新增1条退库流水 if deliver_number_one-(out_count-cancel_count) < 0 { 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 := FindNewDrugCancelStock(advice.AdviceDate, advice.UserOrgId, tx) if errCode == gorm.ErrRecordNotFound { AddNewSigleDrugCancelStock(&cancelStock, tx) } lastDrugCancelStock, _ := FindNewLastDrugCancelStock(advice.AdviceDate, advice.UserOrgId, tx) manufactureName, _ := GetNewManufactureById(warehouse.Manufacturer, tx) dealer, _ := GetNewDealerById(warehouse.Dealer, tx) cancelInfo, _ := GetNewLastDrugCancelStockById(advice.UserOrgId, tx) cancelStockInfo := models.DrugCancelStockInfo{ OrderNumber: cancelInfo.OrderNumber, CancelStockId: lastDrugCancelStock.ID, DrugId: advice.DrugId, Count: (out_count - cancel_count) - deliver_number, Status: 1, Ctime: advice.AdviceDate, Mtime: time.Now().Unix(), 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, } CreatedNewCancelStock(cancelStockInfo, tx) 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: advice.AdviceDate, Mtime: time.Now().Unix(), 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, } CreateNewDrugFlowOne(flow, tx) AddNewCancelSumCountOne(storeConfig.DrugStorehouseOut, advice.DrugId, advice.UserOrgId, flow.Count, tx) ReduceNewDrugCountTwo(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, flow.Count, tx) } //查询是否存在数据 details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: advice.RecordDate, 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, } AddNewSigleDrugAutoReduceRecordInfo(details, tx) 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, MinUnit: drup.MinUnit, WarehousingInfoId: warehouse.WarehousingInfoId, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } //扣减库存 UpDateNewDrugWarehouseInfoByStock(&info, tx) //查询剩余库存 stockInfo, _ := GetNewDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId, tx) 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: advice.RecordDate, Mtime: 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 := GetNewSigleDrugWarehouseOutInfoTwo(advice.PatientId, advice.AdviceDate, orgID, advice.DrugId, tx) if errCode == nil { lastDrugOutInfo, _ := GetNewSigleDrugWarehouseOutInfoTwo(advice.PatientId, advice.AdviceDate, orgID, advice.DrugId, tx) 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 { UpdateNewSingleDrugWarehouseOutInfoSix(advice.PatientId, advice.AdviceDate, orgID, warehouseOutInfo, advice.ID, tx) } } lastDrugOutInfo, _ := FindNewLastDrugWarehouseOutInfo(orgID, tx) details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: advice.AdviceDate, 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 := FindNewDrugAutoReduceRecordInfo(advice.PatientId, advice.RecordDate, advice.DrugId, tx) if errcodeThree == nil { UpdateNewDrugAutoReduceRecordInfo(advice.PatientId, advice.RecordDate, advice.DrugId, details, tx) } var out_count int64 var cancel_count int64 //查询出库数据 infoCountList, _ := FindNewDrugWarehouseOutInfoCount(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, tx) //查询退库数据 cancelInfoList, _ := FindNewDrugCancelOutInfo(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, tx) 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: advice.AdviceDate, Mtime: 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, } CreateNewDrugFlowOne(drugflow, tx) //出库数量相加 AddNewDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count, tx) } 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, _ := FindNewAllDrugCancelStockTotal(advice.UserOrgId, tx) 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 := FindNewDrugCancelStock(advice.AdviceDate, advice.UserOrgId, tx) if errCode == gorm.ErrRecordNotFound { AddNewSigleDrugCancelStock(&cancelStock, tx) } lastDrugCancelStock, _ := FindNewLastDrugCancelStock(advice.AdviceDate, advice.UserOrgId, tx) manufactureName, _ := GetNewManufactureById(warehouse.Manufacturer, tx) dealer, _ := GetNewDealerById(warehouse.Dealer, tx) cancelInfo, _ := GetNewLastDrugCancelStockById(advice.UserOrgId, tx) cancelStockInfo := models.DrugCancelStockInfo{ OrderNumber: cancelInfo.OrderNumber, CancelStockId: lastDrugCancelStock.ID, DrugId: advice.DrugId, Count: (out_count - cancel_count) - deliver_number, Status: 1, Ctime: advice.AdviceDate, Mtime: time.Now().Unix(), 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, } CreatedNewCancelStock(cancelStockInfo, tx) 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: advice.AdviceDate, Mtime: time.Now().Unix(), 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, } errCodeFlows := CreateNewDrugFlowOne(flow, tx) //退库数量增加 errCodeFlows = AddNewCancelSumCountOne(storeConfig.DrugStorehouseOut, advice.DrugId, advice.UserOrgId, flow.Count, tx) if errCodeFlows != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "第二批次创建自动退库流水表失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } errCodereduce := ReduceNewDrugCountTwo(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, flow.Count, tx) if errCodereduce != nil { drugError := models.XtDrugError{ UserOrgId: orgID, DrugId: advice.DrugId, RecordDate: advice.AdviceDate, PatientId: advice.PatientId, Remark: "第二批次减少库存表失败", Status: 1, Ctime: time.Now().Unix(), Mtime: 0, SumCount: 0, Prescribingnumber: advice.PrescribingNumber, PrescribingNumberUnit: advice.PrescribingNumberUnit, } CreateDrugError(drugError) } } // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作 prescribingNumber_two_temp := deliver_number - stock_number overPlusNumber := float64(prescribingNumber_two_temp) advice.PrescribingNumber = float64(prescribingNumber_two_temp) advice.PrescribingNumberUnit = drup.MinUnit NewBloodHisDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice, hisprescribingNumber, unit, tx) } return } func HisStoryBloodHisDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo, hisprescribingNumber float64, unit string, tx *gorm.DB) (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) if advice.PrescribingNumberUnit == drup.MaxUnit { deliver_number = count * drup.MinNumber } else { deliver_number = count } // 根据先进先出原则,查询最先入库的批次,进行出库 // 如果没有对应的库存,则报错 storeConfig, _ := GetNewAllStoreHouseConfig(advice.UserOrgId, tx) lastWarehouse, _ := FindNewLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut, tx) if lastWarehouse.MaxUnit != lastWarehouse.MinUnit && drup.MaxUnit != drup.MinUnit && lastWarehouse.MinUnit != "" { if lastWarehouse.StockMinNumber >= drup.MinNumber { var stockMax int64 var stockMin int64 stockMax = lastWarehouse.StockMinNumber / drup.MinNumber stockMin = lastWarehouse.StockMinNumber % drup.MinNumber ChangeNewMaxNumber(lastWarehouse.ID, stockMax, tx) UpdateNewMinNumber(lastWarehouse.ID, stockMin, tx) } } if lastWarehouse.MaxUnit == lastWarehouse.MinUnit && drup.MaxUnit != drup.MinUnit && lastWarehouse.MinUnit != "" { lastWarehouse.StockMaxNumber = lastWarehouse.StockMaxNumber + lastWarehouse.StockMinNumber ChangeNewMaxNumberOne(lastWarehouse.ID, lastWarehouse.StockMaxNumber, tx) } warehouse, _ := FindNewLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut, tx) // 将该批次的剩余库存数量转换为拆零数量 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 } //fmt.Println("stock_number", stock_number) //fmt.Println("deliver_number=============", 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("hahhahahah", warehouse.StockMinNumber) //fmt.Println("howowowoowow", minNumber) if warehouse.StockMinNumber < minNumber { warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1 if warehouse.MaxUnit != warehouse.MinUnit { warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber } if minNumber == 2 && warehouse.MaxUnit == warehouse.MinUnit && warehouse.StockMinNumber == 0 { warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1 } } 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 } } } } //fmt.Println("maxNumber", maxNumber) //fmt.Println("minNumber", maxNumber) if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit && warehouse.MaxUnit != warehouse.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 } //扣减库存数据 UpDateNewDrugWarehouseInfoByStock(&warehouse, tx) ////查询剩余库存 stockInfo, _ := GetNewDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId, tx) 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: advice.RecordDate, Mtime: 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, _ := GetNewNewDrugWarehouseOutInfoSix(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID, tx) if lastDrugOutInfo.ID == 0 { AddNewSigleDrugWarehouseOutInfo(warehouseOutInfo, tx) } //如果有数量则新增数量 if lastDrugOutInfo.ID > 0 { UpdateSigleDrugWarehouseOutInfoDetail(lastDrugOutInfo.ID, warehouseOutInfo.Count, tx) } fmt.Println("药品追溯码-------------------------------------------------------", advice.DrugCode) drugflow := models.DrugFlow{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, DrugId: advice.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, Count: deliver_number, //按最小单位计算, Price: warehouse.RetailPrice, Status: 1, Ctime: advice.AdviceDate, Mtime: 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, OperateTime: time.Now().Unix(), DrugCode: advice.DrugCode, } CreateNewDrugFlowOne(drugflow, tx) AddNewDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count, tx) //查询是否存在数据 details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: advice.RecordDate, 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, } //查找是否有数据 autoMaticReduceDetail, _ := GetDrugAutoMaticReduceDetail(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID, tx) if autoMaticReduceDetail.ID == 0 { AddNewSigleDrugAutoReduceRecordInfo(details, tx) } if autoMaticReduceDetail.ID > 0 { UpdateNewSingleDrugAutoReduceRecordInfo(autoMaticReduceDetail.ID, deliver_number, tx) } 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, MinUnit: drup.MinUnit, WarehousingInfoId: warehouse.WarehousingInfoId, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } //扣减库存 UpDateNewDrugWarehouseInfoByStock(&info, tx) //查询剩余库存 stockInfo, _ := GetNewDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId, tx) 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: advice.RecordDate, Mtime: 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, } //查询今日该药品该患者是否有出库数据 lastDrugOutInfo, _ := GetNewNewDrugWarehouseOutInfoSix(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID, tx) if lastDrugOutInfo.ID == 0 { AddNewSigleDrugWarehouseOutInfo(warehouseOutInfo, tx) } //如果有数量则新增数量 if lastDrugOutInfo.ID > 0 { UpdateSigleDrugWarehouseOutInfoDetail(lastDrugOutInfo.ID, warehouseOutInfo.Count, tx) } //查询是否存在数据 details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: advice.RecordDate, 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, } //查找是否有数据 autoMaticReduceDetail, _ := GetDrugAutoMaticReduceDetail(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID, tx) if autoMaticReduceDetail.ID == 0 { AddNewSigleDrugAutoReduceRecordInfo(details, tx) } if autoMaticReduceDetail.ID > 0 { UpdateNewSingleDrugAutoReduceRecordInfo(autoMaticReduceDetail.ID, deliver_number, tx) } 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: advice.AdviceDate, Mtime: 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, OperateTime: time.Now().Unix(), DrugCode: advice.DrugCode, } CreateNewDrugFlowOne(drugflow, tx) //出库数量相加 AddNewDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count, tx) // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作 prescribingNumber_two_temp := deliver_number - stock_number overPlusNumber := float64(prescribingNumber_two_temp) advice.PrescribingNumber = float64(prescribingNumber_two_temp) advice.PrescribingNumberUnit = drup.MinUnit HisStoryBloodHisDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice, hisprescribingNumber, unit, tx) } return } func NewHisDrugCancelInfo(orgID int64, creater int64, advice *models.HisDoctorAdviceInfo, cha_count int64, drug models.BaseDrugLibSeven, tx *gorm.DB) (err error) { storeConfig, _ := GetNewAllStoreHouseConfig(advice.UserOrgId, tx) //查找患者最后一条的退库数据是否满足要求 var out_count int64 drugOutInfo, _ := GetDrugWarehouseOutInfoByAdviceIdTwo(advice.PatientId, advice.UserOrgId, advice.AdviceDate, advice.DrugId, advice.ID, tx) if drugOutInfo.CountUnit == drug.MaxUnit && drug.MaxUnit != drug.MinUnit { out_count = drugOutInfo.Count * drug.MinNumber } if drugOutInfo.CountUnit == drug.MinUnit && drug.MaxUnit != drug.MinUnit { out_count = drugOutInfo.Count } if drugOutInfo.CountUnit == drug.MinUnit && drug.MaxUnit == drug.MinUnit { out_count = drugOutInfo.Count } //如果最后1条出库数量大于退库数量,则直接退库,满足退库要求 if out_count >= cha_count { //退库 退回 cha_count 的数量 ModifyNewDrugWarehouseInfoStockMinNumber(cha_count, drugOutInfo.DrugId, drugOutInfo.OrgId, drugOutInfo.WarehouseInfoId, tx) if out_count == cha_count { //删除该出库单 DeleteDrugWarehouseOutInfoByNumber(drugOutInfo.ID, tx) } //减去出库单里面的数量 ModifyDrugWarehouseOutInfoByNumber(drugOutInfo.ID, cha_count, tx) //创建退库单 //查询剩余库存 stockInfo, _ := GetNewDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId, tx) var sum_count int64 for _, its := range stockInfo { if its.MaxUnit == drug.MaxUnit { its.StockMaxNumber = its.StockMaxNumber * drug.MinNumber } sum_count += its.StockMaxNumber + its.StockMinNumber } //创建退库单 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 := FindNewDrugCancelStock(advice.AdviceDate, advice.UserOrgId, tx) if errCode == gorm.ErrRecordNotFound { AddNewSigleDrugCancelStock(&cancelStock, tx) } lastDrugCancelStock, _ := FindNewLastDrugCancelStock(advice.AdviceDate, advice.UserOrgId, tx) manufactureName, _ := GetNewManufactureById(drugOutInfo.Manufacturer, tx) dealer, _ := GetNewDealerById(drugOutInfo.Dealer, tx) cancelInfo, _ := GetNewLastDrugCancelStockById(advice.UserOrgId, tx) cancelStockInfo := models.DrugCancelStockInfo{ OrderNumber: cancelInfo.OrderNumber, CancelStockId: lastDrugCancelStock.ID, DrugId: advice.DrugId, Count: cha_count, Status: 1, Ctime: advice.AdviceDate, Mtime: time.Now().Unix(), OrgId: advice.UserOrgId, Type: 1, Manufacturer: manufactureName.ManufacturerName, Dealer: dealer.DealerName, Total: 0, RetailPrice: drugOutInfo.RetailPrice, RetailTotalPrice: drugOutInfo.RetailTotalPrice, Price: drugOutInfo.Price, RegisterAccount: "", Remark: drugOutInfo.Remark, BatchNumber: drugOutInfo.BatchNumber, MaxUnit: drugOutInfo.CountUnit, ProductDate: drugOutInfo.ProductDate, ExpiryDate: drugOutInfo.ExpiryDate, BatchNumberId: drugOutInfo.WarehouseInfoId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } CreatedNewCancelStock(cancelStockInfo, tx) flow := models.DrugFlow{ WarehousingId: drugOutInfo.WarehouseInfoId, DrugId: drugOutInfo.DrugId, Number: "", BatchNumber: drugOutInfo.BatchNumber, Count: cha_count, 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: drugOutInfo.Manufacturer, Dealer: drugOutInfo.Dealer, Creator: advice.ExecutionStaff, UpdateCreator: 0, Status: 1, Ctime: advice.AdviceDate, Mtime: time.Now().Unix(), Price: drugOutInfo.RetailPrice, WarehousingDetailId: drugOutInfo.ID, WarehouseOutDetailId: 0, CancelOutDetailId: lastDrugCancelStock.ID, ExpireDate: drugOutInfo.ExpiryDate, ProductDate: drugOutInfo.ProductDate, MaxUnit: drugOutInfo.CountUnit, MinUnit: "", AdviceId: advice.ID, StorehouseId: storeConfig.DrugStorehouseOut, LastPrice: drugOutInfo.Price, OverCount: sum_count, OperateTime: time.Now().Unix(), } CreateNewDrugFlowOne(flow, tx) AddNewCancelSumCountOne(storeConfig.DrugStorehouseOut, advice.DrugId, advice.UserOrgId, flow.Count, tx) ReduceNewDrugCountTwo(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, flow.Count, tx) } //如果出库的数据小于这个退库的数量差,则先该批次出库数量出完 if out_count < cha_count { //把该出库单的数量退完 ModifyNewDrugWarehouseInfoStockMinNumber(out_count, drugOutInfo.DrugId, drugOutInfo.OrgId, drugOutInfo.WarehouseInfoId, tx) //删除该出库单 DeleteDrugWarehouseOutInfoByNumber(drugOutInfo.ID, tx) //创建退库单 //查询剩余库存 stockInfo, _ := GetNewDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId, tx) var sum_count int64 for _, its := range stockInfo { if its.MaxUnit == drug.MaxUnit { its.StockMaxNumber = its.StockMaxNumber * drug.MinNumber } sum_count += its.StockMaxNumber + its.StockMinNumber } //创建退库单 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 := FindNewDrugCancelStock(advice.AdviceDate, advice.UserOrgId, tx) if errCode == gorm.ErrRecordNotFound { AddNewSigleDrugCancelStock(&cancelStock, tx) } lastDrugCancelStock, _ := FindNewLastDrugCancelStock(advice.AdviceDate, advice.UserOrgId, tx) manufactureName, _ := GetNewManufactureById(drugOutInfo.Manufacturer, tx) dealer, _ := GetNewDealerById(drugOutInfo.Dealer, tx) cancelInfo, _ := GetNewLastDrugCancelStockById(advice.UserOrgId, tx) cancelStockInfo := models.DrugCancelStockInfo{ OrderNumber: cancelInfo.OrderNumber, CancelStockId: lastDrugCancelStock.ID, DrugId: advice.DrugId, Count: out_count, Status: 1, Ctime: advice.AdviceDate, Mtime: time.Now().Unix(), OrgId: advice.UserOrgId, Type: 1, Manufacturer: manufactureName.ManufacturerName, Dealer: dealer.DealerName, Total: 0, RetailPrice: drugOutInfo.RetailPrice, RetailTotalPrice: drugOutInfo.RetailTotalPrice, Price: drugOutInfo.Price, RegisterAccount: "", Remark: drugOutInfo.Remark, BatchNumber: drugOutInfo.BatchNumber, MaxUnit: drugOutInfo.CountUnit, ProductDate: drugOutInfo.ProductDate, ExpiryDate: drugOutInfo.ExpiryDate, BatchNumberId: drugOutInfo.WarehouseInfoId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } CreatedNewCancelStock(cancelStockInfo, tx) flow := models.DrugFlow{ WarehousingId: drugOutInfo.WarehouseInfoId, DrugId: drugOutInfo.DrugId, Number: "", BatchNumber: drugOutInfo.BatchNumber, Count: out_count, 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: drugOutInfo.Manufacturer, Dealer: drugOutInfo.Dealer, Creator: advice.ExecutionStaff, UpdateCreator: 0, Status: 1, Ctime: advice.AdviceDate, Mtime: time.Now().Unix(), Price: drugOutInfo.RetailPrice, WarehousingDetailId: drugOutInfo.ID, WarehouseOutDetailId: 0, CancelOutDetailId: lastDrugCancelStock.ID, ExpireDate: drugOutInfo.ExpiryDate, ProductDate: drugOutInfo.ProductDate, MaxUnit: drugOutInfo.CountUnit, MinUnit: "", AdviceId: advice.ID, StorehouseId: storeConfig.DrugStorehouseOut, LastPrice: drugOutInfo.Price, OverCount: sum_count, OperateTime: time.Now().Unix(), } CreateNewDrugFlowOne(flow, tx) AddNewCancelSumCountOne(storeConfig.DrugStorehouseOut, advice.DrugId, advice.UserOrgId, flow.Count, tx) ReduceNewDrugCountTwo(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, flow.Count, tx) //计算还有多少没有退库 var over_count = cha_count - out_count NewHisDrugCancelInfo(orgID, creater, advice, over_count, drug, tx) } return err } func NewHisDrugAutoCancelInfo(orgID int64, creater int64, advice *models.HisDoctorAdviceInfo, cha_count int64, drug models.BaseDrugLibSeven, tx *gorm.DB) error { //查找患者最后一条的退库数据是否满足要求 var out_count int64 drugOutInfo, _ := GetDrugAutoOutInfoByAdviceIdTwo(advice.PatientId, advice.UserOrgId, advice.AdviceDate, advice.DrugId, advice.ID, tx) if drugOutInfo.CountUnit == drug.MaxUnit && drug.MaxUnit != drug.MinUnit { out_count = drugOutInfo.Count * drug.MinNumber } if drugOutInfo.CountUnit == drug.MinUnit && drug.MaxUnit != drug.MinUnit { out_count = drugOutInfo.Count } if drugOutInfo.CountUnit == drug.MinUnit && drug.MaxUnit == drug.MinUnit { out_count = drugOutInfo.Count } //fmt.Println("out_count++++==++", out_count) //fmt.Println("cha_count-------", cha_count) //如果最后1条出库数量大于退库数量,则直接退库,满足退库要求 if out_count >= cha_count { //减去出库单里面的数量 ModifyDrugAuToWarehouseOut(drugOutInfo.ID, cha_count, tx) if out_count == cha_count { //删除该出库单 DeleteDrugWarehouseAutoByNumber(drugOutInfo.ID, tx) } } //如果出库的数据小于这个退库的数量差,则先该批次出库数量出完 if out_count < cha_count { //删除该出库单 DeleteDrugWarehouseAutoByNumber(drugOutInfo.ID, tx) //计算还有多少没有退库 var over_count = cha_count - out_count NewHisDrugAutoCancelInfo(orgID, creater, advice, over_count, drug, tx) } return err } func ReduceNewGoodCountTwo(good_id int64, org_id int64, storehouse_id int64, out_count int64, tx *gorm.DB) error { err := tx.Model(&models.XtGoodStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and good_id = ?", storehouse_id, org_id, good_id).UpdateColumn("stock_out_count", gorm.Expr("stock_out_count - ?", out_count)).Error if err != nil { tx.Rollback() return err } return err } func AddDrugWarehouseOut(drug_id int64, total_count int64, storehouse_id int64, user_org_id 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, user_org_id, drug_id).UpdateColumn("sum_out_count", gorm.Expr("sum_out_count + ?", total_count)).Error err = ut.Model(&models.XtDrugStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and drug_id =?", storehouse_id, user_org_id, drug_id).UpdateColumn("sum_act_out_count", gorm.Expr("sum_act_out_count + ?", total_count)).Error if err != nil { ut.Rollback() return err } ut.Commit() return err } func ReduceDrugWarehouseOut(drug_id int64, total_count int64, storehouse_id int64, user_org_id 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, user_org_id, drug_id).UpdateColumn("sum_out_count", gorm.Expr("sum_out_count - ?", total_count)).Error err = ut.Model(&models.XtDrugStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and drug_id =?", storehouse_id, user_org_id, drug_id).UpdateColumn("sum_act_out_count", gorm.Expr("sum_act_out_count - ?", total_count)).Error if err != nil { ut.Rollback() return err } ut.Commit() return err } func HisStoryBloodHisDrugDeliverInfoOne(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo, hisprescribingNumber float64, unit string, tx *gorm.DB) (err error) { // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量 var deliver_number int64 = 0 var stock_number int64 = 0 var stock_number_one int64 = 0 prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64) count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64) prescribingNumber_temp_one := strconv.FormatFloat(math.Abs(hisprescribingNumber), 'f', 0, 64) count_one, _ := strconv.ParseInt(prescribingNumber_temp_one, 10, 64) if advice.PrescribingNumberUnit == drup.MaxUnit { deliver_number = count * drup.MinNumber } else { deliver_number = count } if advice.PrescribingNumberUnit == drup.MaxUnit { stock_number_one = count_one * drup.MinNumber } else { stock_number_one = count_one } fmt.Println(stock_number_one) // 根据先进先出原则,查询最先入库的批次,进行出库 // 如果没有对应的库存,则报错 storeConfig, _ := GetNewAllStoreHouseConfig(advice.UserOrgId, tx) lastWarehouse, _ := FindNewLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut, tx) if lastWarehouse.MaxUnit != lastWarehouse.MinUnit && drup.MaxUnit != drup.MinUnit && lastWarehouse.MinUnit != "" { if lastWarehouse.StockMinNumber >= drup.MinNumber { var stockMax int64 var stockMin int64 stockMax = lastWarehouse.StockMinNumber / drup.MinNumber stockMin = lastWarehouse.StockMinNumber % drup.MinNumber ChangeNewMaxNumber(lastWarehouse.ID, stockMax, tx) UpdateNewMinNumber(lastWarehouse.ID, stockMin, tx) } } if lastWarehouse.MaxUnit == lastWarehouse.MinUnit && drup.MaxUnit != drup.MinUnit && lastWarehouse.MinUnit != "" { lastWarehouse.StockMaxNumber = lastWarehouse.StockMaxNumber + lastWarehouse.StockMinNumber ChangeNewMaxNumberOne(lastWarehouse.ID, lastWarehouse.StockMaxNumber, tx) } warehouse, _ := FindNewLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut, tx) // 将该批次的剩余库存数量转换为拆零数量 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("hahhahahah", warehouse.StockMinNumber) //fmt.Println("howowowoowow", minNumber) if warehouse.StockMinNumber < minNumber { warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1 if warehouse.MaxUnit != warehouse.MinUnit { warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber } if minNumber == 2 && warehouse.MaxUnit == warehouse.MinUnit && warehouse.StockMinNumber == 0 { warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1 } } 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 } } } } //fmt.Println("maxNumber", maxNumber) //fmt.Println("minNumber", maxNumber) if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit && warehouse.MaxUnit != warehouse.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 } //扣减库存数据 UpDateNewDrugWarehouseInfoByStock(&warehouse, tx) ////查询剩余库存 stockInfo, _ := GetNewDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId, tx) 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: advice.RecordDate, Mtime: 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, _ := GetNewNewDrugWarehouseOutInfoSix(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID, tx) if lastDrugOutInfo.ID == 0 { AddNewSigleDrugWarehouseOutInfo(warehouseOutInfo, tx) } //如果有数量则新增数量 if lastDrugOutInfo.ID > 0 { UpdateSigleDrugWarehouseOutInfoDetail(lastDrugOutInfo.ID, warehouseOutInfo.Count, tx) } drugflow := models.DrugFlow{ WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, WarehouseOutId: warehouseout.ID, DrugId: advice.DrugId, Number: warehouse.Number, ProductDate: warehouse.ProductDate, ExpireDate: warehouse.ExpiryDate, Count: deliver_number, //按最小单位计算, Price: warehouse.RetailPrice, Status: 1, Ctime: advice.AdviceDate, Mtime: 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, OperateTime: time.Now().Unix(), } CreateNewDrugFlowOne(drugflow, tx) AddNewDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count, tx) //查询是否存在数据 details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: advice.RecordDate, 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, } //查找是否有数据 autoMaticReduceDetail, _ := GetDrugAutoMaticReduceDetail(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID, tx) if autoMaticReduceDetail.ID == 0 { AddNewSigleDrugAutoReduceRecordInfo(details, tx) } if autoMaticReduceDetail.ID > 0 { UpdateNewSingleDrugAutoReduceRecordInfo(autoMaticReduceDetail.ID, deliver_number, tx) } 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, MinUnit: drup.MinUnit, WarehousingInfoId: warehouse.WarehousingInfoId, SupplyWarehouseId: warehouse.SupplyWarehouseId, StorehouseId: storeConfig.DrugStorehouseOut, IsCheck: 1, } //扣减库存 UpDateNewDrugWarehouseInfoByStock(&info, tx) //查询剩余库存 stockInfo, _ := GetNewDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId, tx) 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: advice.RecordDate, Mtime: 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, } //查询今日该药品该患者是否有出库数据 lastDrugOutInfo, _ := GetNewNewDrugWarehouseOutInfoSix(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID, tx) if lastDrugOutInfo.ID == 0 { AddNewSigleDrugWarehouseOutInfo(warehouseOutInfo, tx) } //如果有数量则新增数量 if lastDrugOutInfo.ID > 0 { UpdateSigleDrugWarehouseOutInfoDetail(lastDrugOutInfo.ID, warehouseOutInfo.Count, tx) } //查询是否存在数据 details := &models.DrugAutomaticReduceDetail{ WarehouseOutId: warehouseout.ID, WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber, PatientId: advice.PatientId, Ctime: advice.RecordDate, 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, } //查找是否有数据 autoMaticReduceDetail, _ := GetDrugAutoMaticReduceDetail(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID, warehouse.ID, tx) if autoMaticReduceDetail.ID == 0 { AddNewSigleDrugAutoReduceRecordInfo(details, tx) } if autoMaticReduceDetail.ID > 0 { UpdateNewSingleDrugAutoReduceRecordInfo(autoMaticReduceDetail.ID, deliver_number, tx) } 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: advice.AdviceDate, Mtime: 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, OperateTime: time.Now().Unix(), } CreateNewDrugFlowOne(drugflow, tx) //出库数量相加 AddNewDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count, tx) // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作 prescribingNumber_two_temp := deliver_number - stock_number overPlusNumber := float64(prescribingNumber_two_temp) advice.PrescribingNumber = float64(prescribingNumber_two_temp) advice.PrescribingNumberUnit = drup.MinUnit HisStoryBloodHisDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice, hisprescribingNumber, unit, tx) } return }