using Microsoft.AspNetCore.Mvc; using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using RB_MES_API.Context; using RB_MES_API.Controllers.Cloud; using RB_MES_API.Models; using RB_MES_API.Models.Cloud; using RB_MES_API.Models.Pangu; using RB_MES_APICore.Models.Pangu; using RB_MES_APICore.Models.Pangu; //using RBMESAPI.Models.Cloud; using RB_MES_APICore.Models.Pangu; //using RBMESAPI.Models.Cloud; using System.Data; using System.Linq; using System.Reflection; using System.Text; // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 namespace RB_MES_API.Controllers { /// /// 专属Enpower的API接口 /// [ApiController] [Route("[controller]")] public class ApiController : ControllerBase { private readonly RBContext _context; private readonly IShareController _shareController; private readonly IKDCloudHttpClient _KdhttpClient; private readonly ILogger _logger; private readonly IChiledSelect _chiledselect; private readonly IKDSqlHelper _kdsqlhelper; ///// ///// 需要查询的请求列表 ///// //private IList queryJsons = new List(); /// /// 构造 /// /// /// /// /// /// /// public ApiController(RBContext context, IShareController shareController, IKDCloudHttpClient kdhttpClient, ILogger logger, IChiledSelect chiledSelect,IKDSqlHelper kdsqlhelper) { _context = context; _shareController = shareController; _KdhttpClient = kdhttpClient; _logger = logger; _chiledselect = chiledSelect; _kdsqlhelper = kdsqlhelper; //_pushmesinterface = pushmesinterface; } private void WritLog(string errstr) { _logger.LogInformation(DateTime.UtcNow.ToLongTimeString() + errstr); } /// /// MES从ERP里查询的JSON结构,逻辑判断符都是‘=’ /// public class GetErpParameters { /// /// 查询类型 /// public string DocType { get; set; } = string.Empty; /// /// 查询参数 /// public Dictionary KeyValues { get; set; } } public class RequestParm { /// /// 接口类型 /// public string DocType { get; set; } = string.Empty; /// /// 发送的内容 /// public object data { get; set; } = new object(); } /// /// 根据SelectClumnConvert创建一个新的空表,准备装返回数据。暂时不用............ /// /// SelectClumnConvert /// private DataTable CreateDatatable(List clumnConvert) { DataTable dataTable = new DataTable(); var selectconvert = clumnConvert .Select(s => new { s.FIndexID, s.FDesTableName }) .DistinctBy(s => new { s.FIndexID, s.FDesTableName }) .OrderBy(s => s.FIndexID) .ToList(); foreach (var selectClumnConvert in selectconvert) { dataTable.Columns.Add(selectClumnConvert.FDesTableName, typeof(string)); } return dataTable; } private string UpdateDataRow_Unit(BD_UNIT unit, DataRow row) { string result = "UPDATE kdCloud_BD_UNIT SET "; string usql = ""; Type type = typeof(BD_UNIT); PropertyInfo[] propertyInfos = type.GetProperties(); for (int i = 0; i < propertyInfos.Length; i++) { PropertyInfo propertyInfo = propertyInfos[i]; string colname = propertyInfo.Name; if (row.Table.Columns.Contains(colname)) { object v= propertyInfo.GetValue(unit, null); if (row[colname].Equals(v)) { string sform =string.Format(colname + "='{0}'",v); usql += usql == "" ? sform : "," + sform; }; } } if (usql != "") { return result + usql + string.Format(" where FUNITID={0}", unit.FUNITID); } return ""; } private void AddDataRow_Unit(BD_UNIT unit, DataTable table) { DataRow row = table.NewRow(); Type type= typeof(BD_UNIT); PropertyInfo[] propertyInfos = type.GetProperties(); for (int i = 0; i < propertyInfos.Length; i++) { PropertyInfo propertyInfo = propertyInfos[i]; string colname=propertyInfo.Name; if (table.Columns.Contains(colname)) { row[colname]=propertyInfo.GetValue(unit, null); } } table.Rows.Add(row); table.AcceptChanges(); } /// /// 云星空计量单位变动反向同步到沃比系统_初始化 /// /// [HttpGet] [Route("UnitChangedinfo")] public async Task UnitChangedinfo() { string messstr = string.Empty; string fileds = "FUNITID,FNumber,FName,FIsBaseUnit,FPrecision,FDocumentStatus,FForbidStatus,FConvertDenominator,FConvertNumerator,FRoundType"; //从云星空中把所有计量单位获取过来 CloudBillQueryJson queryJson = new CloudBillQueryJson() { FieldKeys = fileds, FormId = "BD_UNIT" }; if (!_KdhttpClient.Islogin) { await _KdhttpClient.LoginErp(); } //从云星空查询 string jsonstr = JsonConvert.SerializeObject(queryJson); List Parameters = new List(); Parameters.Add(jsonstr); _KdhttpClient.content = JsonConvert.SerializeObject(Parameters); _KdhttpClient.myurl = LocalStaticRequest.tokenurl + "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc"; //string result = _KdhttpClient.AsyncRequest(); string result = await _KdhttpClient.AsyncClientRequest(); //如果访问正常 if (_KdhttpClient.CloudExecuteQueryStatus(result, ref messstr)) { //将获取到的结果转为List List bDs = _shareController.GetNewObjForChild(fileds, result, ref messstr); //访问接口 UnitChanged(JsonConvert.SerializeObject(bDs)); } if(string.IsNullOrEmpty(messstr)) { //从沃比系统查一下,如果成功了就把所有数据展示出来 DataTable table = GetAllUnit(); //把table转为JSON messstr = JsonConvert.SerializeObject(table); } return messstr; } /// /// 云星空计量单位变动反向同步到沃比系统 /// /// List /// [HttpGet] [Route("UnitChanged")] public BreakData UnitChanged(string data) { BreakData breakData = new BreakData() { Status = false }; string reason=string.Empty; List listunit = _shareController.DataConvertClass(data, ref reason); if(listunit == null) { breakData.Message = reason; return breakData; } DataTable table = GetAllUnit(); DataTable newtb = table.Clone(); StringBuilder stringBuilder = new StringBuilder(); //更新SQL //包裹一个可能产生错误的代码块,以防止将错误返回给了Cloud try { //对比数据,产生增加、更新操作 if (table.Rows.Count > 0) { foreach (BD_UNIT uNIT in listunit) { int id = uNIT.FUNITID; DataRow[] rows = table.Select(string.Format("FUnitID={0}", id)); if (rows.Length > 0) { string usql = UpdateDataRow_Unit(uNIT, rows.FirstOrDefault()!); if (!string.IsNullOrEmpty(usql)) { stringBuilder.Append(usql); } } else { AddDataRow_Unit(uNIT, newtb); } } } else//全是新增 { foreach (BD_UNIT unit in listunit) { AddDataRow_Unit(unit, newtb); } } if (newtb != null) { _kdsqlhelper.InsertBill(newtb, "kdCloud_BD_UNIT", ref reason, false); } if (string.IsNullOrEmpty(reason)) { //确保,就算没法有新行,也会执行 if (stringBuilder.Length > 0) { _kdsqlhelper.ExecuteNonQueryAsync(stringBuilder.ToString(), CommandType.Text, null, ref reason, false); } } if (string.IsNullOrEmpty(reason)) { //清除缓存 CacheHelper.Remove("BD_UNIT"); //重新加入缓存 Thread uthread = new Thread(AddUnitCache); uthread.IsBackground = true; uthread.Start(); breakData.Status = true; } } catch (Exception ex) { reason=ex.Message; //写入错误日志 _shareController._logger(-1, "UnitChanged", reason, data); //throw; } //不需要返回数据包 breakData.Message = reason; return breakData; } private DataTable GetAllUnit() { DataTable table =new DataTable(); string sql = "SELECT * FROM kdCloud_BD_UNIT"; string reason = string.Empty; DataSet dataSet = _kdsqlhelper.GetDataSet(CommandType.Text, sql, null, ref reason); if (dataSet != null) { if (dataSet.Tables.Count > 0) { table = dataSet.Tables[0]; } } return table; } private void AddUnitCache() { DataTable table = CacheHelper.GetCache("BD_UNIT"); if (table == null) { string sql = "SELECT * FROM kdCloud_BD_UNIT WHERE FDocumentStatus=@C AND FForbidStatus=@A"; SqlParameter[] sqlParameters = new SqlParameter[] { new SqlParameter("@C","C"), new SqlParameter("@A","A") }; string reason = string.Empty; DataSet dataSet = _kdsqlhelper.GetDataSet(CommandType.Text, sql, sqlParameters, ref reason); if (dataSet != null) { if (dataSet.Tables.Count > 0) { table = dataSet.Tables[0]; CacheHelper.Set_AbsluteExpire("BD_UNIT", table); } } } } /// /// 从沃比数据库取出计量单位,并封装为List /// /// private List GetUnit() { List list = new List(); string sql = "SELECT * FROM kdCloud_BD_UNIT WHERE FDocumentStatus=@C AND FForbidStatus=@A"; SqlParameter[] sqlParameters = new SqlParameter[] { new SqlParameter("@C","C"), new SqlParameter("@A","A") }; DataTable dataTable; string reason = string.Empty; DataSet dataSet = _kdsqlhelper.GetDataSet(CommandType.Text, sql, sqlParameters, ref reason); if (dataSet != null) { if (dataSet.Tables.Count > 0) { dataTable = dataSet.Tables[0]; list=_shareController.GetClassList(dataTable); } } return list; } /// /// MES下达日计划后,将工单号提交给沃比 /// /// 接口类型 /// 工单 /// [HttpPost] [Route("UpdatePRDMO")] public async Task UpdatePRDMO(string DocType, string data) { //这是测试代码,不管传来什么都替换 BreakData breakData = new BreakData() { Status = false }; string reason = string.Empty; //包裹一个可能产生错误的代码块 try { List mos = _shareController.DataConvertClass(data, ref reason); if (mos == null) { breakData.Message = reason; return JsonConvert.SerializeObject(breakData); } //准备校验星空是否有这些数据 string fieldkeys = "FBillNo,FID,FTreeEntity_FEntryID,FTreeEntity_FSeq"; System.Collections.ArrayList filterstr = new System.Collections.ArrayList(); //组装云星空查询 CloudBillQueryJson queryJson = new CloudBillQueryJson { FilterString = string.Format("({0})",string.Join(") or (", filterstr.ToArray())), FieldKeys = fieldkeys, FormId = "PRD_MO" }; if (!_KdhttpClient.Islogin) { await _KdhttpClient.LoginErp(); } //从云星空查询 string jsonstr = JsonConvert.SerializeObject(queryJson); List Parameters = new List(); Parameters.Add(jsonstr); _KdhttpClient.content = JsonConvert.SerializeObject(Parameters); _KdhttpClient.myurl = LocalStaticRequest.tokenurl + "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc"; string result = await _KdhttpClient.AsyncClientRequest(); //如果访问正常 if (_KdhttpClient.CloudExecuteQueryStatus(result, ref reason)) { DataTable table = _shareController.JsonConvertDatatable("FBillNo,FID,FEntryID,FSeq", result,ref reason); if(table != null) { //产生新的日计划记录 List locks = (from a in table.AsEnumerable() select new LockPRD_MO { ERP_MO = a.Field("FBillNo")!, MO_SEQ=a.Field("FTreeEntity_FSeq"), MOID=a.Field("FID"), MOEntryID = a.Field("FEntryID"), TRX_DATE=DateTime.Now }).ToList(); //写入沃比系统 _context.r_LockPRD_MO!.AddRange(locks); int q = await _context.SaveChangesAsync(); if (q > 0) { breakData.Status = true; breakData.DataSet = locks; } } else { breakData.Status = false; breakData.Message = reason; } } else { breakData.Status = false; breakData.Message = reason; } //如果有错误发生,就会跑到catch中去... } catch (Exception ex) { reason = ex.Message; breakData.Message = reason; //同时写入日志 _shareController._logger(-1, DocType, reason, data); //throw; } return JsonConvert.SerializeObject(breakData); } /// /// 获取MES系统日计划工单 /// /// LockPRD_MO列表的JSON字符串 /// [HttpGet] [Route("GetLockMOsAsync")] public async Task GetLockMOsAsync(string data) { BreakData breakData=new BreakData() { Status=false }; string reason = string.Empty; //包裹一个可能产生错误的代码块,以防止将错误返回给了Cloud try { List mos = _shareController.DataConvertClass(data, ref reason); if (mos == null) { breakData.Message = reason; return JsonConvert.SerializeObject(breakData); } //EF处理起来更慢,使用直接SQL System.Collections.ArrayList stringBuilder = new System.Collections.ArrayList(); foreach(LockPRD_MO po in mos) { string number = po.ERP_MO; int seq = po.MO_SEQ; int moid = po.MOID; int moentryid = po.MOEntryID; System.Collections.ArrayList arrayList = new System.Collections.ArrayList(); if (number != "") { arrayList.Add(string.Format("ERP_MO='{0}'", number)); } if (seq != 0) { arrayList.Add(string.Format("MO_SEQ={0}", seq)); } if (moid != 0) { arrayList.Add(string.Format("MOID={0}", moid)); } if (moentryid != 0) { arrayList.Add(string.Format("MOEntryID={0}", moentryid)); } stringBuilder.Add(string.Join(" AND ", arrayList.ToArray())); } string sql =string.Format(@"SELECT * FROM r_LockPRD_MO WHERE ({0})",string.Join(") OR (", stringBuilder.ToArray())); DataSet dataSet =_kdsqlhelper.GetDataSet(CommandType.Text,sql,null,ref reason,false); if (dataSet == null) { return JsonConvert.SerializeObject(breakData); } if(dataSet.Tables.Count==0) { return JsonConvert.SerializeObject(breakData); } if (dataSet.Tables[0].Rows.Count == 0) { return JsonConvert.SerializeObject(breakData); } List locks = (from a in dataSet.Tables[0].AsEnumerable() select new LockPRD_MO { FID= a.Field("FID"), ERP_MO = a.Field("ERP_MO")!, MO_SEQ = a.Field("MO_SEQ"), MOID = a.Field("MOID"), MOEntryID = a.Field("MOEntryID"), TRX_DATE = a.Field("TRX_DATE") }).ToList(); breakData.DataSet = locks; breakData.Status = true; } catch (Exception ex) { reason =ex.Message; breakData.Message = reason; //同时写入日志 _shareController._logger(-1, "GetLockMOsAsync", reason,data); } //测试序列化与反序列化 string result = JsonConvert.SerializeObject(breakData); return result; } /// /// 测试R104:批量提交MES单据到云星空,保存、提交、审核一起完成 /// /// [HttpPost] [Route("test_PostAsync_R104")] public async Task test_PostR014Async() { List testpos = new List(); testpos.Add(new R014() { QUEUE_ID = "1", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "CK007", ERP_MO = "PPBOM00000054", MO_SEQ = "1", MTRL_ID = "KP-BK-005", QUANTITY = "1", REMARK = "测试第一行为1 Pcs", ERP_LOTNO = "", STORELOC_ID = "001" }); testpos.Add(new R014() { QUEUE_ID = "2", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "CK007", ERP_MO = "PPBOM00000054", MO_SEQ = "2", MTRL_ID = "KP-PM-001", QUANTITY = "2", REMARK = "测试第二行为2 Pcs", ERP_LOTNO = "", STORELOC_ID = "002" }); testpos.Add(new R014() { QUEUE_ID = "3", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "CK007", ERP_MO = "PPBOM00000054", MO_SEQ = "3", MTRL_ID = "KD-LOGO-00", QUANTITY = "3", REMARK = "测试第三行为3 Pcs", ERP_LOTNO = "", STORELOC_ID = "003" }); testpos.Add(new R014() { QUEUE_ID = "4", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "CK007", ERP_MO = "PPBOM00000054", MO_SEQ = "4", MTRL_ID = "KP-SX-001", QUANTITY = "4", REMARK = "测试第四行为4 Pcs", ERP_LOTNO = "", STORELOC_ID = "001" }); testpos.Add(new R014() { QUEUE_ID = "5", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "CK007", ERP_MO = "PPBOM00000054", MO_SEQ = "5", MTRL_ID = "KD-LOGO-00", QUANTITY = "5", REMARK = "测试第三行为5 Pcs", ERP_LOTNO = "", STORELOC_ID = "002" }); testpos.Add(new R014() { QUEUE_ID = "6", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "CK007", ERP_MO = "PPBOM00000054", MO_SEQ = "6", MTRL_ID = "KP-SX-001", QUANTITY = "6", REMARK = "测试第四行为6 Pcs", ERP_LOTNO = "", STORELOC_ID = "003" }); testpos.Add(new R014() { QUEUE_ID = "7", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "CK001", ERP_MO = "PPBOM00000051", MO_SEQ = "1", MTRL_ID = "S1.03.004", QUANTITY = "1", REMARK = "测试多张单据一起下推", ERP_LOTNO = "", STORELOC_ID = "" }); testpos.Add(new R014() { QUEUE_ID = "8", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "CK001", ERP_MO = "PPBOM00000051", MO_SEQ = "2", MTRL_ID = "S1.03.005", QUANTITY = "2", REMARK = "测试多张单据一起下推", ERP_LOTNO = "", STORELOC_ID = "" }); testpos.Add(new R014() { QUEUE_ID = "9", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "CK001", ERP_MO = "PPBOM00000051", MO_SEQ = "3", MTRL_ID = "S1.03.006", QUANTITY = "1", REMARK = "测试多张单据一起下推", ERP_LOTNO = "", STORELOC_ID = "" }); string DocType = "R014"; //string data = JsonConvert.SerializeObject(testpos); RequestParm parm = new RequestParm() { DocType = DocType, data = testpos }; return await PostAsync(parm); } /// /// 测试R102:批量提交MES单据到云星空,保存、提交、审核一起完成 /// /// [HttpPost] [Route("test_PostAsync_R102")] public async Task test_PostR102Async() { List testpos = new List(); testpos.Add(new R102() { QUEUE_ID = "1", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "CK001", ERP_MO = "MO000036", MO_SEQ = "1", MTRL_ID = "1.02.001.0002", QUANTITY = "1", REMARK = "测试第一行为1 Pcs", STORELOC_ID = "001", ERP_LOTNO = "" }); string DocType = "R102"; //string data = JsonConvert.SerializeObject(testpos); RequestParm parm = new RequestParm() { DocType = DocType, data = testpos }; return await PostAsync(parm); } /// /// 测试R014_1:批量提交MES单据到云星空,保存、提交、审核一起完成 /// /// //[HttpPost] //[Route("test_PostAsync_R014_1")] //public async Task test_PostR014_1Async() //{ // List testpos = new List(); // testpos.Add(new R014_1() { QUEUE_ID = "1", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "CK001", ERP_MO = "MO000036", MO_SEQ = "1", MTRL_ID = "1.02.001.0002", QUANTITY = "1", REMARK = "测试第一行为1 Pcs", STORELOC_ID = "001", ERP_LOTNO = "" }); // string DocType = "R014_1"; // string data = JsonConvert.SerializeObject(testpos); // return await PostAsync(DocType, data); //} /// /// 测试R019_1:批量提交MES单据到云星空,保存、提交、审核一起完成 /// /// //[HttpPost] //[Route("test_PostAsync_R019_1")] //public async Task test_PostR019_1Async() //{ // List testpos = new List(); // testpos.Add(new R019_1() { QUEUE_ID = "1", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "CK001", ERP_MO = "MO000036", MO_SEQ = "1", MTRL_ID = "1.02.001.0002", QUANTITY = "1", REMARK = "测试第一行为1 Pcs", STORELOC_ID = "001", ERP_LOTNO = "" }); // string DocType = "R102"; // string data = JsonConvert.SerializeObject(testpos); // return await PostAsync(DocType, data); //} /// /// 测试R170C:批量提交MES单据到云星空,保存、提交、审核一起完成 /// /// [HttpPost] [Route("test_PostAsync_R170C")] public async Task test_PostR170CAsync() { List testpos = new List(); testpos.Add(new R170C() { QUEUE_ID = "0", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "001", SUP_ID = "VEN00003", PO_ID = "CGDD000025", PO_SEQ = "1", MTRL_ID = "4..01", QUANTITY = "1", REMARK = "测试第一行为1 Pcs", ERP_LOTNO = "", STORELOC_ID = "" }); testpos.Add(new R170C() { QUEUE_ID = "1", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "001", SUP_ID = "VEN00003", PO_ID = "CGDD000025", PO_SEQ = "1", MTRL_ID = "4..01", QUANTITY = "2", REMARK = "测试第二行为2 Pcs", ERP_LOTNO = "", STORELOC_ID = "" }); testpos.Add(new R170C() { QUEUE_ID = "2", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "001", SUP_ID = "VEN00003", PO_ID = "CGDD000025", PO_SEQ = "1", MTRL_ID = "4..01", QUANTITY = "3", REMARK = "测试第三行为3 Pcs", ERP_LOTNO = "", STORELOC_ID = "" }); testpos.Add(new R170C() { QUEUE_ID = "3", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "001", SUP_ID = "VEN00003", PO_ID = "CGDD000025", PO_SEQ = "1", MTRL_ID = "4..01", QUANTITY = "4", REMARK = "测试第四行为4 Pcs", ERP_LOTNO = "", STORELOC_ID = "" }); string DocType = "R170C"; //string data = JsonConvert.SerializeObject(testpos); RequestParm parm = new RequestParm() { DocType = DocType, data = testpos }; return await PostAsync(parm); } /// /// 测试RO-VMI:批量提交MES单据到云星空,保存、提交、审核一起完成 /// /// [HttpPost] [Route("test_PostAsync_RO-VMI")] public async Task test_PostROVMIAsync() { List testpos = new List(); testpos.Add(new R170C() { QUEUE_ID = "0", TRX_DATE = DateTime.Now.ToShortDateString(), STORE_ID = "001", SUP_ID = "VEN00003", PO_ID = "CGDD000025", PO_SEQ = "2", MTRL_ID = "4..01", QUANTITY = "1", REMARK = "测试VMI赠品入库", ERP_LOTNO = "", STORELOC_ID = "" }); string DocType = "RO-VMI"; //string data = JsonConvert.SerializeObject(testpos); RequestParm parm = new RequestParm() { DocType = DocType, data = testpos }; return await PostAsync(parm); } /// /// 从ERP中查询数据 /// /// 查询条件数据包 /// [HttpGet] [Route("GetERPData")] public async Task GeterpdataAsync(string data) { int fid = await _context.r_FunctionList!.Where(s => s.FUsing && s.FFunctionName == "GetERPData").AsNoTracking().Select(s => s.FID).FirstOrDefaultAsync(); ////优先从内存访问 //if (queryJsons == null || queryJsons.Count == 0) //{ // queryJsons = await GetCloudBillQueriesAsync(); //} BreakData breakData = new BreakData(); string result = string.Empty; string reason = string.Empty; try { if (!string.IsNullOrEmpty(data)) { GetErpParameters erpParameters = JsonConvert.DeserializeObject(data)!; if (erpParameters != null) { string DocType = erpParameters.DocType; if (!string.IsNullOrEmpty(DocType)) { var querjson = _context.r_CloudBillQuery! .Include(s => s.GetFormID).ThenInclude(s => s.functions) .Where(s => s.GetFormID.FFunctionID == fid && s.GetFormID.FDocType == DocType) .AsNoTracking(); if (querjson.Any()) { CloudBillQuery billquery = querjson.FirstOrDefault()!; result = await PugAsync(erpParameters.KeyValues, billquery); //判断是对还是错 if (_KdhttpClient.CloudExecuteQueryStatus(result, ref reason)) { object ps = new object(); //转换为客户端需要的格式 switch (DocType) { case "PO": ps = _shareController.GetNewObj(fid, DocType, result, ref reason); break; case "XCL": ps = _shareController.GetNewObj(fid, DocType, result, ref reason); break; } if (reason == "") { breakData.Status = true; breakData.DataSet = ps; } else { breakData.Status = false; breakData.Message = reason; } } else { breakData.Status = false; breakData.Message = reason; } } else { breakData.Status = false; breakData.Message = "CloudBillQuery还未配置"; } } else { breakData.Status = false; breakData.Message = "提供的参数中必须包含DocType"; } } } else { breakData.Status = false; breakData.Message = "不接受空的数据包"; } } catch (Exception e) { breakData.Status = false; breakData.Message = e.Message; //throw; WritLog(e.Message); } return JsonConvert.SerializeObject(breakData); } /// /// 匹配合适的参数,从金蝶Cloud中查询数据 /// /// 输入参数 /// /// private async Task PugAsync(Dictionary pairs, CloudBillQuery billquery) { string filterstr = billquery.FFiledString; //解析KeyValues string FilterString = GetErpDataPar(billquery.GetFormID.FFunctionID, pairs, billquery.GetFormID.FDocType, filterstr); CloudBillQueryJson queryJson = new CloudBillQueryJson { FilterString = FilterString, FieldKeys = billquery.FFieldKeys, FormId = billquery.GetFormID.FDBName, Limit = billquery.FLimit, OrderString = billquery.FOrderString, StartRow = billquery.FStartRow, SubSystemId = billquery.FSubSystemID, TopRowCount = billquery.FTopRowCount }; if (!_KdhttpClient.Islogin) { await _KdhttpClient.LoginErp(); } //从云星空查询 string jsonstr = JsonConvert.SerializeObject(queryJson); List Parameters = new List(); Parameters.Add(jsonstr); _KdhttpClient.content = JsonConvert.SerializeObject(Parameters); _KdhttpClient.myurl = billquery.GetFormID.functions.FUrl; //result = _KdhttpClient.AsyncRequest(); return await _KdhttpClient.AsyncClientRequest(); } /// /// MES传过来的参数转义 /// /// FunctionID /// 输入的参数和值 /// 查询类别 /// /// private string GetErpDataPar(int fid, Dictionary inputKeyValues, string DocType, string filterstr) { string result = filterstr; //根据SelectJoinID获取参数列表 var sj = _context.r_SelectJoinID!.Where(s => s.FFunctionID == fid && s.FDocType.Equals(DocType)).AsNoTracking(); if (sj != null) { foreach (var s in sj) { string pars = s.FOptcode; string[] strings = pars.Split('|'); if (strings.Length > 0) { foreach (string s2 in strings) { string[] strings1 = s2.Split('='); if (strings1.Length == 2) { result = result.Replace(strings1[0], inputKeyValues[strings1[0]].ToString()); //result += string.IsNullOrEmpty(result) ? strings1[1] + "='" + inputKeyValues[strings1[0]] + "'" : // " AND " + strings1[1] + "='" + inputKeyValues[strings1[0]] + "'"; } else { result = result.Replace(strings1[0], inputKeyValues[strings1[0]].ToString()); //result += string.IsNullOrEmpty(result) ? s2 + "='" + inputKeyValues[s2] + "'": // " AND " + s2 + "='" + inputKeyValues[s2] + "'"; } } } } } return result; } /// /// 批量提交单据输入参数校验 /// /// 接口类型,云星空的FormId,传入时不必区分大小写 /// 单据数据包 /// 当有错误时返回的消息 /// private bool PostAsyncCheck(string DocType, string data,ref string reason) { reason = ""; bool result = true; if (!_context.r_DataSaveBatch!.Any()) { result = false; reason += "未配置JSON格式数据"; } if (string.IsNullOrEmpty(DocType)) { result = false; reason += reason=="" ? "必须指定接口类型" : "\n" + "必须指定接口类型"; } if (string.IsNullOrEmpty(data)) { result = false; reason += reason == "" ? "不接受空的数据包" : "\n" + "不接受空的数据包"; } return result; } /// /// 根据接口类型,返回关于它的定义项 /// /// 接口类型 /// private async Task> GetAllFormIDTypeAsync(string DocType) { List result = await _context.r_FormIDType!.Include(s => s.functions) .Where(f => f.functions.FUsing) .Where(s => s.FUsing && s.FDocType.Equals(DocType)) .AsNoTracking().ToListAsync(); ; return result; } /// /// 单个单据的保存接口 /// /// 要提交保存的类 /// 云星空的FormId /// 整理好的表单 /// private async Task SaveAsync(string formid,T inputdata) where T : class { BreakData data = new BreakData() { Status = false }; string messstr = string.Empty; DataSaveJson batchJson = new DataSaveJson { Model = inputdata }; if (!_KdhttpClient.Islogin) { await _KdhttpClient.LoginErp(); } //从云星空查询 string jsonstr = JsonConvert.SerializeObject(batchJson); List Parameters = new List() { formid, jsonstr }; _KdhttpClient.content = JsonConvert.SerializeObject(Parameters); //_KdhttpClient.myurl = "http://i.enpower.com:8600/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc"; //string result = _KdhttpClient.AsyncRequest(); string result = await _KdhttpClient.AsyncClientRequest(); //如果访问正常 data.Status = _shareController.CloudExecuteSaveStatus(result, ref messstr); data.Message = messstr; return data; } /// /// 批量提交给Cloud的单据,不会自动提交与审核 /// /// 泛型,实体类 /// 批量提交参数 /// 泛型,需要提交的实体类 /// private async Task SaveBatchAsync(DataSaveBatch? batchObj,string url,string formid,List inputdata) where T : class { BreakData data = new BreakData() { Status = false }; string messstr = string.Empty; if (batchObj != null) { string breakfileds = batchObj.FNeedReturnFields; string updatefields = batchObj.FNeedUpDateFields; DataSaveBatchJson batchJson = new DataSaveBatchJson() { Model = inputdata, IgnoreInterationFlag = batchObj.FIgnoreInterationFlag, InterationFlags = batchObj.FInterationFlags, IsAutoAdjustField = batchObj.FIsAutoAdjustField, //IsAutoSubmitAndAudit = batchObj.FIsAutoSubmitAndAudit, IsDeleteEntry = batchObj.FIsDeleteEntry, IsEntryBatchFill = batchObj.FIsEntryBatchFill, IsVerifyBaseDataField = batchObj.FIsVerifyBaseDataField, SubSystemId = batchObj.FSubSystemId, BatchCount = batchObj.FBatchCount, NeedReturnFields = breakfileds=="" ? null : breakfileds.Split(","), NeedUpDateFields = updatefields=="" ? null : updatefields.Split(","), NumberSearch = batchObj.FNumberSearch, ValidateFlag = batchObj.FValidateFlag }; if (!_KdhttpClient.Islogin) { await _KdhttpClient.LoginErp(); } //从云星空查询 string jsonstr = JsonConvert.SerializeObject(batchJson); List Parameters = new List() { formid, jsonstr }; _KdhttpClient.content = JsonConvert.SerializeObject(Parameters); _KdhttpClient.myurl = url; //string result = _KdhttpClient.AsyncRequest(); string result = await _KdhttpClient.AsyncClientRequest(); //如果访问正常 List> billnos = new List>(); data.Status = _shareController.CloudExecuteBatchSaveStatus(result, breakfileds, ref billnos); if (data.Status) { data.DataSet = billnos; } else { messstr = billnos[0].FirstOrDefault().Value; } } else { messstr = "请检查批量提交配置..."; } data.Message = messstr; return data; } /// /// 批量提交已保存的单据 /// /// 单据编号列表 /// Cloud的FormId /// /// private async Task SubmitCloudAsync(List billlist,string formid,string submiturl) { BreakData data = new BreakData() { Status = false }; string messstr = string.Empty; SubmitJson submitJson = new SubmitJson() { Numbers=billlist.ToArray()}; if (!_KdhttpClient.Islogin) { await _KdhttpClient.LoginErp(); } //从云星空查询 string jsonstr = JsonConvert.SerializeObject(submitJson); List Parameters = new List() { formid, jsonstr }; _KdhttpClient.content = JsonConvert.SerializeObject(Parameters); _KdhttpClient.myurl = submiturl; //string result = _KdhttpClient.AsyncRequest(); string result = await _KdhttpClient.AsyncClientRequest(); //如果访问正常 List billnos = new List(); data.Status = _shareController.CloudExecuteSaveStatus(result, ref messstr); if (data.Status) { data.DataSet = billnos; //此时为单据编号 } else { messstr = billnos[0]; } return data; } /// /// 批量审核已提交的单据 /// /// 单据编号列表 /// Cloud的FormId /// 审核的Url地址 /// private async Task AuditCloudAsync(List billlist, string formid, string aduiturl) { BreakData data = new BreakData() { Status = false }; string messstr = string.Empty; AuditJson submitJson = new AuditJson() { Numbers = billlist.ToArray() }; if (!_KdhttpClient.Islogin) { await _KdhttpClient.LoginErp(); } //从云星空查询 string jsonstr = JsonConvert.SerializeObject(submitJson); List Parameters = new List() { formid, jsonstr }; _KdhttpClient.content = JsonConvert.SerializeObject(Parameters); _KdhttpClient.myurl = aduiturl; //string result = _KdhttpClient.AsyncRequest(); string result = await _KdhttpClient.AsyncClientRequest(); //如果访问正常 List billnos = new List(); data.Status = _shareController.CloudExecuteSaveStatus(result, ref messstr); if (data.Status) { data.DataSet = billlist; //此时为单据编号 } else { messstr = billnos[0]; } return data; } /// /// 更新普通采购订单,以目标表的单据类型编码命名 /// /// 外购入库明细 /// /// private async Task UpdateCGDD01_SYSAsync(List inStocks,string url) { BreakData breakData = new BreakData() { Status = false }; var entries = from a in inStocks select a.FInStockEntry; List instockentries = new List(); foreach (var entry in entries) { foreach (var t in entry) { instockentries.Add(t); } } //取出已入库汇总、未入库汇总 var polist = from a in instockentries group a by new { A = a.FPOOrderNo, B = a.FPOORDERENTRYID, C=a.FInStockEntry_Link!.FirstOrDefault()!.FInStockEntry_Link_FSBillId, D=a.FUnitID, E=a.FRemainInStockUnitId, F=a.FMaterialId, G=a.FPriceUnitID } into b select new { OrderNo=b.Key.A, OrderEntryID = b.Key.B, SBillId=b.Key.C, UnitID=b.Key.D, RemainInStockUnitId=b.Key.E, MaterialId =b.Key.F, PriceUnitID=b.Key.G, FMustQty = b.Sum(s => s.FMustQty), FRealQty = b.Sum(s => s.FRealQty) }; if (instockentries.Count > 0) { List purchaseorders = new List(); List pogroup = polist.Select(s => s.OrderNo).Distinct().ToList(); foreach(string po in pogroup) { var poentry =polist.Where(s=>s.OrderNo==po).ToList(); //为采购订单赋值 PUR_PurchaseOrder order = new PUR_PurchaseOrder() { FBillNo = po, FID=int.Parse(poentry.FirstOrDefault()!.SBillId) }; List entrylist = new List(); foreach (var entry in poentry) { PUR_PurchaseOrder.POOrderEntry orderEntry = new PUR_PurchaseOrder.POOrderEntry() { FEntryID = int.Parse(entry.OrderEntryID), FMaterialId = entry.MaterialId, FPriceUnitID = entry.PriceUnitID, FStockUnitID = entry.UnitID, FUnitID = entry.RemainInStockUnitId, FStockInQty= entry.FMustQty + entry.FRealQty, FRemainStockINQty = entry.FMustQty - entry.FRealQty, FEntryDeliveryPlan = new List { new PUR_PurchaseOrder.POOrderEntry.EntryDeliveryPlan() { FBaseDeliCommitQty=entry.FMustQty + entry.FRealQty , FBaseDeliRemainQty=entry.FMustQty - entry.FRealQty , FDeliCommitQty=entry.FMustQty + entry.FRealQty , FDeliRemainQty=entry.FMustQty - entry.FRealQty } } }; entrylist.Add(orderEntry); order.FPOOrderEntry = entrylist; } purchaseorders.Add(order); } if(purchaseorders.Count > 0) { string formid = "PUR_PurchaseOrder"; //推送数据 DataSaveBatch? dataSave = new DataSaveBatch() { FNeedUpDateFields = "FStockInQty,FRemainStockINQty,FBaseDeliCommitQty,FBaseDeliRemainQty,FDeliCommitQty,FDeliRemainQty", }; //调用批量保存功能 breakData = await SaveBatchAsync(dataSave, url, formid, purchaseorders); } } else { breakData.Message="没有需要反写采购订单"; } return breakData; } /// /// 批量提交MES单据到云星空 /// /// RequestParm [HttpPost] [Route("DataSave_Batch")] public async Task PostAsync([FromBody] RequestParm parm) { BreakData breakData = new BreakData() { Status = false }; if(parm == null) { breakData.Message = "输入的格式不正确"; goto E; } string result = string.Empty; string reason = string.Empty; string DocType = parm.DocType; if (string.IsNullOrEmpty(parm.data.ToString()) || string.IsNullOrEmpty(DocType)) { breakData.Message = "传入的参数不正确"; goto E; } JArray iResultStr = (JArray)JsonConvert.DeserializeObject(parm.data.ToString()!); string data = JsonConvert.SerializeObject(iResultStr); if (!PostAsyncCheck(DocType,data,ref reason)) { breakData.Message = reason; goto E; } try { //查FFunctionID、查FormId List fm_all =await GetAllFormIDTypeAsync(DocType); if (!fm_all.Any()) { breakData.Message = "无法匹配要传入的对象,请检查r_FormIDType配置是否正确"; goto E; } var fm_post = fm_all.Where(f => f.functions.FUsing && f.FActionName == "PostAsync"); if (!fm_post.Any()) { breakData.Message = "没有PostAsync的配置项,请检查r_FormIDType配置是否正确"; goto E; } //注意:这里要用的是提交参数 if (_context.r_DataSaveBatch!.Include(s=>s.GetForm).Any(s => s.GetForm.FFunctionID == fm_post!.FirstOrDefault()!.FFunctionID && s.FDocTypeID == fm_post.FirstOrDefault()!.FID)) { //如果有子查询... //是否存在子查询都要单独写方法... var fm_child = fm_all.Where(f => f.functions.FUsing && f.FActionName == "ChiledSelect"); if (fm_child.Any()) { int fchildid = fm_child.FirstOrDefault()!.FFunctionID; int fchildmid = fm_child.FirstOrDefault()!.FID; //首先,将data转为DataTable待用于内码转换 DataTable dataTable = await _shareController.GetInputDataTable(fchildid, fm_child.FirstOrDefault()!.FDBName, data); if (dataTable != null) { //查找并配置Model,根据字段转换规则,匹配对应的类 string kdformid = fm_post!.FirstOrDefault()!.FDBName; switch (kdformid.ToUpper()) { //源单为采购订单的入库 case "STK_INSTOCK": breakData =await SaveBatchInStockAsync(dataTable, fm_post!.FirstOrDefault()!.FFunctionID, fm_post.FirstOrDefault()!.FID, fchildmid, data); break; //普通生产领料 case "PRD_PICKMTRL": breakData=await SaveBatchPickMtrlAsync(dataTable, fm_post!.FirstOrDefault()!.FFunctionID, fm_post.FirstOrDefault()!.FID, fchildmid, data); break; //生产入库单 case "PRD_INSTOCK": breakData = await SaveBatchINSTOCKAsync(dataTable, fm_post!.FirstOrDefault()!.FFunctionID, fm_post.FirstOrDefault()!.FID, fchildmid, data); break; //委外领料单 case "SUB_PickMtrl": breakData = await SaveBatchSUBPickMtrlAsync(dataTable, fm_post!.FirstOrDefault()!.FFunctionID, fm_post.FirstOrDefault()!.FID, fchildmid, data); break; //委外退料单 case "SUB_RETURNMTRL": breakData = await SaveBatchSUBRETURNMTRLAsync(dataTable, fm_post!.FirstOrDefault()!.FFunctionID, fm_post.FirstOrDefault()!.FID, fchildmid, data); break; //生产退料单 case "PRD_ReturnMtrl": breakData = await SaveBatchPRDReturnMtrlAsync(dataTable, fm_post!.FirstOrDefault()!.FFunctionID, fm_post.FirstOrDefault()!.FID, fchildmid, data); break; } } else { breakData.Message = "未配置子查询的ClumnConvert"; goto E; } } else { //没有子查询的... } } else { breakData.Message = "未配置属于【" + DocType + "】的JSON提交参数"; goto E; } } catch (Exception ex) { breakData.Message = ex.Message; WritLog(ex.Message); } E: return JsonConvert.SerializeObject(breakData); } /// /// MES反推单据或更新单据 /// /// 单据类型 /// 单据数据包 [HttpPost] [Route("UpdateErpBill")] public string Put(string DocType, string data) { return DocType + "\n" + data; } /// /// 将转入data转为云星空需要的类 /// /// 命名空间名 /// 类名 /// 转入的参数 /// /// private List? DataConvertClass(string spacename,string clssname, string data,ref string reason) { reason = ""; List list = new List(); //获得Models下所有模型 var typelist = Assembly.GetExecutingAssembly().GetTypes() .Where(s => s.Namespace == spacename) .Where(p => p.Name == clssname); if (typelist.Any()) { Type? type = typelist.FirstOrDefault(); if (type != null) { try { JArray jArray = (JArray)JsonConvert.DeserializeObject(data)!; //List list = JsonConvert.DeserializeObject>(data)!; //如果直接这样使用,则有些字段不相同的不会报错... foreach (var item in jArray) { if(item != null) { list.Add(item.ToObject(type)); } } return list; } catch (Exception ex) { reason= "将转入data转为云星空需要的类时,发生错误:" + ex.Message; //throw; } } { reason = "将转入data转为云星空需要的类时,指定的类型不存在..."; } } return list; } /// /// 入库接口与采购订单信息对比验证 /// /// MES推过来的数据类 /// ERP的采购订单信息 /// private string PONoInStockQtyCheck(List mes,List indata) { //检测源单是否存在 if (!indata.Any()) { return "必须有源单..."; } StringBuilder stringBuilder =new StringBuilder(); var R170 = from a in mes.AsEnumerable() group a by new { a.PO_ID, a.PO_SEQ } into b select new { PO_ID = b.Key.PO_ID, PO_SEQ = b.Key.PO_SEQ, Qty = b.Sum(s => decimal.Parse(s.QUANTITY)) }; //检测是否所有源单都存在 var poExcept = (from a in mes select new { a.PO_ID, a.PO_SEQ } ).Except( from b in indata select new { PO_ID = b.FBillNo, PO_SEQ = b.FPOOrderEntry_FSeq } ); if(poExcept.Any()) { foreach (var p in poExcept) { string messtr = string.Format("没找到符合条件的订单:{0},行号{1}。", p.PO_ID, p.PO_SEQ); stringBuilder.Append(messtr); } return stringBuilder.ToString(); } //与源单剩余入库数量对比 var SR170 = from a in R170 join b in indata on new { A = a.PO_ID, B = a.PO_SEQ } equals new { A = b.FBillNo, B = b.FPOOrderEntry_FSeq } where a.Qty > _shareController.DecimalPar(b.FRemainInStockQty) select new { PO_ID = a.PO_ID, PO_SEQ = a.PO_SEQ, Qty = _shareController.DecimalPar(b.FRemainInStockQty) - a.Qty }; if (SR170 != null) { foreach (var s in SR170) { string messtr = string.Format("订单:{0},行号{1},超过未入库数{2}。",s.PO_ID,s.PO_SEQ,s.Qty); stringBuilder.Append(messtr); } } return stringBuilder.ToString(); } /// /// 生产领料接口与生产用料清单信息对比验证 /// /// MES推过来的数据类 /// ERP的生产用料清单信息 /// private string PONoPickMtrlQtyCheck(List mes, List indata) { //检测源单是否存在 if (!indata.Any()) { return "必须有源单..."; } StringBuilder stringBuilder = new StringBuilder(); var rs = from a in mes.AsEnumerable() group a by new { a.ERP_MO, a.MO_SEQ } into b select new { ERP_NO = b.Key.ERP_MO, ERP_SEQ = b.Key.MO_SEQ, Qty = b.Sum(s => decimal.Parse(s.QUANTITY)) }; //检测是否所有源单都存在 var poExcept = (from a in mes select new { a.ERP_MO, a.MO_SEQ } ).Except( from b in indata select new { ERP_MO = b.FBillNo, MO_SEQ = b.FEntity_FSeq.ToString() } ); if (poExcept.Any()) { foreach (var p in poExcept) { string messtr = string.Format("没找到符合条件的订单:{0},行号{1}。", p.ERP_MO, p.MO_SEQ); stringBuilder.Append(messtr); } return stringBuilder.ToString(); } //与源单剩余入库数量对比 var rs_mes = from a in rs join b in indata on new { A = a.ERP_NO, B = a.ERP_SEQ } equals new { A = b.FBillNo, B = b.FEntity_FSeq.ToString() } where a.Qty > (int.Parse(b.FNeedQty2) - int.Parse(b.FPickedQty)) select new { ERP_NO = a.ERP_NO, ERP_SEQ = a.ERP_SEQ, Qty = (int.Parse(b.FNeedQty2) - int.Parse(b.FPickedQty) - a.Qty) }; if (rs_mes != null) { foreach (var s in rs_mes) { string messtr = string.Format("订单:{0},行号{1},超过未入库数{2}。", s.ERP_NO, s.ERP_SEQ, s.Qty); stringBuilder.Append(messtr); } } return stringBuilder.ToString(); } /// /// 生产订单接口与生产用入库单信息对比验证 /// /// MES推过来的数据类 /// ERP的生产入库单信息 /// private string PONoPRDINSTOCKQtyCheck(List mes, List indata) { //检测源单是否存在 if (!indata.Any()) { return "必须有源单..."; } StringBuilder stringBuilder = new StringBuilder(); var rs = from a in mes.AsEnumerable() group a by new { a.ERP_MO, a.MO_SEQ } into b select new { ERP_NO = b.Key.ERP_MO, ERP_SEQ = b.Key.MO_SEQ, Qty = b.Sum(s => decimal.Parse(s.QUANTITY)) }; //检测是否所有源单都存在 var poExcept = (from a in mes select new { a.ERP_MO, a.MO_SEQ } ).Except( from b in indata select new { ERP_MO = b.FBillNo, MO_SEQ = b.FSeq.ToString() } ); if (poExcept.Any()) { foreach (var p in poExcept) { string messtr = string.Format("没找到符合条件的订单:{0},行号{1}。", p.ERP_MO, p.MO_SEQ); stringBuilder.Append(messtr); } return stringBuilder.ToString(); } //与源单剩余入库数量对比 var rs_mes = from a in rs join b in indata on new { A = a.ERP_NO, B = a.ERP_SEQ } equals new { A = b.FBillNo, B = b.FSeq.ToString() } where a.Qty >b.FNoStockInQty select new { ERP_NO = a.ERP_NO, ERP_SEQ = a.ERP_SEQ, Qty =a.Qty - b.FNoStockInQty }; if (rs_mes != null) { foreach (var s in rs_mes) { string messtr = string.Format("订单:{0},行号{1},超了未入库数{2}。", s.ERP_NO, s.ERP_SEQ, s.Qty); stringBuilder.Append(messtr); } } return stringBuilder.ToString(); } private string PONoSUBPickMtrltyCheck(List mes, List indata) { //检测源单是否存在 if (!indata.Any()) { return "必须有源单..."; } StringBuilder stringBuilder = new StringBuilder(); var rs = from a in mes.AsEnumerable() group a by new { a.ERP_MO, a.MO_SEQ } into b select new { ERP_NO = b.Key.ERP_MO, ERP_SEQ = b.Key.MO_SEQ, Qty = b.Sum(s => decimal.Parse(s.QUANTITY)) }; //检测是否所有源单都存在 var poExcept = (from a in mes select new { a.ERP_MO, a.MO_SEQ } ).Except( from b in indata select new { ERP_MO = b.FBillNo, MO_SEQ = b.FSeq.ToString() } ); if (poExcept.Any()) { foreach (var p in poExcept) { string messtr = string.Format("没找到符合条件的订单:{0},行号{1}。", p.ERP_MO, p.MO_SEQ); stringBuilder.Append(messtr); } return stringBuilder.ToString(); } //与源单剩余入库数量对比 var rs_mes = from a in rs join b in indata on new { A = a.ERP_NO, B = a.ERP_SEQ } equals new { A = b.FBillNo, B = b.FSeq.ToString() } where a.Qty > b.FNoPickedQty select new { ERP_NO = a.ERP_NO, ERP_SEQ = a.ERP_SEQ, Qty = a.Qty - b.FNoPickedQty }; if (rs_mes != null) { foreach (var s in rs_mes) { string messtr = string.Format("订单:{0},行号{1},超了未入库数{2}。", s.ERP_NO, s.ERP_SEQ, s.Qty); stringBuilder.Append(messtr); } } return stringBuilder.ToString(); } private string PONoSUBRETURNMTRLCheck(List mes, List indata) { //检测源单是否存在 if (!indata.Any()) { return "必须有源单..."; } StringBuilder stringBuilder = new StringBuilder(); var rs = from a in mes.AsEnumerable() group a by new { a.ERP_MO, a.MO_SEQ } into b select new { ERP_NO = b.Key.ERP_MO, ERP_SEQ = b.Key.MO_SEQ, Qty = b.Sum(s => decimal.Parse(s.QUANTITY)) }; //检测是否所有源单都存在 var poExcept = (from a in mes select new { a.ERP_MO, a.MO_SEQ } ).Except( from b in indata select new { ERP_MO = b.FBillNo, MO_SEQ = b.FSeq.ToString() } ); if (poExcept.Any()) { foreach (var p in poExcept) { string messtr = string.Format("没找到符合条件的订单:{0},行号{1}。", p.ERP_MO, p.MO_SEQ); stringBuilder.Append(messtr); } return stringBuilder.ToString(); } //与源单剩余入库数量对比 var rs_mes = from a in rs join b in indata on new { A = a.ERP_NO, B = a.ERP_SEQ } equals new { A = b.FBillNo, B = b.FSeq.ToString() } where a.Qty > b.FWipQty select new { ERP_NO = a.ERP_NO, ERP_SEQ = a.ERP_SEQ, Qty = a.Qty - b.FWipQty }; if (rs_mes != null) { foreach (var s in rs_mes) { string messtr = string.Format("订单:{0},行号{1},超了未入库数{2}。", s.ERP_NO, s.ERP_SEQ, s.Qty); stringBuilder.Append(messtr); } } return stringBuilder.ToString(); } private string PONoPRDReturnMtrlCheck(List mes, List indata) { //检测源单是否存在 if (!indata.Any()) { return "必须有源单..."; } StringBuilder stringBuilder = new StringBuilder(); var rs = from a in mes.AsEnumerable() group a by new { a.ERP_MO, a.MO_SEQ } into b select new { ERP_NO = b.Key.ERP_MO, ERP_SEQ = b.Key.MO_SEQ, Qty = b.Sum(s => decimal.Parse(s.QUANTITY)) }; //检测是否所有源单都存在 var poExcept = (from a in mes select new { a.ERP_MO, a.MO_SEQ } ).Except( from b in indata select new { ERP_MO = b.FBillNo, MO_SEQ = b.FSeq.ToString() } ); if (poExcept.Any()) { foreach (var p in poExcept) { string messtr = string.Format("没找到符合条件的订单:{0},行号{1}。", p.ERP_MO, p.MO_SEQ); stringBuilder.Append(messtr); } return stringBuilder.ToString(); } //与源单剩余入库数量对比 var rs_mes = from a in rs join b in indata on new { A = a.ERP_NO, B = a.ERP_SEQ } equals new { A = b.FBillNo, B = b.FSeq.ToString() } where a.Qty > b.FWipQty select new { ERP_NO = a.ERP_NO, ERP_SEQ = a.ERP_SEQ, Qty = a.Qty - b.FWipQty }; if (rs_mes != null) { foreach (var s in rs_mes) { string messtr = string.Format("订单:{0},行号{1},超了未入库数{2}。", s.ERP_NO, s.ERP_SEQ, s.Qty); stringBuilder.Append(messtr); } } return stringBuilder.ToString(); } /// /// 在RB系统校验源单信息,并转换成Cloud的实体类 /// /// 接收到的数据 /// 源单信息 /// FBillTypeID的FNumber属性 /// 如果错误,则返回消息 /// private List CreateBatchSTKInStock(List r170cs, List purchaseOrders,string billtype, ref string reason) { reason = ""; List list = new List(); //源单校验 string pocheck = PONoInStockQtyCheck(r170cs, purchaseOrders); if (!string.IsNullOrEmpty(pocheck)) { reason += reason == "" ? pocheck : ";" + pocheck; return list; } //将inStocks按源单分组,形成单据头组 var headgroup = (from a in r170cs where a != null select new { PO_ID = a.PO_ID, SUP_ID=a.SUP_ID }).Distinct().ToList(); foreach (var head in headgroup) { //源单信息 var purchase = purchaseOrders.Where(s => s.FBillNo == head.PO_ID) .Select(s => new { FBillNo=s.FBillNo, FPOOrderEntry_FEntryID=s.FPOOrderEntry_FEntryID, FPOOrderEntry_FSeq=s.FPOOrderEntry_FSeq, FSettleCurrId=s.FSettleCurrId, FSupplierId=s.FSupplierId, FExchangeTypeId=s.FExchangeTypeId, FExchangeRate= _shareController.DecimalPar(s.FExchangeRate), FRemainStockINQty = s.FRemainStockINQty, FPrice=s.FPrice, FPriceTimePoint=s.FPriceTimePoint , FPayConditionId=s.FPayConditionId, FLocalCurrId=s.FLocalCurrId, FTaxPrice=s.FTaxPrice, FEntryTaxRate=s.FEntryTaxRate, FGiveAway=s.FGiveAway }).Distinct().ToList(); if(purchase.Count == 0) { string mestr = head.PO_ID + "不存在"; reason += reason == "" ? mestr : ";" + mestr; break; } var order = purchase.FirstOrDefault(); string supplynumber = order!.FSupplierId; string curnumber= order!.FSettleCurrId; string ecchangetype= order!.FExchangeTypeId; decimal ecchange = order!.FExchangeRate; decimal purqty= _shareController.DecimalPar(order!.FRemainStockINQty); decimal price = _shareController.DecimalPar(order!.FPrice); decimal taxprice = _shareController.DecimalPar(order!.FTaxPrice); decimal taxret = int.Parse(order!.FEntryTaxRate) / 100; //创建单据头 STK_InStock inStock = new STK_InStock() { FBillTypeID = new Dictionary() { { "FNUMBER", billtype } }, FDate = DateTime.Now.ToShortDateString(), FSupplyId = new Dictionary() { { "FNUMBER", supplynumber } }, FSettleId = new Dictionary() { { "FNUMBER", supplynumber } }, FSupplierId = new Dictionary() { { "FNumber", supplynumber } }, FChargeId = new Dictionary() { { "FNumber", supplynumber } } }; bool giveaway = order.FGiveAway; if (!giveaway) { //财务信息 STK_InStock.InStockFin stockFin = new STK_InStock.InStockFin() { FSettleOrgId = new Dictionary() { { "FNUMBER", "100" } }, FSettleCurrId = new Dictionary() { { "FNumber", curnumber } }, FExchangeTypeId = new Dictionary() { { "FNumber", ecchangetype } }, FExchangeRate = ecchange, FPriceTimePoint=order.FPriceTimePoint, FPayConditionId = new Dictionary() { { "FNumber", order.FPayConditionId } }, FLocalCurrId = new Dictionary() { { "FNumber", order.FLocalCurrId } }, FIsIncludedTax= taxret>0 ? true : false, }; inStock.FInStockFin = stockFin; } //添加单据体,按订单号找到它的明细数据 List entries = new List(); var entrygroup= r170cs.Where(s=>s.PO_ID==head.PO_ID).ToList(); foreach(var entry in entrygroup) { //源单内码 int sid = 0; //源单行号 int sentryid = 0; //剩余未入库数量 decimal sqty = 0; //单位编号 string unitnumber = string.Empty; var sourceentry = purchaseOrders.Where(s => s.FBillNo == entry.PO_ID && s.FPOOrderEntry_FSeq == entry.PO_SEQ); if (sourceentry != null) { var source = sourceentry.FirstOrDefault(); //源单内码 sid =int.Parse(source.FID); //源单行号 sentryid = int.Parse(source.FPOOrderEntry_FEntryID); //剩余未入库数量 sqty = _shareController.DecimalPar(source.FRemainStockINQty); //单位编号 unitnumber = source.UnitNumber; } else { unitnumber = entry.UNIT_ID; } string stocknumber = entry.STORE_ID; if(string.IsNullOrEmpty(stocknumber)) { string mestr= entry.PO_ID + "第" + entry.PO_SEQ + "行【仓库】不能为空"; reason += reason == "" ? mestr : ";" + mestr; } string martnumber = entry.MTRL_ID; if (string.IsNullOrEmpty(martnumber)) { string mestr = entry.PO_ID + "第" + entry.PO_SEQ + "行【物料编码】不能为空"; reason += reason == "" ? mestr : ";" + mestr; } if (string.IsNullOrEmpty(unitnumber)) { string mestr = entry.PO_ID + "第" + entry.PO_SEQ + "行【单位编码】不存在"; reason += reason == "" ? mestr : ";" + mestr; } decimal qty= _shareController.DecimalPar(entry.QUANTITY); if(qty <= 0) { string mestr = entry.PO_ID + "第" + entry.PO_SEQ + "行【数量】不正确"; reason += reason == "" ? mestr : ";" + mestr; } else if(qty > sqty) { string mestr = entry.PO_ID + "第" + entry.PO_SEQ + "行【数量】不允许大于未入库数"; reason += reason == "" ? mestr : ";" + mestr; } if(reason.Length > 0) { break; } //遇到错误直接退出,不用浪费时间了... STK_InStock.InStockEntry stockEntry = new STK_InStock.InStockEntry() { FPOOrderNo=order!.FBillNo, FSRCBillNo = order!.FBillNo, FPOORDERENTRYID=order!.FPOOrderEntry_FEntryID, FOWNERID = new Dictionary() { { "FNUMBER", supplynumber } }, FMaterialId = new Dictionary() { { "FNumber", martnumber } }, FUnitID = new Dictionary() { { "FNumber", unitnumber } }, FMustQty = sqty, FPURBASENUM = sqty, FStockBaseDen=sqty, FRealQty = qty, FPrice= giveaway ? 0 : price, FTaxPrice= giveaway ? 0 : taxprice, FTaxNetPrice= giveaway ? 0 : price, FEntryTaxRate= giveaway ? 0 : (int)(taxret * 100), FAmount= giveaway ? 0 : Math.Round(price * qty, 2), FAmount_LC = giveaway ? 0 : Math.Round(price * qty* taxret* ecchange, 2), FAllAmount = giveaway ? 0 : Math.Round(taxprice * qty,2), FAllAmount_LC= giveaway ? 0 : Math.Round(taxprice * qty * taxret* ecchange, 2), FEntryTaxAmount = giveaway ? 0 : Math.Round((taxprice-price) * qty, 2), //两位小数 FTaxAmount_LC = giveaway ? 0 : Math.Round((taxprice - price) * qty * taxret* ecchange, 2), //价税合计(本位币)-金额,两位小数 FAllAmountExceptDisCount = giveaway ? 0 : Math.Round(taxprice * qty, 2), FPriceUnitID = giveaway ? new Dictionary() : new Dictionary() { { "FNumber", unitnumber } }, FRemainInStockUnitId = new Dictionary() { { "FNumber", unitnumber } }, FRemainInStockQty = qty, //经实测,FRemainInStockQty应当与FRealQty、FPriceUnitQty相等 FPriceUnitQty = giveaway ? 0 : qty, FRemainInStockBaseQty = qty, FStockId = new Dictionary() { { "FNumber", stocknumber } }, FStockLocId = new STK_InStock.InStockEntry.StockLocId() { FSTOCKLOCID__FF100001 = new Dictionary() { { "FNumber", entry.STORELOC_ID } }, FSTOCKLOCID__FF100002 = new Dictionary() { { "FNumber", entry.STORELOC_ID } } }, FNote = entry.REMARK, FLot = new Dictionary() { { "FNumber", entry.ERP_LOTNO } }, //必须填写编号 FPriceBaseQty = qty, FInStockEntry_Link = sid == 0 ? new List() : new List() { new STK_InStock.InStockEntry.InStockEntry_Link() { FInStockEntry_Link_FSBillId =sid.ToString(), FInStockEntry_Link_FSId = sentryid.ToString(), FInStockEntry_Link_FRemainInStockBaseQtyOld = purqty, FInStockEntry_Link_FRemainInStockBaseQty = qty, FInStockEntry_Link_FBaseUnitQtyOld = purqty, FInStockEntry_Link_FBaseUnitQty = qty } } }; entries.Add(stockEntry); } if(!giveaway) { //再次合计分录 var total = from a in entries group a by a.FEntryID into b select new { FAmount = b.Sum(s => s.FAmount), FAmount_LC = b.Sum(s => s.FAmount_LC), FTaxAmount_LC = b.Sum(s => s.FTaxAmount_LC), FEntryTaxAmount = b.Sum(s => s.FEntryTaxAmount), FAllAmount = b.Sum(s => s.FAllAmount), FAllAmount_LC = b.Sum(s => s.FAllAmount_LC) }; if (total.Any()) { inStock.FInStockFin.FBillTaxAmount = total.FirstOrDefault()!.FEntryTaxAmount; inStock.FInStockFin.FBillAllAmount = total.FirstOrDefault()!.FAllAmount; inStock.FInStockFin.FBillTaxAmount_LC = total.FirstOrDefault()!.FTaxAmount_LC; inStock.FInStockFin.FBillAllAmount_LC = total.FirstOrDefault()!.FAllAmount_LC; inStock.FInStockFin.FBillAmount_LC = total.FirstOrDefault()!.FAmount_LC; inStock.FInStockFin.FBillAmount = total.FirstOrDefault()!.FAmount; } } inStock.FInStockEntry = entries; //财务费用,隶属于单据体 list.Add(inStock); } return list; } /// /// 在RB系统校验源单信息,并转换成Cloud的实体类 /// /// 接收到的数据 /// 源单信息 /// FBillTypeID的FNumber属性 /// 如果错误,则返回消息 /// private List CreateBatchPRDPickMtrl(List r014cs, List purchaseOrders, string billtype, ref string reason) { reason = ""; List list = new List(); //源单校验 string pocheck = PONoPickMtrlQtyCheck(r014cs, purchaseOrders); if (!string.IsNullOrEmpty(pocheck)) { reason += reason == "" ? pocheck : ";" + pocheck; return list; } //将inStocks按源单分组,形成单据头组:按生产用料清单号分组 var headgroup = (from a in r014cs where a != null select new { ERP_No = a.ERP_MO, TRX_DATE = a.TRX_DATE }).Distinct().ToList(); foreach (var head in headgroup) { //源单信息 var purchase = purchaseOrders.Where(s => s.FBillNo == head.ERP_No); if (!purchase.Any()) { string mestr = head.ERP_No + "不存在"; reason += reason == "" ? mestr : ";" + mestr; break; } var order = purchase.FirstOrDefault(); string monumber = order!.FMoBillNo1; int parseq = int.Parse(order!.FMoEntrySeq1); int moid = int.Parse(order!.FMoId1); int moentryid = int.Parse(order!.FMoEntryId1); string parunit = order!.FUnitID; string supplynumber = order!.FWorkshopID; string parnumber = order!.FMaterialID; string pbomnumber = order!.FBillNo; int pid = int.Parse(order!.FID); decimal sqty = int.Parse(order!.FNeedQty2) - int.Parse(order!.FPickedQty); decimal basesqty = int.Parse(order!.FBaseNeedQty) - int.Parse(order!.FBasePickedQty); //基本单位和单位转换率。 List units = CacheHelper.GetCache>("BD_UNIT"); if (units == null) { //重新加入缓存 Thread uthread = new Thread(AddUnitCache); uthread.IsBackground = true; uthread.Start(); units = GetUnit(); } //创建单据头 PRD_PickMtrl inStock = new PRD_PickMtrl() { FBillType = new Dictionary() { { "FNUMBER", billtype } }, FDate = head.TRX_DATE, FWorkShopId = new Dictionary() { { "FNUMBER", supplynumber } } }; //添加单据体,按订单号找到它的明细数据 List entries = new List(); //工单行明细...按生产用料清单号 List entrygroup = r014cs.Where(s => s.ERP_MO == head.ERP_No).ToList(); foreach (var entry in entrygroup) { //校验仓库是否正确 string stocknumber = entry.STORE_ID; if (string.IsNullOrEmpty(stocknumber)) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【仓库】不能为空"; reason += reason == "" ? mestr : ";" + mestr; } string martnumber = entry.MTRL_ID; if (string.IsNullOrEmpty(martnumber)) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【物料编码】不能为空"; reason += reason == "" ? mestr : ";" + mestr; } decimal qty = _shareController.DecimalPar(entry.QUANTITY); if (qty <= 0) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【数量】不正确"; reason += reason == "" ? mestr : ";" + mestr; } else if (qty > sqty) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【数量】不允许大于未领料数"; reason += reason == "" ? mestr : ";" + mestr; } if (reason.Length > 0) { break; } //遇到错误直接退出,不用浪费时间了... //对应这一行属于源单的信息 var sourentry = purchase.Where(s => s.FBillNo == entry.ERP_MO && s.FEntity_FSeq == entry.MO_SEQ); int pentryid = int.Parse(sourentry.FirstOrDefault()!.FEntryID); int pseq = int.Parse(entry.MO_SEQ); //当前单位编号 string unitnumber = sourentry.FirstOrDefault()!.FUnitID; //当前单位实体 var unit = units.Find(s => s.FNumber == unitnumber); //当前单位的换算率 decimal unithsl = unit.FConvertNumerator / unit.FConvertDenominator; //当前单位的精度 int jd = unit.FPrecision; string baseunitnumber = sourentry.FirstOrDefault()!.FBaseUnitID; PRD_PickMtrl.BillEntry stockEntry = new PRD_PickMtrl.BillEntry() { FParentMaterialId = new Dictionary { { "FNumber", parnumber } }, FBaseStockActualQty = Math.Round(qty * unithsl, jd), FBaseActualQty = Math.Round(qty * unithsl, jd), //确定基本单位和常用单位之间的换算关系 FMaterialId = new Dictionary { { "FNumber", martnumber } }, FUnitID = new Dictionary { { "FNumber", unitnumber } }, FAppQty = sqty, FActualQty = qty, FBaseAppQty = Math.Round(sqty * unithsl, jd), FStockId = new Dictionary { { "FNumber", stocknumber } }, FStockLocId = new PRD_PickMtrl.BillEntry.StockLocId() { FSTOCKLOCID__FF100001 = new Dictionary() { { "FNumber", entry.STORELOC_ID } }, FSTOCKLOCID__FF100002 = new Dictionary() }, FLot = new Dictionary() { { "FNumber", entry.ERP_LOTNO } }, FEntrtyMemo = entry.REMARK, FMoBillNo = monumber, FMoEntryId = moentryid, FPPBomEntryId = pentryid, FStockAppQty = basesqty, FStockActualQty = qty, FMoId = moid, FMoEntrySeq = parseq, FPPBomBillNo = pbomnumber, FBaseUnitId = new Dictionary { { "FNumber", baseunitnumber } }, FStockUnitId = new Dictionary { { "FNumber", unitnumber } }, FEntryWorkShopId = new Dictionary() { { "FNumber", supplynumber } }, FSrcBillNo = pbomnumber, FEntrySrcInterId = pid, FEntrySrcEnteryId = pentryid, FEntrySrcEntrySeq = pseq, FEntity_Link = pid == 0 ? new List() : new List() { new PRD_PickMtrl.BillEntry.Entity_Link() { FEntity_Link_FSBillId =pid, FEntity_Link_FSId = pentryid, FEntity_Link_FBaseActualQtyOld = Math.Round(sqty * unithsl, jd), FEntity_Link_FBaseActualQty = Math.Round(qty * unithsl, jd) } } }; entries.Add(stockEntry); } inStock.FEntity = entries; //财务费用,隶属于单据体 list.Add(inStock); } return list; } /// /// 在RB系统校验源单信息,并转换成Cloud的实体类 /// /// 接收到的数据 /// 源单信息 /// FBillTypeID的FNumber属性 /// 如果错误,则返回消息 /// private List CreateBatchPRDINSTOCK(List r102cs, List purchaseOrders, string billtype, ref string reason) { reason = ""; List list = new List(); //源单校验 string pocheck = PONoPRDINSTOCKQtyCheck(r102cs, purchaseOrders); if (!string.IsNullOrEmpty(pocheck)) { reason += reason == "" ? pocheck : ";" + pocheck; return list; } //将inStocks按源单分组,形成单据头组:按生产用料清单号分组 var headgroup = (from a in r102cs where a != null select new { ERP_No = a.ERP_MO, TRX_DATE = a.TRX_DATE }).Distinct().ToList(); foreach (var head in headgroup) { //源单信息 var purchase = purchaseOrders.Where(s => s.FBillNo == head.ERP_No); if (!purchase.Any()) { string mestr = head.ERP_No + "不存在"; reason += reason == "" ? mestr : ";" + mestr; break; } //原单的单据头 var order = purchase.FirstOrDefault(); //decimal sqty = int.Parse(order!.FMaterialId) - int.Parse(order!.FPickedQty); //decimal basesqty = int.Parse(order!.FBaseNeedQty) - int.Parse(order!.FBasePickedQty); //基本单位和单位转换率。 List units = CacheHelper.GetCache>("BD_UNIT"); if (units == null) { //重新加入缓存 Thread uthread = new Thread(AddUnitCache); uthread.IsBackground = true; uthread.Start(); units = GetUnit(); } //创建单据头 PRD_INSTOCK inStock = new() { FBillType = new Dictionary() { { "FNUMBER", billtype } }, FDate = head.TRX_DATE, FStockOrgId=new Dictionary() { { "FNumber",order.FPrdOrgId! } }, FPrdOrgId = new Dictionary() { { "FNumber", order.FPrdOrgId! } }, FWorkShopId = new Dictionary() { { "FNUMBER", order.FWorkShopID! } }, FOwnerTypeId0=order.FOwnerTypeId, FOwnerId0= !string.IsNullOrEmpty(order.FInStockOwnerId) ? new Dictionary() { { "FNumber", order.FInStockOwnerId } } : new Dictionary() { { "FNumber", "100" } } }; //添加单据体,按订单号找到它的明细数据 List entries = new List(); //工单行明细...按生产用料清单号 List entrygroup = r102cs.Where(s => s.ERP_MO == head.ERP_No).ToList(); foreach (var entry in entrygroup) { var sourentry = purchase.Where(s => s.FBillNo == entry.ERP_MO && s.FSeq == entry.MO_SEQ).FirstOrDefault(); //应入库数量,来自原单 decimal sqty = sourentry.FNoStockInQty; //校验仓库是否正确 string stocknumber = entry.STORE_ID; if (string.IsNullOrEmpty(stocknumber)) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【仓库】不能为空"; reason += reason == "" ? mestr : ";" + mestr; } string martnumber = entry.MTRL_ID; if (string.IsNullOrEmpty(martnumber)) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【物料编码】不能为空"; reason += reason == "" ? mestr : ";" + mestr; } decimal qty = _shareController.DecimalPar(entry.QUANTITY); if (qty <= 0) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【数量】不正确"; reason += reason == "" ? mestr : ";" + mestr; } else if (qty > sqty) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【数量】不允许大于未领料数"; reason += reason == "" ? mestr : ";" + mestr; } if (reason.Length > 0) { break; } //遇到错误直接退出,不用浪费时间了... //对应这一行属于源单的信息 int pentryid = int.Parse(sourentry.FEntryId); int pseq = int.Parse(entry.MO_SEQ); //当前单位编号 string unitnumber = sourentry.FUnitID; //当前单位实体 var unit = units.Find(s => s.FNumber == unitnumber); //当前单位的换算率 decimal unithsl = unit.FConvertNumerator / unit.FConvertDenominator; //当前单位的精度 int jd = unit.FPrecision; string baseunitnumber = sourentry.FBaseUnitId; PRD_INSTOCK.Entity stockEntry = new PRD_INSTOCK.Entity() { FSrcEntryId = int.Parse(sourentry.FEntryId), FMaterialId = new Dictionary() { { "FNumber", sourentry.FMaterialId } }, FProductType = sourentry.FProductType, FInStockType = sourentry.FInStockType, FUnitID = new Dictionary() { { "FNumber", sourentry.FUnitID } }, FMustQty = sourentry.FNoStockInQty, FRealQty = decimal.Parse(entry.QUANTITY), FBaseUnitId = new Dictionary() { { "FNumber", sourentry.FBaseUnitId } }, FBaseMustQty = sourentry.FBaseNoStockInQty, FBaseRealQty = sourentry.FBaseNoStockInQty, FOwnerTypeId0 = sourentry.FInStockOwnerTypeId, FOwnerId = !string.IsNullOrEmpty(sourentry.FInStockOwnerId) ? new Dictionary() { { "FNumber",sourentry.FInStockOwnerId } } : new Dictionary() { { "FNumber", "100" } }, FStockId=new Dictionary() { { "FNumber", entry.STORE_ID } }, FStockLocId = new PRD_INSTOCK.Entity.StockLocId() { FSTOCKLOCID__FF100001 = new Dictionary() { { "FNumber", entry.STORELOC_ID } }, FSTOCKLOCID__FF100002 = new Dictionary() { { "FNumber", entry.STORELOC_ID } } }, FLot=new Dictionary() { { "FNumber", entry.ERP_LOTNO } }, FWorkShopId1=new Dictionary() { { "FNumber", sourentry.FWorkShopID } }, FMoBillNo=sourentry.FBillNo, FMoId=int.Parse(sourentry.FID), FMoEntryId=int.Parse(sourentry.FEntryId), FMoEntrySeq=int.Parse(sourentry.FSeq), FMemo= entry.REMARK, FStockUnitId= new Dictionary() { { "FNumber", sourentry.FUnitID } }, FStockRealQty= qty, FSrcInterId=int.Parse(sourentry.FID), FSrcBillNo=sourentry.FBillNo, FBasePrdRealQty=Math.Round(qty * unithsl, jd), FSrcEntrySeq=int.Parse(sourentry.FSeq), FEntity_Link = int.Parse(sourentry.FID) == 0 ? new List() : new List() { new PRD_INSTOCK.Entity.Entity_Link() { FEntity_Link_FSBillId =int.Parse(sourentry.FID), FEntity_Link_FSId = pentryid, FEntity_Link_FBaseActualQtyOld = Math.Round(sqty * unithsl, jd), FEntity_Link_FBaseActualQty = Math.Round(qty * unithsl, jd) } } }; entries.Add(stockEntry); } inStock.FEntity = entries; //财务费用,隶属于单据体 list.Add(inStock); } return list; } /// /// 在RB系统校验源单信息,并转换成Cloud的实体类 /// /// 接收到的数据 /// 源单信息 /// FBillTypeID的FNumber属性 /// 如果错误,则返回消息 /// private List CreateBatchSUBPickMtrl(List R014_1cs, List purchaseOrders, string billtype, ref string reason) { reason = ""; List list = new List(); //源单校验 string pocheck = PONoSUBPickMtrltyCheck(R014_1cs, purchaseOrders); if (!string.IsNullOrEmpty(pocheck)) { reason += reason == "" ? pocheck : ";" + pocheck; return list; } //将inStocks按源单分组,形成单据头组:按生产用料清单号分组 var headgroup = (from a in R014_1cs where a != null select new { ERP_No = a.ERP_MO, TRX_DATE = a.TRX_DATE }).Distinct().ToList(); foreach (var head in headgroup) { //源单信息 var purchase = purchaseOrders.Where(s => s.FBillNo == head.ERP_No); if (!purchase.Any()) { string mestr = head.ERP_No + "不存在"; reason += reason == "" ? mestr : ";" + mestr; break; } //原单的单据头 var order = purchase.FirstOrDefault(); //decimal sqty = int.Parse(order!.FMaterialId) - int.Parse(order!.FPickedQty); //decimal basesqty = int.Parse(order!.FBaseNeedQty) - int.Parse(order!.FBasePickedQty); //基本单位和单位转换率。 List units = CacheHelper.GetCache>("BD_UNIT"); if (units == null) { //重新加入缓存 Thread uthread = new Thread(AddUnitCache); uthread.IsBackground = true; uthread.Start(); units = GetUnit(); } //创建单据头 SUB_PickMtrl inStock = new() { FBillType = new Dictionary() { { "FNUMBER", billtype } }, FDate = head.TRX_DATE, FStockOrgId = new Dictionary() { { "FNumber", order.FSupplyOrg! } }, FSubOrgId = new Dictionary() { { "FNumber", order.FSubOrgId! } }, FSupplierId = new Dictionary() { { "FNumber", order.FSupplierId! }} }; //添加单据体,按订单号找到它的明细数据 List entries = new List(); //工单行明细...按生产用料清单号 List entrygroup = R014_1cs.Where(s => s.ERP_MO == head.ERP_No).ToList(); foreach (var entry in entrygroup) { var sourentry = purchase.Where(s => s.FBillNo == entry.ERP_MO && s.FSeq == entry.MO_SEQ).FirstOrDefault(); //应入库数量,来自原单 decimal sqty = sourentry.FNoPickedQty; //校验仓库是否正确 string stocknumber = entry.STORE_ID; if (string.IsNullOrEmpty(stocknumber)) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【仓库】不能为空"; reason += reason == "" ? mestr : ";" + mestr; } string martnumber = entry.MTRL_ID; if (string.IsNullOrEmpty(martnumber)) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【物料编码】不能为空"; reason += reason == "" ? mestr : ";" + mestr; } decimal qty = _shareController.DecimalPar(entry.QUANTITY); if (qty <= 0) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【数量】不正确"; reason += reason == "" ? mestr : ";" + mestr; } else if (qty > sqty) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【数量】不允许大于未领料数"; reason += reason == "" ? mestr : ";" + mestr; } if (reason.Length > 0) { break; } //遇到错误直接退出,不用浪费时间了... //对应这一行属于源单的信息 int pentryid = int.Parse(sourentry.FEntryID); int pseq = int.Parse(entry.MO_SEQ); //当前单位编号 string unitnumber = sourentry.FUnitID2; //当前单位实体 var unit = units.Find(s => s.FNumber == unitnumber); //当前单位的换算率 decimal unithsl = unit.FConvertNumerator / unit.FConvertDenominator; //当前单位的精度 int jd = unit.FPrecision; string baseunitnumber = sourentry.FBaseUnitID1; SUB_PickMtrl.Entity stockEntry = new SUB_PickMtrl.Entity() { FSrcEntryId = int.Parse(sourentry.FEntryID), FMaterialId = new Dictionary() { { "FNumber", entry.MTRL_ID } }, FUnitID = new Dictionary() { { "FNumber", sourentry.FUnitID2 } }, FActualQty = decimal.Parse(entry.QUANTITY), FStockId = new Dictionary() { { "FNumber", entry.STORE_ID } }, StockLocId = new SUB_PickMtrl.Entity.FStockLocId() { FSTOCKLOCID__FF100001 = new Dictionary() { { "FNumber", entry.STORELOC_ID } }, FSTOCKLOCID__FF100002 = new Dictionary() { { "FNumber", entry.STORELOC_ID } } }, FLOT = new Dictionary() { { "FNumber", entry.ERP_LOTNO } }, FParentMaterialId = new Dictionary() { { "FNumber", sourentry.FMaterialID } }, FSrcInterId = int.Parse(sourentry.FID), FSubReqId = int.Parse(sourentry.FSubReqId), FReserveType = sourentry.FReserveType, FSettleOrgId = new Dictionary() { { "FNumber", sourentry.FSettleOrgId } }, FPPbomBillNo = sourentry.FBillNo, FSubReqEntryId = int.Parse(sourentry.FSubReqEntryId), FBaseUnitId = new Dictionary() { { "FNumber", sourentry.FBaseUnitID1 } }, FStockUnitId = new Dictionary() { { "FNumber", sourentry.FUnitID2 } }, FSrcPickEntryId = int.Parse(sourentry.FID), FPOOrderSeq = int.Parse(sourentry.FSeq), FKeeperTypeId = sourentry.FOwnerTypeId, FKeeperId = new Dictionary() { { "FNumber", sourentry.FOwnerTypeId } }, FStockStatusId = new Dictionary() { { "FNumber", sourentry.FStockStatusId } }, FAllowOverQty = sourentry.FBaseNoPickedQty, FOwnerTypeId = sourentry.FOwnerTypeId, FOwnerId = !string.IsNullOrEmpty(sourentry.FParentOwnerTypeId) ? new Dictionary() { { "FNumber", sourentry.FParentOwnerTypeId } } : new Dictionary() { { "FNumber", "100" } }, FParentOwnerTypeId = sourentry.FParentOwnerTypeId, FParentOwnerId = new Dictionary() { { "FNumber", sourentry.FParentOwnerId } }, FEntity_Link = int.Parse(sourentry.FID) == 0 ? new List() : new List() { new SUB_PickMtrl.Entity.Entity_Link() { FEntity_Link_FSBillId =int.Parse(sourentry.FID), FEntity_Link_FSId = pentryid, FEntity_Link_FBaseActualQtyOld = Math.Round(sqty * unithsl, jd), FEntity_Link_FBaseActualQty = Math.Round(qty * unithsl, jd) } } }; entries.Add(stockEntry); } inStock.FEntity = entries; //财务费用,隶属于单据体 list.Add(inStock); } return list; } /// /// 在RB系统校验源单信息,并转换成Cloud的实体类 /// /// 接收到的数据 /// 源单信息 /// FBillTypeID的FNumber属性 /// 如果错误,则返回消息 /// private List CreateBatchSUBRETURNMTRL(List R019_1cs, List purchaseOrders, string billtype, ref string reason) { reason = ""; List list = new List(); //源单校验 string pocheck = PONoSUBRETURNMTRLCheck(R019_1cs, purchaseOrders); if (!string.IsNullOrEmpty(pocheck)) { reason += reason == "" ? pocheck : ";" + pocheck; return list; } //将inStocks按源单分组,形成单据头组:按生产用料清单号分组 var headgroup = (from a in R019_1cs where a != null select new { ERP_No = a.ERP_MO, TRX_DATE = a.TRX_DATE }).Distinct().ToList(); foreach (var head in headgroup) { //源单信息 var purchase = purchaseOrders.Where(s => s.FBillNo == head.ERP_No); if (!purchase.Any()) { string mestr = head.ERP_No + "不存在"; reason += reason == "" ? mestr : ";" + mestr; break; } //原单的单据头 var order = purchase.FirstOrDefault(); //decimal sqty = int.Parse(order!.FMaterialId) - int.Parse(order!.FPickedQty); //decimal basesqty = int.Parse(order!.FBaseNeedQty) - int.Parse(order!.FBasePickedQty); //基本单位和单位转换率。 List units = CacheHelper.GetCache>("BD_UNIT"); if (units == null) { //重新加入缓存 Thread uthread = new Thread(AddUnitCache); uthread.IsBackground = true; uthread.Start(); units = GetUnit(); } //创建单据头 SUB_RETURNMTRL inStock = new() { FBillType = new Dictionary() { { "FNUMBER", billtype } }, FDate = head.TRX_DATE, FStockOrgId = new Dictionary() { { "FNumber", order.FSupplyOrg! } }, FStockId0 = new Dictionary() { { "FNumber", order.FStockID! } }, FSubOrgId = new Dictionary() { { "FNumber", order.FSubOrgId! } }, FSubSupplierId = new Dictionary() { { "FNumber", order.FSupplierId! } }, FOwnerTypeId0 = order.FOwnerTypeId, FOwnerId0 = new Dictionary() { { "FNumber", order.FOwnerID! } }, }; //添加单据体,按订单号找到它的明细数据 List entries = new List(); //工单行明细...按生产用料清单号 List entrygroup = R019_1cs.Where(s => s.ERP_MO == head.ERP_No).ToList(); foreach (var entry in entrygroup) { var sourentry = purchase.Where(s => s.FBillNo == entry.ERP_MO && s.FSeq == entry.MO_SEQ).FirstOrDefault(); //应入库数量,来自原单 decimal sqty = sourentry.FWipQty; //校验仓库是否正确 string stocknumber = entry.STORE_ID; if (string.IsNullOrEmpty(stocknumber)) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【仓库】不能为空"; reason += reason == "" ? mestr : ";" + mestr; } string martnumber = entry.MTRL_ID; if (string.IsNullOrEmpty(martnumber)) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【物料编码】不能为空"; reason += reason == "" ? mestr : ";" + mestr; } decimal qty = _shareController.DecimalPar(entry.QUANTITY); if (qty <= 0) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【数量】不正确"; reason += reason == "" ? mestr : ";" + mestr; } else if (qty > sqty) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【数量】不允许大于未领料数"; reason += reason == "" ? mestr : ";" + mestr; } if (reason.Length > 0) { break; } //遇到错误直接退出,不用浪费时间了... //对应这一行属于源单的信息 int pentryid = int.Parse(sourentry.FEntryID); int pseq = int.Parse(entry.MO_SEQ); //当前单位编号 string unitnumber = sourentry.FUnitID; //当前单位实体 var unit = units.Find(s => s.FNumber == unitnumber); //当前单位的换算率 decimal unithsl = unit.FConvertNumerator / unit.FConvertDenominator; //当前单位的精度 int jd = unit.FPrecision; string baseunitnumber = sourentry.FUnitID; SUB_RETURNMTRL.Entity stockEntry = new SUB_RETURNMTRL.Entity() { FSrcEntryId = int.Parse(sourentry.FEntryID), FMaterialId = new Dictionary() { { "FNumber", entry.MTRL_ID } }, FUnitID = new Dictionary() { { "FNumber", sourentry.FUnitID } }, FAPPQty = decimal.Parse(entry.QUANTITY), FQty = decimal.Parse(entry.QUANTITY), FStockId = new Dictionary() { { "FNumber", entry.STORE_ID } }, FStockLocId = new SUB_RETURNMTRL.Entity.StockLocId() { FSTOCKLOCID__FF100001 = new Dictionary() { { "FNumber", entry.STORELOC_ID } }, FSTOCKLOCID__FF100002 = new Dictionary() { { "FNumber", entry.STORELOC_ID } } }, FLot = new Dictionary() { { "FNumber", entry.ERP_LOTNO } }, FSUBReqBillNo = sourentry.FBillNo, FSrcEntrySeq = int.Parse(sourentry.FSeq), FParentMaterialId = new Dictionary() { { "FNumber", sourentry.FMaterialID } }, FSUBReqId = int.Parse(sourentry.FSubReqId), FSUBReqEntrySeq = int.Parse(sourentry.FSubReqEntrySeq), FPPBOMEntryId = int.Parse(sourentry.FSubReqEntryId), FSubReqEntryId = int.Parse(sourentry.FSubReqEntryId), FOwnerTypeId0 = sourentry.FOwnerTypeId, FOwnerId = new Dictionary() { { "FNumber", sourentry.FOwnerID } }, FBaseUnitId = new Dictionary() { { "FNumber", sourentry.FBaseUnitId } }, FReserveType = sourentry.FReserveType, FSettleOrgId = new Dictionary() { { "FNumber", sourentry.FSettleOrgId } }, FStockUnitId = new Dictionary() { { "FNumber", sourentry.FUnitID } }, FSecUnitId = new Dictionary() { { "FNumber", sourentry.FUnitID } }, FMtoNo = sourentry.FMtoNo, FProjectNo = sourentry.FProjectNo, FStockStatusId = new Dictionary() { { "FNumber", sourentry.FStockStatusId } }, FKeeperId = new Dictionary() { { "FNumber", sourentry.FSupplyOrg } }, FProcessId = new Dictionary() { { "FNumber", sourentry.FProcessID } }, FOperId = int.Parse(sourentry.FOperID), FBomId = new Dictionary() { { "FNumber", sourentry.FBomId } }, FParentOwnerTypeId = sourentry.FParentOwnerTypeId, FParentOwnerId = new Dictionary() { { "FNumber", sourentry.FParentOwnerId } }, FPPBomBillNo = sourentry.FBillNo, FEntity_Link = int.Parse(sourentry.FID) == 0 ? new List() : new List() { new SUB_RETURNMTRL.Entity.Entity_Link() { FEntity_Link_FSBillId =int.Parse(sourentry.FID), FEntity_Link_FSId = pentryid, FEntity_Link_FBaseActualQtyOld = Math.Round(sqty * unithsl, jd), FEntity_Link_FBaseActualQty = Math.Round(qty * unithsl, jd) } } }; entries.Add(stockEntry); } inStock.FEntity = entries; //财务费用,隶属于单据体 list.Add(inStock); } return list; } /// /// 在RB系统校验源单信息,并转换成Cloud的实体类 /// /// 接收到的数据 /// 源单信息 /// FBillTypeID的FNumber属性 /// 如果错误,则返回消息 /// private List CreateBatchPRDReturnMtrl(List R019cs, List purchaseOrders, string billtype, ref string reason) { reason = ""; List list = new List(); //源单校验 string pocheck = PONoPRDReturnMtrlCheck(R019cs, purchaseOrders); if (!string.IsNullOrEmpty(pocheck)) { reason += reason == "" ? pocheck : ";" + pocheck; return list; } //将inStocks按源单分组,形成单据头组:按生产用料清单号分组 var headgroup = (from a in R019cs where a != null select new { ERP_No = a.ERP_MO, TRX_DATE = a.TRX_DATE }).Distinct().ToList(); foreach (var head in headgroup) { //源单信息 var purchase = purchaseOrders.Where(s => s.FBillNo == head.ERP_No); if (!purchase.Any()) { string mestr = head.ERP_No + "不存在"; reason += reason == "" ? mestr : ";" + mestr; break; } //原单的单据头 var order = purchase.FirstOrDefault(); //decimal sqty = int.Parse(order!.FMaterialId) - int.Parse(order!.FPickedQty); //decimal basesqty = int.Parse(order!.FBaseNeedQty) - int.Parse(order!.FBasePickedQty); //基本单位和单位转换率。 List units = CacheHelper.GetCache>("BD_UNIT"); if (units == null) { //重新加入缓存 Thread uthread = new Thread(AddUnitCache); uthread.IsBackground = true; uthread.Start(); units = GetUnit(); } //创建单据头 PRD_ReturnMtrl inStock = new() { FBillType = new Dictionary() { { "FNUMBER", billtype } }, FDate = head.TRX_DATE, FPrdOrgId = new Dictionary() { { "FNumber", order.FPrdOrgId! } }, FOwnerTypeId0 = order.FOwnerTypeId, FOwnerId0 = new Dictionary() { { "FNumber", order.FOwnerID! } }, }; //添加单据体,按订单号找到它的明细数据 List entries = new List(); //工单行明细...按生产用料清单号 List entrygroup = R019cs.Where(s => s.ERP_MO == head.ERP_No).ToList(); foreach (var entry in entrygroup) { var sourentry = purchase.Where(s => s.FBillNo == entry.ERP_MO && s.FSeq == entry.MO_SEQ).FirstOrDefault(); //应入库数量,来自原单 decimal sqty = sourentry.FWipQty; //校验仓库是否正确 string stocknumber = entry.STORE_ID; if (string.IsNullOrEmpty(stocknumber)) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【仓库】不能为空"; reason += reason == "" ? mestr : ";" + mestr; } string martnumber = entry.MTRL_ID; if (string.IsNullOrEmpty(martnumber)) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【物料编码】不能为空"; reason += reason == "" ? mestr : ";" + mestr; } decimal qty = _shareController.DecimalPar(entry.QUANTITY); if (qty <= 0) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【数量】不正确"; reason += reason == "" ? mestr : ";" + mestr; } else if (qty > sqty) { string mestr = entry.ERP_MO + "第" + entry.MO_SEQ + "行【数量】不允许大于未领料数"; reason += reason == "" ? mestr : ";" + mestr; } if (reason.Length > 0) { break; } //遇到错误直接退出,不用浪费时间了... //对应这一行属于源单的信息 int pentryid = int.Parse(sourentry.FEntryID); int pseq = int.Parse(entry.MO_SEQ); //当前单位编号 string unitnumber = sourentry.FUnitID2; //当前单位实体 var unit = units.Find(s => s.FNumber == unitnumber); //当前单位的换算率 decimal unithsl = unit.FConvertNumerator / unit.FConvertDenominator; //当前单位的精度 int jd = unit.FPrecision; string baseunitnumber = sourentry.FUnitID2; PRD_ReturnMtrl.Entity stockEntry = new PRD_ReturnMtrl.Entity() { FEntryID = int.Parse(sourentry.FEntryID), FMaterialId = new Dictionary() { { "FNumber", entry.MTRL_ID } }, FUnitID = new Dictionary() { { "FNumber", sourentry.FUnitID2 } }, FAPPQty = decimal.Parse(entry.QUANTITY), FQty = decimal.Parse(entry.QUANTITY), FStockId = new Dictionary() { { "FNumber", entry.STORE_ID } }, StockLocId = new PRD_ReturnMtrl.Entity.FStockLocId() { FSTOCKLOCID__FF100001 = new Dictionary() { { "FNumber", entry.STORELOC_ID } }, FSTOCKLOCID__FF100002 = new Dictionary() { { "FNumber", entry.STORELOC_ID } } }, FLot = new Dictionary() { { "FNumber", entry.ERP_LOTNO } }, FEntrySrcEntrySeq = int.Parse(sourentry.FSeq), FPPBomBillNo = sourentry.FBillNo, FProcessId = new Dictionary() { { "FNumber", sourentry.FProcessID } }, FParentMaterialId = new Dictionary() { { "FNumber", sourentry.FMaterialID } }, FPPBOMEntryId = int.Parse(sourentry.FEntryID), FMoId = int.Parse(sourentry.FMoId1), FReserveType = sourentry.FReserveType, FMoBillNo = sourentry.FMoBillNo1, FMoEntryId = int.Parse(sourentry.FMoEntryId1), FMoEntrySeq = int.Parse(sourentry.FMoEntrySeq1), FStockUnitId = new Dictionary() { { "FNumber", sourentry.FUnitID2 } }, FSecUnitId = new Dictionary() { { "FNumber", sourentry.FUnitID2 } }, FMtoNo = sourentry.FMTONO, FProjectNo = sourentry.FProjectNO, FStockStatusId = new Dictionary() { { "FNumber", sourentry.FStockStatusId } }, FKeeperId = sourentry.FPrdOrgId, FOperId = int.Parse(sourentry.FOperID), FBomId = new Dictionary() { { "FNumber", sourentry.FBomId2 } }, FBaseUnitId = new Dictionary() { { "FNumber", sourentry.FBaseUnitID1 } }, FBaseAppQty = sourentry.FBaseWipQty, FBaseQty = sourentry.FBaseWipQty, FOwnerTypeId = sourentry.FOwnerTypeId, FOwnerId = new Dictionary() { { "FNumber", sourentry.FOwnerID } }, FEntrySrcEnteryId = int.Parse(sourentry.FEntryID), FEntrySrcInterId = int.Parse(sourentry.FID), FWorkShopId1 = new Dictionary() { { "FNumber", sourentry.FWorkshopID } }, FParentOwnerId = new Dictionary() { { "FNumber", sourentry.FEntrustPickOrgId } }, FEntity_Link = int.Parse(sourentry.FID) == 0 ? new List() : new List() { new PRD_ReturnMtrl.Entity.Entity_Link() { FEntity_Link_FSBillId =int.Parse(sourentry.FID), FEntity_Link_FSId = pentryid, FEntity_Link_FBaseActualQtyOld = Math.Round(sqty * unithsl, jd), FEntity_Link_FBaseActualQty = Math.Round(qty * unithsl, jd) } } }; entries.Add(stockEntry); } inStock.FEntity = entries; //财务费用,隶属于单据体 list.Add(inStock); } return list; } private BreakData ExistsDoubleQueid(List inputdata,string DocType) where T : class { BreakData breakData=new BreakData() { Status=false}; Type type = typeof(T); PropertyInfo[] propertyInfos = type.GetProperties(); var propertyInfo = propertyInfos.Where(s => s.Name == "QUEUE_ID"); if (propertyInfo.Any()) { try { List strings = new List(); PropertyInfo infos = propertyInfos.Where(s => s.Name == "QUEUE_ID").FirstOrDefault()!; foreach (var obj in inputdata) { object v= infos.GetValue(obj)!; strings.Add(v.ToString()); } string sql = string.Format("select * from r_ReciveDataBack where FDocType='{0}' and QUEUE_ID in ({1})", DocType,string.Join(',', strings.ToArray())); //直接SQL查询更快!!! string messstr = string.Empty; DataSet? dataSet = _kdsqlhelper.GetDataSet(CommandType.Text, sql, null, ref messstr!, false); if(dataSet != null) { DataTable dataTable = dataSet.Tables[0]; var dt = (from a in dataTable.AsEnumerable() select new { QUEUE_ID=a.Field("QUEUE_ID").ToString(), FDocType = a.Field("FDocType")!, FBillNo = a.Field("FBillNo")!, FErpID = a.Field("FErpID"), FSeq = a.Field("FSeq") }).ToList(); if(dt.Any()) { breakData.Message = dt; } else { breakData.Status = true; } } else { breakData.Message = messstr; } } catch (Exception ex) { breakData.Message = ex.Message; //throw; } } else { breakData.Message = "传入的数据中必须有字段【QUEUE_ID】"; } return breakData; } /// /// 提供批量保存、提交并审核普通采购入库单、VMI入库单方法 /// /// 接收到的数据,已转换为table /// FFunctionID /// 主查询doctypeid /// 子查询doctypeid /// 接收到的直接数据 /// private async Task SaveBatchInStockAsync(DataTable dataTable,int fid,int postmid,int fchildmid,string data) { BreakData breakData = new BreakData() { Status=false , DataSet = JsonConvert.DeserializeObject(data) }; string reason = string.Empty; //应当就采购订单号,查询源单并校验 List purchaseOrders = _chiledselect.GetSourceBillEntry(dataTable, fchildmid, ref reason); if (!string.IsNullOrEmpty(reason)) { breakData.Message = reason; } else { List? mes_POInStocks = _shareController.DataConvertClass(data, ref reason); if (mes_POInStocks != null) { //推送数据 DataSaveBatch? dataSave = await _context.r_DataSaveBatch! .Include(s => s.GetForm).ThenInclude(s => s.functions) //必须提供外键表数据 .Where(s => s.GetForm.FFunctionID == fid && s.FDocTypeID == postmid) .AsNoTracking() .FirstOrDefaultAsync(); //为采购入库类赋值 List inStocks = CreateBatchSTKInStock(mes_POInStocks, purchaseOrders, dataSave.FErpBillType, ref reason); if (inStocks.Count()>0 && reason == "") { //校验是否有重复推单 breakData = ExistsDoubleQueid(mes_POInStocks, dataSave.GetForm.FDocType); if (!breakData.Status) { breakData.DataSet = mes_POInStocks; //将源数据返回去... return breakData; } breakData = await SaveBatchAsync(dataSave, dataSave.GetForm.functions.FUrl, dataSave.GetForm.FDBName, inStocks); if (breakData.Status) { List dataBacks = new List(); //提取出创建好的单据编号 List> billlist = (List>)breakData.DataSet!; List billnolist = GetNewBillNoList(dataSave.GetForm.FDocType, mes_POInStocks, billlist, ref dataBacks); if (billnolist.Count > 0) { //写入沃比数据库,避免重复推送 SaveReciveDataBackAsync(breakData,dataBacks); if (dataSave.FIsAutoSubmitAndAudit && breakData.Status) //自动提交、审核 { //提交单据 breakData = await SubmitCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FSubmitUrl); if (breakData.Status) { //继续审核单据 breakData = await AuditCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FAuditUrl); //if (breakData.Status) //{ // //反写订单,除非特殊,否则使用Cloud标准的反写规则,系统自动反写 // breakData = await UpdateCGDD01_SYSAsync(inStocks, dataSave.GetForm.functions.FUrl); //} } } } else { breakData.Status = false; breakData.Message = "单据已保存成功,但返回参数中不包含单据编号,无法提交审核!"; } breakData.DataSet = billlist; } } else { breakData.Message = reason; } } else { breakData.Message =string.IsNullOrEmpty(reason) ? "输入数据转换出错" : reason; } } return breakData; } /// /// 根据金蝶系统返回字段,整理成list并返回给推送方 /// /// 接口类型 /// 推送的数据 /// ERP返回的集合 /// 返回给推送方的今本 /// private List GetNewBillNoList(string doctype, List? mesobj, List> billlist,ref List dataBacks) where T : class { List billnolist = new List(); Type type = typeof(T); PropertyInfo[] propertyInfos = type.GetProperties(); var Q = propertyInfos.Where(s => s.Name == "QUEUE_ID"); if (!Q.Any()) { return billnolist; } PropertyInfo propertyInfo = Q.FirstOrDefault()!; dataBacks = new List(); if (billlist != null) { if (billlist.FirstOrDefault()!.ContainsKey("FBillNo")) { int i = 0; foreach (Dictionary bill in billlist) { billnolist.Add(bill["FBillNo"]); //注意?后台配置r_DataSaveBatch时,FID,FBillNo,FSeq是必须的... dataBacks.Add( new ReciveDataBack() { FBillNo = bill["FBillNo"], FDocType = doctype, FErpID = int.Parse(bill["FID"]), FSeq = int.Parse(bill["FSeq"]), QUEUE_ID = (string)propertyInfo.GetValue(mesobj[i]) } ); i++; } } } return billnolist; } /// /// 成功保存到ERP之后备份主键信息到沃比数据库 /// /// 需要返回给推送方的类 /// 需要保存的数据集 private async void SaveReciveDataBackAsync(BreakData breakData, List dataBacks) { try { _context.r_ReciveDataBack!.AddRange(dataBacks); await _context.SaveChangesAsync(); breakData.Status = true; } catch (Exception ex) { breakData.Message="数据已成功保存到ERP,但" + ex.Message; breakData.Status = false; //throw; } } /// /// 提供批量保存、提交并审核普通生产领料单 /// /// 接收到的数据,已转换为table /// FFunctionID /// 主查询doctypeid /// 子查询doctypeid /// 接收到的直接数据 /// private async Task SaveBatchPickMtrlAsync(DataTable dataTable, int fid, int postmid, int fchildmid, string data) { BreakData breakData = new BreakData() { Status = false, DataSet = JsonConvert.DeserializeObject(data) }; string reason = string.Empty; //应当就ERP生产用料清单号、行号,查询源单,并校验 List purchaseOrders = _chiledselect.GetSourceBillEntry(dataTable, fchildmid, ref reason); if (!string.IsNullOrEmpty(reason)) { breakData.Message = reason; } else { List? mes_POInStocks = _shareController.DataConvertClass(data, ref reason); if (mes_POInStocks != null) { //推送数据 DataSaveBatch? dataSave = await _context.r_DataSaveBatch! .Include(s => s.GetForm).ThenInclude(s => s.functions) //必须提供外键表数据 .Where(s => s.GetForm.FFunctionID == fid && s.FDocTypeID == postmid) .AsNoTracking() .FirstOrDefaultAsync(); List inStocks = CreateBatchPRDPickMtrl(mes_POInStocks, purchaseOrders, dataSave.FErpBillType, ref reason); if (inStocks.Count() > 0 && reason == "") { //校验是否有重复推单 breakData = ExistsDoubleQueid(mes_POInStocks, dataSave.GetForm.FDocType); if (!breakData.Status) { breakData.DataSet = mes_POInStocks; //将源数据返回去... return breakData; } breakData = await SaveBatchAsync(dataSave, dataSave.GetForm.functions.FUrl, dataSave.GetForm.FDBName, inStocks); if (breakData.Status) { List dataBacks = new List(); //提取出创建好的单据编号 List> billlist = (List>)breakData.DataSet!; List billnolist = GetNewBillNoList(dataSave.GetForm.FDocType, mes_POInStocks, billlist, ref dataBacks); if (billnolist.Count > 0) { //写入沃比数据库,避免重复推送 SaveReciveDataBackAsync(breakData, dataBacks); if (dataSave.FIsAutoSubmitAndAudit && breakData.Status) //自动提交、审核 { //提交单据 breakData = await SubmitCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FSubmitUrl); if (breakData.Status) { //继续审核单据 breakData = await AuditCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FAuditUrl); //if (breakData.Status) //{ // //反写订单,除非特殊,否则使用Cloud标准的反写规则,系统自动反写 // breakData = await UpdateCGDD01_SYSAsync(inStocks, dataSave.GetForm.functions.FUrl); //} } } } else { breakData.Status = false; breakData.Message = "单据已保存成功,但返回参数中不包含单据编号,无法提交审核!"; } breakData.DataSet = billlist; } } else { breakData.Message = reason; } } else { breakData.Message = string.IsNullOrEmpty(reason) ? "输入数据转换出错" : reason; } } return breakData; } /// /// 提供批量保存、提交并审核普通生产入库单 /// /// 接收到的数据,已转换为table /// FFunctionID /// 主查询doctypeid /// 子查询doctypeid /// 接收到的直接数据 /// private async Task SaveBatchINSTOCKAsync(DataTable dataTable, int fid, int postmid, int fchildmid, string data) { BreakData breakData = new BreakData() { Status = false, DataSet = JsonConvert.DeserializeObject(data) }; string reason = string.Empty; //应当就ERP生产用料清单号、行号,查询源单,并校验 List purchaseOrders = _chiledselect.GetSourceBillEntry(dataTable, fchildmid, ref reason); if (!string.IsNullOrEmpty(reason)) { breakData.Message = reason; } else { List? mes_POInStocks = _shareController.DataConvertClass(data, ref reason); if (mes_POInStocks != null) { //推送数据 DataSaveBatch? dataSave = await _context.r_DataSaveBatch! .Include(s => s.GetForm).ThenInclude(s => s.functions) //必须提供外键表数据 .Where(s => s.GetForm.FFunctionID == fid && s.FDocTypeID == postmid) .AsNoTracking() .FirstOrDefaultAsync(); List inStocks = CreateBatchPRDINSTOCK(mes_POInStocks, purchaseOrders, dataSave.FErpBillType, ref reason); if (inStocks.Count() > 0 && reason == "") { //校验是否有重复推单 breakData = ExistsDoubleQueid(mes_POInStocks, dataSave.GetForm.FDocType); if (!breakData.Status) { breakData.DataSet = mes_POInStocks; //将源数据返回去... return breakData; } breakData = await SaveBatchAsync(dataSave, dataSave.GetForm.functions.FUrl, dataSave.GetForm.FDBName, inStocks); if (breakData.Status) { List dataBacks = new List(); //提取出创建好的单据编号 List> billlist = (List>)breakData.DataSet!; List billnolist = GetNewBillNoList(dataSave.GetForm.FDocType, mes_POInStocks, billlist, ref dataBacks); if (billnolist.Count > 0) { //写入沃比数据库,避免重复推送 SaveReciveDataBackAsync(breakData, dataBacks); if (dataSave.FIsAutoSubmitAndAudit && breakData.Status) //自动提交、审核 { //提交单据 breakData = await SubmitCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FSubmitUrl); if (breakData.Status) { //继续审核单据 breakData = await AuditCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FAuditUrl); //if (breakData.Status) //{ // //反写订单,除非特殊,否则使用Cloud标准的反写规则,系统自动反写 // breakData = await UpdateCGDD01_SYSAsync(inStocks, dataSave.GetForm.functions.FUrl); //} } } } else { breakData.Status = false; breakData.Message = "单据已保存成功,但返回参数中不包含单据编号,无法提交审核!"; } breakData.DataSet = billlist; } } else { breakData.Message = reason; } } else { breakData.Message = string.IsNullOrEmpty(reason) ? "输入数据转换出错" : reason; } } return breakData; } /// /// 提供批量保存、提交并审核普通委外领料单 /// /// 接收到的数据,已转换为table /// FFunctionID /// 主查询doctypeid /// 子查询doctypeid /// 接收到的直接数据 /// private async Task SaveBatchSUBPickMtrlAsync(DataTable dataTable, int fid, int postmid, int fchildmid, string data) { BreakData breakData = new BreakData() { Status = false, DataSet = JsonConvert.DeserializeObject(data) }; string reason = string.Empty; //应当就ERP生产用料清单号、行号,查询源单,并校验 List purchaseOrders = _chiledselect.GetSourceBillEntry(dataTable, fchildmid, ref reason); if (!string.IsNullOrEmpty(reason)) { breakData.Message = reason; } else { List? mes_POInStocks = _shareController.DataConvertClass(data, ref reason); if (mes_POInStocks != null) { //推送数据 DataSaveBatch? dataSave = await _context.r_DataSaveBatch! .Include(s => s.GetForm).ThenInclude(s => s.functions) //必须提供外键表数据 .Where(s => s.GetForm.FFunctionID == fid && s.FDocTypeID == postmid) .AsNoTracking() .FirstOrDefaultAsync(); List inStocks = CreateBatchSUBPickMtrl(mes_POInStocks, purchaseOrders, dataSave.FErpBillType, ref reason); if (inStocks.Count() > 0 && reason == "") { //校验是否有重复推单 breakData = ExistsDoubleQueid(mes_POInStocks, dataSave.GetForm.FDocType); if (!breakData.Status) { breakData.DataSet = mes_POInStocks; //将源数据返回去... return breakData; } breakData = await SaveBatchAsync(dataSave, dataSave.GetForm.functions.FUrl, dataSave.GetForm.FDBName, inStocks); if (breakData.Status) { List dataBacks = new List(); //提取出创建好的单据编号 List> billlist = (List>)breakData.DataSet!; List billnolist = GetNewBillNoList(dataSave.GetForm.FDocType, mes_POInStocks, billlist, ref dataBacks); if (billnolist.Count > 0) { //写入沃比数据库,避免重复推送 SaveReciveDataBackAsync(breakData, dataBacks); if (dataSave.FIsAutoSubmitAndAudit && breakData.Status) //自动提交、审核 { //提交单据 breakData = await SubmitCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FSubmitUrl); if (breakData.Status) { //继续审核单据 breakData = await AuditCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FAuditUrl); //if (breakData.Status) //{ // //反写订单,除非特殊,否则使用Cloud标准的反写规则,系统自动反写 // breakData = await UpdateCGDD01_SYSAsync(inStocks, dataSave.GetForm.functions.FUrl); //} } } } else { breakData.Status = false; breakData.Message = "单据已保存成功,但返回参数中不包含单据编号,无法提交审核!"; } breakData.DataSet = billlist; } } else { breakData.Message = reason; } } else { breakData.Message = string.IsNullOrEmpty(reason) ? "输入数据转换出错" : reason; } } return breakData; } //private async Task SaveBatchINSTOCKAsync(DataTable dataTable, int fid, int postmid, int fchildmid, string data) //{ // BreakData breakData = new BreakData() { Status = false, DataSet = JsonConvert.DeserializeObject(data) }; // string reason = string.Empty; // //应当就ERP生产用料清单号、行号,查询源单,并校验 // List purchaseOrders = _chiledselect.GetSourceBillEntry(dataTable, fchildmid, ref reason); // if (!string.IsNullOrEmpty(reason)) // { // breakData.Message = reason; // } // else // { // List? mes_POInStocks = _shareController.DataConvertClass(data, ref reason); // if (mes_POInStocks != null) // { // //推送数据 // DataSaveBatch? dataSave = await _context.r_DataSaveBatch! // .Include(s => s.GetForm).ThenInclude(s => s.functions) //必须提供外键表数据 // .Where(s => s.GetForm.FFunctionID == fid && s.FDocTypeID == postmid) // .AsNoTracking() // .FirstOrDefaultAsync(); // List inStocks = CreateBatchPRDPickMtrl(mes_POInStocks, purchaseOrders, dataSave.FErpBillType, ref reason); // if (inStocks.Count() > 0 && reason == "") // { // //校验是否有重复推单 // breakData = ExistsDoubleQueid(mes_POInStocks, dataSave.GetForm.FDocType); // if (!breakData.Status) // { // breakData.DataSet = mes_POInStocks; //将源数据返回去... // return breakData; // } // breakData = await SaveBatchAsync(dataSave, dataSave.GetForm.functions.FUrl, dataSave.GetForm.FDBName, inStocks); // if (breakData.Status) // { // List dataBacks = new List(); // //提取出创建好的单据编号 // List> billlist = (List>)breakData.DataSet!; // List billnolist = GetNewBillNoList(dataSave.GetForm.FDocType, mes_POInStocks, billlist, ref dataBacks); // if (billnolist.Count > 0) // { // //写入沃比数据库,避免重复推送 // SaveReciveDataBackAsync(breakData, dataBacks); // if (dataSave.FIsAutoSubmitAndAudit && breakData.Status) //自动提交、审核 // { // //提交单据 // breakData = await SubmitCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FSubmitUrl); // if (breakData.Status) // { // //继续审核单据 // breakData = await AuditCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FAuditUrl); // //if (breakData.Status) // //{ // // //反写订单,除非特殊,否则使用Cloud标准的反写规则,系统自动反写 // // breakData = await UpdateCGDD01_SYSAsync(inStocks, dataSave.GetForm.functions.FUrl); // //} // } // } // } // else // { // breakData.Status = false; // breakData.Message = "单据已保存成功,但返回参数中不包含单据编号,无法提交审核!"; // } // breakData.DataSet = billlist; // } // } // else // { // breakData.Message = reason; // } // } // else // { // breakData.Message = string.IsNullOrEmpty(reason) ? "输入数据转换出错" : reason; // } // } // return breakData; //} /// /// 提供批量保存、提交并审核普通生产退料单 /// /// 接收到的数据,已转换为table /// FFunctionID /// 主查询doctypeid /// 子查询doctypeid /// 接收到的直接数据 /// private async Task SaveBatchPRDReturnMtrlAsync(DataTable dataTable, int fid, int postmid, int fchildmid, string data) { BreakData breakData = new BreakData() { Status = false, DataSet = JsonConvert.DeserializeObject(data) }; string reason = string.Empty; //应当就ERP生产用料清单号、行号,查询源单,并校验 List purchaseOrders = _chiledselect.GetSourceBillEntry(dataTable, fchildmid, ref reason); if (!string.IsNullOrEmpty(reason)) { breakData.Message = reason; } else { List? mes_POInStocks = _shareController.DataConvertClass(data, ref reason); if (mes_POInStocks != null) { //推送数据 DataSaveBatch? dataSave = await _context.r_DataSaveBatch! .Include(s => s.GetForm).ThenInclude(s => s.functions) //必须提供外键表数据 .Where(s => s.GetForm.FFunctionID == fid && s.FDocTypeID == postmid) .AsNoTracking() .FirstOrDefaultAsync(); List inStocks = CreateBatchPRDReturnMtrl(mes_POInStocks, purchaseOrders, dataSave.FErpBillType, ref reason); if (inStocks.Count() > 0 && reason == "") { //校验是否有重复推单 breakData = ExistsDoubleQueid(mes_POInStocks, dataSave.GetForm.FDocType); if (!breakData.Status) { breakData.DataSet = mes_POInStocks; //将源数据返回去... return breakData; } breakData = await SaveBatchAsync(dataSave, dataSave.GetForm.functions.FUrl, dataSave.GetForm.FDBName, inStocks); if (breakData.Status) { List dataBacks = new List(); //提取出创建好的单据编号 List> billlist = (List>)breakData.DataSet!; List billnolist = GetNewBillNoList(dataSave.GetForm.FDocType, mes_POInStocks, billlist, ref dataBacks); if (billnolist.Count > 0) { //写入沃比数据库,避免重复推送 SaveReciveDataBackAsync(breakData, dataBacks); if (dataSave.FIsAutoSubmitAndAudit && breakData.Status) //自动提交、审核 { //提交单据 breakData = await SubmitCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FSubmitUrl); if (breakData.Status) { //继续审核单据 breakData = await AuditCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FAuditUrl); //if (breakData.Status) //{ // //反写订单,除非特殊,否则使用Cloud标准的反写规则,系统自动反写 // breakData = await UpdateCGDD01_SYSAsync(inStocks, dataSave.GetForm.functions.FUrl); //} } } } else { breakData.Status = false; breakData.Message = "单据已保存成功,但返回参数中不包含单据编号,无法提交审核!"; } breakData.DataSet = billlist; } } else { breakData.Message = reason; } } else { breakData.Message = string.IsNullOrEmpty(reason) ? "输入数据转换出错" : reason; } } return breakData; } /// /// 提供批量保存、提交并审核普通委外退料单 /// /// 接收到的数据,已转换为table /// FFunctionID /// 主查询doctypeid /// 子查询doctypeid /// 接收到的直接数据 /// private async Task SaveBatchSUBRETURNMTRLAsync(DataTable dataTable, int fid, int postmid, int fchildmid, string data) { BreakData breakData = new BreakData() { Status = false, DataSet = JsonConvert.DeserializeObject(data) }; string reason = string.Empty; //应当就ERP生产用料清单号、行号,查询源单,并校验 List purchaseOrders = _chiledselect.GetSourceBillEntry(dataTable, fchildmid, ref reason); if (!string.IsNullOrEmpty(reason)) { breakData.Message = reason; } else { List? mes_POInStocks = _shareController.DataConvertClass(data, ref reason); if (mes_POInStocks != null) { //推送数据 DataSaveBatch? dataSave = await _context.r_DataSaveBatch! .Include(s => s.GetForm).ThenInclude(s => s.functions) //必须提供外键表数据 .Where(s => s.GetForm.FFunctionID == fid && s.FDocTypeID == postmid) .AsNoTracking() .FirstOrDefaultAsync(); List inStocks = CreateBatchSUBRETURNMTRL(mes_POInStocks, purchaseOrders, dataSave.FErpBillType, ref reason); if (inStocks.Count() > 0 && reason == "") { //校验是否有重复推单 breakData = ExistsDoubleQueid(mes_POInStocks, dataSave.GetForm.FDocType); if (!breakData.Status) { breakData.DataSet = mes_POInStocks; //将源数据返回去... return breakData; } breakData = await SaveBatchAsync(dataSave, dataSave.GetForm.functions.FUrl, dataSave.GetForm.FDBName, inStocks); if (breakData.Status) { List dataBacks = new List(); //提取出创建好的单据编号 List> billlist = (List>)breakData.DataSet!; List billnolist = GetNewBillNoList(dataSave.GetForm.FDocType, mes_POInStocks, billlist, ref dataBacks); if (billnolist.Count > 0) { //写入沃比数据库,避免重复推送 SaveReciveDataBackAsync(breakData, dataBacks); if (dataSave.FIsAutoSubmitAndAudit && breakData.Status) //自动提交、审核 { //提交单据 breakData = await SubmitCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FSubmitUrl); if (breakData.Status) { //继续审核单据 breakData = await AuditCloudAsync(billnolist!, dataSave!.GetForm.FDBName, dataSave.FAuditUrl); //if (breakData.Status) //{ // //反写订单,除非特殊,否则使用Cloud标准的反写规则,系统自动反写 // breakData = await UpdateCGDD01_SYSAsync(inStocks, dataSave.GetForm.functions.FUrl); //} } } } else { breakData.Status = false; breakData.Message = "单据已保存成功,但返回参数中不包含单据编号,无法提交审核!"; } breakData.DataSet = billlist; } } else { breakData.Message = reason; } } else { breakData.Message = string.IsNullOrEmpty(reason) ? "输入数据转换出错" : reason; } } return breakData; } } }