You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

313 lines
21 KiB
C#

using Dapper;
using Estsh.Core.Base;
using Estsh.Core.Dapper;
using Estsh.Core.Wms.IRepositories;
using Estsh.Core.Model.Result;
using Estsh.Core.Repositories;
using System.Collections;
using System.Data;
using System.Text;
using System.Security.Cryptography;
using System.Text.Json;
using Estsh.Core.Models;
using Newtonsoft.Json.Linq;
using Estsh.Core.Model.EnumUtil;
namespace Estsh.Core.Wms.Repositories
{
public class OutsourceDeductRepository : BaseRepository<BaseEntity>, IOutsourceDeductRepository
{
public OutsourceDeductRepository(DapperDbContext _dapperDbContext) : base(_dapperDbContext)
{
}
/// <summary>
/// 获取待扣减的数据
/// </summary>
/// <returns></returns>
public List<WmsSubcontractData> GetOutsourceDeductInfo()
{
using (IDbConnection dbConn = dapperDbContext.GetDbConnection())
{
//获取关联库存中在线边库的库存信息
StringBuilder SqlStringBuilder = new StringBuilder(1024);
SqlStringBuilder.Append("select top 500 * from wms_subcontract_data (nolock) ");
SqlStringBuilder.Append("where deal_status=10 ");
SqlStringBuilder.Append("order by create_time ");
return dbConn.Query<WmsSubcontractData>(SqlStringBuilder.ToString()).ToList();
}
}
/// <summary>
/// 处理待扣减的数据
/// </summary>
/// <param name="sapSu"></param>
/// <returns></returns>
public bool InsertOutsourceDeductInfo(List<WmsSubcontractData> wmsSubcontracts)
{
using (IDbConnection dbConn = dapperDbContext.GetDbConnection())
{
WmsSubcontractData wmsSubcontract = new WmsSubcontractData();
List<string> sqlList = new List<string>();
List<DynamicParameters> parametersList = new List<DynamicParameters>();
StringBuilder SqlStringBuilder = new StringBuilder(1024);
DynamicParameters parameters = new DynamicParameters();
int firstCount = 0;//初始行
int rowCount = 10000;//前10000行
bool blLoop = true;
while (blLoop)
{
sqlList = new List<string>();
parametersList = new List<DynamicParameters>();
SqlStringBuilder = new StringBuilder(1024);
SqlStringBuilder.Append(" select * from wms_subcontract_data (nolock) where deal_status=10 order by create_time,1 OFFSET " + firstCount + " ROWS FETCH NEXT " + rowCount + " ROWS ONLY ");
List<WmsSubcontractData> wmsSubcontractDatas = dbConn.Query<WmsSubcontractData>(SqlStringBuilder.ToString()).ToList();
for (int i = 0; i < wmsSubcontractDatas.Count; i++)
{
WmsSubcontractData wmsSubcontractData = wmsSubcontractDatas[i];
string partNo = "";
if (wmsSubcontractData.TransCode== 30)
{
SqlStringBuilder = new StringBuilder(1024);
SqlStringBuilder.Append(" select * from wms_outsource_bom (nolock) where part_no='"+ wmsSubcontract.PartNo + "' ");
List<WmsOutsourceBom> wmsOutsourceBoms = dbConn.Query<WmsOutsourceBom>(SqlStringBuilder.ToString()).ToList();
if (wmsOutsourceBoms.Count>0)
{
partNo = wmsOutsourceBoms[0].ItemPartNo;
}
else
{
SqlStringBuilder = new StringBuilder(1024);//更新 已处理扣减数据
SqlStringBuilder.Append(" update wms_subcontract_data set deal_status=@dealStatus,err_msg='委外Bom零件号未维护,请检查!' where ruid=@ruid");
parameters = new DynamicParameters();
parameters.Add("@dealStatus", 30);
parameters.Add("@ruid", wmsSubcontractData.Ruid);
sqlList.Add(SqlStringBuilder.ToString());
parametersList.Add(parameters);
this.ExecuteTransaction(sqlList, parametersList);//执行
return true;
}
}
else
{
partNo = wmsSubcontract.PartNo;
}
SqlStringBuilder = new StringBuilder(1024);
SqlStringBuilder.Append("select * from sys_locate (nolock) where locate_type='90' enabled='Y' and order by create_time ");
List<SysLocate> sysLocates = dbConn.Query<SysLocate>(SqlStringBuilder.ToString()).ToList();
for (int j = 0; j < sysLocates.Count; j++)
{
sqlList = new List<string>();
parametersList = new List<DynamicParameters>();
SqlStringBuilder = new StringBuilder(1024);
SqlStringBuilder.Append("select * from sys_stock (nolock) where part_no='" + partNo + "' and locate_name='" + sysLocates[j].LocateName + "' and qty!=0 and enabled='Y' and order by create_time ");
SysStock stocks = dbConn.Query<SysStock>(SqlStringBuilder.ToString()).FirstOrDefault();
if (stocks != null)
{
decimal remainQty = stocks.Qty - (wmsSubcontractData.Qty - wmsSubcontractData.DealQty == null ? 0 : wmsSubcontractData.DealQty);
decimal handledItemQty = 0;
if (remainQty >= 0)//库存数>=待扣减数
{
SqlStringBuilder = new StringBuilder(1024);//扣减库存数
SqlStringBuilder.Append(" update sys_stock set qty=@qty where ruid=@ruid");
parameters = new DynamicParameters();
parameters.Add("@qty", remainQty);
parameters.Add("@ruid", stocks.Ruid);
//dbConn.Execute(SqlStringBuilder.ToString(),parameters);
sqlList.Add(SqlStringBuilder.ToString());
parametersList.Add(parameters);
SqlStringBuilder = new StringBuilder(1024);//已扣减的数据,写入记录扣减日志表
SqlStringBuilder.Append("INSERT INTO dbo.wms_subcontract_data_log ");
SqlStringBuilder.Append(" (trans_code,part_id,part_no,part_spec,carton_no,qty ");
SqlStringBuilder.Append(" ,unit,vendor_id,vendor_code,ref_order_no ");
SqlStringBuilder.Append(" ,factory_id,factory_code,enabled,create_userid,create_time,guid) ");
SqlStringBuilder.Append(" VALUES(@trans_code,@part_id,@part_no,@part_spec,@carton_no,@qty ");
SqlStringBuilder.Append(" ,@unit,@vendor_id,@vendor_code,@ref_order_no ");
SqlStringBuilder.Append(" ,@factory_id,@factory_code,@enabled,@create_userid,@create_time,@guid) ");
parameters = new DynamicParameters();
parameters.Add("@trans_code", wmsSubcontractData.TransCode);
parameters.Add("@part_id", wmsSubcontractData.PartId);
parameters.Add("@part_no", wmsSubcontractData.PartNo);
parameters.Add("@part_spec", wmsSubcontractData.PartSpec);
parameters.Add("@carton_no", wmsSubcontractData.CartonNo);
parameters.Add("@qty", wmsSubcontractData.Qty);
parameters.Add("@unit", wmsSubcontractData.Unit);
parameters.Add("@vendor_id", wmsSubcontractData.VendorId);
parameters.Add("@vendor_code", wmsSubcontractData.VendorCode);
parameters.Add("@ref_order_no", wmsSubcontractData.RefOrderNo);
parameters.Add("@factory_id", wmsSubcontractData.FactoryId);
parameters.Add("@factory_code", wmsSubcontractData.FactoryCode);
parameters.Add("@enabled", wmsSubcontractData.Enabled);
parameters.Add("@createUserid", 0);
parameters.Add("@createTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
parameters.Add("@guid", Guid.NewGuid().ToString());
sqlList.Add(SqlStringBuilder.ToString());
parametersList.Add(parameters);
SqlStringBuilder = new StringBuilder(1024);//删除已扣减的数据
SqlStringBuilder.Append(" delete from wms_subcontract_data where ruid=@ruid");
parameters = new DynamicParameters();
parameters.Add("@ruid", wmsSubcontractData.Ruid);
sqlList.Add(SqlStringBuilder.ToString());
parametersList.Add(parameters);
this.ExecuteTransaction(sqlList, parametersList);//执行
break;
}
else//库存数<待扣减数
{
SqlStringBuilder = new StringBuilder(1024);//扣减库存数
SqlStringBuilder.Append(" update sys_stock set qty=0 , enabled='N' where ruid=" + stocks.Ruid);
parameters = new DynamicParameters();
parameters.Add("@ruid", wmsSubcontractData.Ruid);
sqlList.Add(SqlStringBuilder.ToString());
parametersList.Add(parameters);
handledItemQty = Convert.ToDecimal(wmsSubcontractData.DealQty == null ? 0 : wmsSubcontractData.DealQty) + stocks.Qty;
SqlStringBuilder = new StringBuilder(1024);//更新 已处理扣减数据
SqlStringBuilder.Append(" update wms_subcontract_data set deal_qty=@dealQty where ruid=@ruid");
parameters = new DynamicParameters();
parameters.Add("@dealQty", handledItemQty);
parameters.Add("@ruid", wmsSubcontractData.Ruid);
sqlList.Add(SqlStringBuilder.ToString());
parametersList.Add(parameters);
this.ExecuteTransaction(sqlList, parametersList);//执行
while (true)
{
sqlList = new List<string>();
parametersList = new List<DynamicParameters>();
SqlStringBuilder = new StringBuilder(1024);
SqlStringBuilder.Append("select * from wms_subcontract_data (nolock) where ruid=" + wmsSubcontractData.Ruid);
WmsSubcontractData wmsSubcontract1 = dbConn.Query<WmsSubcontractData>(SqlStringBuilder.ToString()).FirstOrDefault();
if (wmsSubcontract1.Qty > wmsSubcontract1.DealQty)
{
SqlStringBuilder = new StringBuilder(1024);
SqlStringBuilder.Append("select * from sys_stock (nolock) where part_no='" + partNo + "' and locate_name='" + sysLocates[j].LocateName + "' and qty!=0 and enabled='Y' and order by create_time ");
stocks = dbConn.Query<SysStock>(SqlStringBuilder.ToString()).FirstOrDefault();
if (stocks != null)
{
remainQty = stocks.Qty - (wmsSubcontractData.Qty - wmsSubcontractData.DealQty == null ? 0 : wmsSubcontractData.DealQty);
if (remainQty >= 0)
{
SqlStringBuilder = new StringBuilder(1024);//扣减库存数
SqlStringBuilder.Append(" update sys_stock set qty=@qty where ruid=@ruid");
parameters = new DynamicParameters();
parameters.Add("@qty", remainQty);
parameters.Add("@ruid", stocks.Ruid);
sqlList.Add(SqlStringBuilder.ToString());
parametersList.Add(parameters);
SqlStringBuilder = new StringBuilder(1024);//已扣减的数据,写入记录扣减日志表
SqlStringBuilder.Append("INSERT INTO dbo.wms_subcontract_data_log ");
SqlStringBuilder.Append(" (trans_code,part_id,part_no,part_spec,carton_no,qty ");
SqlStringBuilder.Append(" ,unit,vendor_id,vendor_code,ref_order_no ");
SqlStringBuilder.Append(" ,factory_id,factory_code,enabled,create_userid,create_time,guid) ");
SqlStringBuilder.Append(" VALUES(@trans_code,@part_id,@part_no,@part_spec,@carton_no,@qty ");
SqlStringBuilder.Append(" ,@unit,@vendor_id,@vendor_code,@ref_order_no ");
SqlStringBuilder.Append(" ,@factory_id,@factory_code,@enabled,@create_userid,@create_time,@guid) ");
parameters = new DynamicParameters();
parameters.Add("@trans_code", wmsSubcontractData.TransCode);
parameters.Add("@part_id", wmsSubcontractData.PartId);
parameters.Add("@part_no", wmsSubcontractData.PartNo);
parameters.Add("@part_spec", wmsSubcontractData.PartSpec);
parameters.Add("@carton_no", wmsSubcontractData.CartonNo);
parameters.Add("@qty", wmsSubcontractData.Qty);
parameters.Add("@unit", wmsSubcontractData.Unit);
parameters.Add("@vendor_id", wmsSubcontractData.VendorId);
parameters.Add("@vendor_code", wmsSubcontractData.VendorCode);
parameters.Add("@ref_order_no", wmsSubcontractData.RefOrderNo);
parameters.Add("@factory_id", wmsSubcontractData.FactoryId);
parameters.Add("@factory_code", wmsSubcontractData.FactoryCode);
parameters.Add("@enabled", wmsSubcontractData.Enabled);
parameters.Add("@createUserid", 0);
parameters.Add("@createTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
parameters.Add("@guid", Guid.NewGuid().ToString());
//dbConn.Execute(SqlStringBuilder.ToString(),parameters);
sqlList.Add(SqlStringBuilder.ToString());
parametersList.Add(parameters);
SqlStringBuilder = new StringBuilder(1024);//删除已扣减的数据
SqlStringBuilder.Append(" delete from wms_subcontract_data where ruid=@ruid");
parameters = new DynamicParameters();
parameters.Add("@ruid", wmsSubcontractData.Ruid);
//dbConn.Execute(SqlStringBuilder.ToString(),parameters);
sqlList.Add(SqlStringBuilder.ToString());
parametersList.Add(parameters);
this.ExecuteTransaction(sqlList, parametersList);//执行
break;
}
else
{
SqlStringBuilder = new StringBuilder(1024);//扣减库存数
SqlStringBuilder.Append(" update sys_stock set qty=0 , enabled='N' where ruid=@ruid");
parameters = new DynamicParameters();
parameters.Add("@ruid", wmsSubcontractData.Ruid);
sqlList.Add(SqlStringBuilder.ToString());
parametersList.Add(parameters);
handledItemQty = Convert.ToDecimal(wmsSubcontractData.DealQty == null ? 0 : wmsSubcontractData.DealQty) + stocks.Qty;
SqlStringBuilder = new StringBuilder(1024);//更新 已处理扣减数据
SqlStringBuilder.Append(" update wms_subcontract_data set deal_qty=@dealQty where ruid=@ruid");
parameters = new DynamicParameters();
parameters.Add("@dealQty", handledItemQty);
parameters.Add("@ruid", wmsSubcontractData.Ruid);
sqlList.Add(SqlStringBuilder.ToString());
parametersList.Add(parameters);
this.ExecuteTransaction(sqlList, parametersList);//执行
continue;
}
}
else
{
break;
}
}
else
{
break;
}
}
break;
}
}
}
}
SqlStringBuilder = new StringBuilder(1024);//获取待扣减行数
SqlStringBuilder.Append(" select count(1) as rowsCount from wms_subcontract_data (nolock) where deal_status=10 order by create_time ");
WmsSubcontractData wmsSubcontract2 = dbConn.Query<WmsSubcontractData>(SqlStringBuilder.ToString()).FirstOrDefault();
firstCount += 10000;
if (wmsSubcontract2.RowsCount <= firstCount)//当待扣减库存数据为0或循环行数>=待扣减行数,则跳出循环等待下一次作业
{
break;
}
}
return true;
}
}
}
}