using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.Serialization; using System.Data; using ICS.WCF.Base; using ICSSoft.Entity; using System.Data.SqlClient; namespace ICS.MaterialReturnGet { /* * 点料退料产生新条码 */ public class GetMaterialReturn { public FormICSCreatedArrivalNoticeModel CustGetMaterialReturn(OutSourePick o) { FormICSCreatedArrivalNoticeModel result = new FormICSCreatedArrivalNoticeModel(); using (SqlConnection conn = new SqlConnection(Appconfig.GetMESStr())) { conn.Open(); using (SqlTransaction trans = conn.BeginTransaction()) { try { string sql = ""; int dtNo = 0; string VouchRow; SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.Transaction = trans; StringBuilder strHead = new StringBuilder(); strHead.AppendLine("***************接口传入参数记录****************:"); strHead.AppendLine("传入条码:" + o.LotNo); strHead.AppendLine("传入维护人:" + o.MUSER); strHead.AppendLine("传入维护人名称:" + o.MUSERName); strHead.AppendLine("传入站点:" + o.WorkPoint); strHead.AppendLine("传入批次:" + o.VendorLot); strHead.AppendLine("传入条码数量:" + o.LOTQTY); foreach (PickInfoList item in o.PickInfoList) { strHead.AppendLine("传入存货编码:" + item.SubInvCode); strHead.AppendLine("传入工单号:" + item.MOCode); strHead.AppendLine("传入领料单号:" + item.VouchCode); strHead.AppendLine("传入领料单行号:" + item.VouchRow); strHead.AppendLine("传入供应商编码:" + item.DeleteStatus); strHead.AppendLine("传入物料编码:" + item.InvCode); strHead.AppendLine("传入数量:" + item.Quantity); strHead.AppendLine("传入库房编码:" + item.WHCode); strHead.AppendLine("传入库位:" + item.BinCode); } strHead.AppendLine("***************接口传入参数记录****************:"); Appconfig.WriteLogFile(strHead.ToString(), "点料退料产生新条码接口日志"); StringBuilder resultlog = new StringBuilder(); foreach (PickInfoList item in o.PickInfoList) { #region 判断输入合法 string BinCode = fenge(item.BinCode); string WHID; string checkSQL = @"select * from ICSMOBOM where MOCODE='{0}' AND WorkPoint='{1}'"; sql = string.Format(checkSQL, item.MOCode, o.WorkPoint); DataTable chkdt = SQlReturnData(sql, cmd); if (chkdt.Rows.Count <= 0) { throw new Exception("传入工单号:" + item.MOCode + "不存在,无法创建条码!"); } checkSQL = @"select * from ICSINVENTORY where INVCODE='{0}' AND WorkPoint='{1}'"; sql = string.Format(checkSQL, item.InvCode, o.WorkPoint); chkdt = SQlReturnData(sql, cmd); if (chkdt.Rows.Count <= 0) { throw new Exception("传入料号:" + item.InvCode + "不存在,无法创建条码!"); } checkSQL = @"select * from ICSMaterialPick where VouchCode='{0}' and VouchRow='{1}' AND WorkPoint='{1}'"; sql = string.Format(checkSQL, item.VouchCode, item.VouchRow, o.WorkPoint); chkdt = SQlReturnData(sql, cmd); if (chkdt.Rows.Count <= 0) { throw new Exception("传入领料单号:" + item.VouchCode + "和行号:" + item.VouchRow + "不存在!"); } checkSQL = @"select Serial from ICSStorage WHERE StorageCode='{0}' and WorkPoint='{1}'"; checkSQL = string.Format(checkSQL, item.WHCode, o.WorkPoint); chkdt = SQlReturnData(checkSQL, cmd); if (chkdt.Rows.Count == 0) { throw new Exception("传入仓库:" + item.WHCode + "不存在,无法创建条码!"); } else { WHID = chkdt.Rows[0]["Serial"].ToString(); } checkSQL = @"select Serial from ICSStack WHERE StackCode = '{0}' and Storage_Serial='{1}' and WorkPoint='{2}'"; checkSQL = string.Format(checkSQL, BinCode, WHID, o.WorkPoint); chkdt = SQlReturnData(checkSQL, cmd); if (chkdt.Rows.Count == 0) { throw new Exception("传入库位:" + BinCode + "不属于传入仓库:" + item.WHCode + ",无法创建条码!"); } #endregion #region 生成退料单号 DateTime now = DateTime.Now.Date; string date = now.Year.ToString() + (now.Month < 10 ? "0" + now.Month : now.Month.ToString()) + (now.Day < 10 ? "0" + now.Day : now.Day.ToString()); //var ITEMLot = db.ICSOutSourePick.Where(a => a.VouchCode.Contains(date)).OrderByDescending(a => a.VouchCode); sql = @"select TOP 1 VouchCode from ICSMaterial where VouchCode like'%{0}%' AND WorkPoint='{1}' order by VouchCode desc"; sql = string.Format(sql, date, o.WorkPoint); DataTable dtRow = SQlReturnData(sql, cmd); string count = "001"; if (dtRow.Rows.Count > 0) { string VouchCode = dtRow.Rows[0]["VouchCode"].ToString(); count = "R" + date + (Convert.ToInt64(VouchCode.Remove(0, 9)) + 1).ToString().PadLeft(3, '0'); } else { count = "R" + date + "001"; } #endregion #region 生成退料单行号 sql = @"select TOP 1 VouchRow from ICSMaterialPick where VouchCode='{0}' AND WorkPoint='{1}' order by VouchRow desc"; sql = string.Format(sql, item.VouchCode, o.WorkPoint); dtRow = SQlReturnData(sql, cmd); if (dtRow.Rows.Count <= 0) { VouchRow = "0001"; } else { VouchRow = (Convert.ToInt64(dtRow.Rows[0]["VouchRow"]) + 1).ToString().PadLeft(4, '0'); } #endregion string MOCode; //获取工单号 checkSQL = @"select MOCode from ICSMaterialPick where VouchCode='{0}' AND VouchRow='{1}' AND WorkPoint='{2}'"; sql = string.Format(checkSQL, item.VouchCode, item.VouchRow, o.WorkPoint); chkdt = SQlReturnData(sql, cmd); if (chkdt.Rows.Count <= 0) { throw new Exception("传入领料单号:" + item.VouchCode + "和行号:" + item.VouchRow + "不存在!"); } else { MOCode = dtRow.Rows[0]["MOCode"].ToString(); } #region 生成退料单 #region 判断已退数量不能大于已领数量 string sql1 = @"SELECT SubInvCode,SUM(Quantity) as HasQuantity FROM ICSMaterialPick WHERE SubInvCode='{0}' AND WorkPoint='{1}' AND MoveType='领料' GROUP BY SubInvCode"; sql1 = string.Format(sql1, item.SubInvCode, o.WorkPoint); DataTable dt1 = SQlReturnData(sql1, cmd); string sql2 = @"SELECT SubInvCode,SUM(Quantity) as Quantity FROM ICSMaterialPick WHERE SubInvCode='{0}' AND WorkPoint='{1}' AND MoveType='退料' GROUP BY SubInvCode"; sql2 = string.Format(sql2, item.SubInvCode, o.WorkPoint); DataTable dt2 = SQlReturnData(sql2, cmd); //DataTable dt2 = DBHelper.ExecuteDataset(AppConfig.AppConnectString, CommandType.Text, sql1).Tables[1]; if (dt1.Rows.Count > 0 && dt2.Rows.Count > 0 && dt1.Rows[0]["HasQuantity"].ToString() != "" && dt2.Rows.Count > 0 && dt2.Rows[0]["Quantity"].ToString() != "") { if (Convert.ToDecimal(dt2.Rows[0]["Quantity"].ToString()) + Convert.ToDecimal(item.Quantity) > Convert.ToDecimal(dt1.Rows[0]["HasQuantity"].ToString())) { throw new Exception("退料单已退料总数量不能大于该物料已领数量"); } } #endregion #region 判断退料数量不能超过领料单行数量 string sql4 = @"SELECT Reservation,ReservationRow,SUM(HasQuantity) as HasQuantity FROM ICSMaterialPick WHERE Reservation='{0}' and ReservationRow='{1}' AND WorkPoint='{2}' AND MoveType='退料' GROUP BY Reservation,ReservationRow"; sql4 = string.Format(sql4, item.VouchCode, item.VouchRow, o.WorkPoint); DataTable dt4 = SQlReturnData(sql4, cmd); string sql5 = @"SELECT Quantity FROM ICSMaterialPick WHERE VouchCode='{0}' and VouchRow='{1}' AND WorkPoint='{2}' AND MoveType='领料' "; sql5 = string.Format(sql5, item.VouchCode, item.VouchRow, o.WorkPoint); DataTable dt5 = SQlReturnData(sql5, cmd); if (dt4.Rows.Count > 0 && dt5.Rows.Count > 0 && dt4.Rows[0]["HasQuantity"].ToString() != "" && dt5.Rows[0]["Quantity"].ToString() != "") { if (Convert.ToDecimal(dt4.Rows[0]["HasQuantity"].ToString()) + Convert.ToDecimal(item.Quantity) > Convert.ToDecimal(dt5.Rows[0]["Quantity"].ToString())) { throw new Exception("该物料的退料数量不能超过对应领料单行数量!"); } } #endregion //更新ICSMaterial表 sql = string.Format(@"insert into ICSMaterial (ID,VouchCode,PickingSTATUS,ISALLINSTORAGE,CreateTIME,CreateUSER,MUSER,MUSERName,MTIME,WorkPoint,WHCode) values (NEWID(),'{0}','新建','N',GETDATE(),'{1}','{2}','{3}',GETDATE(),'{4}','{5}')", count, o.MUSER, o.MUSERName, o.MUSER, o.MUSERName, o.WorkPoint, item.WHCode); cmd.CommandText = sql; dtNo = cmd.ExecuteNonQuery(); if (dtNo <= 0) { throw new Exception("生成退料申请单表头失败,请查看日志"); } //更新ICSMaterialPick表 sql = string.Format(@"insert into ICSMaterialPick(ID,VouchCode,VouchRow,SubInvCode,InvCode,WHCode,HasQuantity,MoveType,MOCode,Quantity,Reservation,ReservationRow,DeleteStatus,cBatch,ORDERNO,EATTRIBUTE,MUSER,MUSERName,MTIME,VoucherDate,WorkPoint) values( NEWID(),'{0}', '{1}', '{2}', '{3}' ,'{4}',0,'点料退料','{5}','{6}','{7}','{8}','{9}','{10}','','{11}','{12}','{13}',GETDATE(),GETDATE(),'{13}')" , count, VouchRow, item.SubInvCode, item.SubInvCode, item.WHCode, MOCode, item.Quantity, item.VouchCode, item.VouchRow, item.DeleteStatus, item.DeleteStatus, MOCode, o.MUSER, o.MUSERName, o.WorkPoint); cmd.CommandText = sql; dtNo = cmd.ExecuteNonQuery(); if (dtNo <= 0) { throw new Exception("生成退料申请单失败,请查看日志"); } #endregion string SqlLotNO = @"select * from ICSItemLot where LotNO = '{0}' "; sql = string.Format(SqlLotNO, o.LotNo); DataTable dt = SQlReturnData(sql, cmd); if (dt.Rows.Count > 0) { throw new Exception("条码已存在,不可重复退料"); } //生成点料退料条码 sql = string.Format(@"INSERT INTO dbo.ICSITEMLot ( ID ,LotNO ,ItemCODE ,TransNO ,TransLine ,VENDORITEMCODE ,VENDORCODE , VenderLotNO ,PRODUCTDATE ,LOTQTY ,ACTIVE ,Exdate ,WorkPoint , MUSER ,MUSERName ,MTIME ,TYPE,ORDERNO) values( NEWID(),'{0}','{1}','{2}','{3}','','', '{4}',GETDATE(),'{5}','Y','2999-12-31 00:00:00.000','{6}', '{7}','{8}',GETDATE(),'点料退料','')", o.LotNo, item.InvCode, count, VouchRow, o.VendorLot, o.LOTQTY, o.WorkPoint, o.MUSER, o.MUSERName); cmd.CommandText = sql; dtNo = cmd.ExecuteNonQuery(); if (dtNo <= 0) { throw new Exception("点料退料产生新条码失败,请查看日志"); } } foreach (PickInfoList item in o.PickInfoList) { string BinCode = fenge(item.BinCode); string NewBinCode = BinCode; string INVCode = ""; string WHCode = ""; string TranNo = ""; string TranLine = ""; string ORDERNO = ""; #region 获取仓库库位等信息 sql = @"select ItemCODE ,TransNO ,TransLine ,ORDERNO from ICSITEMLot where LotNO='{0}' AND WorkPoint='{1}'"; sql = string.Format(sql, o.LotNo, o.WorkPoint); DataTable dt = SQlReturnData(sql, cmd); if (dt.Rows.Count == 0) { throw new Exception("获取条码信息失败!"); } else { INVCode = dt.Rows[0]["ItemCODE"].ToString(); TranNo = dt.Rows[0]["TransNO"].ToString(); TranLine = dt.Rows[0]["TransLine"].ToString(); ORDERNO = dt.Rows[0]["ORDERNO"].ToString(); } sql = @"select B.StorageCode from ICSStack A LEFT JOIN ICSStorage B ON B.Serial=A.Storage_Serial where StackCode='{0}'"; sql = string.Format(sql, NewBinCode); dt = SQlReturnData(sql, cmd); if (dt.Rows.Count == 0) { throw new Exception("获取仓库信息失败!"); } else { WHCode = dt.Rows[0]["StorageCode"].ToString(); } #endregion #region 更新ICSWareHouseInfo表 sql = @"update ICSWareHouseInfo set QTY=QTY+{0},MTIME='{1}' where INVCode='{2}' AND WHCode='{3}' AND BinCode='{4}' AND WorkPoint='{5}'"; sql = string.Format(sql, o.LOTQTY, DateTime.Now, INVCode, WHCode, NewBinCode, o.WorkPoint); cmd.CommandText = sql; dtNo = cmd.ExecuteNonQuery(); if (dtNo <= 0) { sql = @"insert into ICSWareHouseInfo values ((select Serial from ICSStorage where StorageCode='{0}' and WorkPoint='{4}') ,'{0}' ,(SELECT Serial FROM ICSStack WHERE StackCode='{1}' and WorkPoint='{4}') ,'{1}' ,(SELECT ID FROM ICSINVENTORY WHERE INVCODE='{2}' and WorkPoint='{4}') ,'{2}',{3},'{4}','{5}','{6}',GETDATE(),NULL)"; sql = string.Format(sql, WHCode, NewBinCode, INVCode, o.LOTQTY, o.WorkPoint, o.MUSER, o.MUSERName); cmd.CommandText = sql; dtNo = cmd.ExecuteNonQuery(); if (dtNo <= 0) { throw new Exception("库存主表存入失败!"); } } #endregion #region 更新ICSWareHouseLotInfo表 sql = @"insert into ICSWareHouseLotInfo Values (NEWID(),'{0}', (select Serial from ICSStorage where StorageCode='{1}' and WorkPoint='{5}'), '{1}', (SELECT Serial FROM ICSStack WHERE StackCode='{2}' and WorkPoint='{5}'), '{2}', (SELECT ID FROM ICSINVENTORY WHERE INVCODE='{3}' and WorkPoint='{5}'), '{3}',{4},GETDATE(),'{5}','{6}','{7}',GETDATE(),'点料退料',0,0,'{8}')"; sql = string.Format(sql, o.LotNo, WHCode, NewBinCode, INVCode, o.LOTQTY, o.WorkPoint, o.MUSER, o.MUSERName, ORDERNO); cmd.CommandText = sql; dtNo = cmd.ExecuteNonQuery(); if (dtNo <= 0) { throw new Exception("库存子表数量增加失败!"); } #endregion #region 存入ICSWareHouseLotInfoLog表(日志) sql = @"insert into ICSWareHouseLotInfoLog Values (NEWID(),'{0}','{1}','{2}','{3}','','','{8}','{9}' ,{4},null,'收','点料退料','{5}','{6}',GETDATE(),'{7}','','','','','未回写','','')"; sql = string.Format(sql, TranNo, TranLine, INVCode, o.LotNo, o.LOTQTY, o.MUSER, o.MUSERName, o.WorkPoint, WHCode, NewBinCode); cmd.CommandText = sql; dtNo = cmd.ExecuteNonQuery(); if (dtNo <= 0) { throw new Exception("日志表存入失败!"); } #endregion } //生成U9退料单 #region 接口调用 try { List contextList = new List(); List contextLists = new List(); ServiceCreateRIssue.IssueData context = new ServiceCreateRIssue.IssueData(); ServiceCreateRIssue.IssueLineData contexts = new ServiceCreateRIssue.IssueLineData(); string StackCode = ""; string LLCode = ""; foreach (PickInfoList item in o.PickInfoList) { //context.linelist = contextLists.ToArray(); //contextList.Add(context); context = new ServiceCreateRIssue.IssueData(); StackCode = item.WHCode; LLCode = item.VouchCode; context.LLCode = item.VouchCode;//领料单号 context.DocTypeCode = "2";//类型 context.OrgCode = o.WorkPoint; contextLists = new List(); contexts = new ServiceCreateRIssue.IssueLineData(); contexts.LLLineNO = item.VouchRow;//领料单行号 contexts.ItemCode = item.InvCode;//料号 contexts.ItemQty = item.Quantity;//数量 contexts.WHCode = item.WHCode;//仓库 contexts.LotNO = o.VendorLot;//批号 contextLists.Add(contexts); //if (i == dt.Rows.Count - 1) //{ context.linelist = contextLists.ToArray(); contextList.Add(context); //} } sql = @"UPDATE ICSWareHouseLotInfoLog SET EATTRIBUTE5='已回写' where LotNO ='{0}' AND BusinessCode='点料退料'"; sql = string.Format(sql, o.LotNo); cmd.CommandText = sql; dtNo = cmd.ExecuteNonQuery(); if (dtNo <= 0) { throw new Exception("日志表更新失败!"); } ServiceCreateRIssue.CreateRIssueClient client = new ServiceCreateRIssue.CreateRIssueClient(); ServiceCreateRIssue.CustCreateIssueOperationResult cresult = new ServiceCreateRIssue.CustCreateIssueOperationResult(); cresult = client.CreateIss(contextList.ToArray()); if (cresult.IsSuccess == false) { throw new Exception(cresult.MESSAGE); } } catch (Exception ex) { throw new Exception(ex.Message); } #endregion result.Code = 0; result.ResMsg = "点料退料产生新条码成功"; result.ResData = "{}"; result.IsCompress = false; result.IsSuccess = true; return result; } catch (Exception ex) { result.Code = -1; result.ResMsg = ex.Message; result.ResData = null; result.IsCompress = false; result.IsSuccess = false; StringBuilder str = new StringBuilder(); str.AppendLine("传入条码:" + o.LotNo); str.AppendLine("传入维护人:" + o.MUSER); str.AppendLine("传入维护人名称:" + o.MUSERName); str.AppendLine("传入站点:" + o.WorkPoint); str.AppendLine("传入批次:" + o.VendorLot); str.AppendLine("传入条码数量:" + o.LOTQTY); foreach (PickInfoList item in o.PickInfoList) { str.AppendLine("传入存货编码:" + item.SubInvCode); str.AppendLine("传入工单号:" + item.MOCode); str.AppendLine("传入领料单号:" + item.VouchCode); str.AppendLine("传入供应商编码:" + item.DeleteStatus); str.AppendLine("传入物料编码:" + item.InvCode); str.AppendLine("传入数量:" + item.Quantity); str.AppendLine("传入库房编码:" + item.WHCode); str.AppendLine("传入库位:" + item.BinCode); } str.AppendLine("失败原因:" + ex.Message); Appconfig.WriteLogFile(str.ToString(), "点料退料产生新条码接口日志"); } } conn.Close(); } return result; } /// /// 返回值 /// public class FormICSCreatedArrivalNoticeModel { //0 :正常数据,-1:失败。 public int Code { get; set; } public string ResMsg { get; set; } public object ResData { get; set; } public bool IsCompress { get; set; } public bool IsSuccess { get; set; } } /// /// SQL执行方法 /// /// /// /// public static DataTable SQlReturnData(string SQl, SqlCommand cmd) { DataTable dt = new DataTable(); cmd.CommandText = SQl; SqlDataAdapter dr = new System.Data.SqlClient.SqlDataAdapter(); dr.SelectCommand = cmd; dr.Fill(dt); return dt; } //库位转换 public string fenge(string sourceString) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < sourceString.Length; i++) { if (i == 0 || i == 3) { sb.Append(sourceString[i].ToString()).Append("-"); } else { sb.Append(sourceString[i]); } } return sb.ToString(); } } }