pan
2025-11-08 e83bd2f6a38957c0d47c9e0a6c6b2ca45836e114
提交
已添加1个文件
已修改25个文件
614 ■■■■ 文件已修改
项目代码/WIDESEA_WMSClient/public/webconfig.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/Login.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db-wal 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db-wal 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/MaterialUnitService.cs 397 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/MaterielInfoService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Common/LocationEnum/LocationTypeEnum.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Allocate/AllocateDto.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Basic/MaterialUnitDto.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Inbound/InboundOrderAddDTO.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Outbound/OutboundOrderAddDTO.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IBasicService/IInvokeMESService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IBasicService/IMaterialUnitService.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundOrderService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Allocate/Dt_ AllocateOrder.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_InboundOrder.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_InboundOrderDetail.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrder.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WIDESEA_WMSClient/public/webconfig.js
@@ -1,4 +1,4 @@
window.webConfig = {
    "webApiBaseUrl": "http://localhost:9291/",
    "webApiProduction":"http://localhost:9291/"
    "webApiBaseUrl": "http://172.19.69.152:9291/",
    "webApiProduction":"http://172.19.69.152:9291/"
}
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue
@@ -14,7 +14,7 @@
      
      <!-- æ‰˜ç›˜ä¿¡æ¯æ˜¾ç¤º -->
      <div class="tray-info" v-if="trayBarcode">
        <i class="el-icon-s-management"></i> å½“前托盘: {{ trayBarcode }}
        <i class="el-icon-s-management"></i> å½“前料箱: {{ trayBarcode }}
       <!--  <el-button 
          class="small-button"
          type="text" 
@@ -49,7 +49,7 @@
                 class="custom-input"
            >
              <template slot="prepend">
                <span>料箱。码</span>
                <span> æ–™ç®±æ¡ç </span>
              </template>
              <template slot="append">
                <el-button 
@@ -95,7 +95,7 @@
          </div>
          
          <div class="input-tips">
            <p>提示:先输入托盘条码,然后输入物料条码</p>
            <p>提示:先输入料箱码,然后输入物料条码</p>
       
          </div>
        
@@ -147,7 +147,7 @@
          
          <div v-if="materials.length === 0" class="empty-state">
            <i class="el-icon-document"></i>
            <p v-if="!trayBarcode">请先输入托盘条码</p>
            <p v-if="!trayBarcode">请先输入料箱条码</p>
            <p v-else>暂无物料数据,请扫描或输入物料条码</p>
          </div>
          
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/Login.vue
@@ -1,6 +1,6 @@
<template>
  <div class="login-container">
    <div class="project-name">WIDESEA_WMS</div>
    <div class="project-name">WMS</div>
    <div class="login-form">
      <div class="form-user" @keypress="loginPress">
        <div class="login-text">
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db
Binary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db-wal
Binary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db
Binary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db-wal
Binary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs
@@ -28,24 +28,24 @@
            _logger = logger;
        }
        public async Task FeedbackInbound(  FeedbackInboundRequestModel model)
        public async Task<ResponseModel> FeedbackInbound(  FeedbackInboundRequestModel model)
        {
            string json = JsonConvert.SerializeObject(model);
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            var _client = _httpClientFactory.CreateClient("MESUrl");
            _client.DefaultRequestHeaders.Clear();
            _client.DefaultRequestHeaders.Add("Accept", "application/json");
            _logger.LogInformation("InvokeMESService  FeedbackInbound :  " + json);
            var response = await _client.PostAsync("AldMaterialWarehousing/MaterialWarehousing", content);
            string body = await response.Content.ReadAsStringAsync();
            _logger.LogInformation("InvokeMESService  FeedbackInbound  body:  " + body);
            if (!response.IsSuccessStatusCode)
            {
                throw new HttpRequestException(body);
            }
            // JsonConvert.DeserializeObject<ResponseModel>(body);
           return JsonConvert.DeserializeObject<ResponseModel>(body);
        }
        public async Task FeedbackOutbound(  FeedbackOutboundRequestModel model)
@@ -73,15 +73,15 @@
            string json = JsonConvert.SerializeObject(model);
            string userDataEncoded = Uri.EscapeDataString(json);
            //string baseUrl = "http://mestest.ald.com//OrBitWCFServiceR15/orbitwebapi.ashx?";
            string userTicket = await GetToken(UserName, Password);
            string api = "WMS_BarcodeInformation";
            //string userDataEncoded = Uri.EscapeDataString(json);
            ////string baseUrl = "http://mestest.ald.com//OrBitWCFServiceR15/orbitwebapi.ashx?";
            //string userTicket = await GetToken(UserName, Password);
            //string api = "WMS_BarcodeInformation";
            var client = _httpClientFactory.CreateClient("MESUrl");
            // æ‹¼æŽ¥ URL å‚æ•°
            string url = $"{client.BaseAddress}UserTicket={userTicket}&API={api}&UserData={userDataEncoded}";
           // string url = $"{client.BaseAddress}UserTicket={userTicket}&API={api}&UserData={userDataEncoded}";
            client.DefaultRequestHeaders.Clear();
