using MES.Service.Dto.webApi.RealTimeInventory; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Oracle.ManagedDataAccess.Client; namespace MESApplication.Controllers.RealTimeInventory; /// /// 实时库存控制器 /// 负责同步第三方系统库存数据到本地数据库 /// [Route("api/[controller]")] [ApiController] public class RealTimeInventoryController : ControllerBase { // K3Cloud系统的基础API地址 private readonly string _baseUrl = "http://122.227.249.70:5050/k3cloud"; // 数据库连接字符串 private readonly string _connectionString; /// /// 构造函数 /// 通过依赖注入获取配置信息 /// /// 配置对象 public RealTimeInventoryController(IConfiguration configuration) { // 从配置中获取数据库连接字符串 _connectionString = configuration["AppSettings:DataBaseConn"]; } /// /// 同步库存数据API /// 从K3Cloud系统获取库存数据并同步到本地数据库 /// /// 同步结果 [HttpPost("syncInventory")] public async Task SyncInventory() { // 创建自定义HTTP客户端实例 var httpClient = new HttpClientEx(); // 设置身份验证API地址 httpClient.Url = $"{_baseUrl}/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc"; // 准备登录参数 var parameters = new List { "6654201b47f099", // 帐套Id "Administrator", // 用户名 "Lts88666*", // 密码 2052 // 语言(中文) }; // 序列化参数并设置为请求内容 httpClient.Content = JsonConvert.SerializeObject(parameters); // 发送登录请求并解析结果 var result = JObject.Parse(httpClient.AsyncRequest())["LoginResultType"] .Value(); // 登录失败返回错误信息 if (result != 1) return BadRequest("登录失败"); // 获取需要同步的仓库代码列表 var depotCodes = FetchDepotCodes(); if (depotCodes.Count == 0) return NotFound("未找到有效的DEPOTS_CODE"); // 清空现有库存数据 DeleteInventoryData(); // 将仓库代码列表转换为逗号分隔的字符串 var depotCodesStr = string.Join(",", depotCodes); var hasMoreData = true; var pageIndex = 1; // 分页获取所有库存数据 while (hasMoreData) { // 构建库存查询参数模型 var model = new InventoryParamModel { fstocknumbers = depotCodesStr, // 仓库代码 isshowauxprop = true, // 是否显示辅助属性 isshowstockloc = true, // 是否显示库存位置 pageindex = pageIndex, // 当前页码 pagerows = 10000 // 每页记录数 }; // 设置库存查询API地址 httpClient.Url = $"{_baseUrl}/Kingdee.K3.SCM.WebApi.ServicesStub.InventoryQueryService.GetInventoryData.common.kdsvc"; // 序列化查询参数 httpClient.Content = JsonConvert.SerializeObject(new List { model }); // 发送查询请求 var response = httpClient.AsyncRequest(); // 反序列化库存数据 var inventoryData = JsonConvert.DeserializeObject(response); // 检查是否还有数据 if (inventoryData?.Data == null || inventoryData.Data.Count == 0) { hasMoreData = false; } else { // 将当前页数据插入数据库 InsertInventoryData(inventoryData); // 准备获取下一页数据 pageIndex++; } } // 返回同步完成消息 return Ok("库存数据导入完成"); } /// /// 从本地数据库获取仓库代码列表 /// 排除特定仓库代码('MJ','CY-MJ') /// /// 仓库代码列表 private List FetchDepotCodes() { var depotCodes = new List(); // 使用Oracle连接 using (var connection = new OracleConnection(_connectionString)) { try { // 打开数据库连接 connection.Open(); // 查询有效仓库代码的SQL var query = "SELECT DEPOTS_CODE FROM MES_INV_ITEM_STOCKS WHERE DEPOTS_CODE IS NOT NULL AND DEPOTS_CODE NOT IN ('MJ','CY-MJ') GROUP BY DEPOTS_CODE"; // 执行查询并读取结果 using (var cmd = new OracleCommand(query, connection)) using (var reader = cmd.ExecuteReader()) { while (reader.Read()) depotCodes.Add(reader.GetString(0)); } } catch (Exception ex) { Console.WriteLine("获取仓库代码时出错: " + ex.Message); } } return depotCodes; } /// /// 清空ERPKCPC表中的现有库存数据 /// 使用事务确保操作的原子性 /// private void DeleteInventoryData() { using (var connection = new OracleConnection(_connectionString)) { try { connection.Open(); // 开始数据库事务 using (var transaction = connection.BeginTransaction()) { // 执行删除操作 using (var deleteCmd = new OracleCommand("DELETE FROM ERPKCPC", connection)) { deleteCmd.ExecuteNonQuery(); } // 提交事务 transaction.Commit(); } } catch (Exception ex) { Console.WriteLine("删除库存数据时出错: " + ex.Message); } } } /// /// 将库存数据插入到ERPKCPC表中 /// 使用事务确保所有数据要么全部插入成功,要么全部失败 /// /// 库存数据响应对象 private void InsertInventoryData(InventoryResponse inventoryData) { using (var connection = new OracleConnection(_connectionString)) { try { connection.Open(); // 开始数据库事务 using (var transaction = connection.BeginTransaction()) { // 遍历每条库存数据 foreach (var item in inventoryData.Data) { // 插入SQL语句 var query = "INSERT INTO ERPKCPC (ITEM_ID, DEPOT_CODE, FQTY, ITEM_NO, ORGID,Fstockstatusnumber,Fstockstatusname) VALUES (:ITEM_ID, :DEPOT_CODE, :FQTY, :ITEM_NO, :ORGID,:Fstockstatusnumber,:Fstockstatusname)"; using (var cmd = new OracleCommand(query, connection)) { cmd.Parameters.Add(new OracleParameter(":ITEM_ID", item.FmaterialId)); cmd.Parameters.Add( new OracleParameter(":DEPOT_CODE", item.FstockNumber)); cmd.Parameters.Add( new OracleParameter(":FQTY", item.Fqty)); cmd.Parameters.Add(new OracleParameter(":ITEM_NO", item.FmaterialNumber)); cmd.Parameters.Add(new OracleParameter(":ORGID",item.FstockorgId)); cmd.Parameters.Add(new OracleParameter(":Fstockstatusnumber",item.Fstockstatusnumber)); cmd.Parameters.Add(new OracleParameter(":Fstockstatusname",item.Fstockstatusname)); try { // 执行插入命令 cmd.ExecuteNonQuery(); } catch (Exception ex) { // 出错时回滚事务 transaction.Rollback(); Console.WriteLine("插入库存数据时出错: " + ex.Message); return; } } } // 所有数据插入成功,提交事务 transaction.Commit(); } } catch (Exception ex) { Console.WriteLine("数据库连接出错: " + ex.Message); } } } }