using ADODB; using log4net; using MSXML2; using System; using System.Collections.Generic; using System.Threading.Tasks; 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.U8M; // ReSharper disable StringLiteralTypo // ReSharper disable CommentTypo // ReSharper disable IdentifierTypo // ReSharper disable InconsistentNaming // ReSharper disable UnusedMember.Global namespace UFIDA.U8.Framework.Api.ControlObject.ST { /// /// 库存管理 /// public class USERPCO { protected readonly ILog logInfo = LogManager.GetLogger("logInfo"); /// /// 新增单据 /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// public async Task> Insert(BaseLogin baseLogin, Dictionary dictionary, string cCardNum, string sVouchType, bool bGetCode = false, string codeKey = "", bool bCheck = true, bool bBeforCheckStock = true, bool bIsRedVouch = false, string sAddedState = "", bool bReMote = false, bool bAudit = false, bool bPrintDom = false) { try { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; logInfo.Debug("开始输出登录信息"); logInfo.Debug(baseLogin._vbLogin.userToken); if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } IXMLDOMDocument2 domHead = new DOMDocument(); IXMLDOMDocument2 domBody = new DOMDocument(); IXMLDOMDocument2 domPosition = new DOMDocument(); errorMsg = ""; try { logInfo.Debug("开始获取单据默认模板..."); if (!co.GetDefaultVoucherDom(sVouchType, cCardNum, ref domHead, ref domBody, ref domPosition, ref errorMsg) || !string.IsNullOrWhiteSpace(errorMsg)) { throw new Exception(errorMsg); } } catch (Exception ex) { logInfo.Error($"获取单据默认模板失败,错误信息:{ex.Message}", ex); errorMsg = ""; logInfo.Debug($"开始读取单据数据,当前单据编码:{cCardNum}"); if (!co.Load(sVouchType, "1=2", ref domHead, ref domBody, ref domPosition, ref errorMsg, true) || !string.IsNullOrWhiteSpace(errorMsg)) { throw new Exception(errorMsg); } } logInfo.Debug("填充表头DOM..."); domHead = dictionary.ToDocument2(domHead); if (!dictionary.TryGetValue("body", out var bodys)) { await Task.Delay(1); throw new Exception("无法获取表体数据"); } if (!(bodys is List> dictionarys) || dictionarys.Count <= 0) { await Task.Delay(1); throw new Exception("无法获取表体数据"); } if (bGetCode && !string.IsNullOrWhiteSpace(codeKey)) { errorMsg = ""; var newCode = co.GetNewVouchCode(sVouchType, domHead, ref errorMsg); logInfo.Debug($"获取新单号:{newCode}"); if (!string.IsNullOrWhiteSpace(newCode)) { CommonHelper.SetDomKeyValue(domHead, codeKey, newCode); } } logInfo.Debug("填充表体DOM..."); domBody = dictionarys.ToDocument2(domBody); IXMLDOMDocument2 domMsg = new DOMDocument(); errorMsg = ""; baseLogin.Connection.BeginTrans(); object vouchId = ""; var res = new BaseResult(); try { if (bPrintDom) { logInfo.Debug("开始输入DOM..."); logInfo.Debug(domHead.xml); logInfo.Debug(domBody.xml); logInfo.Debug(domPosition.xml); } logInfo.Debug("执行插入操作..."); //var cmd = new Command //{ // CommandText = "Select '开始执行插入操作'", // ActiveConnection = baseLogin.Connection //}; //object rsts = new Recordset(); //cmd.Execute(out rsts); res.bSuccess = co.Insert(sVouchType, domHead, domBody, null, ref errorMsg, baseLogin.Connection, ref vouchId, ref domMsg, bCheck, bBeforCheckStock, bIsRedVouch, sAddedState, bReMote); if (res.bSuccess) { res.voucherId = $"{vouchId}"; logInfo.Debug($"操作完成,操作结果:成功!------[{vouchId}]------[{errorMsg}]------[{domMsg.xml}]"); } else { logInfo.Debug($"操作完成,操作结果:失败!------[{vouchId}]------[{errorMsg}]------[{domMsg.xml}]"); } } catch (Exception) { await Task.Delay(1); baseLogin.Connection.RollbackTrans(); throw; } res.message = errorMsg; if (res.bSuccess && bAudit) { errorMsg = ""; if (!co.Verify(sVouchType, vouchId, ref errorMsg, baseLogin.Connection, null, ref domMsg)) { baseLogin.Connection.RollbackTrans(); if (!string.IsNullOrWhiteSpace(errorMsg)) throw new Exception(errorMsg); throw new Exception("审核单据时发生异常,请检查数据"); } } if (!res.bSuccess) { baseLogin.Connection.RollbackTrans(); if (!string.IsNullOrWhiteSpace(errorMsg)) throw new Exception(errorMsg); throw new Exception(domMsg.xml); } baseLogin.Connection.CommitTrans(); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WITH(NOLOCK) WHERE CardNumber='{cCardNum}'", baseLogin.Connection); if (rst.BOF || rst.EOF) { res.bSuccess = false; res.result = $"已在U8生成单据ID为{vouchId}的单据,但是未能查询到该单据的配置信息!"; } else { rst.MoveFirst(); var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (string.IsNullOrWhiteSpace(fieldName) || string.IsNullOrWhiteSpace(codeName)) { res.voucherCode = $"{res.voucherId}"; } else { if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } var strSql = $"SELECT {codeName} AS cCode FROM {rst.Fields["BTTblName"].Value} WITH(NOLOCK) WHERE {fieldName}='{vouchId}'"; rst.Close(); rst.Open(strSql, baseLogin.Connection); if (rst.EOF || rst.BOF) { res.voucherCode = ""; } else { rst.MoveFirst(); res.voucherCode = $"{rst.Fields["cCode"].Value}"; } } } res.message = "新增成功"; res.result = $"{vouchId}"; return res; //var bodys = dictionary.TryGetValue() dictionary["body"]; } catch (Exception ex) { logInfo.Error(ex.Message, ex); return new BaseResult { bSuccess = false, message = "新增失败", result = ex.Message }; } } /// /// 修改单据 /// /// /// /// /// /// /// /// /// /// /// /// public async Task> Update(BaseLogin baseLogin, Dictionary dictionary, string sCardNum, string sVouchType, bool bCheck = true, bool bBeforCheckStock = true, bool bIsRedVouch = false, string sAddedState = "", bool bUpdateNeedEas = true) { try { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } IXMLDOMDocument2 domHead = new DOMDocument(); IXMLDOMDocument2 domBody = new DOMDocument(); IXMLDOMDocument2 domPosition = new DOMDocument(); errorMsg = ""; if (!co.GetDefaultVoucherDom(sVouchType, sCardNum, ref domHead, ref domBody, ref domPosition, ref errorMsg)) { throw new Exception(errorMsg); } domHead = dictionary.ToDocument2(domHead); var bodys = dictionary["body"] as List> ?? $"{dictionary["body"]}".ToObject>>(); if (bodys == null || bodys.Count <= 0) { await Task.Delay(1); throw new Exception("无法获取表体数据"); } //if (!(bodys is List> dictionarys) || dictionarys.Count <= 0) //{ // await Task.Delay(1); // throw new Exception("无法获取表体数据"); //} domBody = bodys.ToDocument2(domBody); //IXMLDOMDocument2 domMsg = new DOMDocument(); errorMsg = ""; baseLogin.Connection.BeginTrans(); var vouchId = ""; var res = new BaseResult(); try { res.bSuccess = co.Update(sVouchType, domHead, domBody, domPosition); } catch (Exception) { baseLogin.Connection.RollbackTrans(); throw; } if (!res.bSuccess) { baseLogin.Connection.RollbackTrans(); res.message = "新增失败"; res.result = errorMsg; } else { baseLogin.Connection.CommitTrans(); res.message = "新增成功"; res.result = vouchId; } return res; //var bodys = dictionary.TryGetValue() dictionary["body"]; } catch (Exception ex) { logInfo.Error(ex.Message, ex); return new BaseResult { bSuccess = false, message = "新增失败", result = ex.Message }; } } /// /// 批量审核单据(单号) /// /// /// /// /// /// /// /// /// /// public async Task>> Verify(BaseLogin baseLogin, string sCardNum, string sVouchType, List cCodes, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } var conn = new Connection(); conn.Open(baseLogin.UfDbName); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WHERE CardNumber='{sCardNum}'", conn); if (rst.BOF || rst.EOF) throw new Exception("未能获取到单据的配置信息!"); rst.MoveFirst(); var tableName = $"{rst.Fields["BTTblName"].Value}"; var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } rst.Close(); var resList = new List>(); foreach (var cCode in cCodes) { var strSql = $"SELECT {fieldName} AS ID FROM {tableName} WHERE {codeName}='{cCode}'"; rst.Open(strSql, conn); if (rst.BOF || rst.EOF) { var res = new BaseResult { bSuccess = false, message = "审核失败", result = $"没有查询到单号为{cCode}的单据!", voucherId = "", voucherCode = cCode }; resList.Add(res); continue; } rst.MoveFirst(); object curId = rst.Fields["ID"].Value; var verifyResult = await Verify(co, conn, sVouchType, cCode, curId, bCheck, bBeforCheckStock, bList); resList.Add(verifyResult); } return resList; } /// /// 批量审核单据(ID) /// /// /// /// /// /// /// /// /// /// public async Task>> Verify(BaseLogin baseLogin, string sCardNum, string sVouchType, List vouchIds, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } var conn = new Connection(); conn.Open(baseLogin.UfDbName); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WHERE CardNumber='{sCardNum}'", conn); if (rst.BOF || rst.EOF) throw new Exception("未能获取到单据的配置信息!"); rst.MoveFirst(); var tableName = $"{rst.Fields["BTTblName"].Value}"; var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } rst.Close(); var resList = new List>(); foreach (var vouchId in vouchIds) { var strSql = $"SELECT {codeName} AS cCode FROM {tableName} WHERE {fieldName}='{vouchId}'"; rst.Open(strSql, conn); if (rst.BOF || rst.EOF) { var res = new BaseResult { bSuccess = false, message = "审核失败", result = $"没有查询到ID为{vouchId}的单据!", voucherId = $"{vouchId}", voucherCode = "" }; resList.Add(res); continue; } rst.MoveFirst(); var cCode = $"{rst.Fields["cCode"].Value}"; var verifyResult = await Verify(co, conn, sVouchType, cCode, vouchId, bCheck, bBeforCheckStock, bList); resList.Add(verifyResult); } return resList; } /// /// 审核单据(单号) /// /// /// /// /// /// /// /// /// /// public async Task> Verify(BaseLogin baseLogin, string sCardNum, string sVouchType, string cCode, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } var conn = new Connection(); conn.Open(baseLogin.UfDbName); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WHERE CardNumber='{sCardNum}'", conn); if (rst.BOF || rst.EOF) throw new Exception("未能获取到单据的配置信息!"); rst.MoveFirst(); var tableName = $"{rst.Fields["BTTblName"].Value}"; var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } rst.Close(); var strSql = $"SELECT {fieldName} AS ID FROM {tableName} WHERE {codeName}='{cCode}'"; rst.Open(strSql, conn); if (rst.BOF || rst.EOF) { var res = new BaseResult { bSuccess = false, message = "审核失败", result = $"没有查询到单号为{cCode}的单据!", voucherId = "", voucherCode = cCode }; } rst.MoveFirst(); object curId = rst.Fields["ID"].Value; var verifyResult = await Verify(co, conn, sVouchType, cCode, curId, bCheck, bBeforCheckStock, bList); return verifyResult; } /// /// 审核单据(ID) /// /// /// /// /// /// /// /// /// /// public async Task> Verify(BaseLogin baseLogin, string sCardNum, string sVouchType, long vouchId, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } var conn = new Connection(); conn.Open(baseLogin.UfDbName); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WHERE CardNumber='{sCardNum}'", conn); if (rst.BOF || rst.EOF) throw new Exception("未能获取到单据的配置信息!"); rst.MoveFirst(); var tableName = $"{rst.Fields["BTTblName"].Value}"; var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } rst.Close(); var strSql = $"SELECT {codeName} AS cCode FROM {tableName} WHERE {fieldName}='{vouchId}'"; rst.Open(strSql, conn); if (rst.BOF || rst.EOF) { var res = new BaseResult { bSuccess = false, message = "审核失败", result = $"没有查询到ID为{vouchId}的单据!", voucherId = $"{vouchId}", voucherCode = "" }; } rst.MoveFirst(); var cCode = $"{rst.Fields["cCode"].Value}"; var verifyResult = await Verify(co, conn, sVouchType, cCode, vouchId, bCheck, bBeforCheckStock, bList); return verifyResult; } /// /// 审核单据 /// /// /// /// /// /// /// /// /// /// public async Task> Verify(dynamic voucherCO, Connection conn, string sVouchType, string cCode, object vouchId, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var errMsg = ""; IXMLDOMDocument2 domMsg = new DOMDocument(); var res = new BaseResult { voucherCode = cCode, voucherId = $"{vouchId}" }; if (bList) { await Task.Delay(1); } conn.BeginTrans(); res.bSuccess = voucherCO.Verify(sVouchType, vouchId, ref errMsg, conn, null, ref domMsg, bCheck, bBeforCheckStock, bList); if (res.bSuccess) { conn.CommitTrans(); res.message = "审核成功"; res.result = res.voucherId; } else { conn.RollbackTrans(); res.message = "审核失败"; res.result = string.IsNullOrWhiteSpace(errMsg) ? domMsg.xml : errMsg; } return res; } /// /// 批量弃审单据(单号) /// /// /// /// /// /// /// /// /// /// public async Task>> UnVerify(BaseLogin baseLogin, string sCardNum, string sVouchType, List cCodes, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } var conn = new Connection(); conn.Open(baseLogin.UfDbName); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WHERE CardNumber='{sCardNum}'", conn); if (rst.BOF || rst.EOF) throw new Exception("未能获取到单据的配置信息!"); rst.MoveFirst(); var tableName = $"{rst.Fields["BTTblName"].Value}"; var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } rst.Close(); var resList = new List>(); foreach (var cCode in cCodes) { var strSql = $"SELECT {fieldName} AS ID FROM {tableName} WHERE {codeName}='{cCode}'"; rst.Open(strSql, conn); if (rst.BOF || rst.EOF) { var res = new BaseResult { bSuccess = false, message = "弃审失败", result = $"没有查询到单号为{cCode}的单据!", voucherId = "", voucherCode = cCode }; resList.Add(res); continue; } rst.MoveFirst(); object curId = rst.Fields["ID"].Value; var verifyResult = await UnVerify(co, conn, sVouchType, cCode, curId, bCheck, bBeforCheckStock, bList); resList.Add(verifyResult); } return resList; } /// /// 批量弃审单据(ID) /// /// /// /// /// /// /// /// /// /// public async Task>> UnVerify(BaseLogin baseLogin, string sCardNum, string sVouchType, List vouchIds, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } var conn = new Connection(); conn.Open(baseLogin.UfDbName); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WHERE CardNumber='{sCardNum}'", conn); if (rst.BOF || rst.EOF) throw new Exception("未能获取到单据的配置信息!"); rst.MoveFirst(); var tableName = $"{rst.Fields["BTTblName"].Value}"; var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } rst.Close(); var resList = new List>(); foreach (var vouchId in vouchIds) { var strSql = $"SELECT {codeName} AS cCode FROM {tableName} WHERE {fieldName}='{vouchId}'"; rst.Open(strSql, conn); if (rst.BOF || rst.EOF) { var res = new BaseResult { bSuccess = false, message = "弃审失败", result = $"没有查询到ID为{vouchId}的单据!", voucherId = $"{vouchId}", voucherCode = "" }; resList.Add(res); continue; } rst.MoveFirst(); var cCode = $"{rst.Fields["cCode"].Value}"; var verifyResult = await UnVerify(co, conn, sVouchType, cCode, vouchId, bCheck, bBeforCheckStock, bList); resList.Add(verifyResult); } return resList; } /// /// 弃审单据(单号) /// /// /// /// /// /// /// /// /// /// public async Task> UnVerify(BaseLogin baseLogin, string sCardNum, string sVouchType, string cCode, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } var conn = new Connection(); conn.Open(baseLogin.UfDbName); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WHERE CardNumber='{sCardNum}'", conn); if (rst.BOF || rst.EOF) throw new Exception("未能获取到单据的配置信息!"); rst.MoveFirst(); var tableName = $"{rst.Fields["BTTblName"].Value}"; var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } rst.Close(); var strSql = $"SELECT {fieldName} AS ID FROM {tableName} WHERE {codeName}='{cCode}'"; rst.Open(strSql, conn); if (rst.BOF || rst.EOF) { var res = new BaseResult { bSuccess = false, message = "弃审失败", result = $"没有查询到单号为{cCode}的单据!", voucherId = "", voucherCode = cCode }; } rst.MoveFirst(); object curId = rst.Fields["ID"].Value; var verifyResult = await UnVerify(co, conn, sVouchType, cCode, curId, bCheck, bBeforCheckStock, bList); return verifyResult; } /// /// 弃审单据(ID) /// /// /// /// /// /// /// /// /// /// public async Task> UnVerify(BaseLogin baseLogin, string sCardNum, string sVouchType, long vouchId, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } var conn = new Connection(); conn.Open(baseLogin.UfDbName); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WHERE CardNumber='{sCardNum}'", conn); if (rst.BOF || rst.EOF) throw new Exception("未能获取到单据的配置信息!"); rst.MoveFirst(); var tableName = $"{rst.Fields["BTTblName"].Value}"; var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } rst.Close(); var strSql = $"SELECT {codeName} AS cCode FROM {tableName} WHERE {fieldName}='{vouchId}'"; rst.Open(strSql, conn); if (rst.BOF || rst.EOF) { var res = new BaseResult { bSuccess = false, message = "弃审失败", result = $"没有查询到ID为{vouchId}的单据!", voucherId = $"{vouchId}", voucherCode = "" }; } rst.MoveFirst(); var cCode = $"{rst.Fields["cCode"].Value}"; var verifyResult = await UnVerify(co, conn, sVouchType, cCode, vouchId, bCheck, bBeforCheckStock, bList); return verifyResult; } /// /// 弃审单据 /// /// /// /// /// /// /// /// /// /// public async Task> UnVerify(dynamic voucherCO, Connection conn, string sVouchType, string cCode, object vouchId, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var errMsg = ""; IXMLDOMDocument2 domMsg = new DOMDocument(); var res = new BaseResult { voucherCode = cCode, voucherId = $"{vouchId}" }; if (bList) { await Task.Delay(1); } conn.BeginTrans(); try { res.bSuccess = voucherCO.UnVerify(sVouchType, vouchId, ref errMsg, conn, null, ref domMsg, bCheck, bBeforCheckStock, bList); } catch { conn.RollbackTrans(); throw; } if (res.bSuccess) { conn.CommitTrans(); res.message = "审核成功"; res.result = res.voucherId; } else { conn.RollbackTrans(); res.message = "审核失败"; res.result = string.IsNullOrWhiteSpace(errMsg) ? domMsg.xml : errMsg; } return res; } /// /// 批量删除单据(单号) /// /// /// /// /// /// /// /// /// /// public async Task>> Delete(BaseLogin baseLogin, string sCardNum, string sVouchType, List cCodes, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } var conn = new Connection(); conn.Open(baseLogin.UfDbName); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WHERE CardNumber='{sCardNum}'", conn); if (rst.BOF || rst.EOF) throw new Exception("未能获取到单据的配置信息!"); rst.MoveFirst(); var tableName = $"{rst.Fields["BTTblName"].Value}"; var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } rst.Close(); var resList = new List>(); foreach (var cCode in cCodes) { var strSql = $"SELECT {fieldName} AS ID FROM {tableName} WHERE {codeName}='{cCode}'"; rst.Open(strSql, conn); if (rst.BOF || rst.EOF) { var res = new BaseResult { bSuccess = false, message = "删除失败", result = $"没有查询到单号为{cCode}的单据!", voucherId = "", voucherCode = cCode }; resList.Add(res); continue; } rst.MoveFirst(); object curId = rst.Fields["ID"].Value; var verifyResult = await Delete(co, conn, sVouchType, cCode, curId, bCheck, bBeforCheckStock, bList); resList.Add(verifyResult); } return resList; } /// /// 批量删除单据(ID) /// /// /// /// /// /// /// /// /// /// public async Task>> Delete(BaseLogin baseLogin, string sCardNum, string sVouchType, List vouchIds, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } var conn = new Connection(); conn.Open(baseLogin.UfDbName); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WHERE CardNumber='{sCardNum}'", conn); if (rst.BOF || rst.EOF) throw new Exception("未能获取到单据的配置信息!"); rst.MoveFirst(); var tableName = $"{rst.Fields["BTTblName"].Value}"; var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } rst.Close(); var resList = new List>(); foreach (var vouchId in vouchIds) { var strSql = $"SELECT {codeName} AS cCode FROM {tableName} WHERE {fieldName}='{vouchId}'"; rst.Open(strSql, conn); if (rst.BOF || rst.EOF) { var res = new BaseResult { bSuccess = false, message = "删除失败", result = $"没有查询到ID为{vouchId}的单据!", voucherId = $"{vouchId}", voucherCode = "" }; resList.Add(res); continue; } rst.MoveFirst(); var cCode = $"{rst.Fields["cCode"].Value}"; var verifyResult = await Delete(co, conn, sVouchType, cCode, vouchId, bCheck, bBeforCheckStock, bList); resList.Add(verifyResult); } return resList; } /// /// 删除单据(单号) /// /// /// /// /// /// /// /// /// /// public async Task> Delete(BaseLogin baseLogin, string sCardNum, string sVouchType, string cCode, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } var conn = new Connection(); conn.Open(baseLogin.UfDbName); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WHERE CardNumber='{sCardNum}'", conn); if (rst.BOF || rst.EOF) throw new Exception("未能获取到单据的配置信息!"); rst.MoveFirst(); var tableName = $"{rst.Fields["BTTblName"].Value}"; var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } rst.Close(); var strSql = $"SELECT {fieldName} AS ID FROM {tableName} WHERE {codeName}='{cCode}'"; rst.Open(strSql, conn); if (rst.BOF || rst.EOF) { var res = new BaseResult { bSuccess = false, message = "删除失败", result = $"没有查询到单号为{cCode}的单据!", voucherId = "", voucherCode = cCode }; } rst.MoveFirst(); object curId = rst.Fields["ID"].Value; var verifyResult = await Delete(co, conn, sVouchType, cCode, curId, bCheck, bBeforCheckStock, bList); return verifyResult; } /// /// 删除单据(ID) /// /// /// /// /// /// /// /// /// /// public async Task> Delete(BaseLogin baseLogin, string sCardNum, string sVouchType, long vouchId, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var co = "USERPCO.VoucherCO".GetComObject(); var errorMsg = ""; if (!co.IniLogin(baseLogin._vbLogin, ref errorMsg)) { await Task.Delay(1); throw new Exception(errorMsg); } var conn = new Connection(); conn.Open(baseLogin.UfDbName); var rst = new Recordset(); rst.Open($"SELECT CardNumber,BTTblName,BTQName,BWTblName,BWQName,VchListQName,VchTblPrimarykeyNames,ReceiptNOFieldName FROM dbo.vouchers WHERE CardNumber='{sCardNum}'", conn); if (rst.BOF || rst.EOF) throw new Exception("未能获取到单据的配置信息!"); rst.MoveFirst(); var tableName = $"{rst.Fields["BTTblName"].Value}"; var fieldName = $"{rst.Fields["VchTblPrimarykeyNames"].Value}"; var codeName = $"{rst.Fields["ReceiptNOFieldName"].Value}"; if (codeName.Contains("{##}")) { codeName = codeName.Split('{', '#', '#', '}')[0]; } rst.Close(); var strSql = $"SELECT {codeName} AS cCode FROM {tableName} WHERE {fieldName}='{vouchId}'"; rst.Open(strSql, conn); if (rst.BOF || rst.EOF) { var res = new BaseResult { bSuccess = false, message = "删除失败", result = $"没有查询到ID为{vouchId}的单据!", voucherId = $"{vouchId}", voucherCode = "" }; } rst.MoveFirst(); var cCode = $"{rst.Fields["cCode"].Value}"; var verifyResult = await Delete(co, conn, sVouchType, cCode, vouchId, bCheck, bBeforCheckStock, bList); return verifyResult; } /// /// 删除单据 /// /// /// /// /// /// /// /// /// /// public async Task> Delete(dynamic voucherCO, Connection conn, string sVouchType, string cCode, object vouchId, bool bCheck = true, bool bBeforCheckStock = true, bool bList = false) { var errMsg = ""; IXMLDOMDocument2 domMsg = new DOMDocument(); var res = new BaseResult { voucherCode = cCode, voucherId = $"{vouchId}" }; if (bList) { await Task.Delay(1); } conn.BeginTrans(); try { res.bSuccess = voucherCO.Delete(sVouchType, vouchId, ref errMsg, conn, null, ref domMsg, bCheck, bBeforCheckStock, bList); } catch { conn.RollbackTrans(); throw; } if (res.bSuccess) { conn.CommitTrans(); res.message = "删除成功"; res.result = res.voucherId; } else { conn.RollbackTrans(); res.message = "删除失败"; res.result = string.IsNullOrWhiteSpace(errMsg) ? domMsg.xml : errMsg; } return res; } } }