using Newtonsoft.Json;
using Rhea.Common;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Tiger.IBusiness;
using Tiger.Model;
using Tiger.Model.Minsun;
namespace Tiger.Business.WMS
{
public class ProdMaterialReq : IProdMaterialReq
{
///
/// T100推送领料单到WMS
///
///
///
public ApiAction GetMaterialReq(List prd_hs)
{
var action = new ApiAction();
try
{
if (prd_hs.Count > 0)
{
List entity_h = new();
List entity_d = new();
//查询出来的列表
List list_d = new();
DbClient db = Biz.DataSource["WMS57"].Client;
foreach (var item_h in prd_hs)
{
var prd_h = db.Queryable().Where(s => s.BILLCODE == item_h.BILLCODE).Single();
if (prd_h?.STATUS != BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue())
{
prd_h = prd_h ?? new BIZ_ERP_PROD_OUT()
{
STATUS = BIZ_ERP_PROD_OUT.STATUSs.INIT.GetValue(),
BIZTYPE = "1",
};
prd_h.BILLCODE = item_h.BILLCODE;
prd_h.BILLDATE = item_h.BILLDATE??DateTime.MinValue;
prd_h.SOURCETYPE = item_h.SOURCETYPE;
prd_h.STATUS = prd_h.STATUS == BIZ_ERP_PROD_OUT.STATUSs.DELETE.GetValue() ? BIZ_ERP_PROD_OUT.STATUSs.INIT.GetValue() : prd_h.STATUS;
prd_h.REMARK = item_h.REMARK;
prd_h.SOURCECODE = item_h.SOURCECODE;
prd_h.AUTH_ORG = item_h.STRONGHOID;
prd_h.HANDLED = 0;
entity_h.Add(prd_h);
}
}
Logger.Interface.Info($"推送到新数据库,开始保存数据,数量[{entity_h.Count}]");
//保存到数据库
var dbTran = db.UseTran(() =>
{
db.Storageable(entity_h, "T100").ExecuteCommand();
});
if (!dbTran.IsSuccess)
{
action.CatchExceptionWithLog(dbTran.ErrorException, $"数据保存失败");
}
//异步拉取单身列表
GenerateReqDetailNew(prd_hs, db);
}
return action;
}
catch (Exception ex)
{
return action.GetResponse().CatchExceptionWithLog(ex, $"领料单生成异常");
}
}
///
/// 根据领料单头拉单身
///
///
///
///
private static ApiAction GenerateReqDetailNew(List dtls, DbClient db)
{
Thread.Sleep(5000);
var action = new ApiAction();
try
{
Logger.Interface.Info($"推送到新数据库,根据领料单头拉单身开始");
List entity_h = new();
List entity_d = new();
List transferH = new();
List sctrwos = new();
//查询出来的列表
List list_dOld = new();
foreach (var item_h in dtls)
{
var prd_h = db.Queryable().Where(s => s.BILLCODE == item_h.BILLCODE).Single();
if (prd_h?.STATUS != BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue())
{
var list_d = db.Queryable().Where(s => s.BILLCODE == item_h.BILLCODE).ToList();
var item_h_list = new List();
var ret = DI.Resolve().GetMaterialReqDetail(new ReqInputParameter
{
parameter = new reqParameter { sfdcdocno = item_h.BILLCODE },
datakey = new Datakey
{
EntId = item_h.ENTERPRISECODE.ToString(),
CompanyId = item_h.STRONGHOID
}
});
List ret_list = new List();
if (ret.payload.std_data.execution.code != "0")
{
action.IsSuccessed = false;
action.Message = $"错误信息:[{ret.payload.std_data.execution.description}]";
Logger.Default.Info(action.Message);
var dt = DateTime.Now;
while ((dt - DateTime.Now).TotalSeconds < 10)
{
}
var ret1 = DI.Resolve().GetMaterialReqDetail(new ReqInputParameter
{
parameter = new reqParameter { sfdcdocno = item_h.BILLCODE },
datakey = new Datakey
{
EntId = item_h.ENTERPRISECODE.ToString(),
CompanyId = item_h.STRONGHOID
}
});
if (ret1.payload.std_data.execution.code != "0")
{
action.IsSuccessed = false;
action.Message = $"错误信息:[{ret1.payload.std_data.execution.description}]";
Logger.Default.Info(action.Message);
return action;
}
else
{
ret_list = ret1.payload.std_data.parameter.@return;
}
}
else
{
ret_list = ret.payload.std_data.parameter.@return;
}
foreach (var item in ret_list)
{
BIZ_ERP_PROD_OUT_DTL d = new BIZ_ERP_PROD_OUT_DTL
{
BILLCODE = item.sfdcdocno,
BILLLINE = item.sfdcseq,
UNITCODE = item.sfdc006,
ITEM_CODE = item.sfdc004,
PRQTY = Convert.ToDecimal(item.sfdc007),
DELIVERYDATE = Convert.ToDateTime(item.sfdareqdt),
WAREHOUSECODE = item.sfdc012,
SOURCETYPE = Convert.ToInt32(item.sfdc003),
SOURCECODE = item.sfdc001,
SOURCELINE = item.sfdc002,
AUTH_ORG = item_h.STRONGHOID,
};
item_h_list.Add(d);
}
//保存委外工单号对应关系
WMS_SCTRWO_TRANSFER sctr = new WMS_SCTRWO_TRANSFER
{
ID = Guid.NewGuid().ToString("N"),
ORIGINAL_WORKORDER = ret_list[0]?.sfdc001,
TARGET_WORKORDER = ret_list[0]?.sfdc001_1
};
sctrwos.Add(sctr);
action.Message += $",领料单明细获取成功,[{string.Join(",", item_h_list.Select(x => x.BILLCODE + ";" + x.ITEM_CODE).ToList())},获取总数[{item_h_list.Count}],数据库中总数[{list_d.Count}]";
action.Message += $",委外工单,[{string.Join(",", sctrwos.Select(x => x.ORIGINAL_WORKORDER + ";" + x.TARGET_WORKORDER).ToList())}";
if (list_d.Count != item_h_list.Count)
{
foreach (var d in list_d) { d.PRQTY = 0; } //需求数量都弄成0
}
int n = 0;
List prdDList = new List();
foreach (var item_d in item_h_list)
{
//根据单据重新到数据查找相应的单据明细
var prd_d = list_d.Where(s => s.BILLCODE == item_d.BILLCODE && s.BILLLINE == item_d.BILLLINE).FirstOrDefault();
prd_d = prd_d ?? new BIZ_ERP_PROD_OUT_DTL()
{
LINESTATUS = BIZ_ERP_PROD_OUT.STATUSs.INIT.GetValue(),
QTY = Convert.ToDecimal(0),
};
prd_d.BILLCODE = item_d.BILLCODE;
prd_d.BILLLINE = item_d.BILLLINE;
prd_d.UNITCODE = item_d.UNITCODE;
prd_d.ITEM_CODE = item_d.ITEM_CODE;
prd_d.PRQTY = Convert.ToDecimal(item_d.PRQTY);
prd_d.DELIVERYDATE = Convert.ToDateTime(item_d.DELIVERYDATE);
prd_d.WAREHOUSECODE = item_d.WAREHOUSECODE;
prd_d.LINESTATUS = prd_d.PRQTY == prd_d.QTY ? BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue() : Convert.ToDecimal(item_d.PRQTY) == 0 ? BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue() : prd_d.LINESTATUS == BIZ_ERP_PROD_OUT.STATUSs.DELETE.GetValue() ? BIZ_ERP_PROD_OUT.STATUSs.INIT.GetValue() : prd_d.LINESTATUS;
prd_d.SOURCETYPE = item_d.SOURCETYPE;
prd_d.SOURCECODE = item_d.SOURCECODE;
prd_d.SOURCELINE = item_d.SOURCELINE;
prd_d.AUTH_ORG = item_d.AUTH_ORG;
list_d.RemoveAll(q => q.BILLCODE == item_d.BILLCODE && q.BILLLINE == item_d.BILLLINE);
if (prd_d.LINESTATUS == BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue()) { n++; }
prdDList.Add(prd_d);
entity_d.Add(prd_d);
}
if (prdDList.Count == n) { prd_h.STATUS = BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue(); }
entity_h.Add(prd_h);
list_dOld.AddRange(list_d);
//检查有没有调拨单,有就更新状态为完成
var transferList = db.Queryable().Where(s => s.SOURCECODE == prd_h.BILLCODE).ToList();
if (transferList.Any())
{
foreach (var item in transferList)
{
item.STATUS = BIZ_WMS_TRANSFER.STATUSs.FINISHED.GetValue();
item.SOURCECODE = prd_h.BILLCODE;
transferH.Add(item);
action.Message += $",领料单[{prd_h.BILLCODE}]对应调拨单[{item.BILLCODE}]完成";
}
}
}
}
//保存到数据库
var dbTran = db.UseTran(() =>
{
db.Storageable(entity_h, "T100").ExecuteCommand();
db.Storageable(entity_d, "T100").ExecuteCommand();
if (transferH.Any())
{
db.Updateable(transferH, "T100").ExecuteCommand();
}
if (sctrwos.Any())
{
//db.Insertable(sctrwos).ExecuteCommand();
var y = db.Storageable(sctrwos)
.WhereColumns(t => new { t.ORIGINAL_WORKORDER, t.TARGET_WORKORDER })
.ToStorage();
y.AsInsertable.ExecuteCommand();
y.AsUpdateable.IgnoreColumns(t => t.ID).ExecuteCommand();
}
if (list_dOld.Any())
{
db.Deleteable(list_dOld).ExecuteCommand();
}
});
if (!dbTran.IsSuccess)
{
action.CatchExceptionWithLog(dbTran.ErrorException, $"数据保存失败");
}
//如果未过账则尝试过账
foreach (var reqNo in dtls.Select(x=>x.BILLCODE).ToList())
{
Logger.Interface.Info($"开始检测是否T100重新推过来的领料单[{reqNo}]");
var req = db.Queryable().Where(x => x.BILLCODE == reqNo && x.STATUS == BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue() && SqlFunc.IsNullOrEmpty(x.ERP_BILL_CODE)).First();
var dtlList = db.Queryable().Where(x => x.BILLCODE == reqNo).ToList();
if (req != null && dtlList.Where(x => x.LINESTATUS == BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue()).Count() == dtlList.Count)
{
Logger.Interface.Info($"领料单[{reqNo}]重新过账准备进入过账进程");
iWMS.MaterialReqOldToErpNew(new MReqPostParam() {BillCode = req.BILLCODE, CompanyId=req.AUTH_ORG});
}
}
Logger.Interface.Info(action.Message);
return action;
}
catch (System.Exception ex)
{
return action.GetResponse().CatchExceptionWithLog(ex, $"领料单生成异常");
}
}
///
/// 获取领料单列表
///
///
///
///
public ApiAction> GetProdMaterialReqHeaders(int pageIndex, int pageSize, string orgcode, string billcode)
{
var action = new ApiAction>();
var query = Biz.Db.Queryable().Where(x =>
(x.STATUS == BIZ_ERP_PROD_OUT.STATUSs.INIT.GetValue()
|| x.STATUS == BIZ_ERP_PROD_OUT.STATUSs.WORKING.GetValue())
&& x.AUTH_ORG == orgcode)
.WhereIF(!billcode.IsNullOrEmpty(),x=>x.BILLCODE.Contains(billcode))
.OrderByDescending(x => x.UPDATE_TIME.ToString("yyyy-MM-dd"))
.OrderBy(x => x.REMARK == "L40774" ? 0 : 1)
.OrderBy(x => x.SOURCECODE == null ? 1 : 0)
.OrderBy(x => x.CREATE_TIME)
.ToPage(pageIndex, pageSize);
action.Data = query;
return action;
}
public ApiAction> GetWoReqHeaders(int pageIndex, int pageSize, string orgcode, string billcode)
{
var action = new ApiAction>();
var query = Biz.Db.Queryable().Where(x =>
(x.STATUS == BIZ_ERP_PROD_OUT.STATUSs.INIT.GetValue()
|| x.STATUS == BIZ_ERP_PROD_OUT.STATUSs.WORKING.GetValue())
&& x.AUTH_ORG == orgcode)
.WhereIF(!billcode.IsNullOrEmpty(), x => x.BILLCODE.Contains(billcode))
.OrderByDescending(x => x.UPDATE_TIME.ToString("yyyy-MM-dd"))
.OrderByDescending(x => x.BILLDATE)
.OrderBy(x => new { x.CREATE_TIME, x.BILLCODE })
.ToPage(pageIndex, pageSize);
action.Data = query;
return action;
}
///
/// 调拨出库明细
///
///
///
///
///
///
public ApiAction> GetOutTransferHeaders(int pageIndex, int pageSize, string orgcode, string billcode)
{
var action = new ApiAction>();
var query = Biz.Db.Queryable().Where(x =>
(x.STATUS == BIZ_WMS_TRANSFER.STATUSs.INIT.GetValue()
|| x.STATUS == BIZ_WMS_TRANSFER.STATUSs.MANUAL.GetValue()
|| x.STATUS == BIZ_WMS_TRANSFER.STATUSs.WORKING.GetValue())
&& x.AUTH_ORG == orgcode)
.WhereIF(!billcode.IsNullOrEmpty(), x => x.BILLCODE.Contains(billcode))
.OrderByDescending(x => x.UPDATE_TIME.ToString("yyyy-MM-dd"))
//.OrderBy(x => x.REMARK == "L40774" ? 0 : 1)
//.OrderBy(x => x.SOURCECODE == null ? 1 : 0)
.OrderByDescending(x => x.BILLDATE)
.OrderBy(x => new { x.CREATE_TIME, x.BILLCODE})
//.OrderBy(x => x.CREATE_TIME)
.ToPage(pageIndex, pageSize);
action.Data = query;
return action;
}
///
/// 领料单过账到T100
///
///
///
public ApiAction MaterialReqToErp(MReqPostParam param)
{
var action = new ApiAction();
Work.DoAsync(() =>
{
Thread.Sleep(3000);
try
{
BIZ_ERP_PROD_OUT entity_h = Biz.Db.Queryable().Where(x => x.BILLCODE == param.BillCode && x.ERP_BILL_CODE == null).First();
List entity_d = Biz.Db.Queryable().Where(x => x.BILLCODE == param.BillCode && Convert.ToInt32(x.PRQTY) != 0).ToList();
List details = new List();
foreach (var item in entity_d)
{
//计算数量
var qty = item.QTY > item.PRQTY ? item.PRQTY.ToString() : item.QTY.ToString();
details.Add(new Detail5
{
sfdcseq = item.BILLLINE.ToString(),
sfdc001 = item.SOURCECODE,
sfdc002 = item.SOURCELINE.ToString(),
sfdc003 = item.SOURCETYPE.ToString(),
sfdc007 = qty,
});
}
var ret = ErpT100.MaterialReqToErp(new ReqErpInputParameter
{
parameter = new Parameter4
{
sfdatype = entity_h.SOURCETYPE.ToString(),
sfdadocno = entity_h.BILLCODE,
detail = details
},
datakey = new Datakey
{
EntId = "88", //ApiConfig.IsTestServer ? "108" : "88",
CompanyId = param.CompanyId
}
});
if (ret.payload.std_data.execution.code == "0") //成功
{
entity_h.ERP_BILL_CODE = ret.payload.std_data.parameter.docno;
entity_h.UPDATE_TIME = DateTime.Now;
action.Message += $"{action.Message.IsNullOrEmpty("", ";")}{ret.payload.std_data.execution.description},返回的ERP_BILL_CODE:[{ret.payload.std_data.parameter.docno}]";
Logger.Interface.Info(action.Message);
}
else //失败
{
action.IsSuccessed = false;
action.Message += $",领料单{entity_h.BILLCODE}过账失败,返回的信息:{ret.payload.std_data.execution.description}";
Logger.Interface.Error(action.Message);
//return action;
}
//数据库处理操作
DbClient db = Business.Biz.Db;
if (action.IsSuccessed)
{
action.Message += $",领料单{entity_h.BILLCODE}过账成功";
var dbTran = db.UseTran(() =>
{
db.Updateable(entity_h).ExecuteCommand();
db.Updateable(entity_d).ExecuteCommand();
});
if (!dbTran.IsSuccess)
{
action.CatchExceptionWithLog(dbTran.ErrorException, $"数据处理失败");
}
}
Logger.Interface.Info(action.Message);
//return action;
}
catch (Exception ex)
{
action.GetResponse().CatchExceptionWithLog(ex, $"发料单过账异常");
}
});
return action;
}
}
}