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
|
{
|
/// <summary>
|
/// T100推送领料单到WMS
|
/// </summary>
|
/// <param name="prd_hs"></param>
|
/// <returns></returns>
|
public ApiAction GetMaterialReq(List<Model.Minsun.WMS_PRDPICK_H> prd_hs)
|
{
|
var action = new ApiAction();
|
try
|
{
|
if (prd_hs.Count > 0)
|
{
|
List<BIZ_ERP_PROD_OUT> entity_h = new();
|
List<BIZ_ERP_PROD_OUT_DTL> entity_d = new();
|
//查询出来的列表
|
List<BIZ_ERP_PROD_OUT_DTL> list_d = new();
|
DbClient db = Biz.DataSource["WMS57"].Client;
|
foreach (var item_h in prd_hs)
|
{
|
var prd_h = db.Queryable<BIZ_ERP_PROD_OUT>().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, $"领料单生成异常");
|
}
|
}
|
|
/// <summary>
|
/// 根据领料单头拉单身
|
/// </summary>
|
/// <param name="dtls"></param>
|
/// <param name="db"></param>
|
/// <returns></returns>
|
private static ApiAction GenerateReqDetailNew(List<WMS_PRDPICK_H> dtls, DbClient db)
|
{
|
Thread.Sleep(5000);
|
var action = new ApiAction();
|
try
|
{
|
Logger.Interface.Info($"推送到新数据库,根据领料单头拉单身开始");
|
List<BIZ_ERP_PROD_OUT> entity_h = new();
|
List<BIZ_ERP_PROD_OUT_DTL> entity_d = new();
|
List<BIZ_WMS_TRANSFER> transferH = new();
|
List<WMS_SCTRWO_TRANSFER> sctrwos = new();
|
//查询出来的列表
|
List<BIZ_ERP_PROD_OUT_DTL> list_dOld = new();
|
foreach (var item_h in dtls)
|
{
|
var prd_h = db.Queryable<BIZ_ERP_PROD_OUT>().Where(s => s.BILLCODE == item_h.BILLCODE).Single();
|
if (prd_h?.STATUS != BIZ_ERP_PROD_OUT.STATUSs.COMPLETE.GetValue())
|
{
|
var list_d = db.Queryable<BIZ_ERP_PROD_OUT_DTL>().Where(s => s.BILLCODE == item_h.BILLCODE).ToList();
|
|
var item_h_list = new List<BIZ_ERP_PROD_OUT_DTL>();
|
var ret = DI.Resolve<IErpT100>().GetMaterialReqDetail(new ReqInputParameter
|
{
|
parameter = new reqParameter { sfdcdocno = item_h.BILLCODE },
|
datakey = new Datakey
|
{
|
EntId = item_h.ENTERPRISECODE.ToString(),
|
CompanyId = item_h.STRONGHOID
|
}
|
});
|
List<reqParameterReturn> ret_list = new List<reqParameterReturn>();
|
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<IErpT100>().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<BIZ_ERP_PROD_OUT_DTL> prdDList = new List<BIZ_ERP_PROD_OUT_DTL>();
|
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<BIZ_WMS_TRANSFER>().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<BIZ_ERP_PROD_OUT>().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<BIZ_ERP_PROD_OUT_DTL>().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, $"领料单生成异常");
|
}
|
}
|
|
/// <summary>
|
/// 获取领料单列表
|
/// </summary>
|
/// <param name="pageIndex"></param>
|
/// <param name="pageSize"></param>
|
/// <returns></returns>
|
public ApiAction<PageAble<BIZ_ERP_PROD_OUT>> GetProdMaterialReqHeaders(int pageIndex, int pageSize, string orgcode, string billcode)
|
{
|
var action = new ApiAction<PageAble<BIZ_ERP_PROD_OUT>>();
|
var query = Biz.Db.Queryable<BIZ_ERP_PROD_OUT>().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<PageAble<BIZ_ERP_PROD_OUT>> GetWoReqHeaders(int pageIndex, int pageSize, string orgcode, string billcode)
|
{
|
var action = new ApiAction<PageAble<BIZ_ERP_PROD_OUT>>();
|
var query = Biz.Db.Queryable<BIZ_ERP_PROD_OUT>().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;
|
}
|
|
/// <summary>
|
/// 调拨出库明细
|
/// </summary>
|
/// <param name="pageIndex"></param>
|
/// <param name="pageSize"></param>
|
/// <param name="orgcode"></param>
|
/// <param name="billcode"></param>
|
/// <returns></returns>
|
public ApiAction<PageAble<BIZ_WMS_TRANSFER>> GetOutTransferHeaders(int pageIndex, int pageSize, string orgcode, string billcode)
|
{
|
var action = new ApiAction<PageAble<BIZ_WMS_TRANSFER>>();
|
var query = Biz.Db.Queryable<BIZ_WMS_TRANSFER>().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;
|
}
|
|
/// <summary>
|
/// 领料单过账到T100
|
/// </summary>
|
/// <param name="param"></param>
|
/// <returns></returns>
|
public ApiAction MaterialReqToErp(MReqPostParam param)
|
{
|
var action = new ApiAction();
|
Work.DoAsync(() =>
|
{
|
Thread.Sleep(3000);
|
try
|
{
|
BIZ_ERP_PROD_OUT entity_h = Biz.Db.Queryable<BIZ_ERP_PROD_OUT>().Where(x => x.BILLCODE == param.BillCode && x.ERP_BILL_CODE == null).First();
|
List<BIZ_ERP_PROD_OUT_DTL> entity_d = Biz.Db.Queryable<BIZ_ERP_PROD_OUT_DTL>().Where(x => x.BILLCODE == param.BillCode && Convert.ToInt32(x.PRQTY) != 0).ToList();
|
List<Detail5> details = new List<Detail5>();
|
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;
|
}
|
}
|
}
|