using MES.Service.Dto.webApi.RealTimeInventory; namespace MESApplication.Controllers.RealTimeInventory; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Net; using System.Text; using System.Threading.Tasks; [Route("api/[controller]")] [ApiController] public class RealTimeInventoryController : ControllerBase { private readonly string _connectionString; private readonly string _baseUrl = "http://122.227.249.70:5050/k3cloud"; public RealTimeInventoryController(IConfiguration configuration) { _connectionString = configuration["AppSettings:DataBaseConn"]; } [HttpPost("syncInventory")] public async Task SyncInventory() { HttpClientEx httpClient = new HttpClientEx(); 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("登录失败"); List depotCodes = FetchDepotCodes(); if (depotCodes.Count == 0) return NotFound("未找到有效的DEPOTS_CODE"); DeleteInventoryData(); string depotCodesStr = string.Join(",", depotCodes); bool hasMoreData = true; int pageIndex = 1; while (hasMoreData) { InventoryParamModel model = new InventoryParamModel { fstocknumbers = depotCodesStr, isshowauxprop = true, isshowstockloc = true, pageindex = pageIndex, pagerows = 10000 }; httpClient.Url = $"{_baseUrl}/Kingdee.K3.SCM.WebApi.ServicesStub.InventoryQueryService.GetInventoryData.common.kdsvc"; httpClient.Content = JsonConvert.SerializeObject(new List { model }); string response = httpClient.AsyncRequest(); var inventoryData = JsonConvert.DeserializeObject(response); if (inventoryData?.Data == null || inventoryData.Data.Count == 0) hasMoreData = false; else { InsertInventoryData(inventoryData); pageIndex++; } } return Ok("库存数据导入完成"); } private List FetchDepotCodes() { List depotCodes = new List(); using (var connection = new OracleConnection(_connectionString)) { try { connection.Open(); string 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; } 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); } } } 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) { string query = "INSERT INTO ERPKCPC (ITEM_ID, DEPOT_CODE, FQTY, ITEM_NO, ORGID) VALUES (:ITEM_ID, :DEPOT_CODE, :FQTY, :ITEM_NO, :ORGID)"; 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)); try { cmd.ExecuteNonQuery(); } catch (Exception ex) { transaction.Rollback(); Console.WriteLine("插入库存数据时出错: " + ex.Message); return; } } } transaction.Commit(); } } catch (Exception ex) { Console.WriteLine("数据库连接出错: " + ex.Message); } } } }