diff --git a/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 b/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 index 87fd87fc..e2a492bd 100644 Binary files a/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 and b/.vs/WMS.Web/DesignTimeBuild/.dtbcache.v2 differ diff --git a/src/WMS.Web.Api/Controllers/SysConfigController.cs b/src/WMS.Web.Api/Controllers/SysConfigController.cs index d8e08f66..47b1e9d1 100644 --- a/src/WMS.Web.Api/Controllers/SysConfigController.cs +++ b/src/WMS.Web.Api/Controllers/SysConfigController.cs @@ -12,6 +12,7 @@ using WMS.Web.Core.Internal.Results; using WMS.Web.Domain.Infrastructure; using WMS.Web.Domain.IService.Public; using WMS.Web.Domain.Values; +using WMS.Web.Domain.Values.Single; namespace WMS.Web.Api.Controllers { @@ -25,12 +26,16 @@ namespace WMS.Web.Api.Controllers private readonly ILoginService _loginService; private readonly IBasicsRepositories _basicsRepositories; private readonly IBoxRepositories _boxRepositories; + private readonly IErpService _erpService; + private readonly ISingleDataService _singleDataService; public SysConfigController(ILoginService loginService, IBasicsRepositories basicsRepositories, - IBoxRepositories boxRepositories) + IBoxRepositories boxRepositories, IErpService erpService, ISingleDataService singleDataService) { _loginService = loginService; _basicsRepositories = basicsRepositories; _boxRepositories = boxRepositories; + _erpService = erpService; + _singleDataService = singleDataService; } /// @@ -111,6 +116,37 @@ namespace WMS.Web.Api.Controllers var r = await _basicsRepositories.GetSubUcStockAsync(id); return Result>.ReSuccess(r); } + /// + /// 根据仓库获取金蝶子仓库 + /// + /// 仓库id + /// + [HttpGet] + [Route("GetErp_SubUcStock/{id}")] + public async Task>> GetErp_SubUcStock([FromRoute] int id) + { + var loginInfo = _loginService.GetLoginInfo(this.HttpContext.Request.Headers["Authorization"]); + if (loginInfo == null || loginInfo.UserInfo == null) + return Result>.ReFailure(ResultCodes.Token_Invalid_Error); + + List list = new List(); + var code = _singleDataService.GetSingleDataCode(SingleAction.Stocks, loginInfo.UserInfo.CompanyId, id); + if (code.Substring(0, 2).Equals("HD") || code.Substring(0, 2).Equals("GD")) + { + var subs = await _erpService.BillQueryForSubStock(code); + foreach (var s in subs.Data) + { + list.Add(new UcStockResponse() + { + Id = s.Id, + Code = s.Code, + Name = s.Name, + Disable = false + }); + } + } + return Result>.ReSuccess(list); + } /// /// 获取仓位:模糊名称 diff --git a/src/WMS.Web.Api/Controllers/TestController.cs b/src/WMS.Web.Api/Controllers/TestController.cs index 8088fdca..a46d6ea7 100644 --- a/src/WMS.Web.Api/Controllers/TestController.cs +++ b/src/WMS.Web.Api/Controllers/TestController.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; using System.Linq; using System.ServiceModel; using System.Threading.Tasks; +using WMS.Web.Core.Dto; using WMS.Web.Core.Internal.Results; using WMS.Web.Domain.Infrastructure; using WMS.Web.Domain.IService; @@ -23,19 +24,28 @@ namespace WMS.Web.Api.Controllers private readonly IErpService _erpService; private IInStockTaskService _inStockTaskService; private IBasicsRepositories _transactionRepositories; + private readonly IOpsService _opsService; - public TestController(IErpService erpService, IInStockTaskService inStockTaskService, IBasicsRepositories transactionRepositories) + public TestController(IErpService erpService, IInStockTaskService inStockTaskService, + IBasicsRepositories transactionRepositories, IOpsService opsService) { this._erpService = erpService; this._inStockTaskService = inStockTaskService; this._transactionRepositories = transactionRepositories; + _opsService = opsService; } [HttpGet] [Route("hj")] public async Task TestHJ() { - var res = await this._erpService.BillQueryForTransferDirectOutStock(); + OpsBoxRequest request = new OpsBoxRequest() + { + StrartTime = DateTime.Now.AddYears(-1), + EndTime=DateTime.Now + }; + await _opsService.GetBox(request); + //var res = await this._erpService.BillQueryForSubStock(); //var result= await this._erpService.BillQueryForPurchaseInStock(); //var result = await this._erpService.BillQueryForOrg(); var result = await this._erpService.BillQueryForMaterial(); diff --git a/src/WMS.Web.Api/appsettings.json b/src/WMS.Web.Api/appsettings.json index 1420980f..0afcdc17 100644 --- a/src/WMS.Web.Api/appsettings.json +++ b/src/WMS.Web.Api/appsettings.json @@ -43,6 +43,11 @@ "ErpId": "ce20210909", "PurchaseInstockFieldKeys": "FBillNo,FUOM,FSupplierId.FName,FPurchaseOrgId.FName,FMaterialName,FMaterialId.FNumber" }, + "OpsOptions": { + "Url": "http://39.108.150.2:8050/", + "UserName": "admin", + "PassWord": "888888" + }, "Qiniu": { "AccessKey": "dOsTum4a5qvhPTBbZRPX0pIOU7PZWRX7htKjztms", "SecretKey": "KFxsGbnErkALFfeGdMa8QWTdodJbamMX0iznLe-q", diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml index 42c97a90..443d7192 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Api.xml @@ -283,6 +283,13 @@ 仓库id + + + 根据仓库获取金蝶子仓库 + + 仓库id + + 获取仓位:模糊名称 diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml index 9ff5164b..dd09a194 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Core.xml @@ -2280,6 +2280,16 @@ 操作 Id集合 + + + 老ops箱信息请求 + + + + + 老ops箱信息 + + 根据单号搜索出库单任务信息 diff --git a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml index bc5074b3..643a246f 100644 --- a/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml +++ b/src/WMS.Web.Api/wwwroot/WMS.Web.Domain.xml @@ -993,6 +993,11 @@ 仓位ID + + + 子仓库(跟金蝶交互字段) + + 盘点前数量(wms系统数量) @@ -1598,6 +1603,12 @@ + + + 获取仓位信息信息 根据仓库编码 + + + 登录服务接口 @@ -1924,6 +1935,11 @@ 采购入库:字段 + + + 老ops对接 + + Quartz定时任务-配置项 @@ -2373,6 +2389,13 @@ + + + 根据仓库编码获取仓位 + + + + 同步数据(保存提交审核) @@ -2597,6 +2620,11 @@ + + + ops服务 + + 保存单个key value diff --git a/src/WMS.Web.Core/Dto/OpsBoxRequest.cs b/src/WMS.Web.Core/Dto/OpsBoxRequest.cs new file mode 100644 index 00000000..4497d64b --- /dev/null +++ b/src/WMS.Web.Core/Dto/OpsBoxRequest.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WMS.Web.Core.Dto +{ + /// + /// 老ops箱信息请求 + /// + public class OpsBoxRequest + { + public DateTime StrartTime { get; set; } + public DateTime EndTime { get; set; } + public string BoxBillNo { get; set; } + + public int Page { get; set; } = 1; + public int Limit { get; set; } = 10000000; + } +} diff --git a/src/WMS.Web.Core/Dto/OpsBoxResponse.cs b/src/WMS.Web.Core/Dto/OpsBoxResponse.cs new file mode 100644 index 00000000..3ad53221 --- /dev/null +++ b/src/WMS.Web.Core/Dto/OpsBoxResponse.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WMS.Web.Core.Dto +{ + /// + /// 老ops箱信息 + /// + public class OpsBoxResponse + { + } +} diff --git a/src/WMS.Web.Domain/Entitys/Box.cs b/src/WMS.Web.Domain/Entitys/Box.cs index b26d2c0e..2083e5ff 100644 --- a/src/WMS.Web.Domain/Entitys/Box.cs +++ b/src/WMS.Web.Domain/Entitys/Box.cs @@ -34,12 +34,16 @@ namespace WMS.Web.Domain.Entitys /// /// 供应商Id /// - public int SupplierId { get; set; } + public int? SupplierId { get; set; } + /// + /// 组织Id + /// + public int? OrgId { get; set; } /// /// 创建时间(对应老OPS的创建时间) /// public DateTime CreateTime { get; set; } = DateTime.Now; - + /// /// 明细 /// diff --git a/src/WMS.Web.Domain/Entitys/TakeStock.cs b/src/WMS.Web.Domain/Entitys/TakeStock.cs index e0808357..82a349ae 100644 --- a/src/WMS.Web.Domain/Entitys/TakeStock.cs +++ b/src/WMS.Web.Domain/Entitys/TakeStock.cs @@ -61,6 +61,11 @@ namespace WMS.Web.Domain.Entitys [Column("SubStockId")] public int SubStockId { get; set; } /// + /// 子仓库(跟金蝶交互字段) + /// + [Column("Erp_SubStockId")] + public int Erp_SubStockId { get; set; } = 0; + /// /// 盘点前数量(wms系统数量) /// [Column("BeforeQty")] diff --git a/src/WMS.Web.Domain/IService/Public/IErpService.cs b/src/WMS.Web.Domain/IService/Public/IErpService.cs index 52aefd13..399c0b4c 100644 --- a/src/WMS.Web.Domain/IService/Public/IErpService.cs +++ b/src/WMS.Web.Domain/IService/Public/IErpService.cs @@ -65,6 +65,11 @@ namespace WMS.Web.Domain.IService.Public /// /// Task> BillQueryForStock(); + /// + /// 获取仓位信息信息 根据仓库编码 + /// + /// + Task> BillQueryForSubStock(string code=null); //同步数据(保存提交审核) Task Sync(T dto, string formId); //下推 diff --git a/src/WMS.Web.Domain/IService/Public/IHttpClientService.cs b/src/WMS.Web.Domain/IService/Public/IHttpClientService.cs index 6b35e31a..42a5e48c 100644 --- a/src/WMS.Web.Domain/IService/Public/IHttpClientService.cs +++ b/src/WMS.Web.Domain/IService/Public/IHttpClientService.cs @@ -8,6 +8,7 @@ namespace WMS.Web.Domain.IService.Public { public interface IHttpClientService { + HttpClient BuildHttpClient(Dictionary dicDefaultHeaders, int? timeoutSecond = 180); Task GetAsync(string url, int timeoutSecond = 180); Task GetAsync(string url, Dictionary dicHeaders, int timeoutSecond = 180); Task PostAsync(string url, string requestBody, int timeoutSecond = 180); diff --git a/src/WMS.Web.Domain/IService/Public/IOpsService.cs b/src/WMS.Web.Domain/IService/Public/IOpsService.cs new file mode 100644 index 00000000..7d6c5c38 --- /dev/null +++ b/src/WMS.Web.Domain/IService/Public/IOpsService.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using WMS.Web.Core.Dto; + +namespace WMS.Web.Domain.IService.Public +{ + public interface IOpsService + { + Task GetBox(OpsBoxRequest request); + } +} diff --git a/src/WMS.Web.Domain/Options/OpsOptions.cs b/src/WMS.Web.Domain/Options/OpsOptions.cs new file mode 100644 index 00000000..3fe9cfc1 --- /dev/null +++ b/src/WMS.Web.Domain/Options/OpsOptions.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WMS.Web.Domain.Options +{ + /// + /// 老ops对接 + /// + public class OpsOptions + { + public string Url { get; set; } + public string UserName { get; set; } + public string PassWord { get; set; } + } +} diff --git a/src/WMS.Web.Domain/Services/Public/ErpService.cs b/src/WMS.Web.Domain/Services/Public/ErpService.cs index de4f8972..ed5b4f8f 100644 --- a/src/WMS.Web.Domain/Services/Public/ErpService.cs +++ b/src/WMS.Web.Domain/Services/Public/ErpService.cs @@ -201,6 +201,21 @@ namespace WMS.Web.Domain.Services.Public //3.使用组织:只查询“深圳市元创时代科技有限公司”这个组织;组织ID=100008--固定值查询(测试端和正式是一样的) param.FilterString = "FDocumentStatus='C' and FForbidStatus='A' and FUseOrgId=100008"; param.OrderString = "FCreateDate ASC"; + //3.获取金蝶物料:拼接参数和条件 + var query = new ErpBillQueryDto(token_result.Data); + var param = new ErpBillQueryParamDto(FormIdParam.BD_MATERIAL.ToString()); + param.FieldKeys = "FMATERIALID,FName,FNumber,FSpecification,FForbidStatus,FUseOrgId"; + param.Limit = 10000; + Console.Write("请输入第几行:"); + var row = Console.ReadLine(); + param.StartRow = (Convert.ToInt32(row) * param.Limit); + + //查询条件:备注其中的条件值以金蝶的值为准!!! + //1.审核状态:已审核 + //2.禁用状态:A否,B是 + //3.使用组织:只查询“深圳市元创时代科技有限公司”这个组织;组织ID=100008--固定值查询(测试端和正式是一样的) + param.FilterString = "FDocumentStatus='C' and FForbidStatus='A' and FUseOrgId=100008"; + param.OrderString = "FCreateDate ASC"; //4.循环拿金蝶数据 bool isHave = true; @@ -331,6 +346,49 @@ namespace WMS.Web.Domain.Services.Public } } /// + /// 根据仓库编码获取仓位 + /// + /// + /// + public async Task> BillQueryForSubStock(string code = null) + { + try + { + var token_result = await this.Init(); + if (!token_result.IsSuccess) + return ResultList.ReFailure(token_result); + var query = new ErpBillQueryDto(token_result.Data); + var param = new ErpBillQueryParamDto(FormIdParam.BD_STOCK.ToString()); + param.FieldKeys = "FStockFlexDetail_FDetailID,FFlexEntryName,FFlexEntryId,'0'"; + param.Limit = 100000; + if (!string.IsNullOrEmpty(code)) + param.FilterString = "FNumber='" + code + "'";//FNumber='C' + query.Data = JsonConvert.SerializeObject(param); + var json = JsonConvert.SerializeObject(query); + + var result_json = await _client.ExecuteBillQueryAsync(json); + var result = JsonConvert.DeserializeObject>>(result_json); + + var list = new List(); + foreach (var item in result) + { + var lis = new ErpStockDto(); + lis.Id = int.Parse(item[0]); + lis.Name = item[1]; + lis.Code = item[2]; + lis.OrgId = Convert.ToInt32(item[3]); + list.Add(lis); + + } + return ResultList.ReSuccess(list); + + } + catch (Exception) + { + return ResultList.ReFailure("错误", 10002); + } + } + /// /// 同步数据(保存提交审核) /// /// @@ -414,7 +472,7 @@ namespace WMS.Web.Domain.Services.Public param.FilterString = "FCreateDate>='" + beginTime + "' and FCreateDate<='" + endTime + "' and FDocumentStatus='C' and FRemainOutQty>=0"; //string srt = JsonConvert.SerializeObject(stocks_codes); //param.FilterString = param.FilterString + " and FStockID in (" + srt.Substring(1, srt.Length - 2) + ")"; - + //根据原订单号查询 if (sourceBillNos != null && sourceBillNos.Count() > 0) { @@ -833,6 +891,7 @@ namespace WMS.Web.Domain.Services.Public return ResultList.ReFailure(ResultCodes.Erp_BillQuery_Error); } } + #endregion } } diff --git a/src/WMS.Web.Domain/Services/Public/HttpClientService.cs b/src/WMS.Web.Domain/Services/Public/HttpClientService.cs index db4f48e0..016bd2dd 100644 --- a/src/WMS.Web.Domain/Services/Public/HttpClientService.cs +++ b/src/WMS.Web.Domain/Services/Public/HttpClientService.cs @@ -105,8 +105,8 @@ namespace WMS.Web.Domain.Services.Public /// public async Task PostAsync(string url, string requestBody, Dictionary dicHeaders, int timeoutSecond = 180) { - var client = BuildHttpClient(null, timeoutSecond); - var requestContent = GenerateStringContent(requestBody, dicHeaders); + var client = BuildHttpClient(dicHeaders, timeoutSecond); + var requestContent = GenerateStringContent(requestBody, contentHeaders); var response = await client.PostAsync(url, requestContent); var responseContent = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) @@ -213,7 +213,7 @@ namespace WMS.Web.Domain.Services.Public /// /// /// - private HttpClient BuildHttpClient(Dictionary dicDefaultHeaders, int? timeoutSecond) + public HttpClient BuildHttpClient(Dictionary dicDefaultHeaders, int? timeoutSecond=180) { var httpClient = _clientFactory.CreateClient("ops_client"); httpClient.DefaultRequestHeaders.Clear(); //为了使客户端不受最后一个请求的影响,它需要清除DefaultRequestHeaders diff --git a/src/WMS.Web.Domain/Services/Public/OpsService.cs b/src/WMS.Web.Domain/Services/Public/OpsService.cs new file mode 100644 index 00000000..22f77fd8 --- /dev/null +++ b/src/WMS.Web.Domain/Services/Public/OpsService.cs @@ -0,0 +1,81 @@ +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using WMS.Web.Core.Dto; +using WMS.Web.Domain.IService.Public; +using WMS.Web.Domain.Options; + +namespace WMS.Web.Domain.Services.Public +{ + /// + /// ops服务 + /// + public class OpsService : IOpsService + { + private readonly IHttpClientService _httpClientService; + private readonly ILogger _logger; + private readonly IMemoryCache _memoryCache; + private int hours = 10;//过期时间 默认10小时 + private readonly OpsOptions _option; + + public OpsService(IHttpClientService httpClientService, ILogger logger, + IMemoryCache memoryCache, IOptions option) + { + this._memoryCache = memoryCache; + this._httpClientService = httpClientService; + this._logger = logger; + _option = option?.Value; + } + + public async Task GetBox(OpsBoxRequest request) + { + var token = await GetToken(); + Dictionary dicHeaders = new Dictionary(); + dicHeaders.Add("Authorization", "Bearer " + token); + //_httpClientService.BuildHttpClient(contentHeaders); + var res= await _httpClientService.PostAsync(_option.Url + "BarCode/carton-box_api/carton-box", JsonConvert.SerializeObject(request), dicHeaders); + } + + private async Task GetToken() + { + OpsLogin login = new OpsLogin() + { + hAccount = _option.UserName, + hPassword = _option.PassWord + }; + var res = await _httpClientService.PostAsync(_option.Url + "api/login", JsonConvert.SerializeObject(login)); + var token = res.data?.token ?? ""; + if (string.IsNullOrEmpty(token)) + _logger.LogInformation("老Ops登录失败:" + res?.errors); + return token; + } + + } + public class OpsLogin + { + public OpsLogin() { } + public string hAccount { get; set; } = "admin"; + public string hPassword { get; set; } = "888888"; + } + public class OpsInfo + { + public int code { get; set; } + public string message { get; set; } + public string date { get; set; } + public string token { get; set; } + } + public class OpsReponse + { + public int statusCode { get; set; } + public bool succeeded { get; set; } + public string errors { get; set; } + public string extras { get; set; } + + public OpsInfo data { get; set; } + } +} diff --git a/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs b/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs index 10908300..e37c0187 100644 --- a/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs +++ b/src/WMS.Web.Repositories/DependencyInjection/AppBuilder.cs @@ -174,6 +174,8 @@ namespace WMS.Web.Repositories.DependencyInjection Services.Configure(Configuration.GetSection("HttpOptions")); Services.AddOptions(); Services.Configure(Configuration.GetSection("ErpOptions")); + Services.AddOptions(); + Services.Configure(Configuration.GetSection("OpsOptions")); } /// @@ -234,6 +236,8 @@ namespace WMS.Web.Repositories.DependencyInjection Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); + Services.AddTransient(); + Services.AddTransient();