@@ -91,7 +91,7 @@
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            using var response = await client.PostAsync(url, content);
            using var response = await client.PostAsync("", content);
            var responseText = await response.Content.ReadAsStringAsync();
            if (!response.IsSuccessStatusCode)
            {
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/MaterialUnitService.cs
@@ -1,4 +1,6 @@
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.JsonPatch.Internal;
using Microsoft.Extensions.Logging;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -6,9 +8,11 @@
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_DTO.Basic;
using WIDESEA_IBasicService;
using WIDESEA_Model.Models;
using WIDESEA_Model.Models.Basic;
namespace WIDESEA_BasicService
{
@@ -23,10 +27,72 @@
            _logger = logger;
            _materielInfoRepository = materielInfoRepository;
        }
        /// <summary>
        /// èŽ·å–ç‰©æ–™åŠå…¶æ‰€æœ‰å•ä½è½¬æ¢å…³ç³»ï¼ˆä½¿ç”¨MaterialUnit左连接Material)
        /// </summary>
        private async Task<MaterialWithUnits> GetMaterialWithUnitsAsync(string materialCode)
        {
            var unitConversions = await Repository.Db.Queryable<Dt_MaterialUnit>()
                .LeftJoin<Dt_MaterielInfo>((u, m) => u.ItemNo == m.MaterielCode)
                .Where((u, m) => u.ItemNo == materialCode)
                .Select((u, m) => new
                {
                    MaterialCode = u.ItemNo,
                    FromUom = u.FromUom,
                    ToUom = u.ToUom,
                    Ratio = u.Ratio,
                    IssueUnit = m.usageUOM,
                    PurchaseUnit = m.purchaseUOM,
                    StockUnit = m.inventoryUOM
                })
                .ToListAsync();
            if (!unitConversions.Any())
            {
                // å¦‚果没有找到单位转换记录,尝试直接获取物料信息
                var material = await _materielInfoRepository.Db.Queryable<Dt_MaterielInfo>()
                    .Where(m => m.MaterielCode == materialCode)
                    .FirstAsync();
                if (material == null)
                {
                    throw new ArgumentException($"未找到物料编号: {materialCode}");
                }
                return new MaterialWithUnits
                {
                    MaterialCode = materialCode,
                    IssueUnit = material.usageUOM,
                    PurchaseUnit = material.purchaseUOM,
                    StockUnit = material.inventoryUOM
                };
            }
            // ä»Žç¬¬ä¸€æ¡è®°å½•中获取物料信息(所有记录都有相同的物料信息)
            var firstRecord = unitConversions.First();
            return new MaterialWithUnits
            {
                MaterialCode = materialCode,
                IssueUnit = firstRecord.IssueUnit,
                PurchaseUnit = firstRecord.PurchaseUnit,
                StockUnit = firstRecord.StockUnit,
                UnitConversions = unitConversions.Select(u => new UnitConversion
                {
                    FromUom = u.FromUom,
                    ToUom = u.ToUom,
                    Ratio = u.Ratio
                }).ToList()
            };
        }
        /// <summary>
        /// å•位转换
        /// </summary>
        public async Task<decimal> ConvertAsync(string materialCode, decimal quantity, string fromUnit, string toUnit)
        public async Task<MaterialWithUnitConversionResult> ConvertAsync(string materialCode, decimal quantity, string fromUnit, string toUnit)
        {
            if (string.IsNullOrEmpty(materialCode))
                throw new ArgumentException("物料编号不能为空");
@@ -34,11 +100,12 @@
            if (string.IsNullOrEmpty(fromUnit) || string.IsNullOrEmpty(toUnit))
                throw new ArgumentException("单位不能为空");
            // å¦‚果单位相同,直接返回
            // å¦‚果单位相同,直接返回,不进行转换
            if (fromUnit.Equals(toUnit, StringComparison.OrdinalIgnoreCase))
                return quantity;
                return new MaterialWithUnitConversionResult(quantity, toUnit, false);
            var ratio = await GetConversionRatioAsync(materialCode, fromUnit, toUnit);
            var materialData = await GetMaterialWithUnitsAsync(materialCode);
            var ratio = GetConversionRatioFromData(materialData, fromUnit, toUnit);
            if (ratio == null)
            {
@@ -46,141 +113,291 @@
                throw new InvalidOperationException($"未找到物料 {materialCode} ä»Ž {fromUnit} åˆ° {toUnit} çš„单位转换关系");
            }
            return quantity * ratio.Value;
            var convertedQuantity = quantity * ratio.Value;
            return new MaterialWithUnitConversionResult(convertedQuantity, toUnit, true);
        }
        private  MaterialWithUnitConversionResult ConvertAsync(MaterialWithUnits materialData, decimal quantity, string fromUnit, string toUnit)
        {
            if(materialData==null)
                throw new ArgumentException("物料不存在");
            if (string.IsNullOrEmpty(fromUnit) || string.IsNullOrEmpty(toUnit))
                throw new ArgumentException("单位不能为空");
            // å¦‚果单位相同,直接返回,不进行转换
            if (fromUnit.Equals(toUnit, StringComparison.OrdinalIgnoreCase))
                return new MaterialWithUnitConversionResult(quantity, toUnit, false);
            var ratio = GetConversionRatioFromData(materialData, fromUnit, toUnit);
            if (ratio == null)
            {
                _logger.LogWarning($"未找到物料 {materialData.MaterialCode} ä»Ž {fromUnit} åˆ° {toUnit} çš„单位转换关系");
                throw new InvalidOperationException($"未找到物料 {materialData.MaterialCode} ä»Ž {fromUnit} åˆ° {toUnit} çš„单位转换关系");
            }
            var convertedQuantity = quantity * ratio.Value;
            return new MaterialWithUnitConversionResult(convertedQuantity, toUnit, true);
        }
        /// <summary>
        /// é‡‡è´­å•位转库存单位
        /// </summary>
        public async Task<decimal> ConvertPurchaseToStockAsync(string materialCode, decimal quantity)
        public async Task<MaterialWithUnitConversionResult> ConvertPurchaseToStockAsync(string materialCode, decimal quantity)
        {
            // èŽ·å–ç‰©æ–™ä¿¡æ¯
            var material = await _materielInfoRepository.Db.Queryable<Dt_MaterielInfo>()
                .Where(x => x.MaterielCode == materialCode)
                .FirstAsync();
            var materialData = await GetMaterialWithUnitsAsync(materialCode);
            if (material == null)
            {
                throw new ArgumentException($"未找到物料编号: {materialCode}");
            }
            // å¦‚果采购单位和库存单位相同,直接返回
            if (materialData.PurchaseUnit.Equals(materialData.StockUnit, StringComparison.OrdinalIgnoreCase))
                return new MaterialWithUnitConversionResult(quantity, materialData.StockUnit, false);
            return await ConvertAsync(materialCode, quantity, material.purchaseUOM, material.inventoryUOM);
            return ConvertAsync(materialData, quantity, materialData.PurchaseUnit, materialData.StockUnit);
        }
        /// <summary>
        /// é¢†æ–™å•位转库存单位
        /// </summary>
        public async Task<decimal> ConvertIssueToStockAsync(string materialCode, decimal quantity)
        public async Task<MaterialWithUnitConversionResult> ConvertIssueToStockAsync(string materialCode, decimal quantity)
        {
            // èŽ·å–ç‰©æ–™ä¿¡æ¯
            var material = await _materielInfoRepository.Db.Queryable<Dt_MaterielInfo>()
                .Where(x => x.MaterielCode == materialCode)
                .FirstAsync();
            var materialData = await GetMaterialWithUnitsAsync(materialCode);
            if (material == null)
            {
                throw new ArgumentException($"未找到物料编号: {materialCode}");
            }
            // å¦‚果领料单位和库存单位相同,直接返回
            if (materialData.IssueUnit.Equals(materialData.StockUnit, StringComparison.OrdinalIgnoreCase))
                return new MaterialWithUnitConversionResult(quantity, materialData.StockUnit, false);
            return await ConvertAsync(materialCode, quantity, material.usageUOM, material.inventoryUOM);
            return   ConvertAsync(materialData, quantity, materialData.IssueUnit, materialData.StockUnit);
        }
        /// <summary>
        /// èŽ·å–å•ä½è½¬æ¢æ¯”çŽ‡
        /// </summary>
        public async Task<decimal?> GetConversionRatioAsync(string materialCode, string fromUnit, string toUnit)
        {
            // å°è¯•直接查找转换关系
            var conversion = await Repository.Db.Queryable<Dt_MaterialUnit>()
                .Where(x => x.ItemNo == materialCode &&
                           x.FromUom == fromUnit &&
                           x.ToUom == toUnit)
                .FirstAsync();
            // å¦‚果单位相同,比率为1
            if (fromUnit.Equals(toUnit, StringComparison.OrdinalIgnoreCase))
                return 1m;
            if (conversion != null)
            var materialData = await GetMaterialWithUnitsAsync(materialCode);
            return GetConversionRatioFromData(materialData, fromUnit, toUnit);
        }
        /// <summary>
        /// ä»Žå†…存数据中获取转换比率
        /// </summary>
        private decimal? GetConversionRatioFromData(MaterialWithUnits materialData, string fromUnit, string toUnit)
        {
            // ç›´æŽ¥æŸ¥æ‰¾è½¬æ¢å…³ç³»
            var directConversion = materialData.UnitConversions
                .FirstOrDefault(x => x.FromUom.Equals(fromUnit, StringComparison.OrdinalIgnoreCase) &&
                                    x.ToUom.Equals(toUnit, StringComparison.OrdinalIgnoreCase));
            if (directConversion != null)
            {
                return conversion.Ratio;
                return directConversion.Ratio;
            }
            // å°è¯•查找反向转换关系(取倒数)
            var reverseConversion = await Repository.Db.Queryable<Dt_MaterialUnit>()
                .Where(x => x.ItemNo == materialCode &&
                           x.FromUom == toUnit &&
                           x.ToUom == fromUnit)
                .FirstAsync();
            // æŸ¥æ‰¾åå‘转换关系(取倒数)
            var reverseConversion = materialData.UnitConversions
                .FirstOrDefault(x => x.FromUom.Equals(toUnit, StringComparison.OrdinalIgnoreCase) &&
                                    x.ToUom.Equals(fromUnit, StringComparison.OrdinalIgnoreCase));
            if (reverseConversion != null)
            {
                return 1 / reverseConversion.Ratio;
            }
            // å°è¯•通过中间单位(库存单位)进行转换
            var material = await _materielInfoRepository.Db.Queryable<Dt_MaterielInfo>()
                .Where(x => x.MaterielCode == materialCode)
                .FirstAsync();
            // é€šè¿‡åº“存单位进行间接转换
            var stockUnit = materialData.StockUnit;
            if (material != null)
            // æŸ¥æ‰¾ fromUnit -> stockUnit çš„转换
            var fromToStock = materialData.UnitConversions
                .FirstOrDefault(x => x.FromUom.Equals(fromUnit, StringComparison.OrdinalIgnoreCase) &&
                                    x.ToUom.Equals(stockUnit, StringComparison.OrdinalIgnoreCase));
            var stockToFrom = materialData.UnitConversions
                .FirstOrDefault(x => x.FromUom.Equals(stockUnit, StringComparison.OrdinalIgnoreCase) &&
                                    x.ToUom.Equals(fromUnit, StringComparison.OrdinalIgnoreCase));
            // æŸ¥æ‰¾ stockUnit -> toUnit çš„转换
            var stockToTo = materialData.UnitConversions
                .FirstOrDefault(x => x.FromUom.Equals(stockUnit, StringComparison.OrdinalIgnoreCase) &&
                                    x.ToUom.Equals(toUnit, StringComparison.OrdinalIgnoreCase));
            var toToStock = materialData.UnitConversions
                .FirstOrDefault(x => x.FromUom.Equals(toUnit, StringComparison.OrdinalIgnoreCase) &&
                                    x.ToUom.Equals(stockUnit, StringComparison.OrdinalIgnoreCase));
            decimal? ratioFromToStock = null;
            decimal? ratioStockToTo = null;
            // è®¡ç®— fromUnit -> stockUnit çš„æ¯”率
            if (fromToStock != null)
            {
                var stockUnit = material.inventoryUOM;
                ratioFromToStock = fromToStock.Ratio;
            }
            else if (stockToFrom != null)
            {
                ratioFromToStock = 1 / stockToFrom.Ratio;
            }
            else if (fromUnit.Equals(stockUnit, StringComparison.OrdinalIgnoreCase))
            {
                ratioFromToStock = 1; // å¦‚果源单位就是库存单位,比率为1
            }
                // å¦‚果目标单位已经是库存单位,直接查找源单位到库存单位的转换
                if (toUnit.Equals(stockUnit, StringComparison.OrdinalIgnoreCase))
                {
                    var toStockRatio = await GetDirectRatioAsync(materialCode, fromUnit, stockUnit);
                    if (toStockRatio != null) return toStockRatio;
                }
            // è®¡ç®— stockUnit -> toUnit çš„æ¯”率
            if (stockToTo != null)
            {
                ratioStockToTo = stockToTo.Ratio;
            }
            else if (toToStock != null)
            {
                ratioStockToTo = 1 / toToStock.Ratio;
            }
            else if (toUnit.Equals(stockUnit, StringComparison.OrdinalIgnoreCase))
            {
                ratioStockToTo = 1; // å¦‚果目标单位就是库存单位,比率为1
            }
                // å¦‚果源单位是库存单位,直接查找库存单位到目标单位的转换
                if (fromUnit.Equals(stockUnit, StringComparison.OrdinalIgnoreCase))
                {
                    var fromStockRatio = await GetDirectRatioAsync(materialCode, stockUnit, toUnit);
                    if (fromStockRatio != null) return fromStockRatio;
                }
                // é€šè¿‡åº“存单位进行间接转换:fromUnit -> stockUnit -> toUnit
                var ratio1 = await GetDirectRatioAsync(materialCode, fromUnit, stockUnit);
                var ratio2 = await GetDirectRatioAsync(materialCode, stockUnit, toUnit);
                if (ratio1 != null && ratio2 != null)
                {
                    return ratio1 * ratio2;
                }
            // å¦‚果找到了两条路径,返回乘积
            if (ratioFromToStock != null && ratioStockToTo != null)
            {
                return ratioFromToStock * ratioStockToTo;
            }
            return null;
        }
        /// <summary>
        /// èŽ·å–ç›´æŽ¥è½¬æ¢æ¯”çŽ‡ï¼ˆåŒ…å«æ­£å‘å’Œåå‘æŸ¥æ‰¾ï¼‰
        /// æ‰¹é‡è½¬æ¢ï¼ˆä¼˜åŒ–性能,一次查询处理多个物料)
        /// </summary>
        private async Task<decimal?> GetDirectRatioAsync(string materialCode, string fromUnit, string toUnit)
        public async Task<Dictionary<string, MaterialWithUnitConversionResult>> BatchConvertAsync(List<BatchConversionRequest> requests)
        {
            // æ­£å‘查找
            var conversion = await Repository.Db.Queryable<Dt_MaterialUnit>()
                .Where(x => x.ItemNo == materialCode &&
                           x.FromUom == fromUnit &&
                           x.ToUom == toUnit)
                .FirstAsync();
            if (requests == null || !requests.Any())
                return new Dictionary<string, MaterialWithUnitConversionResult>();
            if (conversion != null)
            // æŒ‰ç‰©æ–™ç¼–号分组
            var materialGroups = requests.GroupBy(x => x.MaterialCode);
            var results = new Dictionary<string, MaterialWithUnitConversionResult>();
            foreach (var group in materialGroups)
            {
                return conversion.Ratio;
                var materialCode = group.Key;
                var materialData = await GetMaterialWithUnitsAsync(materialCode);
                foreach (var request in group)
                {
                    try
                    {
                        // å¦‚果单位相同,直接返回
                        if (request.FromUnit.Equals(request.ToUnit, StringComparison.OrdinalIgnoreCase))
                        {
                            results[request.RequestId] = new MaterialWithUnitConversionResult(request.Quantity, request.ToUnit, false);
                            continue;
                        }
                        var ratio = GetConversionRatioFromData(materialData, request.FromUnit, request.ToUnit);
                        if (ratio != null)
                        {
                            var convertedQuantity = request.Quantity * ratio.Value;
                            results[request.RequestId] = new MaterialWithUnitConversionResult(convertedQuantity, request.ToUnit, true);
                        }
                        else
                        {
                            _logger.LogWarning($"未找到物料 {materialCode} ä»Ž {request.FromUnit} åˆ° {request.ToUnit} çš„单位转换关系");
                            results[request.RequestId] = new MaterialWithUnitConversionResult(request.Quantity, request.ToUnit, false);
                        }
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(ex, $"批量转换物料 {materialCode} æ—¶å‘生错误");
                        results[request.RequestId] = new MaterialWithUnitConversionResult(request.Quantity, request.ToUnit, false);
                    }
                }
            }
            // åå‘查找
            var reverseConversion = await Repository.Db.Queryable<Dt_MaterialUnit>()
                .Where(x => x.ItemNo == materialCode &&
                           x.FromUom == toUnit &&
                           x.ToUom == fromUnit)
                .FirstAsync();
            if (reverseConversion != null)
            {
                return 1 / reverseConversion.Ratio;
            }
            return null;
            return results;
        }
        /// <summary>
        /// æ‰¹é‡é‡‡è´­å•位转库存单位
        /// </summary>
        public async Task<Dictionary<string, MaterialWithUnitConversionResult>> BatchConvertPurchaseToStockAsync(List<BatchConversionRequest> requests)
        {
            if (requests == null || !requests.Any())
                return new Dictionary<string, MaterialWithUnitConversionResult>();
            // æŒ‰ç‰©æ–™ç¼–号分组
            var materialGroups = requests.GroupBy(x => x.MaterialCode);
            var results = new Dictionary<string, MaterialWithUnitConversionResult>();
            foreach (var group in materialGroups)
            {
                var materialCode = group.Key;
                var materialData = await GetMaterialWithUnitsAsync(materialCode);
                foreach (var request in group)
                {
                    try
                    {
                        // å¦‚果采购单位和库存单位相同,直接返回
                        if (materialData.PurchaseUnit.Equals(materialData.StockUnit, StringComparison.OrdinalIgnoreCase))
                        {
                            results[request.RequestId] = new MaterialWithUnitConversionResult(request.Quantity, materialData.StockUnit, false);
                            continue;
                        }
                        var ratio = GetConversionRatioFromData(materialData, materialData.PurchaseUnit, materialData.StockUnit);
                        if (ratio != null)
                        {
                            var convertedQuantity = request.Quantity * ratio.Value;
                            results[request.RequestId] = new MaterialWithUnitConversionResult(convertedQuantity, materialData.StockUnit, true);
                        }
                        else
                        {
                            _logger.LogWarning($"未找到物料 {materialCode} ä»Žé‡‡è´­å•位到库存单位的转换关系");
                            results[request.RequestId] = new MaterialWithUnitConversionResult(request.Quantity, materialData.StockUnit, false);
                        }
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(ex, $"批量转换物料 {materialCode} é‡‡è´­å•位到库存单位时发生错误");
                        results[request.RequestId] = new MaterialWithUnitConversionResult(request.Quantity, materialData.StockUnit, false);
                    }
                }
            }
            return results;
        }
        /// <summary>
        /// èŽ·å–ç‰©æ–™çš„åº“å­˜å•ä½
        /// </summary>
        public async Task<string> GetStockUnitAsync(string materialCode)
        {
            var materialData = await GetMaterialWithUnitsAsync(materialCode);
            return materialData.StockUnit;
        }
        /// <summary>
        /// èŽ·å–ç‰©æ–™çš„é‡‡è´­å•ä½
        /// </summary>
        public async Task<string> GetPurchaseUnitAsync(string materialCode)
        {
            var materialData = await GetMaterialWithUnitsAsync(materialCode);
            return materialData.PurchaseUnit;
        }
        /// <summary>
        /// èŽ·å–ç‰©æ–™çš„é¢†æ–™å•ä½
        /// </summary>
        public async Task<string> GetIssueUnitAsync(string materialCode)
        {
            var materialData = await GetMaterialWithUnitsAsync(materialCode);
            return materialData.IssueUnit;
        }
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/MaterielInfoService.cs
@@ -20,5 +20,6 @@
        public IRepository<Dt_MaterielInfo> Repository => BaseDal;
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Common/LocationEnum/LocationTypeEnum.cs
@@ -23,19 +23,19 @@
        /// </summary>
        [Description("不良品区")]
        Defective = 1,
        /// <summary>
        /// PCBA区
        /// </summary>
        [Description("PCBA区")]
        PCBA = 2,
        /// <summary> 
        /// ä¿ç¨ŽåŒº
        /// </summary>
        [Description("保税区")]
        Bonded = 2,
        Bonded = 3,
        /// <summary>
        /// PCBA区
        /// </summary>
        [Description("PCBA区")]
        PCBA = 3,
      
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_DTO/Allocate/AllocateDto.cs
@@ -43,7 +43,7 @@
        /// æ˜¯å¦åˆ†æ‰¹
        /// </summary>
        [JsonProperty("isBatch")]
        public bool IsBatch { get; set; }
        public int IsBatch { get; set; }
        /// <summary>
        /// åŽ‚åŒºä»£ç 
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_DTO/Basic/MaterialUnitDto.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_DTO.Basic
{
    public class MaterialWithUnits
    {
        public string MaterialCode { get; set; }
        public string IssueUnit { get; set; }
        public string PurchaseUnit { get; set; }
        public string StockUnit { get; set; }
        public List<UnitConversion> UnitConversions { get; set; } = new List<UnitConversion>();
    }
    public class UnitConversion
    {
        public string FromUom { get; set; }
        public string ToUom { get; set; }
        public decimal Ratio { get; set; }
    }
    public class MaterialWithUnitConversionResult
    {
        public decimal Quantity { get; set; }
        public string Unit { get; set; }
        public bool Converted { get; set; } // æ ‡è®°æ˜¯å¦å®žé™…进行了转换
        public MaterialWithUnitConversionResult(decimal quantity, string unit, bool converted = true)
        {
            Quantity = quantity;
            Unit = unit;
            Converted = converted;
        }
        public override string ToString()
        {
            return $"{Quantity} {Unit}";
        }
    }
    public class BatchConversionRequest
    {
        public string RequestId { get; set; }
        public string MaterialCode { get; set; }
        public decimal Quantity { get; set; }
        public string FromUnit { get; set; }
        public string ToUnit { get; set; }
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_DTO/Inbound/InboundOrderAddDTO.cs
@@ -125,7 +125,7 @@
        public string business_type { get; set; }
        public bool isBatch { get; set; }
        public int isBatch { get; set; }
        public string factoryArea { get; set; }
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_DTO/Outbound/OutboundOrderAddDTO.cs
@@ -67,7 +67,7 @@
        public string business_type { get; set; }
        public bool isBatch { get; set; }
        public int isBatch { get; set; }
        public string factoryArea { get; set; }
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_IBasicService/IInvokeMESService.cs
@@ -12,7 +12,7 @@
{
    public interface IInvokeMESService : IDependency
    {
        Task FeedbackInbound(FeedbackInboundRequestModel model);
        Task<ResponseModel> FeedbackInbound(FeedbackInboundRequestModel model);
        Task FeedbackOutbound(FeedbackOutboundRequestModel model);
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_IBasicService/IMaterialUnitService.cs
@@ -1,10 +1,12 @@
using System;
using Microsoft.AspNetCore.JsonPatch.Internal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_DTO.Basic;
using WIDESEA_Model.Models;
using WIDESEA_Model.Models.Basic;
@@ -14,10 +16,14 @@
    {
        IRepository<Dt_MaterialUnit> Repository { get; }
          Task<decimal> ConvertAsync(string materialCode, decimal quantity, string fromUnit, string toUnit);
        Task<decimal> ConvertPurchaseToStockAsync(string materialCode, decimal quantity);
        Task<decimal> ConvertIssueToStockAsync(string materialCode, decimal quantity);
        Task<Dictionary<string, MaterialWithUnitConversionResult>> BatchConvertAsync(List<BatchConversionRequest> requests);
        Task<Dictionary<string, MaterialWithUnitConversionResult>> BatchConvertPurchaseToStockAsync(List<BatchConversionRequest> requests);
        Task<MaterialWithUnitConversionResult> ConvertAsync(string materialCode, decimal quantity, string fromUnit, string toUnit);
        Task<MaterialWithUnitConversionResult> ConvertIssueToStockAsync(string materialCode, decimal quantity);
        Task<MaterialWithUnitConversionResult> ConvertPurchaseToStockAsync(string materialCode, decimal quantity);
        Task<decimal?> GetConversionRatioAsync(string materialCode, string fromUnit, string toUnit);
        Task<string> GetIssueUnitAsync(string materialCode);
        Task<string> GetPurchaseUnitAsync(string materialCode);
        Task<string> GetStockUnitAsync(string materialCode);
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundOrderService.cs
@@ -16,7 +16,7 @@
    {
        IRepository<Dt_InboundOrder> Repository { get; }
        WebResponseContent ReceiveInboundOrder(List<Dt_InboundOrder> models, int operateType);
        Task<WebResponseContent> ReceiveInboundOrder(List<Dt_InboundOrder> models, int operateType);
        WebResponseContent BarcodeMaterielGroup(BarcodeMaterielGroupDTO materielGroupDTO);
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs
@@ -1,5 +1,6 @@
using AutoMapper;
using SqlSugar;
using System.Threading.Tasks;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.StockEnum;
@@ -29,12 +30,12 @@
        private readonly IRepository<Dt_Task> _taskRepository;
        private IStockService _stockService;
        private readonly IMaterialUnitService _materialUnitService;
        private readonly IInboundOrderDetailService _inboundOrderDetailService;
        private readonly IRepository<Dt_InboundOrderDetail> _inboundOrderDetailRepository;
        public IRepository<Dt_InboundOrder> Repository => BaseDal;
        public InboundOrderService(IRepository<Dt_InboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_Task> taskRepository, IStockService stockService, IInboundOrderDetailService inboundOrderDetailService) : base(BaseDal)
        public InboundOrderService(IRepository<Dt_InboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_Task> taskRepository, IStockService stockService, IInboundOrderDetailService inboundOrderDetailService, IMaterialUnitService materialUnitService) : base(BaseDal)
        {
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
@@ -42,16 +43,17 @@
            _taskRepository = taskRepository;
            _stockService = stockService;
            _inboundOrderDetailService = inboundOrderDetailService;
            _materialUnitService = materialUnitService;
        }
        public WebResponseContent ReceiveInboundOrder(List<Dt_InboundOrder> models, int operateType)
        public async Task<WebResponseContent> ReceiveInboundOrder(List<Dt_InboundOrder> models, int operateType)
        {
            try
            {
                return operateType switch
                {
                    1 => AddInboundOrder(models),
                    2 => UpdateInboundOrder(models),
                    1 =>await AddInboundOrder(models),
                    2 => await UpdateInboundOrder(models),
                    3 => DeleteInboundOrder(models),
                    _ => WebResponseContent.Instance.OK(),
@@ -63,7 +65,7 @@
            }
        }
        public WebResponseContent AddInboundOrder(List<Dt_InboundOrder> models)
        public async Task<WebResponseContent> AddInboundOrder(List<Dt_InboundOrder> models)
        {
            try
            {
@@ -77,6 +79,13 @@
                foreach (var model in models)
                {
                    foreach (var item in model.Details)
                    {
                        var purchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync(item.MaterielCode, item.BarcodeQty);
                        item.Unit= purchaseToStockResult.Unit;
                        item.OrderQuantity=purchaseToStockResult.Quantity;
                    }
                    model.InboundOrderNo = CreateCodeByRule(nameof(RuleCodeEnum.InboundOrderRule));
                    Db.InsertNav(model).Include(x => x.Details).ExecuteCommand();
                }
@@ -87,7 +96,7 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent UpdateInboundOrder(List<Dt_InboundOrder> models)
        public async Task<WebResponseContent> UpdateInboundOrder(List<Dt_InboundOrder> models)
        {
            try
            {
@@ -131,6 +140,10 @@
                                    BarcodeQty = item.BarcodeQty,
                                    OrderQuantity = item.OrderQuantity
                                };
                                var purchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync(item.MaterielCode, item.BarcodeQty);
                                inboundOrderDetail.Unit = purchaseToStockResult.Unit;
                                inboundOrderDetail.OrderQuantity = purchaseToStockResult.Quantity;
                                inboundOrderDetails.Add(inboundOrderDetail);
                            }
                            else
@@ -304,7 +317,8 @@
                var dbinboundOrderDetails = _inboundOrderDetailService.GetByBarcode(materielGroupDTO.Barcodes);
                if (dbinboundOrderDetails != null && !dbinboundOrderDetails.Any()) {
                if (dbinboundOrderDetails != null && !dbinboundOrderDetails.Any())
                {
                    return content = WebResponseContent.Instance.Error($"单据中没有该{materielGroupDTO.Barcodes}条码数据。");
                }
@@ -332,14 +346,14 @@
                        Barcode = item.Barcode,
                        MaterielCode = item.MaterielCode,
                        BatchNo = item.BatchNo,
                        Unit = item.BarcodeUnit,
                        Unit = item.Unit,
                        InboundOrderRowNo = item.lineNo,
                        SupplyCode = item.SupplyCode,
                        WarehouseCode = item.WarehouseCode,
                        StockQuantity = item.BarcodeQty,
                        StockQuantity = item.OrderQuantity,
                        Status = 0,
                        OrderNo = inboundOrder.InboundOrderNo,
                        BusinessType=inboundOrder.BusinessType,
                        BusinessType = inboundOrder.BusinessType,
                    });
                    item.ReceiptQuantity = item.BarcodeQty;
@@ -351,7 +365,7 @@
                    stockInfo.PalletCode = materielGroupDTO.PalletCode;
                    stockInfo.StockStatus = StockStatusEmun.组盘暂存.ObjToInt();
                }
                stockInfo.PalletType = (int)PalletTypeEnum.None;
                List<int> updateDetailIds = dbinboundOrderDetails.Select(x => x.Id).ToList();
                if (inboundOrder.OrderStatus == InOrderStatusEnum.未开始.ObjToInt())
@@ -391,7 +405,7 @@
                (bool, string, object?) result2 = ModelValidate.ValidateModelData(materielGroupDTO);
                if (!result2.Item1) return content = WebResponseContent.Instance.Error(result2.Item2);
                Dt_StockInfo? stockInfo = _stockService.StockInfoService.GetStockByPalletCode(materielGroupDTO.PalletCode);
                if (stockInfo != null && !string.IsNullOrEmpty(stockInfo.LocationCode) && stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
                {
@@ -416,7 +430,7 @@
                        stockInfo.StockStatus = StockStatusEmun.组盘暂存.ObjToInt();
                    }
                        _unitOfWorkManage.BeginTran();
                    _unitOfWorkManage.BeginTran();
                    _stockService.StockInfoService.AddMaterielGroup(stockInfo);
                    _unitOfWorkManage.CommitTran();
@@ -429,7 +443,7 @@
                }
            }
            catch (Exception ex)
            {
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Allocate/Dt_ AllocateOrder.cs
@@ -87,7 +87,7 @@
        /// æ˜¯å¦æ‰¹æ¬¡
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "是否批次")]
        public bool? IsBatch { get; set; }
        public int IsBatch { get; set; }
        /// <summary>
        /// åŽ‚åŒº
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_InboundOrder.cs
@@ -78,7 +78,7 @@
        /// é»˜è®¤å€¼:
        ///</summary>
        [SugarColumn(ColumnName = "isBatch", ColumnDescription = "是否分批")]
        public bool? IsBatch { get; set; }
        public int IsBatch { get; set; }
        /// <summary>
        /// å¤‡  æ³¨:厂区
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_InboundOrderDetail.cs
@@ -45,9 +45,9 @@
        public string BatchNo { get; set; }
        /// <summary>
        /// å•据数量
        /// å•据单位转换后的数量
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "单据数量")]
        [SugarColumn(IsNullable = false, ColumnDescription = "单据单位转换后的数量")]
        public decimal OrderQuantity { get; set; }
        /// <summary>
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrder.cs
@@ -84,7 +84,7 @@
        /// é»˜è®¤å€¼:
        ///</summary>
        [SugarColumn(ColumnName = "isBatch", ColumnDescription = "是否分批")]
        public bool? IsBatch { get; set; }
        public int IsBatch { get; set; }
        /// <summary>
        /// å¤‡  æ³¨:厂区
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -156,7 +156,7 @@
            decimal beforeQuantity = 0;
            //查库存
            Dt_StockInfo stockInfo = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).First();
            Dt_StockInfo stockInfo = _stockRepository.Db.Queryable<Dt_StockInfo>().Includes(x => x.Details).Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).First();
            if (stockInfo == null)
            {
                return WebResponseContent.Instance.Error($"未找到托盘对应的组盘信息");
@@ -264,7 +264,7 @@
                               supplyCode = group.Key.SupplyCode,
                               batchNo = group.Key.BatchNo,
                               lineNo = group.Key.lineNo,
                               warehouseCode = group.Key.WarehouseCode,
                               warehouseCode = group.Key.WarehouseCode=="0"?"1072": group.Key.WarehouseCode,
                               unit= group.Key.BarcodeUnit,
                               barcodes = group.Select(row => new FeedbackBarcodesModel
                               {
@@ -273,7 +273,7 @@
                               }).ToList()
                           }).ToList();
                        feedmodel.details = groupedData;
                        _invokeMESService.FeedbackInbound(feedmodel);
                    }
