diff --git a/ICSSoft.WMS.WebAPI/ICSSoft.DataProject/ICSSubmitService.cs b/ICSSoft.WMS.WebAPI/ICSSoft.DataProject/ICSSubmitService.cs index 8866704..f35dae1 100644 --- a/ICSSoft.WMS.WebAPI/ICSSoft.DataProject/ICSSubmitService.cs +++ b/ICSSoft.WMS.WebAPI/ICSSoft.DataProject/ICSSubmitService.cs @@ -9341,7 +9341,7 @@ GROUP BY ExtensionID,INVCode,WHCode) a LEFT JOIN (SELECT a.INVCode,b.ExtensionID,SUM(a.Quantity) Quantity,a.WarehouseCode WHCode FROM ICSWareHouseLotInfo a LEFT JOIN ICSInventoryLot b ON a.lotno=b.lotno and a.WorkPoint=b.WorkPoint -WHERE a.Quantity>0 and a.WorkPoint='{1}' +WHERE a.Quantity>0 and a.WorkPoint='{1}' and a.Quantity-a.LockQuantity>0 GROUP BY a.INVCode,b.ExtensionID,a.WarehouseCode) b ON a.ExtensionID=b.ExtensionID AND a.INVCode=b.INVCode AND a.WHCode=b.WHCode WHERE b.INVCode is NULL OR a.Quantity>isnull(b.Quantity,0)"; sql = string.Format(sql, JsonData.TransCode, JsonData.WorkPoint); @@ -9390,9 +9390,9 @@ ORDER BY CAST(Sequence AS INT),MTDOCType"; } //获取转换前物料所匹配条码 - string lotList = @"SELECT a.*,b.ExtensionID FROM ICSWareHouseLotInfo a + string lotList = @"SELECT a.*,b.ExtensionID,a.Quantity-a.LockQuantity newQuantity FROM ICSWareHouseLotInfo a LEFT JOIN ICSInventoryLot b ON a.lotno=b.lotno and a.WorkPoint=b.WorkPoint -WHERE a.Quantity>0 AND a.INVCode='{0}' AND b.ExtensionID='{1}' and a.WorkPoint='{2}' and a.WarehouseCode='{3}' +WHERE a.Quantity>0 AND a.INVCode='{0}' AND b.ExtensionID='{1}' and a.WorkPoint='{2}' and a.WarehouseCode='{3}' and a.Quantity-a.LockQuantity>0 ORDER BY a.mtime "; lotList = string.Format(lotList, beforInvCode, beforExtensionID, JsonData.WorkPoint, whCode); DataTable dtlotList = DBHelper.SQlReturnData(lotList, cmd); @@ -9400,17 +9400,18 @@ ORDER BY a.mtime "; { log.Info("1111111111"); string lotNo = dr["lotNo"].ToString(); - decimal Quantity = Convert.ToDecimal(dr["Quantity"].ToString()); + decimal Quantity = Convert.ToDecimal(dr["newQuantity"].ToString()); + decimal LockQuantity = Convert.ToDecimal(dr["LockQuantity"].ToString());//占料数量,有占料数量的条码形态转换需要分批 decimal thisQuantity = 0; string lotNoNew = lotNo; if (MTDQuantity <= 0) { continue; } + log.Info("转换数量:" + MTDQuantity + ",条码可用量:" + Quantity + ",占料数量:" + LockQuantity); //形态转换自动分批:传入条码数量<原条码数量,则原条码修改库存数量,增加一条出库记录,创建新条码,新条码进行形态转换 20240515 yangtm if (MTDQuantity < Quantity) { - log.Info("2222222222222"); int result = 0; thisQuantity = MTDQuantity; #region 分批前添加日志 @@ -9573,12 +9574,175 @@ ORDER BY a.mtime "; #endregion MTDQuantity = 0; } + else if (MTDQuantity >= Quantity && LockQuantity > 0) + { + int result = 0; + thisQuantity = Quantity; + #region 分批前添加日志 + string lotSql = @"IF NOT EXISTS(SELECT F_Account FROM Sys_SRM_User WHERE F_Account='{2}' AND F_Location='{1}') + BEGIN + RAISERROR('" + string.Format(language.GetNameByCode("WMSAPIInfo060"), "{2}") + @"',16,1); + RETURN + END + + INSERT INTO ICSWareHouseLotInfoLog(ID,Identification,TransCode,TransSequence,LotNo,InvCode, + FromWarehouseCode,FromLocationCode,ToWarehouseCode,ToLocationCode,Quantity, + Memo,Lock,TransType,BusinessCode,ERPUpload,ERPID, + ERPDetailID,ERPCode,ERPSequence,MUSER,MUSERName, + MTIME,WorkPoint,EATTRIBUTE1) + SELECT NEWID(),'{3}',b.TransCode,b.TransSequence,a.LotNo ,a.InvCode , + c.WarehouseCode,c.LocationCode,'','',c.Quantity, + '','0','4','31','0','', + '','','',f.F_Account ,f.F_RealName , + SYSDATETIME() ,a.WorkPoint ,'' + FROM ICSInventoryLot a + INNER JOIN ICSInventoryLotDetail b ON a.LotNo=b.LotNo AND a.WorkPoint=b.WorkPoint + INNER JOIN ICSWareHouseLotInfo c ON a.LotNo=c.LotNo AND a.WorkPoint=c.WorkPoint + INNER JOIN Sys_SRM_User f ON f.F_Account='{2}' AND a.WorkPoint=f.F_Location + WHERE a.LotNo='{0}' AND a.WorkPoint='{1}' + "; + lotSql = string.Format(lotSql, lotNo, JsonData.WorkPoint, JsonData.User, Identification); + + if (!DBHelper.ExecuteNonQuery(lotSql, cmd)) + { + throw new Exception(language.GetNameByCode("WMSAPIInfo166")); + } + #endregion + #region 获取分批后的条码(lotNoNew) + lotSql = @"SELECT TOP 1 LotNO FROM ICSInventoryLot WHERE EATTRIBUTE1='{0}' AND WorkPoint='{1}' + ORDER BY CAST(SUBSTRING(LotNO, (LEN(LotNO)-CHARINDEX('-',REVERSE(LotNO))+1)+1,CHARINDEX('-',REVERSE(LotNO))-1) AS INT) DESC"; + lotSql = string.Format(lotSql, lotNo, JsonData.WorkPoint); + DataTable dt = DBHelper.SQlReturnData(lotSql, cmd); + if (dt.Rows.Count == 0) + { + lotNoNew = lotNo + "-" + 1; + } + else + { + lotNoNew = lotNo + "-" + (Convert.ToInt32(dt.Rows[0]["LotNO"].ToString().Split('-')[dt.Rows[0]["LotNO"].ToString().Split('-').Length - 1]) + 1).ToString(); + } + #endregion + + #region 将分批后的条码记录插入条码表,库存表及日志表并将原条码库存数量清零 + lotSql = @"INSERT INTO ICSInventoryLot(ID,LotNo,InvCode,ProductDate,ExpirationDate, + Quantity,Amount,ExtensionID,Type,PrintTimes, + LastPrintUser,LastPrintTime,MUSER,MUSERName,MTIME, + WorkPoint,EATTRIBUTE1) + SELECT TOP 1 NEWID(),'{0}',a.InvCode,a.ProductDate,a.ExpirationDate, + '{2}',a.Amount,a.ExtensionID,a.Type,a.PrintTimes, + a.LastPrintUser,a.LastPrintTime,a.MUSER ,a.MUSERName ,GETDATE(), + a.WorkPoint ,'{1}' + From ICSInventoryLot a + where a.LotNo='{1}' and a.WorkPoint='{3}'"; + lotSql = string.Format(lotSql, lotNoNew, lotNo, thisQuantity, JsonData.WorkPoint); + cmd.CommandText = lotSql; + result = cmd.ExecuteNonQuery(); + if (result <= 0) + { + throw new Exception(language.GetNameByCode("WMSAPIInfo195"));//条码分批后条码表存入失败! + } + lotSql = @"INSERT INTO ICSWareHouseLotInfo(ID,LotNO,WarehouseCode,LocationCode,InvCode,Quantity,InDate,LockQuantity,MUSER,MUSERName,MTIME,WorkPoint,EATTRIBUTE1) + select NEWID(),'{0}',WarehouseCode,LocationCode,InvCode,'{2}',InDate,0 + ,MUSER,MUSERName,GETDATE(),'{3}','' + from ICSWareHouseLotInfo + where LotNO='{1}' AND WorkPoint='{3}'"; + lotSql = string.Format(lotSql, lotNoNew, lotNo, thisQuantity, JsonData.WorkPoint); + cmd.CommandText = lotSql; + result = cmd.ExecuteNonQuery(); + if (result <= 0) + { + throw new Exception(language.GetNameByCode("WMSAPIInfo196"));//条码分批后库存表存入失败! + } + //插入条码单据表 + lotSql = @"INSERT INTO ICSInventoryLotDetail(LotNo,TransCode,TransSequence,MUSER,MUSERName,MTIME,WorkPoint) + SELECT '{3}',b.TransCode,b.TransSequence,f.F_Account ,f.F_RealName ,SYSDATETIME() ,a.WorkPoint + FROM ICSInventoryLot a + INNER JOIN ICSInventoryLotDetail b ON a.LotNo=b.LotNo AND a.WorkPoint=b.WorkPoint + INNER JOIN Sys_SRM_User f ON f.F_Account='{2}' AND a.WorkPoint=f.F_Location + WHERE a.LotNo='{0}' AND a.WorkPoint='{1}'"; + lotSql = string.Format(lotSql, lotNo, JsonData.WorkPoint, JsonData.User, lotNoNew); + + if (!DBHelper.ExecuteNonQuery(lotSql, cmd)) + { + throw new Exception(language.GetNameByCode("WMSAPIInfo174"));//"条码单据表写入失败!"); + } + lotSql = @"INSERT INTO ICSWareHouseLotInfoLog(ID,Identification,TransCode,TransSequence,LotNo,InvCode, + FromWarehouseCode,FromLocationCode,ToWarehouseCode,ToLocationCode,Quantity, + Memo,Lock,TransType,BusinessCode,ERPUpload,ERPID, + ERPDetailID,ERPCode,ERPSequence,MUSER,MUSERName, + MTIME,WorkPoint,EATTRIBUTE1,LogID) + SELECT NEWID(),'{3}',b.TransCode,b.TransSequence,'{5}' ,a.InvCode , + c.WarehouseCode,c.LocationCode,'','','{4}', + '','0','4','32','0','', + '','','',f.F_Account ,f.F_RealName , + SYSDATETIME() ,a.WorkPoint ,'',null + FROM ICSInventoryLot a + INNER JOIN ICSInventoryLotDetail b ON a.LotNo=b.LotNo AND a.WorkPoint=b.WorkPoint + INNER JOIN ICSWareHouseLotInfo c ON a.LotNo=c.LotNo AND a.WorkPoint=c.WorkPoint + INNER JOIN Sys_SRM_User f ON f.F_Account='{2}' AND a.WorkPoint=f.F_Location + WHERE a.LotNo='{0}' AND a.WorkPoint='{1}' + "; + lotSql = string.Format(lotSql, lotNo, JsonData.WorkPoint, JsonData.User, Identification, thisQuantity, lotNoNew); + cmd.CommandText = lotSql; + result = cmd.ExecuteNonQuery(); + if (result <= 0) + { + throw new Exception(language.GetNameByCode("WMSAPIInfo197"));//条码分批后库存日志表存入失败! + } + + ///更新原条码库存 + lotSql = @"UPDATE ICSWareHouseLotInfo SET Quantity=ISNULL(Quantity,0)-'{2}' WHERE LotNo='{0}' AND WorkPoint='{1}' + + IF EXISTS(SELECT a.LotNo FROM ICSWareHouseLotInfo a WHERE a.LotNo='{0}' AND a.WorkPoint='{1}' AND Quantity<0) + BEGIN + RAISERROR('" + language.GetNameByCode("WMSAPIInfo167") + @"',16,1); + RETURN + END"; + lotSql = string.Format(lotSql, lotNo, JsonData.WorkPoint, thisQuantity); + + if (!DBHelper.ExecuteNonQuery(lotSql, cmd)) + { + throw new Exception(language.GetNameByCode("WMSAPIInfo168"));//"库存更新失败!"); + } + + ///添加日志 + lotSql = @"IF NOT EXISTS(SELECT F_Account FROM Sys_SRM_User WHERE F_Account='{2}' AND F_Location='{1}') + BEGIN + RAISERROR('" + string.Format(language.GetNameByCode("WMSAPIInfo060"), "{2}") + @"',16,1); + RETURN + END + + INSERT INTO ICSWareHouseLotInfoLog(ID,Identification,TransCode,TransSequence,LotNo,InvCode, + FromWarehouseCode,FromLocationCode,ToWarehouseCode,ToLocationCode,Quantity, + Memo,Lock,TransType,BusinessCode,ERPUpload,ERPID, + ERPDetailID,ERPCode,ERPSequence,MUSER,MUSERName, + MTIME,WorkPoint,EATTRIBUTE1,MergeID) + SELECT NEWID(),'{3}',b.TransCode,b.TransSequence,a.LotNo ,a.InvCode , + c.WarehouseCode,c.LocationCode,'','',c.Quantity, + '','0','4','32','0','', + '','','',f.F_Account ,f.F_RealName , + SYSDATETIME() ,a.WorkPoint ,'',null + FROM ICSInventoryLot a + INNER JOIN ICSInventoryLotDetail b ON a.LotNo=b.LotNo AND a.WorkPoint=b.WorkPoint + INNER JOIN ICSWareHouseLotInfo c ON a.LotNo=c.LotNo AND a.WorkPoint=c.WorkPoint + INNER JOIN Sys_SRM_User f ON f.F_Account='{2}' AND a.WorkPoint=f.F_Location + WHERE a.LotNo='{0}' AND a.WorkPoint='{1}' + "; + lotSql = string.Format(lotSql, lotNo, JsonData.WorkPoint, JsonData.User, Identification); + + if (!DBHelper.ExecuteNonQuery(lotSql, cmd)) + { + throw new Exception(language.GetNameByCode("WMSAPIInfo166")); + } + + #endregion + MTDQuantity = MTDQuantity - Quantity; + } else { thisQuantity = Quantity; MTDQuantity = MTDQuantity - Quantity; } - log.Info("3333333333"); string updateData = ""; //单据类型 12:按单转移 13:按物料转移 if (TransType == "13")