using Dapper; using Estsh.Core.Dapper; using Estsh.Core.IRepositories; using Estsh.Core.Model.Result; using Estsh.Core.Models; using Estsh.Core.Repository.IRepositories; using System.Collections; using System.Data; using System.Text; /*************************************************************************************************** * * 更新人:sitong.dong * 描述:采购周计划导入数据访问类 * 修改时间:2022.06.22 * 修改日志:系统迭代升级 * **************************************************************************************************/ namespace Estsh.Core.Repositories { /// /// 处理采购周计划导入模块的业务数据 /// public class PurchaseNoteRepository : BaseRepository, IPurchaseNoteRepository { public PurchaseNoteRepository(DapperDbContext _dapperDbContext) : base(_dapperDbContext) { } #region 成员方法 /// /// 返回服务日期及时间,返回时格式化 /// /// 返回的类型 /// public string GetServerDateTime(string flag) { using (IDbConnection dbConn = dapperDbContext.GetDbConnection()) { dbConn.Open(); //default style string serverDateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss").Replace("-", "/"); switch (flag.ToUpper().Replace(" ", "")) { case "YMD": return serverDateTime.Substring(0, 10); //style:yyyy/MM/dd case "HMS": return serverDateTime.Substring(11); //style:HH:mm:ss case "YY": return serverDateTime.Substring(2, 2); //style:yy(年前两位) case "YYYY": return serverDateTime.Substring(0, 4); //style:yyyy } return serverDateTime; } } #region Multilple sheet import DB operat method /// /// Query supplier base information /// /// supplier code /// public List QuerySupplierInfo(string vendorCode) { using (IDbConnection dbConn = dapperDbContext.GetDbConnection()) { dbConn.Open(); StringBuilder sbSql = new StringBuilder(1024); sbSql.Remove(0, sbSql.Length); sbSql.Append("SELECT TOP 1 vendor_id,vendor_code,vendor_name,vendor_sale,vendor_tel"); sbSql.Append(",vendor_fax,vendor_mtel,vendor_addr,vendor_mail,vendor_pwd,is_print,guid "); sbSql.Append(" FROM sys_vendor (NOLOCK) WHERE vendor_code=@vendorCode AND enabled='Y'"); DynamicParameters param = new DynamicParameters(); param.Add("@vendorCode", vendorCode); List result = dbConn.Query(sbSql.ToString(), param).ToList(); return result; } } /// /// 查询下单员信息 /// /// 上单员姓名 /// public List QueryOrderInfo(string orderName) { using (IDbConnection dbConn = dapperDbContext.GetDbConnection()) { dbConn.Open(); string strSql = "SELECT TOP 1 iss_id,iss_addr,iss_name,iss_tel,iss_mtel,iss_fax,iss_mail,iss_no " + " FROM sys_issuser (NOLOCK) WHERE iss_name=@issName AND enabled='Y'"; DynamicParameters param = new DynamicParameters(); param.Add("@issName", orderName); List result = dbConn.Query(strSql, param).ToList(); return result; } } /// /// 获取服务器日期、时间 /// /// 返回类型标志 /// public string GetApDateTime(int flag) { using (IDbConnection dbConn = dapperDbContext.GetDbConnection()) { dbConn.Open(); string sql = "SELECT CONVERT(VARCHAR(10),GETDATE(),111) AS ap_datetime"; if (flag > 0) { sql = "SELECT CONVERT(VARCHAR(10),GETDATE(),108) AS ap_datetime"; } List result = dbConn.Query(sql).ToList(); if (result.Count < 1) { return ""; } return result[0].ap_datetime; } } /// /// 查询零件行ID /// /// 零件号 /// public string QueryPartId(string partNo) { using (IDbConnection dbConn = dapperDbContext.GetDbConnection()) { dbConn.Open(); string sql = "SELECT TOP 1 part_id FROM sys_part (NOLOCK) WHERE part_no=@partNo AND enabled='Y'"; DynamicParameters param = new DynamicParameters(); param.Add("@partNo", partNo); object obj = dbConn.ExecuteScalar(sql, param); if (obj == null) { return string.Empty; } return obj.ToString(); } } /// /// 查询零件标准包装 /// /// 零件行ID /// public int QueryPartSnp(string partId) { using (IDbConnection dbConn = dapperDbContext.GetDbConnection()) { dbConn.Open(); string sql = "SELECT TOP 1 default_box_qty FROM sys_part (NOLOCK) WHERE part_id=@partId AND enabled='Y'"; DynamicParameters param = new DynamicParameters(); param.Add("@partId", partId); object obj = dbConn.ExecuteScalar(sql, param); if (obj == null) { return -1; } int iReturn = 0; try { iReturn = (int)Convert.ToDouble(obj.ToString()); } catch { return -1; } return iReturn; } } /// /// 查询项目ID /// /// 项目(车型)代码 /// public string QueryItemId(string itemNo) { using (IDbConnection dbConn = dapperDbContext.GetDbConnection()) { dbConn.Open(); string sql = "SELECT TOP 1 type_id FROM sys_model_type (NOLOCK) WHERE REPLACE(type_name,' ','')=@item_no and enabled='Y'"; DynamicParameters param = new DynamicParameters(); param.Add("@item_no", itemNo); object obj = dbConn.ExecuteScalar(sql, param); if (obj == null) { return ""; } return obj.ToString(); } } /// /// 验证采购单是否匹配 /// /// 采购单号 /// 零件号 /// public bool ValidatePurNo(string purNo, string partNo) { using (IDbConnection dbConn = dapperDbContext.GetDbConnection()) { dbConn.Open(); //更新sys_base增加WMS接口程序是否开启状态(工厂如未开通,则不验证) string sql = "SELECT TOP 1 param_value FROM sys_base (NOLOCK) WHERE param_name='WMSInterfaceEnabled'"; object obj = dbConn.ExecuteScalar(sql); if (obj != null && obj.ToString().ToUpper() == "Y") { sql = "SELECT TOP 1 xw_pod_part FROM xw_pod_det(NOLOCK) WHERE xw_pod_nbr=@purNo AND xw_pod_part=@partNo"; DynamicParameters param = new DynamicParameters(); param.Add("@purNo", purNo); param.Add("@partNo", partNo); obj = dbConn.ExecuteScalar(sql, param); if (obj == null) { return false; } } } return true; } /// /// 查询工厂ID /// /// public string GetFactoryId(int userID) { using (IDbConnection dbConn = dapperDbContext.GetDbConnection()) { dbConn.Open(); string sql = "SELECT TOP 1 factory_id FROM sys_emp (NOLOCK) WHERE emp_id=@userId AND enabled='Y'"; DynamicParameters param = new DynamicParameters(1); param.Add("@userId", userID); object obj = dbConn.ExecuteScalar(sql, param); if (obj == null) { return ""; } return obj.ToString(); } } /// /// 获取单据码 /// /// 单据号类型 /// 前缀 /// public string GetOrderNo(string item, string prefix) { using (IDbConnection dbConn = dapperDbContext.GetDbConnection()) { dbConn.Open(); DynamicParameters list = new DynamicParameters(); list.Add("@order_type", item); list.Add("@order_prefix", prefix); list.Add("@order_no", null, DbType.String, ParameterDirection.Output, 50); var hashtable = dbConn.Execute("sys_create_orderno", list, commandType: CommandType.StoredProcedure); string result = list.Get("@order_no"); return result; } } /// /// 保存采购单数据并转结日程单条码 /// /// public string DataSaveTransact(DataTable dtWeekSchedule, DataTable dtDaySchedule,int userID) { using (IDbConnection dbConn = dapperDbContext.GetDbConnection()) { dbConn.Open(); if (dtWeekSchedule == null || dtWeekSchedule.Rows.Count < 1) { return "周计划表头数据读取错误,请确认文件格式!"; } if (dtDaySchedule == null || dtDaySchedule.Rows.Count < 1) { return "周计划表身数据读取错误,请确认文件格式!"; } IDbTransaction transaction = dbConn.BeginTransaction(); StringBuilder sql = new StringBuilder(1024); try { string saveDate = GetServerDateTime("YMD"); sql.Remove(0, sql.Length); sql.Append("SELECT RIGHT(CAST(COUNT(DISTINCT iss_seq)+10001 AS VARCHAR(5)),3) FROM g_buy_weekly WHERE create_time=@create_time"); DynamicParameters param = new DynamicParameters(); param.Add("@create_time", saveDate); string strSeq = dbConn.ExecuteScalar(sql.ToString(), param, transaction).ToString(); if (string.IsNullOrEmpty(strSeq)) { transaction.Rollback(); return "周计划单导入次序查询失败!"; } transaction.Commit(); strSeq = saveDate.Replace("/", "") + "-" + strSeq; foreach (DataRow drWeek in dtWeekSchedule.Rows) { string strSeNo = GetOrderNo("BuyWeekOrder", "WR");//weekly order no if (string.IsNullOrEmpty(strSeNo)) { transaction.Rollback(); return "周计划单据号获取错误!"; } string factoryId = drWeek["wa_no"].ToString(); string strSuNo = drWeek["su_no"].ToString(); string strVendorId = drWeek["vendor_id"].ToString(); DataRow[] drs = dtDaySchedule.Select("vendor_id='" + strVendorId + "'"); if (drs.Length < 1) { continue; } List sqlStrings = new List(); List parameters = new List(); //添加采购订单周计划表头 sql.Remove(0, sql.Length); sql.Append("INSERT INTO g_buy_weekly (order_no,weekly_no,buy_no,vendor_id,iss_id,iss_date,iss_seq,factory_id "); sql.Append(",enabled,create_userid, create_time) VALUES (@order_no,@weekly_no,@buy_no,@vendor_id,@iss_id,@iss_date "); sql.Append(",@iss_seq,@factory_id,@enabled,@user_id, CONVERT(varchar(50), GETDATE(), 21))"); param = new DynamicParameters(); param.Add("@order_no", strSeNo); param.Add("@weekly_no", drWeek["se_week"].ToString()); param.Add("@buy_no", drWeek["ch_no"].ToString()); param.Add("@vendor_id", strVendorId); param.Add("@iss_id", drWeek["iss_id"].ToString()); param.Add("@iss_date", drWeek["se_date"].ToString()); param.Add("@iss_seq", strSeq); param.Add("@factory_id", drWeek["wa_no"].ToString()); param.Add("@enabled", "Y"); param.Add("@user_id", userID); sqlStrings.Add(sql.ToString()); parameters.Add(param); //_remotingClone.ExecuteNonQuery(sql.ToString(), param); //按供应商添加每次提交的日程单数据 foreach (DataRow drDay in drs) { sql.Remove(0, sql.Length); sql.Append("INSERT INTO g_ht_buy_day (order_no,type_id,buy_no,vendor_id,se_date,se_time,part_id,qty,snp_qty "); sql.Append(",carton_qty,iss_seq,factory_id,enabled,create_userid, create_time) VALUES (@order_no "); sql.Append(",@type_id,@buy_no,@vendor_id,@se_date,@se_time,@part_id,@qty,@snpQty "); sql.Append(",@carton_qty,@iss_seq,@factory_id,@enabled,@user_id, CONVERT(varchar(50), GETDATE(), 21))"); param = new DynamicParameters(); param.Add("@order_no", strSeNo); param.Add("@type_id", drDay["type_id"].ToString()); param.Add("@buy_no", drDay["ch_no"].ToString()); param.Add("@vendor_id", strVendorId); param.Add("@se_date", drDay["se_date"].ToString()); param.Add("@se_time", drDay["se_time"].ToString()); param.Add("@part_id", drDay["part_id"].ToString()); param.Add("@qty", drDay["qty"].ToString()); param.Add("@snpQty", drDay["snp_qty"].ToString()); param.Add("@carton_qty", drDay["carton_qty"].ToString()); param.Add("@iss_seq", strSeq); param.Add("@factory_id", factoryId); param.Add("@enabled", "Y"); param.Add("@user_id", userID); sqlStrings.Add(sql.ToString()); parameters.Add(param); //_remotingClone.ExecuteNonQuery(sql.ToString(), param); } //清除日程单导入汇总表中数据,只保留最后一次导入数据(按供应商及本次导入的所含的日期) sql.Remove(0, sql.Length); sql.Append("update g_buy_day set Enabled='N' WHERE vendor_id=@vendor_id AND se_date IN (SELECT DISTINCT se_date FROM g_ht_buy_day "); sql.Append(" WHERE vendor_id=@vendor_id AND order_no=@order_no AND iss_seq=@iss_seq) AND type_id IN (SELECT DISTINCT "); sql.Append(" type_id FROM g_ht_buy_day WHERE vendor_id=@vendor_id AND order_no=@order_no AND iss_seq=@iss_seq)"); param = new DynamicParameters(); param.Add("@vendor_id", strVendorId); param.Add("@order_no", strSeNo); param.Add("@iss_seq", strSeq); sqlStrings.Add(sql.ToString()); parameters.Add(param); //_remotingClone.ExecuteNonQuery(sql.ToString(), param); //将本次提交数据更新至采购日程数据表中 foreach (DataRow drDay in drs) { sql.Remove(0, sql.Length); sql.Append("INSERT INTO g_buy_day (order_no,type_id,buy_no,vendor_id,se_date,se_time,part_id,qty,snp_qty "); sql.Append(",carton_qty,iss_seq,factory_id,enabled,create_userid, create_time) VALUES (@order_no "); sql.Append(",@type_id,@buy_no,@vendor_id,@se_date,@se_time,@part_id,@qty,@snpQty "); sql.Append(",@carton_qty,@iss_seq,@factory_id,@enabled,@user_id, CONVERT(varchar(50), GETDATE(), 21))"); param = new DynamicParameters(); param.Add("@order_no", strSeNo); param.Add("@type_id", drDay["type_id"].ToString()); param.Add("@buy_no", drDay["ch_no"].ToString()); param.Add("@vendor_id", strVendorId); param.Add("@se_date", drDay["se_date"].ToString()); param.Add("@se_time", drDay["se_time"].ToString()); param.Add("@part_id", drDay["part_id"].ToString()); param.Add("@qty", drDay["qty"].ToString()); param.Add("@snpQty", drDay["snp_qty"].ToString()); param.Add("@carton_qty", drDay["carton_qty"].ToString()); param.Add("@iss_seq", strSeq); param.Add("@factory_id", factoryId); param.Add("@enabled", "Y"); param.Add("@user_id", userID); sqlStrings.Add(sql.ToString()); parameters.Add(param); //_remotingClone.ExecuteNonQuery(sql.ToString(), param); } // Batch Execute for (int i = 0; i < sqlStrings.Count; i++) { dbConn.Execute(sqlStrings[i], parameters[i], transaction); transaction.Commit(); } sql.Remove(0, sql.Length); sql.Append("SELECT type_id,se_date,part_id,RIGHT(REPLACE(se_date,'/',''),6) AS lot_no,SUM(qty) AS qty,buy_no "); sql.Append(" ,(SELECT TOP 1 part_no FROM sys_part (NOLOCK) WHERE part_id=a.part_id) AS part_no "); sql.Append(" ,(SELECT TOP 1 buy_no FROM g_buy_day (NOLOCK) WHERE type_id=a.type_id AND se_date=a.se_date AND part_id=a.part_id) AS buy_no "); sql.Append(",snp_qty,SUM(carton_qty) AS carton_qty FROM g_buy_day AS a WHERE vendor_id=@vendor_id AND order_no=@order_no "); sql.Append(" AND iss_seq=@iss_seq GROUP BY type_id,se_date,part_id,snp_qty,buy_no ORDER BY type_id,se_date,part_id"); param = new DynamicParameters(); param.Add("@vendor_id", strVendorId); param.Add("@order_no", strSeNo); param.Add("@iss_seq", strSeq); List dtCalc = dbConn.Query(sql.ToString(), param).ToList(); if (dtCalc == null || dtCalc.Count < 1) { continue; } sqlStrings = new List(); parameters = new List(); string dayOrderNo = string.Empty; string sSeDate = string.Empty; foreach (GBuyDay drCalc in dtCalc) { int iSnpQty = drCalc.SnpQty; int iBoxQty = 0; int iRema = 0; int iDiffQty = 0; if (sSeDate != drCalc.SeDate) { //dayOrderNo = "DR" + drCalc["se_date"].ToString().Replace("/", ""); dayOrderNo = GetOrderNo("BuyDayOrder", "PR"); sSeDate = drCalc.SeDate; } sql.Remove(0, sql.Length); sql.Append("SELECT TOP 1 qty,snp_qty,carton_qty,is_closed FROM g_buy_day_fact (NOLOCK) "); sql.Append(" WHERE type_id=@type_id AND se_date=@se_date AND part_id=@part_id AND vendor_id=@vendor_id "); param = new DynamicParameters(); param.Add("@type_id", drCalc.TypeId.ToString()); param.Add("@se_date", drCalc.SeDate.ToString()); param.Add("@part_id", drCalc.PartId.ToString()); param.Add("@vendor_id", strVendorId); List dtDayFact = dbConn.Query(sql.ToString(), param).ToList(); if (dtDayFact == null || dtDayFact.Count < 1) { sql.Remove(0, sql.Length); sql.Append("INSERT INTO g_buy_day_fact (order_no,weekly_order_no,type_id,buy_no,vendor_id,se_date,part_id,lot_no "); sql.Append(" ,qty,snp_qty,carton_qty,rec_qty,rec_carton_qty,diff_qty,status,is_closed,type,factory_id,enabled,create_userid, create_time) "); sql.Append(" VALUES (@order_no,@weekly_order_no,@type_id,@buy_no,@vendor_id,@se_date,@part_id,@lot_no "); sql.Append(" ,@qty,@snpQty,@carton_qty,'0','0',@qty,@status,@is_closed,@type,@factory_id,@enabled,@user_id, CONVERT(varchar(50), GETDATE(), 21))"); param = new DynamicParameters(); param.Add("@order_no", dayOrderNo); param.Add("@weekly_order_no", strSeNo); param.Add("@type_id", drCalc.TypeId.ToString()); param.Add("@buy_no", drCalc.BuyNo.ToString()); param.Add("@vendor_id", strVendorId); param.Add("@se_date", drCalc.SeDate.ToString()); param.Add("@part_id", drCalc.PartId.ToString()); param.Add("@lot_no", drCalc.SeDate.ToString().Replace("/", "").Substring(2)); param.Add("@qty", drCalc.Qty.ToString()); param.Add("@snpQty", drCalc.SnpQty.ToString()); param.Add("@carton_qty", drCalc.CartonQty.ToString()); param.Add("@status", "0"); param.Add("@is_closed", "N"); param.Add("@type", "0"); param.Add("@factory_id", factoryId); param.Add("@enabled", "Y"); param.Add("@user_id", userID); //_remotingClone.ExecuteNonQuery(sql.ToString(), param); sqlStrings.Add(sql.ToString()); parameters.Add(param); iDiffQty = Convert.ToInt32(drCalc.Qty.ToString()); iBoxQty = (int)Math.Ceiling(Convert.ToDouble(iDiffQty) / iSnpQty); iRema = iDiffQty % iSnpQty; } else { int iCalcQty = Convert.ToInt32(drCalc.Qty.ToString()); int iFactQty = Convert.ToInt32(dtDayFact[0].Qty.ToString()); iDiffQty = iCalcQty - iFactQty; if (iDiffQty > 0) { sql.Remove(0, sql.Length); sql.Append("UPDATE g_buy_day_fact SET qty=@qty,carton_qty=@carton_qty,diff_qty=@diff_qty "); sql.Append(" WHERE type_id=@type_id AND se_date=@se_date AND part_id=@part_id "); param = new DynamicParameters(); param.Add("@qty", drCalc.Qty.ToString()); param.Add("@carton_qty", drCalc.CartonQty.ToString()); param.Add("@diff_qty", iDiffQty.ToString()); param.Add("@type_id", drCalc.TypeId.ToString()); param.Add("@se_date", drCalc.SeDate.ToString()); param.Add("@part_id", drCalc.PartId.ToString()); //_remotingClone.ExecuteNonQuery(sql.ToString(), param); sqlStrings.Add(sql.ToString()); parameters.Add(param); iBoxQty = (int)Math.Ceiling(Convert.ToDouble(iDiffQty) / iSnpQty); iRema = iDiffQty % iSnpQty; } else { sql.Remove(0, sql.Length); sql.Append("UPDATE g_buy_day_fact SET diff_qty=@diff_qty "); sql.Append(" WHERE type_id=@type_id AND se_date=@se_date AND part_id=@part_id "); param = new DynamicParameters(); param.Add("@diff_qty", iDiffQty.ToString()); param.Add("@type_id", drCalc.TypeId.ToString()); param.Add("@se_date", drCalc.SeDate.ToString()); param.Add("@part_id", drCalc.PartId.ToString()); //_remotingClone.ExecuteNonQuery(sql.ToString(), param); sqlStrings.Add(sql.ToString()); parameters.Add(param); } } if (iDiffQty > 0 && iBoxQty > 0) { sql.Remove(0, sql.Length); sql.Append("SELECT TOP 1 RIGHT(carton_no,3) AS carton_no,lot_no FROM sys_stock WHERE 1=1 "); sql.Append(" AND se_date=@se_date AND part_id=@part_id ORDER BY carton_no DESC"); param = new DynamicParameters(); param.Add("@type_id", drCalc.TypeId.ToString()); param.Add("@se_date", drCalc.SeDate.ToString()); param.Add("@part_id", drCalc.PartId.ToString()); int iLastQty = 0; string strLotNo = string.Empty; List dtCarton = dbConn.Query(sql.ToString(), param).ToList(); if (dtCarton == null || dtCarton.Count < 1) { strLotNo = drCalc.SeDate.ToString().Replace("/", "").Substring(2); } else { iLastQty = Convert.ToInt32(dtCarton[0].CartonNo.ToString()); strLotNo = dtCarton[0].LotNo.ToString(); } for (int i = 1; i <= iBoxQty; i++) { iLastQty++; string strCartonNo = GetCartonNo(drCalc.PartNo.ToString(), strLotNo, iLastQty); string strCartonQty = iSnpQty.ToString(); if (i == iBoxQty && iRema > 0) { strCartonQty = iRema.ToString(); } sql.Remove(0, sql.Length); sql.Append("INSERT INTO sys_stock (order_no,weekly_order_no,type_id,buy_no,vendor_id,se_date,part_id "); sql.Append(" ,carton_no,lot_no,qty,snp_qty,plan_qty,status,iss_seq,group_no,factory_id,enabled,create_userid, create_time) "); sql.Append(" VALUES (@order_no,@weekly_order_no,@type_id,@buy_no,@vendor_id,@se_date,@part_id "); sql.Append(" ,@carton_no,@lot_no,@qty,@snpQty,@qty,@status,@iss_seq,@groupNo,@factory_id,@enabled,@user_id, CONVERT(varchar(50), GETDATE(), 21))"); param = new DynamicParameters(); param.Add("@order_no", dayOrderNo); param.Add("@weekly_order_no", strSeNo); param.Add("@type_id", drCalc.TypeId.ToString()); param.Add("@buy_no", drCalc.BuyNo.ToString()); param.Add("@vendor_id", strVendorId); param.Add("@se_date", drCalc.SeDate.ToString()); param.Add("@part_id", drCalc.PartId.ToString()); param.Add("@carton_no", strCartonNo); param.Add("@lot_no", strLotNo); param.Add("@qty", strCartonQty); param.Add("@snpQty", iSnpQty.ToString()); param.Add("@status", "A"); param.Add("@iss_seq", strSeq); param.Add("@groupNo", ""); param.Add("@factory_id", factoryId); param.Add("@enabled", "Y"); param.Add("@user_id", userID); //_remotingClone.ExecuteNonQuery(sql.ToString(), param); sqlStrings.Add(sql.ToString()); parameters.Add(param); } } } for (int i = 0; i < sqlStrings.Count; i++) { dbConn.Execute(sqlStrings[i], parameters[i], transaction); } } transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); return "周计划订单数据保存失败!\r\n" + ex.Message; } return ""; } } /// /// 箱条码生成(零件号(18)+批号(6)+流水号(3)) /// /// 零件号 /// 批号 /// 流水号 /// public string GetCartonNo(string partNo, string lotNo, int seq) { using (IDbConnection dbConn = dapperDbContext.GetDbConnection()) { dbConn.Open(); string strCartonNo = partNo + "000000000000000000"; strCartonNo = strCartonNo.Substring(0, 18) + lotNo; string strSeq = "000" + seq.ToString(); return strCartonNo + strSeq.Substring(strSeq.Length - 3); } } #endregion #endregion 成员方法 } }