@@ -359,7 +359,7 @@
                    return content.Error($"未找到对应的终点货位信息");
                }
                _stockRepository.Db.Deleteable(stockInfo);
               // _stockRepository.Db.Deleteable(stockInfo);
                int beforeStatus = locationInfo.LocationStatus;
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs
@@ -2,6 +2,7 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using SqlSugar;
using System.Net;
using System.Threading.Tasks;
@@ -33,19 +34,26 @@
        private readonly IESSApiService _eSSApiService;
        private readonly ILocationInfoService _locationInfoService;
        private readonly IDailySequenceService _dailySequenceService;
        public InboundOrderController(IInboundOrderService service, WIDESEA_IBasicService.IErpApiService erpApiService, WIDESEA_IBasicService.IInvokeMESService invokeMESService, IESSApiService eSSApiService, IDailySequenceService dailySequenceService, ILocationInfoService locationInfoService) : base(service)
        private readonly IMaterialUnitService _materialUnitService;
        private readonly ILogger<InboundOrderController> _logger;
        public InboundOrderController(IInboundOrderService service, WIDESEA_IBasicService.IErpApiService erpApiService, WIDESEA_IBasicService.IInvokeMESService invokeMESService, IESSApiService eSSApiService, IDailySequenceService dailySequenceService, ILocationInfoService locationInfoService, ILogger<InboundOrderController> logger, IMaterialUnitService materialUnitService) : base(service)
        {
            this.erpApiService = erpApiService;
            _invokeMESService = invokeMESService;
            _eSSApiService = eSSApiService;
            _dailySequenceService = dailySequenceService;
            _locationInfoService = locationInfoService;
            _logger = logger;
            _materialUnitService = materialUnitService;
        }
        [HttpPost, Route("Test"), AllowAnonymous, MethodParamsValidate]
        public async Task<WebResponseContent> Test()
        {
            var purchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync("101001-00002", 10);
            var pdddurchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync("100513-00210", 10);
            var sddd = _locationInfoService.AssignLocation();
            var code = sddd.LocationCode;
            // await _dailySequenceService.GetNextSequenceAsync();
@@ -88,10 +96,10 @@
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost, Route("ReceiveInboundOrder"), AllowAnonymous, MethodParamsValidate]
        public WebResponseContent ReceiveInboundOrder([FromBody] InboundRequestModel model)
        public async Task<WebResponseContent> ReceiveInboundOrder([FromBody] InboundRequestModel model)
        {
            _logger.LogInformation("InboundOrderController ReceiveInboundOrder:  " +  JsonConvert.SerializeObject(model));
            List<Dt_InboundOrder> inboundOrders = new List<Dt_InboundOrder>();
            foreach (var item in model.inBounds)
@@ -133,7 +141,9 @@
                            BatchNo = detailitem.batchNo,
                            Unit = detailitem.unit,
                            WarehouseCode = detailitem.warehouseCode,
                            OrderQuantity = detailitem.qty
                            OrderQuantity = detailitem.qty,
                            BarcodeUnit = detailitem.unit,
                            BarcodeQty = detailitem.qty,
                        };
                        dt_InboundOrder.Details.Add(inboundOrderDetail);
                    }
@@ -147,7 +157,7 @@
                inboundOrders.Add(dt_InboundOrder);
            }
            var content = Service.ReceiveInboundOrder(inboundOrders, model.operationType);
            var content =await Service.ReceiveInboundOrder(inboundOrders, model.operationType);
            if (content.Status) return WebResponseContent.Instance.OK(200);
            else return WebResponseContent.Instance.Error(content.Message);
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -27,7 +27,9 @@
        [HttpPost, Route("Test"), AllowAnonymous, MethodParamsValidate]
        public async Task<WebResponseContent> PalletOutboundTask(string endStation, string palletCode = "")
        {
            var result=await Service.PalletOutboundTask(endStation, palletCode);
            var ssd = Service.TaskCompleted("93");
            var result = await Service.PalletOutboundTask(endStation, palletCode);
            return result;
        }