using log4net; using log4net.Util; using Microsoft.Extensions.Caching.Memory; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Web; using System.Web.Http; using UFIDA.U8.Framework.Api.Common.Entity; using UFIDA.U8.Framework.Api.ControlObject.AP; using UFIDA.U8.Framework.Api.ControlObject.Common; using UFIDA.U8.Framework.Api.ControlObject.Entity; using UFIDA.U8.Framework.Api.ControlObject.Json; using UFIDA.U8.Framework.Api.ControlObject.ST; using UFIDA.U8.Framework.Api.ControlObject.U8M; using UFIDA.U8.Framework.Api.Unit; namespace UFIDA.U8.Framework.Api.Controllers.U8 { public class STController : ApiController { /// /// 日志组件 /// protected readonly ILog logInfo = LogManager.GetLogger("logInfo"); private static readonly MemoryCache _cache = new MemoryCache(new MemoryCacheOptions { ExpirationScanFrequency = TimeSpan.FromMinutes(10) }); /// /// 新增单据 /// /// /// /// /// /// /// /// /// /// [HttpPost] [Route("api/U8/ST/{cCardNum}/Insert")] public async Task> Insert(string cAccId, string cCardNum,[FromBody] Dictionary input, bool bCheck = true,bool bBeforCheckStock=true,bool bIsRedVouch=false,string sAddedState="",bool bReMote=false) { try { var db = CommUnit.GetDbClient(); var workId = SnowFlakeSingle.Instance.NextId(); logInfo.Debug($"作业Id:{workId}-----单据:{cCardNum},操作:新增,对接账套:{cAccId},数据:{input.ToJson()}"); LoginParamter param; if (!_cache.TryGetValue($"U8_{cAccId}", out BaseLogin baseLogin)) { logInfo.Debug($"作业Id:{workId}-----未获取到缓存的登录信息,正在重新构建"); baseLogin = new BaseLogin(); param = await CommUnit.GetLoginParamter(cAccId); if (param == null) { throw new Exception("未能加载指定系统号的登录信息"); } baseLogin.Init(param, false); _cache.Clear(); _cache.Set($"U8_{cAccId}", baseLogin); } else { param = await CommUnit.GetLoginParamter(cAccId); } logInfo.Debug($"作业Id:{workId}-----登录信息获取完成,缓存设置完成,开始加载单据配置信息"); var voucherInfo = db.Queryable().First(s => s.CardNumber == cCardNum); var defs = db.Queryable().Where(s => s.CardNumber == cCardNum && s.cPosition == "H" && s.bEnable==true).ToList(); //查询表头字段配置,供后续设置字段值 var dateKey = ""; var exchKey = ""; if (defs.Any(a => a.bDate == true && a.cPosition == "H")) dateKey = defs.Where(a => a.bDate == true && a.cPosition == "H").Select(a => a.FieldName).First(); if (defs.Any(a => a.bPrice == true && a.cPosition == "H")) exchKey = defs.Where(a => a.bPrice == true && a.cPosition == "H").Select(a => a.FieldName).First(); var dDate = DateTime.Today; if (!string.IsNullOrWhiteSpace(dateKey)) { if (!DateTime.TryParse($"{input[dateKey]}", out dDate)) { dDate = DateTime.Today; } } Exch exch; if (!string.IsNullOrWhiteSpace(exchKey) && input.ContainsKey(exchKey)) { exch = CommonHelper.GetExch(dDate, param.cAccId, $"{input[exchKey]}", baseLogin.Connection); } else { exch = null; } var newNumber = ""; #region 调整日期,去掉时间部分 if (input.ContainsKey("ddate")) { logInfo.Debug($"作业Id:{workId}-----调整日期,去掉时间部分"); input["ddate"] = $"{Convert.ToDateTime(input["ddate"]):yyyy-MM-dd}"; } if (input.ContainsKey("dtvdate")) { logInfo.Debug($"作业Id:{workId}-----调整日期,去掉时间部分"); input["dtvdate"] = $"{Convert.ToDateTime(input["dtvdate"]):yyyy-MM-dd}"; } #endregion logInfo.Debug($"作业Id:{workId}-----设置表头数据"); input.SetDictionaryData(defs, baseLogin.Connection, newNumber, 1, exch); logInfo.Debug($"作业Id:{workId}-----读取表体数据"); var bodyData = input[voucherInfo.BodyName].ToJson().ToList>(); //读取表体的数据 if (bodyData == null || bodyData.Count <= 0) throw new Exception("无表体数据!"); logInfo.Debug($"作业Id:{workId}-----获取表体字段配置"); var defsBody = db.Queryable().Where(s => s.CardNumber == cCardNum && s.cPosition == "B" && s.bEnable==true).ToList(); //获取表体的字段配置 var rowNo = 1; foreach (var body in bodyData) { logInfo.Debug($"作业Id:{workId}-----设置第{rowNo}行单据数据"); body.SetDictionaryData(defsBody, baseLogin.Connection, newNumber, rowNo, exch); rowNo++; // 根据存货档案是否批次管理调整批次号 if (body.ContainsKey("binvbatch") && body.ContainsKey("cbatch")) { logInfo.Debug($"作业Id:{workId}-----第{rowNo}行根据存货档案是否批次管理调整批次号"); if (body["binvbatch"] == null || body["binvbatch"] == DBNull.Value || !body["binvbatch"].ToBoolean()) { body["cbatch"] = ""; } } // 根据存货档案是否批次管理调整批次号(调拨单) if (body.ContainsKey("binvbatch") && body.ContainsKey("ctvbatch")) { logInfo.Debug($"作业Id:{workId}-----第{rowNo}行根据存货档案是否批次管理调整批次号(调拨单)"); if (body["binvbatch"] == null || body["binvbatch"] == DBNull.Value || !body["binvbatch"].ToBoolean()) { body["ctvbatch"] = ""; } } // 根据存货档案是否保质期管理调整生产日期和失效日期 if (body.ContainsKey("binvquality") && body.ContainsKey("dmadedate")) { logInfo.Debug($"作业Id:{workId}-----第{rowNo}行根据存货档案是否保质期管理调整生产日期和失效日期"); if (body["binvquality"] == null || body["binvquality"] == DBNull.Value || !body["binvquality"].ToBoolean()) { if (cCardNum == "0304") { body["dmadedate"] = ""; } else { body["dmadedate"] = ""; } } else { if (body.ContainsKey("cmassunit") && body.ContainsKey("imassdate")) { switch ($"{body["cmassunit"]}") { case "1" when cCardNum != "0304": body["dvdate"] = $"{Convert.ToDateTime(body["dmadedate"]).AddYears(Convert.ToInt32(body["imassdate"])):yyyy-MM-dd HH:MM:ss}"; break; case "1" when cCardNum == "0304": body["ddisdate"] = $"{Convert.ToDateTime(body["dmadedate"]).AddYears(Convert.ToInt32(body["imassdate"])):yyyy-MM-dd HH:MM:ss}"; break; case "2" when cCardNum != "0304": body["dvdate"] = $"{Convert.ToDateTime(body["dmadedate"]).AddMonths(Convert.ToInt32(body["imassdate"])):yyyy-MM-dd HH:MM:ss}"; break; case "2" when cCardNum == "0304": body["ddisdate"] = $"{Convert.ToDateTime(body["dmadedate"]).AddMonths(Convert.ToInt32(body["imassdate"])):yyyy-MM-dd HH:MM:ss}"; break; case "3" when cCardNum != "0304": body["dvdate"] = $"{Convert.ToDateTime(body["dmadedate"]).AddDays(Convert.ToInt32(body["imassdate"])):yyyy-MM-dd HH:MM:ss}"; break; case "3" when cCardNum == "0304": body["ddisdate"] = $"{Convert.ToDateTime(body["dmadedate"]).AddDays(Convert.ToInt32(body["imassdate"])):yyyy-MM-dd HH:MM:ss}"; break; } } } } } var co = new USERPCO(); var res =await co.Insert(baseLogin, input, voucherInfo.VoucherType, bCheck, bBeforCheckStock, bIsRedVouch, sAddedState,bReMote); return res; } catch (Exception ex) { logInfo.Error(ex.Message, ex); return new BaseResult { bSuccess = false, message = ex.Message, result = ex.StackTrace }; } } /// /// 更新单据 /// /// /// /// /// /// /// /// /// /// [HttpPost] [Route("api/U8/ST/{cCardNum}/Update")] public async Task> Update(string cAccId, string cCardNum, [FromBody] Dictionary input, bool bCheck = true, bool bBeforCheckStock = true, bool bIsRedVouch = false, string sAddedState = "", bool bUpdateNeedEas = true) { try { if (!_cache.TryGetValue($"U8_{cAccId}", out BaseLogin baseLogin)) { baseLogin = new BaseLogin(); var param = await CommUnit.GetLoginParamter(cAccId); if (param == null) { throw new Exception("未能加载指定系统号的登录信息"); } baseLogin.Init(param, false); _cache.Clear(); _cache.Set($"U8_{cAccId}", baseLogin); } var bo = new USERPCO(); var res = await bo.Update(baseLogin, input, "0412", "11", bCheck, bBeforCheckStock, bIsRedVouch, sAddedState, bUpdateNeedEas); return res; } catch (Exception ex) { logInfo.Error(ex.Message, ex); return new BaseResult { bSuccess = false, message = ex.Message, result = ex.StackTrace }; } } } }