1.新增销售模块自动审核功能

This commit is contained in:
qmj
2025-09-25 00:03:24 +08:00
parent 858538df17
commit 5def74f70a
11 changed files with 199 additions and 98 deletions
@@ -0,0 +1,25 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UFIDA.U8.Framework.Api.Common.Entity
{
/// <summary>
/// 系统U8账套对接参数配置表
/// </summary>
[SugarTable("SysU8AccountConfig", "系统U8账套对接参数配置表")]
public class SysSubSystem
{
[SugarColumn(IsIdentity = true, IsPrimaryKey = true, ColumnDescription = "主键", ColumnName = "Id", IsNullable = false)]
public virtual long Id { get; set; }
[SugarColumn(ColumnDescription = "应用秘钥",ColumnName = "AppSecrtet")]
public virtual string AppSecrtet { get; set; }
[SugarColumn(ColumnDescription = "应用key",ColumnName = "AppKey")]
public virtual string AppKey { get; set; }
}
}
@@ -12,7 +12,7 @@ namespace UFIDA.U8.Framework.Api.Common.Entity
{ {
[SugarColumn(IsIdentity = true, IsPrimaryKey = true, ColumnDescription = "主键", ColumnName = "Id", IsNullable = false)] [SugarColumn(IsIdentity = true, IsPrimaryKey = true, ColumnDescription = "主键", ColumnName = "Id", IsNullable = false)]
public int Id { get; set; } public long Id { get; set; }
/// <summary> /// <summary>
/// 系统号 /// 系统号
@@ -52,6 +52,7 @@
<Reference Include="System.Web" /> <Reference Include="System.Web" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Entity\SysSubSystem.cs" />
<Compile Include="Entity\SysU8AccountConfig.cs" /> <Compile Include="Entity\SysU8AccountConfig.cs" />
<Compile Include="Entity\SysU8FieldDefine.cs" /> <Compile Include="Entity\SysU8FieldDefine.cs" />
<Compile Include="Entity\SysU8MTask.cs" /> <Compile Include="Entity\SysU8MTask.cs" />
@@ -48,7 +48,7 @@ namespace UFIDA.U8.Framework.Api.ControlObject.SA
return co; return co;
} }
public async Task<BaseResult<string>> Save(BaseLogin baseLogin, Dictionary<string, object> dictionary, string cardNumber, VoucherTypeSA enmVoucherType, int VoucherState = 0, bool bGetCode = false, string codeKey = null, bool bAudit = false, bool iswfcontrolled = false, string cFlowFieldName = "IsWfControlled") public async Task<BaseResult<string>> Save(BaseLogin baseLogin, Dictionary<string, object> dictionary, string cardNumber, VoucherTypeSA enmVoucherType, int VoucherState = 0, bool bGetCode = false, string codeKey = null, bool? bVerify = false, bool iswfcontrolled = false, string cFlowFieldName = "IsWfControlled")
{ {
try try
{ {
@@ -114,90 +114,67 @@ namespace UFIDA.U8.Framework.Api.ControlObject.SA
var res = new BaseResult<string>(); var res = new BaseResult<string>();
_logInfo.Debug("开始保存..."); _logInfo.Debug("开始保存...");
errorMsg = co.Save(ref domHead, ref domBody, VoucherState, ref vouchId, ref domCur); errorMsg = co.Save(ref domHead, ref domBody, VoucherState, ref vouchId, ref domCur);
_logInfo.Debug("保存结束...");
_logInfo.Debug(errorMsg);
_logInfo.Debug($"{vouchId}");
res.bSuccess = string.IsNullOrWhiteSpace(errorMsg) && !string.IsNullOrWhiteSpace($"{vouchId}");
if (!res.bSuccess)
{
if (!string.IsNullOrWhiteSpace(errorMsg))
{
throw new Exception(errorMsg);
}
if (!string.IsNullOrWhiteSpace(domMsg.xml))
{
throw new Exception(domMsg.xml);
}
if (!string.IsNullOrWhiteSpace(curDom.xml))
{
throw new Exception(curDom.xml);
}
throw new Exception("未知错误");
}
if (iswfcontrolled == false && VoucherState == 2)
{
var strSql = $"UPDATE {vouchers.cBTTblName} SET {cFlowFieldName} = 0 WHERE {vouchers.voucherIdFieldName}={vouchId}";
object rsts = new Recordset();
baseLogin.Connection.Execute(strSql, out rsts);
}
res.voucherCode = CommonHelper.GetVoucherCode(baseLogin.Connection, vouchId, vouchers);
res.voucherId = $"{vouchId}";
res.result = errorMsg;
_logInfo.Debug("保存结束...");
_logInfo.Debug(errorMsg);
_logInfo.Debug($"{vouchId}");
res.bSuccess = (string.IsNullOrWhiteSpace(errorMsg) && !string.IsNullOrWhiteSpace($"{vouchId}")) ||
(errorMsg == "True" && !string.IsNullOrWhiteSpace($"{vouchId}"));
if (!res.bSuccess) if (!res.bSuccess)
{ {
res.message = "保存失败"; if (!string.IsNullOrWhiteSpace(errorMsg))
{
throw new Exception(errorMsg);
}
if (!string.IsNullOrWhiteSpace(domMsg.xml))
{
throw new Exception(domMsg.xml);
}
if (!string.IsNullOrWhiteSpace(curDom.xml))
{
throw new Exception(curDom.xml);
}
throw new Exception("未知错误");
return res;
} }
//if (iswfcontrolled == false && VoucherState == 0)
//{
// var strSql = $"UPDATE {vouchers.cBTTblName} SET {cFlowFieldName} = 0 WHERE {vouchers.voucherIdFieldName}={vouchId}";
// object rsts = new Recordset();
// baseLogin.Connection.Execute(strSql, out rsts);
//}
res.voucherCode = CommonHelper.GetVoucherCode(baseLogin.Connection, vouchId, vouchers);
res.voucherId = $"{vouchId}";
res.result = errorMsg;
res.message = "保存成功"; res.message = "保存成功";
_logInfo.Debug($"{baseLogin.Connection.State},{baseLogin.Connection.ConnectionString}"); _logInfo.Debug($"{baseLogin.Connection.State},{baseLogin.Connection.ConnectionString}");
var strWhere = CommonHelper.GetVoucherWhereSqlById(vouchers, vouchId); var strWhere = CommonHelper.GetVoucherWhereSqlById(vouchers, vouchId);
if (res.bSuccess && bAudit) if (res.bSuccess && bVerify == true)
{ {
try var verifyRes =await VerifyVouch(co, baseLogin.Connection, enmVoucherType, res.voucherCode, res.voucherId, strWhere, true);
{
errorMsg = VerifyVouch(co, baseLogin.Connection, enmVoucherType, res.voucherCode, res.voucherId, strWhere, true);
if (!string.IsNullOrWhiteSpace(errorMsg)) if (verifyRes.bSuccess == false)
{ {
return verifyRes;
throw new Exception(errorMsg); }
}
}
catch (Exception)
{
res.bSuccess = false;
throw;
}
} }
_logInfo.Debug("提交事务...");
return res; return res;
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -209,38 +186,60 @@ namespace UFIDA.U8.Framework.Api.ControlObject.SA
} }
} }
public async Task<BaseResult<string>> VerifyVouch(dynamic voucherCO, Connection conn, VoucherTypeSA sVouchType, string cCode, object vouchId, string strWhere, bool bVerify) /// <summary>
/// 审核单据
/// </summary>
/// <param name="voucherCo"></param>
/// <param name="conn"></param>
/// <param name="sVouchType"></param>
/// <param name="cCode"></param>
/// <param name="vouchId"></param>
/// <param name="strWhere"></param>
/// <param name="bVerify"></param>
/// <returns></returns>
public async Task<BaseResult<string>> VerifyVouch(dynamic voucherCo, Connection conn, VoucherTypeSA sVouchType, string cCode, object vouchId, string strWhere, bool bVerify)
{ {
IXMLDOMDocument2 domHead = new DOMDocument(); try
IXMLDOMDocument2 domBody = new DOMDocument();
IXMLDOMDocument2 domMsg = new DOMDocument();
_logInfo.Debug("开始获取单据数据...");
voucherCO.GetVoucherData(ref domHead, ref domBody, vouchId, true, strWhere);
var res = new BaseResult<string>
{ {
voucherCode = cCode, IXMLDOMDocument2 domHead = new DOMDocument();
voucherId = $"{vouchId}" IXMLDOMDocument2 domBody = new DOMDocument();
}; IXMLDOMDocument2 domMsg = new DOMDocument();
var errorMsg = voucherCO.VerifyVouch(ref domHead, bVerify); _logInfo.Debug("开始获取单据数据...");
voucherCo.GetVoucherData(ref domHead, ref domBody, vouchId, true, strWhere);
res.bSuccess = string.IsNullOrWhiteSpace(errorMsg); var res = new BaseResult<string>
{
voucherCode = cCode,
voucherId = $"{vouchId}"
};
if (res.bSuccess) var errorMsg = voucherCo.VerifyVouch(ref domHead, bVerify);
{
res.message = "审核成功";
res.result = res.voucherId;
res.bSuccess = string.IsNullOrWhiteSpace(errorMsg);
if (res.bSuccess)
{
res.message = "审核成功";
res.result = res.voucherId;
}
else
{
res.message = "审核失败";
res.result = string.IsNullOrWhiteSpace(errorMsg) ? domMsg.xml : errorMsg;
}
return res;
} }
else catch (Exception ex)
{ {
res.message = "审核失败"; _logInfo.Error(ex.Message, ex);
res.result = string.IsNullOrWhiteSpace(errorMsg) ? domMsg.xml : errorMsg;
}
return res; await Task.Delay(1);
return new BaseResult<string> { bSuccess = false, message = "审核失败", result = ex.Message };
}
} }
} }
} }
Binary file not shown.
+7 -1
View File
@@ -1002,12 +1002,17 @@
<returns></returns> <returns></returns>
<exception cref="T:System.Exception"></exception> <exception cref="T:System.Exception"></exception>
</member> </member>
<member name="T:UFIDA.U8.Framework.Api.Controllers.U8.SAController">
<summary>
销售管理
</summary>
</member>
<member name="F:UFIDA.U8.Framework.Api.Controllers.U8.SAController._logInfo"> <member name="F:UFIDA.U8.Framework.Api.Controllers.U8.SAController._logInfo">
<summary> <summary>
日志组件 日志组件
</summary> </summary>
</member> </member>
<member name="M:UFIDA.U8.Framework.Api.Controllers.U8.SAController.Save(System.String,System.String,System.Collections.Generic.Dictionary{System.String,System.Object},System.Int32)"> <member name="M:UFIDA.U8.Framework.Api.Controllers.U8.SAController.Save(System.String,System.String,System.Collections.Generic.Dictionary{System.String,System.Object},System.Int32,System.Nullable{System.Boolean})">
<summary> <summary>
保存单据 保存单据
</summary> </summary>
@@ -1015,6 +1020,7 @@
<param name="cCardNum">单据类型编码</param> <param name="cCardNum">单据类型编码</param>
<param name="input">报文</param> <param name="input">报文</param>
<param name="VoucherState">单据状态:0新增,1修改</param> <param name="VoucherState">单据状态:0新增,1修改</param>
<param name="bVerify">是否审核</param>
<returns></returns> <returns></returns>
<exception cref="T:System.Exception"></exception> <exception cref="T:System.Exception"></exception>
</member> </member>
@@ -6,9 +6,9 @@
"cexch_name": "人民币", //币种 "cexch_name": "人民币", //币种
"cmaker": "demo", //制单人 "cmaker": "demo", //制单人
"breturnflag": 0, //退货标志 "breturnflag": 0, //退货标志
"cstcode": "", //销售类型编码 "cstcode": "01", //销售类型编码
"cdepcode": "", //部门编码 "cdepcode": "0301", //部门编码
"ccuscode": "", //客户编码 "ccuscode": "00000001", //客户编码
"dpredatebt": "2025-01-01", //预发货日期 "dpredatebt": "2025-01-01", //预发货日期
"dpremodatebt": "2025-01-01", //预完工日期 "dpremodatebt": "2025-01-01", //预完工日期
"iexchrate": 1, //汇率 "iexchrate": 1, //汇率
@@ -16,12 +16,15 @@
"cpersoncode": "", //业务员编码 "cpersoncode": "", //业务员编码
"body": [ "body": [
{ {
"cinvcode": "", //存货编码 "cinvcode": "W1000A002", //存货编码
"iquantity": 10, //数量 "iquantity": 10, //数量
"dpredate": "2025-01-01", //预发货日期 "dpredate": "2025-01-01", //预发货日期
"dpremodate": "2025-01-01", //预完工日期 "dpremodate": "2025-01-01", //预完工日期
"editprop": "A", //编辑属性 "editprop": "A", //编辑属性
"irowno": 1, //行号 "irowno": 1, //行号
"cinvm_unit": "台",
"igrouptype": 0,
"cgroupcode": "01",
"itaxunitprice": 1, //含税单价 "itaxunitprice": 1, //含税单价
"iquotedprice": 1, //报价 "iquotedprice": 1, //报价
"iunitprice": 1, //无税单价 "iunitprice": 1, //无税单价
@@ -205,7 +205,7 @@ namespace UFIDA.U8.Framework.Api
// //
//c.InjectJavaScript(thisAssembly, "Swashbuckle.Dummy.SwaggerExtensions.testScript1.js"); //c.InjectJavaScript(thisAssembly, "Swashbuckle.Dummy.SwaggerExtensions.testScript1.js");
c.InjectJavaScript(Assembly.GetExecutingAssembly(), "UFIDA.U8.Framework.Api.Scripts.Swagger_zh-cn.js"); c.InjectJavaScript(Assembly.GetExecutingAssembly(), "UFIDA.U8.Framework.Api.Scripts.Swagger_zh-cn.js");
c.DisableValidator();
// The swagger-ui renders boolean data types as a dropdown. By default, it provides "true" and "false" // The swagger-ui renders boolean data types as a dropdown. By default, it provides "true" and "false"
// strings as the possible choices. You can use this option to change these to something else, // strings as the possible choices. You can use this option to change these to something else,
// for example 0 and 1. // for example 0 and 1.
@@ -9,6 +9,8 @@ using System.Web.Http.Description;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
using log4net; using log4net;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using SqlSugar;
using UFIDA.U8.Framework.Api.Common.Entity;
using UFIDA.U8.Framework.Api.ControlObject.Common; using UFIDA.U8.Framework.Api.ControlObject.Common;
using UFIDA.U8.Framework.Api.ControlObject.Entity; using UFIDA.U8.Framework.Api.ControlObject.Entity;
using UFIDA.U8.Framework.Api.ControlObject.Json; using UFIDA.U8.Framework.Api.ControlObject.Json;
@@ -16,6 +18,7 @@ using UFIDA.U8.Framework.Api.ControlObject.U8M;
using UFIDA.U8.Framework.Api.Entity; using UFIDA.U8.Framework.Api.Entity;
using UFIDA.U8.Framework.Api.Models; using UFIDA.U8.Framework.Api.Models;
using UFIDA.U8.Framework.Api.Unit; using UFIDA.U8.Framework.Api.Unit;
using SysU8AccountConfig = UFIDA.U8.Framework.Api.ControlObject.Entity.SysU8AccountConfig;
namespace UFIDA.U8.Framework.Api.Controllers.U8 namespace UFIDA.U8.Framework.Api.Controllers.U8
{ {
@@ -454,5 +457,41 @@ namespace UFIDA.U8.Framework.Api.Controllers.U8
return ex.Message; return ex.Message;
} }
} }
[HttpPost]
[Route("api/U8/DP/InitSubSystem")]
public async Task<BaseResult<long>> InitSubSystem(Dictionary<string,string> input)
{
try
{
if (!input.TryGetValue("cAppInfo", out var cValue) || string.IsNullOrWhiteSpace(cValue))
{
throw new Exception("参数错误");
}
var info = CommUnit.GetDecrypt(cValue).ToObject<SysSubSystem>();
var db = CommUnit.GetDbClient();
if (await db.Queryable<SysSubSystem>().AnyAsync(a => a.AppKey == info.AppKey))
{
throw new Exception("当前子系统已注册");
}
info.Id=SnowFlakeSingle.instance.NextId();
await db.Insertable(info).ExecuteCommandAsync();
return new BaseResult<long>() { bSuccess = true, message = "注册成功", result = info.Id };
}
catch (Exception ex)
{
_logInfo.Error(ex.Message, ex);
await Task.Delay(1);
return new BaseResult<long>() { bSuccess = false, message = "子系统初始化失败", result = 0 };
}
}
} }
} }
@@ -208,11 +208,21 @@ namespace UFIDA.U8.Framework.Api.Controllers.U8
}); });
} }
if (colListBody.Any(a => string.Equals(a.Key, "RelsTime", StringComparison.OrdinalIgnoreCase) || string.Equals(a.Value, "RelsTime", StringComparison.OrdinalIgnoreCase)))
{
var col = colListBody.First(a => string.Equals(a.Key, "RelsTime", StringComparison.OrdinalIgnoreCase) || string.Equals(a.Value, "RelsTime", StringComparison.OrdinalIgnoreCase));
conModels.Add(new ConditionalModel
{
FieldName = $"{col.Value}",
ConditionalType = ConditionalType.GreaterThanOrEqual,
FieldValue = $"{o.Value}"
});
}
} }
else if (o.Key == "dModifyDate__2") else if (o.Key == "dModifyDate__2")
{ {
if (colListHead.Any(a => string.Equals(a.Key, "dnveriRelsTimefytime", StringComparison.OrdinalIgnoreCase) || string.Equals(a.Value, "RelsTime", StringComparison.OrdinalIgnoreCase))) if (colListHead.Any(a => string.Equals(a.Key, "RelsTime", StringComparison.OrdinalIgnoreCase) || string.Equals(a.Value, "RelsTime", StringComparison.OrdinalIgnoreCase)))
{ {
var col = colListHead.First(a => string.Equals(a.Key, "RelsTime", StringComparison.OrdinalIgnoreCase) || string.Equals(a.Value, "RelsTime", StringComparison.OrdinalIgnoreCase)); var col = colListHead.First(a => string.Equals(a.Key, "RelsTime", StringComparison.OrdinalIgnoreCase) || string.Equals(a.Value, "RelsTime", StringComparison.OrdinalIgnoreCase));
@@ -223,6 +233,18 @@ namespace UFIDA.U8.Framework.Api.Controllers.U8
FieldValue = $"{o.Value}" FieldValue = $"{o.Value}"
}); });
} }
if (colListBody.Any(a => string.Equals(a.Key, "dnveriRelsTimefytime", StringComparison.OrdinalIgnoreCase) || string.Equals(a.Value, "RelsTime", StringComparison.OrdinalIgnoreCase)))
{
var col = colListBody.First(a => string.Equals(a.Key, "RelsTime", StringComparison.OrdinalIgnoreCase) || string.Equals(a.Value, "RelsTime", StringComparison.OrdinalIgnoreCase));
conModels.Add(new ConditionalModel
{
FieldName = $"{col.Value}",
ConditionalType = ConditionalType.LessThanOrEqual,
FieldValue = $"{o.Value}"
});
}
} }
else if ($"{o.Value}".EndsWith("%") || $"{o.Value}".StartsWith("%")) else if ($"{o.Value}".EndsWith("%") || $"{o.Value}".StartsWith("%"))
{ {
@@ -20,6 +20,9 @@ using UFIDA.U8.Framework.Api.Unit;
namespace UFIDA.U8.Framework.Api.Controllers.U8 namespace UFIDA.U8.Framework.Api.Controllers.U8
{ {
/// <summary>
/// 销售管理
/// </summary>
public class SAController : ApiController public class SAController : ApiController
{ {
@@ -37,11 +40,12 @@ namespace UFIDA.U8.Framework.Api.Controllers.U8
/// <param name="cCardNum">单据类型编码</param> /// <param name="cCardNum">单据类型编码</param>
/// <param name="input">报文</param> /// <param name="input">报文</param>
/// <param name="VoucherState">单据状态:0新增,1修改</param> /// <param name="VoucherState">单据状态:0新增,1修改</param>
/// <param name="bVerify">是否审核</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="Exception"></exception> /// <exception cref="Exception"></exception>
[HttpPost] [HttpPost]
[Route("api/U8/SA/{cCardNum}/Save")] [Route("api/U8/SA/{cCardNum}/Save")]
public async Task<BaseResult<string>> Save(string cAccId, string cCardNum, [FromBody] Dictionary<string, object> input, int VoucherState = 0) public async Task<BaseResult<string>> Save(string cAccId, string cCardNum, [FromBody] Dictionary<string, object> input, int VoucherState = 0, bool? bVerify = null)
{ {
try try
{ {
@@ -135,7 +139,9 @@ namespace UFIDA.U8.Framework.Api.Controllers.U8
var co = new ClsVoucherCO_SA(); var co = new ClsVoucherCO_SA();
var res = await co.Save(baseLogin, input, cCardNum, (VoucherTypeSA)Convert.ToInt32(voucherInfo.VoucherType), VoucherState,bGetCode, codeKey, voucherInfo.bVerify, voucherInfo.iswfcontrolled, voucherInfo.cFlowFieldName); var res = await co.Save(baseLogin, input, cCardNum,
(VoucherTypeSA)Convert.ToInt32(voucherInfo.VoucherType), VoucherState, bGetCode, codeKey,
bVerify ?? voucherInfo.bVerify, voucherInfo.iswfcontrolled, voucherInfo.cFlowFieldName);
return res; return res;
} }