Преглед на файлове

fix

添加多个新控制器和配置,更新现有服务

在 `CPService.cs` 文件中,更新了 `if` 和 `Where` 条件语句,增加了对特定值的判断。
在 `appsettings.Development.json` 和 `appsettings.json` 文件中,添加了日志、数据库连接、Redis连接、Serilog等配置。
在 `Program.cs` 文件中,添加了对 Autofac、CSRedis、Swagger、Serilog 等的依赖注入和配置。
在 `wms.api.csproj` 文件中,添加了项目的基本配置和依赖项。
在 `dotnet-tools.json` 文件中,添加了工具版本和根配置。
在 `AutofacModuleRegister.cs` 文件中,添加了 Autofac 模块注册。
在 `BaseController.cs` 文件中,添加了多个构造函数和方法。
在 `DBInitController.cs` 文件中,添加了一个新的控制器 `DBInitController`,用于初始化不同类型的数据库。
在 `FjController.cs` 文件中,添加了一个新的控制器 `FjController`,用于处理分拣库相关的操作。
在 `SxController.cs` 文件中,添加了 `SxController` 类,处理同步物料基础信息等业务逻辑。
在 `WmsController.cs` 文件中,添加了 `WmsController` 类,接收 ESB 请求的统一入口。
在 `LogFilter.cs` 文件中,添加了 `LogFilter` 类,用于记录操作执行前后的日志。
在 `JobScheduler.cs` 文件中,添加了 `JobScheduler` 类,用于初始化调度器和启动任务。
在 `PostJob.cs` 文件中,添加了 `PostJob` 类,用于执行任务和发送 HTTP 请求。
在 `launchSettings.json` 文件中,添加了新的启动配置。
林豪 左 преди 4 месеца
родител
ревизия
871564c3f7

+ 5 - 0
wms.api/.config/dotnet-tools.json

@@ -0,0 +1,5 @@
+{
+  "version": 1,
+  "isRoot": true,
+  "tools": {}
+}

+ 377 - 0
wms.api/Controllers/BaseController.cs

@@ -0,0 +1,377 @@
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json;
+using System.Diagnostics;
+using wms.dto.request;
+using wms.dto.response;
+using wms.service;
+using wms.service.IService;
+using wms.util.Check;
+using wms.util.Ext;
+using wms.util.Http;
+using Apache.NMS;
+using Apache.NMS.ActiveMQ;
+using Apache.NMS.Util;
+
+namespace wms.api.Controllers
+{
+    [Route("api/[controller]/[action]")]
+    [ApiController]
+    public class BaseController : ControllerBase
+    {
+        private readonly IHJService _hJService;
+        private readonly IPTService _ptService;
+        private readonly IFJService _fjService;
+        private readonly ISXService _sxService;
+        private readonly ICPService _cpService;
+        private readonly ILogger<BaseController> _logger;
+        public BaseController(IHJService hJService ,ILogger<BaseController> logger)
+        {
+            _hJService = hJService;
+            _logger = logger;
+        }
+        public BaseController(IPTService ptService)
+        {
+            _ptService = ptService;
+        }
+        public BaseController(IFJService fjService)
+        {
+            _fjService = fjService;
+        }
+        public BaseController(ISXService sxService)
+        {
+            _sxService = sxService;
+        }
+        public BaseController(ICPService cpService)
+        {
+            _cpService = cpService;
+        }
+        /// <summary>
+        /// 发送ESB请求统一出口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        internal string WmsServiceExportApi(object strReqBody)
+        {
+            var res = new SRes();
+            //var aa = (new StackTrace()).GetFrame(0).GetMethod().Name;//当前方法名
+            var methodName = (new StackTrace()).GetFrame(1).GetMethod().Name;//调用的方法名称                                                 
+            string methodcode = "";
+            if (_ptService != null)
+            {
+                methodcode = _ptService.GetSysConfigContentByCode(methodName);
+            }
+            else if (_hJService != null)
+            {
+                methodcode = _hJService.GetSysConfigContentByCode(methodName);
+            }
+            else if (_cpService != null)
+            {
+                methodcode = _cpService.GetSysConfigContentByCode(methodName);
+            }
+            else if (_fjService != null)
+            {
+                methodcode = _fjService.GetSysConfigContentByCode(methodName);
+            }
+
+            if (string.IsNullOrEmpty(methodcode))
+            {
+                return new SRes() { ResCode = 0, ResMsg = "数据表没有配置" }.ToCamelCaseString();
+            }
+            methodcode = RedisHelper.Get("sys_config" + methodName);
+            var reqid = Guid.NewGuid().ToString();
+            var req = new EsbReq() { headers = new HeadersReq() { serviceCode = methodcode.Split("|")[0],requestId = reqid,TrackId = reqid } };
+            //req.Body = strReqBody;
+            string sysname = methodcode.Split("|")[1];
+            var apiurl = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
+            //if (sysname == "mes")
+            //{
+            //    apiurl = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
+            //}
+            //else
+            //{
+            //    apiurl = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
+            //}
+
+            if (methodcode.Split("|")[0].StartsWith("163D"))
+            {
+                req.headers.sourceCode = "163D";
+            }
+            else if (methodcode.Split("|")[0].StartsWith("163I"))
+            {
+                req.headers.sourceCode = "163I";
+            }
+            else if (methodcode.Split("|")[0].StartsWith("163J"))
+            {
+                req.headers.sourceCode = "163J";
+            }
+            else if (methodcode.Split("|")[0].StartsWith("163L"))
+            {
+                req.headers.sourceCode = "163L";
+            }
+            else if (methodcode.Split("|")[0].StartsWith("163K"))
+            {
+                req.headers.sourceCode = "163K";
+            }
+            var strEsbRes = "";
+            try
+            {
+                //_logger.LogInformation("111111111111");
+                strEsbRes = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(strReqBody), 30000, "UTF-8", "application/json", reqid, req.headers.sourceCode, req.headers.serviceCode);
+                //_logger.LogInformation(methodName + "POST响应参数" + strEsbRes);
+            }
+            catch(Exception ex)
+            {
+                _logger.LogInformation(methodName + "调用异常:" + ex.ToString());
+            }
+         
+            if (!string.IsNullOrEmpty(strEsbRes))
+            {
+                //res = JsonConvert.DeserializeObject<SRes>(strEsbRes);
+                return strEsbRes;
+            }
+            else
+            {
+                res = new SRes() { ResMsg = "MES没有返回任务数据",ResCode = 500,Memo1 = apiurl,Memo2 = req.ToJsonString(),Memo3 = strEsbRes };
+            }
+            return res.ToCamelCaseString();
+        }
+
+        internal SRes ConsumerMQ(string queuesName)
+        {
+            queuesName = "ESB.OUT.163LFJ.Q";
+            string esburi = wms.util.AppSettings.GetConfig("EsbMQUri");
+            //Uri _uri = new Uri(String.Concat("activemq: failover:(tcp://esb-pre.zt.net.cn:61616?wireFormat.maxInactivityDuration-0)"));
+            Uri _uri = new Uri(String.Concat("activemq:failover:("+ esburi + ")?randomize=false"));
+            IConnectionFactory factory = new ConnectionFactory(_uri);
+            using (IConnection conn = factory.CreateConnection("esbadminrw", "esbadminrw"))
+            {
+                using (Apache.NMS.ISession session = conn.CreateSession())
+                {
+                    conn.Start();
+                    IDestination destination = SessionUtil.GetDestination(session, queuesName);
+                    using (IMessageConsumer consumer = session.CreateConsumer(destination))
+                    {
+                        consumer.Listener += (IMessage message) =>
+                        {
+                            ITextMessage msg = (ITextMessage)message;
+                            Console.WriteLine("接收消息:" + msg.Text);
+                        };
+                        Console.ReadLine();
+                    }
+                }
+            }
+
+            return null;
+
+        }
+
+
+        /// <summary>
+        /// 并发管控
+        /// </summary>
+        /// <typeparam name="T">方法请求参数类型</typeparam>
+        /// <typeparam name="U">方法响应参数类型</typeparam>
+        /// <param name="lockobj">方法锁</param>
+        /// <param name="key">并发管控关键key</param>
+        /// <param name="equNo">管控设备号</param>
+        /// <param name="reqparam">请求参数</param>
+        /// <param name="fun">管控方法</param>
+        /// <returns></returns>
+        public U ConcurrencyReqControl<T, U>(object lockobj, string key, string equNo, BaseRequest reqparam, Func<T, U> fun) where T : BaseRequest where U : SRes, new()
+        {
+            var res = new U();
+            try
+            {
+                lock (lockobj)
+                {
+                    //并发管控
+                    var sign = RedisHelper.Get(key);
+                    if (!string.IsNullOrEmpty(sign) && sign == "1")
+                    {
+                        //不可通行
+                        res.ResCode = 0;
+                        res.ResMsg = equNo + "并发重复请求";
+                        return res;
+                    }
+                    //加状态
+                    RedisHelper.Set(key, "1",300);
+                }
+                var resulttemp = fun((T)reqparam);
+                RedisHelper.Set(key, "0", 300);
+                return resulttemp;
+            }
+            catch (Exception ex)
+            {
+                RedisHelper.Set(key, "0", 300);
+                res.ResCode = 500;
+                res.ResMsg = ex.Message;
+                return res;
+            }
+        }
+
+        /// <summary>
+        /// 发送ESB异步请求统一出口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        internal string WmsServiceExportMq(object strReqBody)
+        {
+            var res = new SRes();
+            //var aa = (new StackTrace()).GetFrame(0).GetMethod().Name;//当前方法名
+            var methodName = (new StackTrace()).GetFrame(1).GetMethod().Name;//调用的方法名称                                                 
+            string methodcode = "";
+            if (_ptService != null)
+            {
+                methodcode = _ptService.GetSysConfigContentByCode(methodName);
+            }
+            else if (_hJService != null)
+            {
+                methodcode = _hJService.GetSysConfigContentByCode(methodName);
+            }
+            else if (_cpService != null)
+            {
+                methodcode = _cpService.GetSysConfigContentByCode(methodName);
+            }
+            else if (_fjService != null)
+            {
+                methodcode = _fjService.GetSysConfigContentByCode(methodName);
+            }
+
+            if (string.IsNullOrEmpty(methodcode))
+            {
+                return new SRes() { ResCode = 0, ResMsg = "数据表没有配置" }.ToCamelCaseString();
+            }
+            methodcode = RedisHelper.Get("sys_config" + methodName);
+            var reqid = Guid.NewGuid().ToString();
+            var req = new EsbReq() { headers = new HeadersReq() { serviceCode = methodcode.Split("|")[0], requestId = reqid, TrackId = reqid } };
+            //req.Body = strReqBody;
+            var apiurl = wms.util.AppSettings.GetConfig("EsbMesPushUrlMq");
+
+            if (methodcode.Split("|")[0].StartsWith("163D"))
+            {
+                req.headers.sourceCode = "163D";
+            }
+            else if (methodcode.Split("|")[0].StartsWith("163I"))
+            {
+                req.headers.sourceCode = "163I";
+            }
+            else if (methodcode.Split("|")[0].StartsWith("163J"))
+            {
+                req.headers.sourceCode = "163J";
+            }
+            else if (methodcode.Split("|")[0].StartsWith("163L"))
+            {
+                req.headers.sourceCode = "163L";
+            }
+            else if (methodcode.Split("|")[0].StartsWith("163K"))
+            {
+                req.headers.sourceCode = "163K";
+            }
+            var strEsbRes = "";
+            try
+            {
+                //_logger.LogInformation("111111111111");
+                strEsbRes = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(strReqBody), 30000, "UTF-8", "application/json", reqid, req.headers.sourceCode, req.headers.serviceCode);
+                //_logger.LogInformation(methodName + "POST响应参数" + strEsbRes);
+            }
+            catch (Exception ex)
+            {
+                _logger.LogInformation(methodName + "调用异常:" + ex.ToString());
+            }
+
+            if (!string.IsNullOrEmpty(strEsbRes))
+            {
+                //res = JsonConvert.DeserializeObject<SRes>(strEsbRes);
+                return strEsbRes;
+            }
+            else
+            {
+                res = new SRes() { ResMsg = "MES没有返回任务数据", ResCode = 500, Memo1 = apiurl, Memo2 = req.ToJsonString(), Memo3 = strEsbRes };
+            }
+            return res.ToCamelCaseString();
+        }
+
+        /// <summary>
+        /// 发送ESB分发请求统一出口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        internal string WmsServiceExportPubMq(object strReqBody)
+        {
+            var res = new SRes();
+            //var aa = (new StackTrace()).GetFrame(0).GetMethod().Name;//当前方法名
+            var methodName = (new StackTrace()).GetFrame(1).GetMethod().Name;//调用的方法名称                                                 
+            string methodcode = "";
+            if (_ptService != null)
+            {
+                methodcode = _ptService.GetSysConfigContentByCode(methodName);
+            }
+            else if (_hJService != null)
+            {
+                methodcode = _hJService.GetSysConfigContentByCode(methodName);
+            }
+            else if (_cpService != null)
+            {
+                methodcode = _cpService.GetSysConfigContentByCode(methodName);
+            }
+            else if (_fjService != null)
+            {
+                methodcode = _fjService.GetSysConfigContentByCode(methodName);
+            }
+
+            if (string.IsNullOrEmpty(methodcode))
+            {
+                return new SRes() { ResCode = 0, ResMsg = "数据表没有配置" }.ToCamelCaseString();
+            }
+            methodcode = RedisHelper.Get("sys_config" + methodName);
+            var reqid = Guid.NewGuid().ToString();
+            var req = new EsbReq() { headers = new HeadersReq() { serviceCode = methodcode.Split("|")[0], requestId = reqid, TrackId = reqid } };
+            //req.Body = strReqBody;
+            var apiurl = wms.util.AppSettings.GetConfig("EsbMesPushUrlPubMq");
+
+            if (methodcode.Split("|")[0].StartsWith("163D"))
+            {
+                req.headers.sourceCode = "163D";
+            }
+            else if (methodcode.Split("|")[0].StartsWith("163I"))
+            {
+                req.headers.sourceCode = "163I";
+            }
+            else if (methodcode.Split("|")[0].StartsWith("163J"))
+            {
+                req.headers.sourceCode = "163J";
+            }
+            else if (methodcode.Split("|")[0].StartsWith("163L"))
+            {
+                req.headers.sourceCode = "163L";
+            }
+            else if (methodcode.Split("|")[0].StartsWith("163K"))
+            {
+                req.headers.sourceCode = "163K";
+            }
+            var strEsbRes = "";
+            try
+            {
+                //_logger.LogInformation("111111111111");
+                strEsbRes = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(strReqBody), 30000, "UTF-8", "application/json", reqid, req.headers.sourceCode, req.headers.serviceCode);
+                //_logger.LogInformation(methodName + "POST响应参数" + strEsbRes);
+            }
+            catch (Exception ex)
+            {
+                _logger.LogInformation(methodName + "调用异常:" + ex.ToString());
+            }
+
+            if (!string.IsNullOrEmpty(strEsbRes))
+            {
+                //res = JsonConvert.DeserializeObject<SRes>(strEsbRes);
+                return strEsbRes;
+            }
+            else
+            {
+                res = new SRes() { ResMsg = "MES没有返回任务数据", ResCode = 500, Memo1 = apiurl, Memo2 = req.ToJsonString(), Memo3 = strEsbRes };
+            }
+            return res.ToCamelCaseString();
+        }
+    }
+}

+ 1545 - 0
wms.api/Controllers/CpController.cs

@@ -0,0 +1,1545 @@
+using AutoMapper;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json;
+using NPOI.SS.Formula.Functions;
+using SqlSugar;
+using System.Text.RegularExpressions;
+using wms.api.Job;
+using wms.dto;
+using wms.dto.request;
+using wms.dto.request.cp;
+using wms.dto.request.cp.dto;
+using wms.dto.request.hj;
+using wms.dto.request.hj.dto;
+using wms.dto.request.pt.dto;
+using wms.dto.request.share;
+using wms.dto.response;
+using wms.dto.response.cp;
+using wms.service.IService;
+using wms.sqlsugar;
+using wms.sqlsugar.model.cp;
+using wms.util.Ext;
+using wms.util.Http;
+
+namespace wms.api.Controllers
+{
+    [Route("api/[controller]/[action]")]
+    [ApiController]
+    public class CpController : BaseController
+    {
+        private readonly ICPService _cpService;
+        private readonly ILogger<CpController> _logger;
+        private readonly IMapper _mapper;
+        static object lockerSalesDocTrans = new object();
+        static object lockerSalesBackDocTrans = new object();
+        static object lockerComPushApiResInfo = new object();
+        static object lockerStockChange = new object();
+        static object lockerMesReleaseFlag = new object();
+        
+        static object lockerStockStateChange = new object();
+        static object lockerPdaCpGroupStock = new object();   //pda空托or 物料 or 间隔板组盘
+        static object lockerPdaTrayTaskOut = new object();   //pda空托 or 间隔板出库
+        static object lockerWCS_InTaskInfo = new object();   //入库任务
+        static object lockerGetCpTunnelList = new object();   //巷道锁
+        static object lockerCpCompleteTask = new object();
+        static object lockerCpApplyStockInLoc = new object();
+        static object lockerCpManualTaskOut = new object();
+        static object lockerCpSrmPickOutCompleted = new object();
+        static object lockerMoveTask = new object();
+        static object lockerSalesDocOutTask = new object();
+        static object lockerCpSyncMaterInfoList = new object();
+        static object lockerCpCancelOrComplet = new object();
+        static object lockerCpCarryTask = new object();
+        static object lockerUpdatePuchState = new object();
+        static object lockerForceCancelTask = new object();
+        static object lockerDeleteStockInfo = new object();
+        static object lockerUpdateStockState = new object();
+        static object lockerUpdateCellState = new object();
+        static object lockerDataSwapCell = new object();
+        static object lockerDataBasePatch = new object();
+        static object lockerDataMoveCell = new object();
+        static object lockerErpCancelStock = new object();
+        static object lockerPdaStockInBack = new object();
+        static object lockerPreLockedStock = new object();
+        static object lockerMoveTaskInfo = new object();
+        static object lockerTrayPortageTask = new object();
+        static object lockerTrayPortageTaskCheck = new object();
+
+        
+        static object lockerPalletAutoInTask = new object();
+        static object lockWcsUploadInfo = new object();
+        static object lockLabellingMachine = new object();
+        static object lockerHandErrTask = new object();
+        static object lockerPalletManualMoveTask = new object();
+        static object lockerFlowDataMoveJob = new object();
+        static object lockerProductBoxDetailUploadJob = new object();
+
+       
+        Repository<cpSysJob> _sysJobrepository => new Repository<cpSysJob>();
+        public CpController(ICPService cpService, ILogger<CpController> logger, IMapper mapper) : base(cpService)
+        {
+            _cpService = cpService;
+            _logger = logger;
+            _mapper = mapper;
+        }
+
+        /// <summary>
+        /// 同步物料基础信息
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string SyncMaterInfo(SyncMaterInfoRequest reqBody)
+        {
+            var result = new SRes();
+            //_logger.LogInformation("请求参数:{@reqBody},{aa}", reqBody,1);
+            CPSyncMaterInfoResponse resbody = JsonConvert.DeserializeObject<CPSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+            if (reqBody.SyncType == 1)
+            {
+                reqBody.PageIndex = 1;
+                while (resbody.ResData.Any())
+                {
+                    _cpService.SyncMaterInfo(resbody.ResData);
+                    reqBody.PageIndex++;
+                    resbody = JsonConvert.DeserializeObject<CPSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+                }
+            }
+            else if (reqBody.SyncType == 2)
+            {
+                //拿到增量
+                var increconf = _cpService.GetSysConfigByCode(Const.MESMaterialInitIncrement);
+                if (increconf != null)
+                {
+                    reqBody.StartTime = DateTime.Parse(increconf.SContent);
+                    //reqBody.Count = int.Parse(increconf.Remark);
+                    resbody = JsonConvert.DeserializeObject<CPSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+                    if (resbody.ResData.Any())
+                    {
+                        if (_cpService.SyncMaterInfo(resbody.ResData))
+                        {
+                            var lastdata = resbody.ResData.OrderBy(p => p.UpdatedTime).Last();
+                            _cpService.UpdateSysConfigModelColumns(new sqlsugar.model.UpdateModelColumns<cpSysConfig>()
+                            {
+                                Columns = it => new cpSysConfig { SContent = lastdata.UpdatedTime.ToString("yyyy-MM-dd HH:mm:ss.fff") },
+                                WhereExpression = it => it.Code == Const.MESMaterialInitIncrement
+                            });
+                        }
+                    }
+                    else
+                    {
+                        result.ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode();
+                        result.ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription();
+                    }
+                }
+                else
+                {
+                    result.ResCode = ResponseStatusCodeEnum.AccountError.GetHashCode();
+                    result.ResMsg = "没有配置信息" + Const.MESMaterialInitIncrement;
+                }
+            }
+            else
+            {
+                if (!string.IsNullOrEmpty(reqBody.MatCode))
+                {
+                    resbody = JsonConvert.DeserializeObject<CPSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+                    if (resbody.ResData.Any())
+                    {
+                        if (_cpService.SyncMaterInfo(resbody.ResData))
+                        {
+
+                        }
+                    }
+                }
+            }
+            return result.ToCamelCaseString();
+        }
+        /// <summary>
+        /// 成品库主数据接收
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CpSyncMaterInfoList(CpSyncMaterInfoListRequest request)
+        {
+            return ConcurrencyReqControl<CpSyncMaterInfoListRequest, SRes>(lockerCpSyncMaterInfoList, "CpSyncMaterInfoList", request.MatCode, request, _cpService.SyncMaterInfoList);
+        }
+        /// <summary>
+        /// 销售单信息传输接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes SalesDocTrans(SalesDocTransRequest reqDto)
+        {
+            return ConcurrencyReqControl<SalesDocTransRequest, SRes>(lockerSalesDocTrans, "SalesDocTrans", reqDto.BillCode, reqDto, _cpService.SalesDocTrans);
+            //if (res.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+            //{
+            //    return ComPushApiResInfo(new ComPushApiResInfoRequest() { ApiId = "SalesDocTrans", ReqId = Guid.NewGuid().ToString(), ResCode = ResponseStatusCodeEnum.Sucess.GetDescription() });
+            //}
+            //else
+            //{
+            //    return ComPushApiResInfo(new ComPushApiResInfoRequest() { ApiId = "SalesDocTrans", ReqId = Guid.NewGuid().ToString(), ResCode = ResponseStatusCodeEnum.Fail.GetDescription() });
+            //}
+        }
+        /// <summary>
+        /// 销售单下发出库任务
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes SalesDocOutTask(SalesDocOutTaskRequest request)
+        {
+            lock (lockerCpCompleteTask)
+            {
+                return ConcurrencyReqControl<SalesDocOutTaskRequest, SRes>(lockerSalesDocOutTask, "SalesDocOutTask", request.SalesDoc, request, _cpService.SalesDocOutTask);
+            }
+        }
+        /// <summary>
+        ///单据预锁库存(手动按钮触发) 
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PreLockedStock(PreLockedStockRequest request)
+        {
+            return ConcurrencyReqControl<PreLockedStockRequest, SRes>(lockerPreLockedStock, "PreLockedStock", request.BillCode, request, _cpService.PreLockedStock);
+        }
+        /// <summary>
+        /// 销售出库信息反馈接口/呆滞料/异常料出库反馈接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes SalesDocTransFeedBack(SalesDocAutoPushRequest request)
+        {
+            var res = new SRes();
+            if (request.Type == "1")
+            {
+                var SalesDoclists = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.SalesDoc.ToString()).OrderBy(p => p.AddTime).Take(10);
+                var ErrorMateriallists = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.ErrorMaterial.ToString()).OrderBy(p => p.AddTime).Take(10);
+                if (SalesDoclists.Any())
+                {
+                    var doc = SalesDoclists.First();
+                    var SalesDoclist = SalesDoclists.Where(p => p.DocsNo == doc.DocsNo).ToList();
+                    List<string> boxlist = new List<string>();
+                    foreach (var item in SalesDoclist)
+                    {
+                        boxlist.Add(item.HWBarCode);
+                    }
+                    var salesDocTrans = new SalesDocTransFeedBackRequest()
+                    {
+                        BillCode = doc.DocsNo,
+                        BoxList = boxlist,
+                        Type = CpFackbeekType.SalesDoc.ToString()
+                    };
+                    WmsServiceExportMq(salesDocTrans);
+                    var ids = SalesDoclist.Select(p => p.Id).ToList();
+                    _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
+                    {
+                        Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+                if (ErrorMateriallists.Any())
+                {
+                    var doc = ErrorMateriallists.First();
+                    var ErrorMateriallist = ErrorMateriallists.Where(p => p.DocsNo == doc.DocsNo).ToList();
+                    List<string> boxlist = new List<string>();
+                    foreach (var item in ErrorMateriallist)
+                    {
+                        boxlist.Add(item.HWBarCode);
+                    }
+                    var errorMaterialTrans = new SalesDocTransFeedBackRequest()
+                    {
+                        BillCode = doc.DocsNo,
+                        BoxList = boxlist,
+                        Type = CpFackbeekType.ErrorMaterial.ToString()
+                    };
+                    WmsServiceExportMq(errorMaterialTrans);
+                    var ids = ErrorMateriallist.Select(p => p.Id).ToList();
+                    _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
+                    {
+                        Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+            }
+            return res;
+        }
+        /// <summary>
+        /// 退售单信息传输接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes SalesBackDocTrans(SalesDocTransRequest reqDto)
+        {
+            return ConcurrencyReqControl<SalesDocTransRequest, SRes>(lockerSalesBackDocTrans, "SalesBackDocTrans", reqDto.BillCode, reqDto, _cpService.SalesBackDocTrans);
+        }
+        /// <summary>
+        /// 销售退货入库信息反馈接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes SalesBackDocTransFeedBack(string doccode)
+        {
+            var list = _cpService.GetBillFeedbackList(p => p.DocsNo == doccode);
+            var dtolist = _mapper.Map<List<SalesDocTransFeedBackRequest>>(list);
+            //var dto = new SalesDocTransFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dtolist));
+            return resbody;
+        }
+        /// <summary>
+        /// 销售余料回库入库信息反馈接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes SalesLeftDocTransFeedBack(string doccode)
+        {
+            var list = _cpService.GetBillFeedbackList(p => p.DocsNo == doccode);
+            var dtolist = _mapper.Map<List<SalesLeftDocTransFeedBackRequest>>(list);
+            //var dto = new SalesDocTransFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dtolist));
+            return resbody;
+        }
+        /// <summary>
+        /// 接收回馈接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ComPushApiResInfo(ComPushApiResInfoRequest reqDto)
+        {
+            lock (lockerComPushApiResInfo)
+            {
+                return JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(reqDto));
+            }
+        }
+        /// <summary>
+        /// 呆滞料/异常料出库接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ErrorMaterialStockOut(ErrorMaterialStockOutRequest reqDto)
+        {
+            return ConcurrencyReqControl<ErrorMaterialStockOutRequest, SRes>(lockerComPushApiResInfo, "CpErrorMaterialStockOut", reqDto.BillCode, reqDto, _cpService.ErrorMaterialStockOut);
+        }
+        /// <summary>
+        /// 库存改判
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes StockChange(CpStockChangeRequest reqDto)
+        {
+            return ConcurrencyReqControl<CpStockChangeRequest, SRes>(lockerStockChange, "CpStockChange", reqDto.BillCode, reqDto, _cpService.StockChange);
+        }
+
+        /// <summary>
+        /// MES放行标志
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes MesReleaseFlag(MesReleaseFlagDto reqDto)
+        {
+            lock(lockerMesReleaseFlag) { return _cpService.MesReleaseFlag(reqDto); }
+        }
+        /// <summary>
+        /// 改判反馈接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes StockChangeFeedBack(SalesDocAutoPushRequest request)
+        {
+            var res = new SRes();
+            if (request.Type == "1")
+            {
+                var list = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.StateTrans.ToString()).OrderBy(p => p.AddTime).Take(5);
+                if (!list.Any())
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "没有取到数据" + ResponseStatusCodeEnum.Fail.GetDescription();
+                    return res;
+                }
+                var doc = list.First();
+                list = list.Where(p => p.DocsNo == doc.DocsNo);
+                var dtolist = _mapper.Map<List<StockChangeFeedBackRequestItem>>(list);
+                var StockChangeFeed = new dto.request.cp.StockChangeFeedBackRequest()
+                {
+                    ListInfo = dtolist,
+                    BillCode = doc.DocsNo,
+                    ReqId = Guid.NewGuid().ToString()
+                };
+
+                var resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(StockChangeFeed));
+                var ids = list.Select(p => p.Id).ToList();
+                if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                {
+                    _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
+                    {
+                        Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+                else
+                {
+                    _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
+                    {
+                        Columns = it => new cpBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+            }
+            else
+            {
+                var list = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.StateTrans.ToString()).OrderBy(p => p.AddTime).Take(5);
+                if (!list.Any())
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "没有取到数据" + ResponseStatusCodeEnum.Fail.GetDescription();
+                    return res;
+                }
+                var doc = list.First();
+                list = list.Where(p => p.DocsNo == doc.DocsNo);
+                var dtolist = _mapper.Map<List<StockChangeFeedBackRequestItem>>(list);
+                var StockChangeFeed = new dto.request.cp.StockChangeFeedBackRequest()
+                {
+                    ListInfo = dtolist,
+                    BillCode = doc.DocsNo,
+                    ReqId = Guid.NewGuid().ToString()
+                };
+                var resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(StockChangeFeed));
+                var ids = list.Select(p => p.Id).ToList();
+                if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                {
+                    _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
+                    {
+                        Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "手动推送", EditTime = DateTime.Now },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+                else
+                {
+                    _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
+                    {
+                        Columns = it => new cpBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "手动推送", EditTime = DateTime.Now },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+            }
+            return res;
+        }
+        /// <summary>
+        /// 实时库存查询接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public CPGetCurStockListResponse GetCpCurStockList(CpGetCurStockListRequest reqDto)
+        {
+            return _cpService.GetCurStockList(reqDto);
+        }
+        /// <summary>
+        /// 移库货位上报MES接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes MoveStockLocationFeedBack(SalesDocAutoPushRequest request)
+        {
+            var res = new SRes();
+            if (request.Type == "1")
+            {
+                var list = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.MoveCell.ToString()).OrderBy(p => p.AddTime).Take(2);
+                if (!list.Any())
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "没有取到数据" + ResponseStatusCodeEnum.Fail.GetDescription();
+                    return res;
+                }
+                var dtolist = _mapper.Map<List<MoveStockLocationFeedBackRequest>>(list);
+
+                var resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dtolist));
+                var ids = list.Select(p => p.Id).ToList();
+                if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                {
+                    _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
+                    {
+                        Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+                else
+                {
+                    _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
+                    {
+                        Columns = it => new cpBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+            }
+            else
+            {
+                var list = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.MoveCell.ToString()).OrderBy(p => p.AddTime).Take(2);
+                if (!list.Any())
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "没有取到数据" + ResponseStatusCodeEnum.Fail.GetDescription();
+                    return res;
+                }
+                var dtolist = _mapper.Map<List<MoveStockLocationFeedBackRequest>>(list);
+
+                var resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dtolist));
+                var ids = list.Select(p => p.Id).ToList();
+                if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                {
+                    _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
+                    {
+                        Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+                else
+                {
+                    _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
+                    {
+                        Columns = it => new cpBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+            }
+            return res;
+        }
+        /// <summary>
+        /// 放行/冻结单传输接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public StockStateChangeResponse StockStateChange(StockStateChangeRequest reqDto)
+        {
+            return ConcurrencyReqControl<StockStateChangeRequest, StockStateChangeResponse>(lockerStockStateChange, "CpStockStateChange", reqDto.BillCode, reqDto, _cpService.StockStateChange);
+        }
+        /// <summary>
+        /// 同步箱号信息(人工入库使用)
+        /// </summary>
+        /// <param name="reqBody"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes BoxBuildStockTrans(BoxBuildStockTransRequest reqBody)
+        {
+            var res = new SRes();
+            BoxBuildStockTransResponse resbody = JsonConvert.DeserializeObject<BoxBuildStockTransResponse>(WmsServiceExportApi(reqBody));
+            if (resbody.Items.Any() && resbody.Items.First().lst_Children.Any())
+            {
+                var code = _mapper.Map<List<cpBoxItems>>(resbody.Items.First().lst_Children);
+                code.ForEach(p =>
+                {
+                    p.HuTotalWt = resbody.Items.FirstOrDefault().HuTotalWt;
+                    p.HuNetWt = resbody.Items.FirstOrDefault().HuNetWt;
+                    p.HuTareWt = resbody.Items.FirstOrDefault().HuTareWt;
+                });
+                _cpService.InsertBoxItems(code);
+            }
+            else
+            {
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = reqBody.HuNr + "MES返回明细" + ResponseStatusCodeEnum.Fail.GetDescription();
+            }
+            return res;
+        }
+        /// <summary>
+        /// 成品入库反馈接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ProductStockInBack(SalesDocAutoPushRequest request)
+        {
+            var res = new SRes();
+            if (request.Type == "1")
+            {
+                var list = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.ProductStockIn.ToString()).OrderBy(p => p.AddTime).Take(1);
+                if (!list.Any())
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "没有取到数据" + ResponseStatusCodeEnum.Fail.GetDescription();
+                    return res;
+                }
+                var product = new ProductStockInBackRequest()
+                {
+                    HuNr = list.First().HWBarCode,
+                    StoreCode = list.First().WarehouseCode,
+                    StoreName = "成品库",
+                    LocatCode = list.First().WareCellCode
+                };
+                WmsServiceExportMq(product);
+                var ids = list.Select(p => p.Id).ToList();
+                _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
+                {
+                    Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                    WhereExpression = it => ids.Contains(it.Id)
+                });
+            }
+
+            return res;
+        }
+        /// <summary>
+        /// ERP取消出库
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ErpCancelStock(ErpCancelStockRequest request)
+        {
+            lock (lockerErpCancelStock)
+            {
+                return _cpService.ErpCancelStock(request);
+            }
+        }
+
+        #region 手持机操作功能
+        /// <summary>
+        /// PDA 组盘绑定(只组盘)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PdaCpGroupStock(SouthPdaRequest request)
+        {
+            lock (lockerPdaCpGroupStock)
+            {
+                request.ContGrpBarCode = Regex.Replace(request.ContGrpBarCode.Trim(), @"[\r\n]", "");
+                if (!string.IsNullOrEmpty(request.BoxCode))
+                {
+                    request.BoxCode = Regex.Replace(request.BoxCode.Trim(), @"[\r\n]", "");
+                    var boxCode = _cpService.GetBoxCodedetails(request.BoxCode);
+                    if (!boxCode.Any())
+                    {
+                        var tt = BoxBuildStockTrans(new BoxBuildStockTransRequest() { HuNr = request.BoxCode });
+                        if (tt.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
+                        {
+                            return new SRes() { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = tt.ResMsg };
+                        }
+                    }
+                    else
+                    {
+                        _cpService.DeleteoldBoxcodeinfo(request.BoxCode);
+                        _logger.LogInformation("删除旧数据,获取最新数据" + request.BoxCode + "|" + request.ContGrpBarCode);
+                        var tt = BoxBuildStockTrans(new BoxBuildStockTransRequest() { HuNr = request.BoxCode });
+                        if (tt.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
+                        {
+                            return new SRes() { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = tt.ResMsg };
+                        }
+                    }
+
+                }
+                return _cpService.PdaGroupStock(request);
+            }
+        }
+        /// <summary>
+        /// 空托盘 or 间隔板出库
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PdaTrayTaskOut(TrayGroupOutRequest request)
+        {
+            lock (lockerPdaTrayTaskOut)
+            {
+                return _cpService.PdaTrayTaskOut(request);
+            }
+        }
+        /// <summary>
+        /// PDA 退料
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PdaStockInBack(SouthPdaRequest request)
+        {
+            lock (lockerPdaStockInBack)
+            {
+                return _cpService.PdaStockInBack(request);
+            }
+        }
+        #endregion
+
+        #region WCS调用
+        /// <summary>
+        /// 获取入库任务
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes WCS_InTaskInfo(TrayGroupOutRequest request)
+        {
+            return ConcurrencyReqControl<TrayGroupOutRequest, SRes>(lockerWCS_InTaskInfo, "WCS_InTaskInfo" + request.Equip, request.Code, request, _cpService.InsertWCSInTask);
+        }
+        /// <summary>
+        /// WCS信息上传(称重)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes WcsUploadInfo(WcsUploadInfoRequest request)
+        {
+            lock (lockWcsUploadInfo)
+            {
+                return _cpService.WcsUploadInfo(request);
+            }
+        }
+
+        /// <summary>
+        /// 贴标机信息传输
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<LabellingMachineResponse> LabellingMachine(LabellingMachineRequest request)
+        {
+            lock (lockLabellingMachine)
+            {
+                return _cpService.LabellingMachine(request);
+            }
+        }
+        /// <summary>
+        /// 获取巷道
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<string> GetTunnelPriorityList(GetTunnelPriorityListRequest reqEntity)
+        {
+            lock (lockerGetCpTunnelList)
+            {
+                return _cpService.GetCpTunnelPriorityList(reqEntity);
+            }
+        }
+        /// <summary>
+        /// 分配货位
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<CpApplyStockInLocResponse> ApplyStockInLoc(CpApplyStockInLocRequest request)
+        {
+            return ConcurrencyReqControl<CpApplyStockInLocRequest, SRes<CpApplyStockInLocResponse>>(lockerCpApplyStockInLoc, "CpApplyStockInLoc", "分配货位" + request.TunnelNum, request, _cpService.CpApplyStockInLoc);
+        }
+        /// <summary>
+        /// 完成任务
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<int> CompleteTask(CompleteTaskRequest reqDto)
+        {
+            lock (lockerCpCompleteTask)
+            {
+                var res = _cpService.CpCompleteTask(reqDto);
+                //进程死锁失败的情况再重复调用一次
+                if (res.ResCode == ResponseStatusCodeEnum.InnerServerErr.GetHashCode())
+                {
+                    res = _cpService.CpCompleteTask(reqDto);
+                }
+                return res;
+            }
+        }
+        /// <summary>
+        /// 堆垛机出库放货完成
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<int> SrmPickOutCompleted(CpSrmPickOutCompletedRequest request)
+        {
+            lock (lockerCpCompleteTask)
+            {
+                return _cpService.CpSrmPickOutCompleted(request);
+            }
+        }
+        /// <summary>
+        /// 移库任务申请
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<WcsMoveTaskResponse> WcsMoveTask(WcsMoveTaskRequest request)
+        {
+            lock (lockerCpCompleteTask)
+            {
+                return _cpService.WcsMoveTask(request);
+            }
+        }
+        /// <summary>
+        /// 修改任务状态
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes UpdateTaskState(UpdateTaskStateRequest request)
+        {
+            lock (lockerMoveTaskInfo)
+            {
+                return _cpService.UpdateTaskState(request);
+            }
+        }
+        /// <summary>
+        /// 手动移库确定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes MoveTaskInfo(MoveTaskRequest request)
+        {
+            lock (lockerMoveTaskInfo)
+            {
+                return _cpService.MoveTaskInfo(request);
+            }
+        }
+
+        /// <summary>
+        /// 成品库 取消/完成任务验证(只验证不做业务处理,开放wcs系统调用)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CancelTaskVerify(CancelTaskRequest request)
+        {
+            lock (lockerCpCancelOrComplet)
+            {
+                return _cpService.CpCancelTaskVerify(request);
+            }
+        }
+        /// <summary>
+        /// 成品库 执行任务(开放wcs调用,前端不调用)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CarryTaskInfo(CancelTaskRequest request)
+        {
+            lock (lockerCpCarryTask)
+            {
+                return _cpService.CpCarryTaskInfo(request);
+            }
+        }
+        #endregion
+
+        /// <summary>
+        /// 手动出库确定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ManualTask(CpManualTaskRequest request)
+        {
+            lock (lockerCpCompleteTask)
+            {
+                request.BusType = TaskBusType.TaskBusType_HJ_ManualOut.GetDescription();
+                return _cpService.ManualTask(request);
+            }
+        }
+
+        /// <summary>
+        /// 异常箱出库
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ErrorManualTask(CpManualTaskRequest request)
+        {
+            lock (lockerCpCompleteTask)
+            {
+                request.BusType = TaskBusType.TaskBusType_HJ_ManualOut.GetDescription();
+                return _cpService.ErrorManualTask(request);
+            }
+        }
+
+        /// <summary>
+        /// 手动出库确定(MES调用)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes MesManualTask(CpMesManualTaskRequest request)
+        {
+            lock (lockerCpCompleteTask)
+            {
+                return _cpService.MesManualTask(request);
+            }
+        }
+
+        /// <summary>
+        /// 成品货位初始化
+        /// </summary>
+        /// <param name="row"></param>
+        /// <param name="col"></param>
+        /// <param name="deot"></param>
+        /// <param name="rowcount"></param>
+        /// <param name="tun"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CpWareCellInit(int row, int col, int deot, int rowcount, int tun)
+        {
+            return _cpService.CpWareCellInit(row,col, deot, rowcount, tun);
+        }
+
+        #region 异常处理
+        /// <summary>
+        /// 强制取消任务
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ForceCancelTask(ErrorTaskRequest request)
+        {
+            lock (lockerForceCancelTask)
+            {
+                return _cpService.ForceCancelTask(request);
+            }
+        }
+        /// <summary>
+        /// 删除库存信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes DeleteStockInfo(DetailCodeStrRequest request)
+        {
+            lock (lockerDeleteStockInfo)
+            {
+                return _cpService.DeleteStockInfo(request);
+            }
+        }
+        /// <summary>
+        /// 修改库存状态
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes UpdateStockState(DetailCodeStr1Requestdto request)
+        {
+            lock (lockerUpdateStockState)
+            {
+                return _cpService.UpdateStockState(request);
+            }
+        }
+        /// <summary>
+        /// 修改货位状态
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes UpdateCellState(DetailCodeStr1Requestdto request)
+        {
+            lock (lockerUpdateCellState)
+            {
+                return _cpService.UpdateCellState(request);
+            }
+        }
+        /// <summary>
+        /// 货位数据互换
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes DataSwapCell(DataSwapCellStrRequest request)
+        {
+            lock (lockerDataSwapCell)
+            {
+                return _cpService.DataSwapCell(request);
+            }
+        }
+        /// <summary>
+        /// 补数据
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes DataBasePatch(DataBasePatchRequest request)
+        {
+            lock (lockerDataBasePatch)
+            {
+                return _cpService.DataBasePatch(request);
+            }
+        }
+        [HttpPost]
+        public SRes UpdatePurchState(UpdatePurchStateRequestdto request)
+        {
+            lock (lockerUpdatePuchState)
+            {
+                return _cpService.UpdatePurchState(request);
+            }
+        }
+        /// <summary>
+        /// 货位数据转移
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes DataMoveCell(DataSwapCellStrRequest request)
+        {
+            lock (lockerDataMoveCell)
+            {
+                return _cpService.DataMoveCell(request);
+            }
+        }
+        /// <summary>
+        /// 修改任务目标地址
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes UpdateTaskAddrTo(UpdateTaskAddrToReq request)
+        {
+            lock (lockerUpdatePuchState)
+            {
+                return _cpService.UpdateTaskAddrTo(request);
+            }
+        }
+
+
+        #endregion
+
+        #region 定时器
+        /// <summary>
+        /// 启用job
+        /// </summary>
+        /// <param name="req"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string StartJob(AutoDetailRequest req)
+        {
+            var res = new SRes();
+            var sysjob = _cpService.GetJobEntityByid(req.Id);
+            if (sysjob == null)
+            {
+                res.ResCode = 0;
+                res.ResMsg = "没有找到对应的定时任务";
+                return res.ToCamelCaseString();
+            }
+            JobScheduler.Start(sysjob.Code, Type.GetType("wms.api.Job.PostJob"), sysjob.CronExpression);
+            return res.ToCamelCaseString();
+        }
+        /// <summary>
+        /// 执行job
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string ExecuteJob(DetailCodeStrRequest reqEntity)
+        {
+            var res = new SRes();
+            if (string.IsNullOrEmpty(reqEntity.Code))
+            {
+                res.ResCode = 0;
+                res.ResMsg = "参数错误";
+                return res.ToCamelCaseString();
+            }
+            var jobEntity = _cpService.GetJobEntityByCode(reqEntity.Code);
+            if (jobEntity == null)
+            {
+                res.ResCode = 0;
+                res.ResMsg = "没有找到该编码";
+                return res.ToCamelCaseString();
+            }
+            var jobapilist = _cpService.GetJobapilist(jobEntity.Id);
+            if (jobapilist.Any())
+            {
+                foreach (var item in jobapilist)
+                {
+                    Task.Run(() => { HttpUtil.PostRequest(item.ApiUrl, item.RequestBody); });
+                }
+            }
+            return res.ToCamelCaseString();
+        }
+
+        /// <summary>
+        /// 分页Job列表
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public List<dto.response.hj.SysJobDto> GetSysJobList(wms.dto.request.hj.GetSysJobListRequest reqEntity)
+        {
+            var list = _sysJobrepository.GetList();
+            var listdto = _mapper.Map<List<dto.response.hj.SysJobDto>>(list);
+            if (listdto != null && listdto.Any())
+            {
+                for (int i = 0; i < list.Count; i++)
+                {
+                    listdto[i].JobExecuteStatus = GetExecuteStatus(new DetailCodeRequest() { Code = listdto[i].Code });
+                }
+                return listdto;
+            }
+            return new List<dto.response.hj.SysJobDto>();
+        }
+        /// <summary>
+        /// 获取执行状态
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetExecuteStatus(DetailCodeRequest reqEntity)
+        {
+            var jobInfo = _sysJobrepository.GetFirst(p => p.Code == reqEntity.Code);
+            var jobs = JobScheduler.GetJobList(Const.JobGroupName).Result;
+            if (jobs != null)
+            {
+                var temp = jobs.Where(p => p.JobName == jobInfo.Code);
+                if (temp.Any())
+                {
+                    return temp.First().JobStatus;
+                }
+                else
+                {
+                    return "Stop";
+                }
+            }
+            else
+            {
+                return "Stop";
+            }
+        }
+        #endregion
+
+        #region 时效调用接口
+        /// <summary>
+        /// 托盘搬运任务
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes TrayPortageTask(TrayGroupOutRequest request)
+        {
+            lock (lockerPalletAutoInTask)
+            {
+               return  _cpService.TrayPortageTask(request);
+            }
+            //return ConcurrencyReqControl<TrayGroupOutRequest, SRes>(lockerTrayPortageTask, "TrayPortageTask", request.Equip, request, _cpService.TrayPortageTask);
+   
+        }
+
+        /// <summary>
+        /// 托盘搬运验证
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes TrayPortageTaskCheck(TrayGroupOutRequest request)
+        {
+            lock (lockerTrayPortageTaskCheck)
+            {
+                return _cpService.TrayPortageTaskCheck(request);
+            }
+            //return ConcurrencyReqControl<TrayGroupOutRequest, SRes>(lockerTrayPortageTaskCheck, "TrayPortageTaskCheck", request.Equip, request, _cpService.TrayPortageTaskCheck);
+        }
+
+        /// <summary>
+        /// 成品自动入库(码垛完成入库)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PalletAutoInTask(PalletAutoTaskRequest request)
+        {
+            lock (lockerPalletAutoInTask)
+            {
+                return _cpService.PalletAutoInTask(request);
+            }
+            //return ConcurrencyReqControl<PalletAutoTaskRequest, SRes>(lockerPalletAutoInTask, "PalletAutoInTask", request.Equip, request, _cpService.PalletAutoInTask);
+        }
+        #endregion
+
+        /// <summary>
+        /// 成品整箱上传接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ProductBoxDetailUpload(SalesDocAutoPushRequest request)
+        {
+            lock (lockerProductBoxDetailUploadJob)
+            {
+                var res = new SRes();
+                if (request.Type == "1")
+                {
+                    var list = _cpService.GetBoxItemsList(p => p.UpLoadFlag == 0 || p.UpLoadFlag == 2).Where(p => p.IsNeedUpLoadFlag == 1);
+                    if (!list.Any())
+                    {
+                        return new SRes() { ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode(), ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription() };
+                    }
+                    foreach (var itemhunr in list.GroupBy(p => p.HuNr))
+                    {
+                        if (itemhunr.Key.Length > 12)//特殊装箱不上传mes
+                        {
+                            _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
+                            {
+                                Columns = it => new cpBoxItems { UpLoadFlag = 1, EditTime = DateTime.Now, Memo = "特殊装箱不上传mes" },
+                                WhereExpression = it => it.HuNr == itemhunr.Key
+                            });
+                            continue;
+                        }
+                        ProductBoxDetailUploadRequestNew itemreq = new ProductBoxDetailUploadRequestNew()
+                        {
+                            LayerList = new List<LayerListItem>()
+                            {
+                            }
+                        };
+
+                        int ovcflag = 0;
+                        foreach (var item in list.Where(p => p.HuNr == itemhunr.Key).GroupBy(p => new { p.Layer }))
+                        {
+                            itemreq.HuNr = item.First().HuNr;
+                            itemreq.SKU = item.First().Sku;
+                            itemreq.SkuDesc = item.First().Sku;
+                            itemreq.Batch = item.First().Batch;
+                            itemreq.Winding = item.First().Winding;
+                            itemreq.TimeStamp = item.First().TimeStamp;
+                            itemreq.MachineCode = item.First().EquNo;
+                            itemreq.OvcValue = list.Where(p => p.HuNr == item.First().HuNr).Average(p => decimal.Parse(string.IsNullOrEmpty(p.OvcValue) ? "0" : p.OvcValue)).ToString();
+
+                            if (item.First().OvcFlag == 2)
+                            {
+                                if (ovcflag == 0)
+                                {
+                                    var response = HttpUtil.PostRequest("http://10.30.44.3:8011/api/sx/GetTorsRange", JsonConvert.SerializeObject(new DetailCodeRequest() { Code = itemhunr.Key }));
+                                    var trayres = JsonConvert.DeserializeObject<SRes<GetTorsRangeRes>>(response);
+                                    if (decimal.Parse(itemreq.OvcValue) >= trayres.ResData.TorsValue - trayres.ResData.TorsRangeValue && decimal.Parse(itemreq.OvcValue) <= trayres.ResData.TorsValue + trayres.ResData.TorsRangeValue)
+                                    {
+                                        ovcflag = 2;
+                                    }
+                                    else
+                                    {
+                                        ovcflag = 1;
+                                    }
+                                    itemreq.OvcFlag = ovcflag.ToString();
+                                }
+                            }
+                            else
+                            {
+                                itemreq.OvcFlag = item.First().OvcFlag.ToString();
+                            }
+
+
+                            var laydetail = new LayerListItem()
+                            {
+                                LayerCode = item.Key.Layer.ToString().PadLeft(2, '0'),
+                                layerName = "第" + item.Key.Layer + "层",
+                                OvcFlag = item.First().OvcFlag.ToString(),
+                                OvcValue = item.Average(p => decimal.Parse(string.IsNullOrEmpty(p.OvcValue) ? "0" : p.OvcValue)).ToString(),
+                                SpoolList = new List<SpoolListItem>()
+                            };
+                            laydetail.SpoolList = list.Where(p => p.HuNr == item.First().HuNr && p.Layer == item.Key.Layer).Select(p => new SpoolListItem()
+                            {
+                                MatNo = p.CLBarCode,
+                                SpoolNr = p.HWBarCode
+                            }).ToList();
+                            itemreq.LayerList.Add(laydetail);
+                        }
+                        _logger.LogInformation("推送箱号记录:" + itemreq.HuNr);
+                        var resbody = JsonConvert.DeserializeObject<PushResponse>(WmsServiceExportApi(itemreq));
+                        if (resbody.ResCode == 200)
+                        {
+                            _logger.LogInformation("推送箱号:" + itemreq.HuNr + "反馈:" + JsonConvert.SerializeObject(resbody));
+                            _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
+                            {
+                                Columns = it => new cpBoxItems { UpLoadFlag = 1, EditTime = DateTime.Now },
+                                WhereExpression = it => it.HuNr == itemhunr.Key
+                            });
+                        }
+                        else
+                        {
+                            _logger.LogInformation("推送整箱数据反回" + JsonConvert.SerializeObject(resbody));
+                            _cpService.UpdateErrorBoxinfo(itemhunr.Key, resbody.ResMsg);
+                            if (resbody.ResMsg.Length > 400)
+                            {
+                                resbody.ResMsg = resbody.ResMsg.Substring(0, 400);
+                            }
+                            _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
+                            {
+                                Columns = it => new cpBoxItems { UpLoadFlag = 1, EditTime = DateTime.Now, Memo = resbody.ResMsg },
+                                WhereExpression = it => it.HuNr == itemhunr.Key
+                            });
+                        }
+                    }
+                }
+
+                return res;
+            }
+           
+        }
+
+        /// <summary>
+        /// 异常数据重复上传接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ErrorRepeatProductBoxDetailUpload(SalesDocAutoPushRequest request)
+        {
+            var res = new SRes();
+            var list = _cpService.GetBoxItemsHistoryList(p => p.HuNr == request.Type);
+            if (!list.Any())
+            {
+                return new SRes() { ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode(), ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription() };
+            }
+            foreach (var itemhunr in list.GroupBy(p => p.HuNr))
+            {
+                ProductBoxDetailUploadRequestNew itemreq = new ProductBoxDetailUploadRequestNew()
+                {
+                    LayerList = new List<LayerListItem>()
+                    {
+                    }
+                };
+
+                int ovcflag = 0;
+                foreach (var item in list.Where(p => p.HuNr == itemhunr.Key).GroupBy(p => new { p.Layer }))
+                {
+                    itemreq.HuNr = item.First().HuNr;
+                    itemreq.SKU = item.First().Sku;
+                    itemreq.SkuDesc = item.First().Sku;
+                    itemreq.Batch = item.First().Batch;
+                    itemreq.Winding = item.First().Winding;
+                    itemreq.TimeStamp = item.First().TimeStamp;
+                    itemreq.MachineCode = item.First().EquNo;
+                    itemreq.OvcValue = list.Where(p => p.HuNr == item.First().HuNr).Average(p => decimal.Parse(string.IsNullOrEmpty(p.OvcValue) ? "0" : p.OvcValue)).ToString();
+
+                    if (item.First().OvcFlag == 2)
+                    {
+                        if (ovcflag == 0)
+                        {
+                            var response = HttpUtil.PostRequest("http://10.30.44.3:8011/api/sx/GetTorsRange", JsonConvert.SerializeObject(new DetailCodeRequest() { Code = itemhunr.Key }));
+                            var trayres = JsonConvert.DeserializeObject<SRes<GetTorsRangeRes>>(response);
+                            if (decimal.Parse(itemreq.OvcValue) >= trayres.ResData.TorsValue - trayres.ResData.TorsRangeValue && decimal.Parse(itemreq.OvcValue) <= trayres.ResData.TorsValue + trayres.ResData.TorsRangeValue)
+                            {
+                                ovcflag = 2;
+                            }
+                            else
+                            {
+                                ovcflag = 1;
+                            }
+                            itemreq.OvcFlag = ovcflag.ToString();
+                        }
+                    }
+                    else
+                    {
+                        itemreq.OvcFlag = item.First().OvcFlag.ToString();
+                    }
+
+
+                    var laydetail = new LayerListItem()
+                    {
+                        LayerCode = item.Key.Layer.ToString().PadLeft(2, '0'),
+                        layerName = "第" + item.Key.Layer + "层",
+                        OvcFlag = item.First().OvcFlag.ToString(),
+                        OvcValue = item.Average(p => decimal.Parse(string.IsNullOrEmpty(p.OvcValue) ? "0" : p.OvcValue)).ToString(),
+                        SpoolList = new List<SpoolListItem>()
+                    };
+                    laydetail.SpoolList = list.Where(p => p.HuNr == item.First().HuNr && p.Layer == item.Key.Layer).Select(p => new SpoolListItem()
+                    {
+                        MatNo = p.CLBarCode,
+                        SpoolNr = p.HWBarCode
+                    }).ToList();
+                    itemreq.LayerList.Add(laydetail);
+                }
+                _logger.LogInformation("推送箱号记录:" + itemreq.HuNr);
+                var resbody = JsonConvert.DeserializeObject<PushResponse>(WmsServiceExportApi(itemreq));
+                if (resbody.ResCode == 200)
+                {
+                    _logger.LogInformation("推送箱号:" + itemreq.HuNr + "反馈:" + resbody.ResMsg);
+
+                }
+                else
+                {
+                    _logger.LogInformation("推送箱号:" + itemreq.HuNr + "反馈:" + resbody.ResMsg);
+
+                }
+            }
+
+            return res;
+        }
+
+        /// <summary>
+        /// 成品临时箱整箱上传接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes TempProductBoxDetailUpload(SalesDocAutoPushRequest request)
+        {
+            var res = new SRes();
+            if (request.Type == "1")
+            {
+                var list = _cpService.GetBoxItemsList(p => p.UpLoadFlag == 0 || p.UpLoadFlag == 2).Where(p => p.IsNeedUpLoadFlag == 2);
+                if (!list.Any())
+                {
+                    return new SRes() { ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode(), ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription() };
+                }
+                foreach (var item in list.GroupBy(p => p.HuNr))
+                {
+                    if (item.Key.StartsWith("Test"))//特殊装箱不上传mes
+                    {
+                        _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
+                        {
+                            Columns = it => new cpBoxItems { UpLoadFlag = 1, EditTime = DateTime.Now, Memo = "特殊装箱不上传mes" },
+                            WhereExpression = it => it.HuNr == item.Key
+                        });
+                        continue;
+                    }
+                    ProductBoxDetailUploadRequest itemreq = new ProductBoxDetailUploadRequest()
+                    {
+                        TempHuNr = item.Key,
+                        Lst_SpoolNr = item.Select(p => p.HWBarCode).ToList()
+                    };
+
+                    var resbody = JsonConvert.DeserializeObject<PushResponse>(WmsServiceExportApi(itemreq));
+                    if (resbody.success == true)
+                    {
+                        _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
+                        {
+                            Columns = it => new cpBoxItems { UpLoadFlag = 1, EditTime = DateTime.Now },
+                            WhereExpression = it => it.HuNr == item.Key
+                        });
+                    }
+                    else
+                    {
+                        if (item.Key.StartsWith("HAZDA"))
+                        {
+                            //如果是临时箱子则标记成异常,不再上传
+                            _cpService.UpdateBoxFail(item.Key);
+                            _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
+                            {
+                                Columns = it => new cpBoxItems { UpLoadFlag = 1, EditTime = DateTime.Now,Memo = "临时箱推送MES失败,自动设置成异常箱" },
+                                WhereExpression = it => it.HuNr == item.Key
+                            });
+                        }
+                        else
+                        {
+                            _cpService.UpdateBoxItemsModelColumns(new sqlsugar.model.UpdateModelColumns<cpBoxItems>()
+                            {
+                                Columns = it => new cpBoxItems { UpLoadFlag = 2, EditTime = DateTime.Now },
+                                WhereExpression = it => it.HuNr == item.Key
+                            });
+                        }
+                      
+                    }
+                }
+
+            }
+
+            return res;
+        }
+        /// <summary>
+        /// 监控遗留的库存数据
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes MonitorLeftStock(WebErrorRequest request)
+        {
+            return _cpService.MonitorLeftStock(request);
+        }
+        /// <summary>
+        /// 手动出库数据反馈(分发)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ManaelOutBack(SalesDocAutoPushRequest request)
+        {
+            var res = new SRes();
+            if (request.Type == "1")
+            {
+                var ManaelOut = _cpService.GetBillFeedbackList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == CpFackbeekType.ManualOut.ToString()).OrderBy(p => p.AddTime).FirstOrDefault();
+                if (ManaelOut == null)
+                {
+                    res.ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode();
+                    res.ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription();
+                    return res;
+                }
+                var ManaelOutTrans = new ManaelOutBackRequest()
+                {
+                    HuNr = ManaelOut.HWBarCode,
+                    Type = CpFackbeekType.ManualOut.ToString(),
+                    OutTime = ManaelOut.AddTime.ToString("yyyyMMddHHmmss")
+                };
+                WmsServiceExportPubMq(ManaelOutTrans);
+                _cpService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<cpBillPushinfo>()
+                {
+                    Columns = it => new cpBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                    WhereExpression = it => ManaelOut.Id == it.Id
+                });
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 验证箱号和托盘是否匹配
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes VerifyBoxNum(VerifyBoxNumRequest request)
+        {
+            return _cpService.VerifyBoxNum(request);
+        }
+
+        /// <summary>
+        /// 成品库盘点报表生成
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes GenInventoryReport(DetailCodeRequest request)
+        {
+            //0 30 8 ? * *    每天上午8:30触发
+            var res = new SRes();
+            DateTime lastDay = Convert.ToDateTime(DateTime.Now.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1);
+            if (lastDay.Day != DateTime.Now.Day)
+            {
+                res.ResMsg = "当前不是本月最后一天";
+                return res;
+            }
+            _cpService.GenInventoryReport();
+
+            return res;
+        }
+
+
+        /// <summary>
+        /// 成品人工口上成品码垛托盘PDA提交接口(MES调用)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PalletManualMoveTask(PalletManualMoveTaskRequest request)
+        {
+            lock (lockerPalletManualMoveTask)
+            {
+                return _cpService.PalletManualMoveTask(request);
+            }
+        }
+
+        /// <summary>
+        /// 流水数据归档
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes FlowDataMoveJob(SalesDocAutoPushRequest request)
+        {
+            lock (lockerFlowDataMoveJob)
+            {
+                return _cpService.FlowDataMoveJob(request);
+            }
+        }
+    }
+}

+ 68 - 0
wms.api/Controllers/DBInitController.cs

@@ -0,0 +1,68 @@
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using wms.service;
+using wms.service.IService;
+
+namespace wms.api.Controllers
+{
+    [Route("api/[controller]/[action]")]
+    [ApiController]
+    public class DBInitController : ControllerBase
+    {
+        private readonly IDBService _dBService;
+        public DBInitController(IDBService dBService)
+        {
+            _dBService = dBService;
+        }
+        /// <summary>
+        /// 初始化盘条库
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet(Name = "InitPtDB")]
+        public string InitPtDB()
+        {
+            _dBService.InitPtDB();
+            return "";
+        }
+        /// <summary>
+        /// 初始化合金库
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet(Name = "InitHjDB")]
+        public string InitHjDB()
+        {
+             _dBService.InitHjDB();
+            return "";
+        }
+        /// <summary>
+        /// 初始化分拣库
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet(Name = "InitFjDB")]
+        public string InitFjDB()
+        {
+             _dBService.InitFjDB();
+            return "";
+        }
+        /// <summary>
+        /// 初始化时效库
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet(Name = "InitSxDB")]
+        public string InitSxDB()
+        {
+             _dBService.InitSxDB();
+            return "";
+        }
+        /// <summary>
+        /// 初始化成品库
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet(Name = "InitCpDB")]
+        public string InitCpDB()
+        {
+             _dBService.InitCpDB();
+            return "";
+        }
+    }
+}

+ 425 - 0
wms.api/Controllers/FjController.cs

@@ -0,0 +1,425 @@
+using AutoMapper;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json;
+using wms.dto;
+using wms.dto.request;
+using wms.dto.request.fj;
+using wms.dto.request.share;
+using wms.dto.response;
+using wms.dto.response.fj;
+using wms.service.IService;
+using wms.sqlsugar.model.fj;
+using wms.util.Ext;
+
+namespace wms.api.Controllers
+{
+    /// <summary>
+    /// 分拣库控制器
+    /// </summary>
+    [Route("api/[controller]/[action]")]
+    [ApiController]
+    public class FjController : BaseController
+    {
+        private readonly IFJService _fjService;
+        private readonly ILogger<FjController> _logger;
+        private readonly IMapper _mapper;
+        static object lockerCurtainProductionOrder = new object();
+        static object lockerCurtainOrderStartCheck = new object();
+        static object lockerSpoolMaterialInfoTrans = new object();
+        static object lockerCurtainProductionStockOut = new object();
+        static object lockerProductionBack = new object();
+        static object lockerErrorMaterialStockOut = new object();
+        static object lockerBGradeMaterialStockOut = new object();
+        static object lockerlockerStockChange = new object();
+        static object lockerManualBuildStockTrans = new object();
+        static object lockerBomInfoTrans = new object();
+        static object lockerWetFormulaInfo = new object();
+        
+
+
+        public FjController(IFJService fjService, ILogger<FjController> logger, IMapper mapper) : base(fjService)
+        {
+            _fjService = fjService;
+            _logger = logger;
+            _mapper = mapper;
+        }
+
+        #region  暂时不用
+        /// <summary>
+        /// 同步物料基础信息
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        //[HttpPost]
+        //public string SyncMaterInfo(SyncMaterInfoRequest reqBody)
+        //{
+        //    var result = new SRes();
+        //    //_logger.LogInformation("请求参数:{@reqBody},{aa}", reqBody,1);
+        //    FJSyncMaterInfoResponse resbody = JsonConvert.DeserializeObject<FJSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+        //    if (reqBody.SyncType == 1)
+        //    {
+        //        reqBody.PageIndex = 1;
+        //        while (resbody.ResData !=null && resbody.ResData.Any())
+        //        {
+        //            _fjService.SyncMaterInfo(resbody.ResData);
+        //            reqBody.PageIndex++;
+        //            resbody = JsonConvert.DeserializeObject<FJSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+        //        }
+        //    }
+        //    else if (reqBody.SyncType == 2)
+        //    {
+        //        //拿到增量
+        //        var increconf = _fjService.GetSysConfigByCode(Const.MESMaterialInitIncrement);
+        //        if (increconf != null)
+        //        {
+        //            reqBody.StartTime = DateTime.Parse(increconf.SContent);
+        //            //reqBody.Count = int.Parse(increconf.Remark);
+        //            resbody = JsonConvert.DeserializeObject<FJSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+        //            if (resbody.ResData.Any())
+        //            {
+        //                if (_fjService.SyncMaterInfo(resbody.ResData))
+        //                {
+        //                    var lastdata = resbody.ResData.OrderBy(p => p.UpdatedTime).Last();
+        //                    _fjService.UpdateSysConfigModelColumns(new sqlsugar.model.UpdateModelColumns<fjSysConfig>()
+        //                    {
+        //                        Columns = it => new fjSysConfig { SContent = lastdata.UpdatedTime.ToString("yyyy-MM-dd HH:mm:ss.fff") },
+        //                        WhereExpression = it => it.Code == Const.MESMaterialInitIncrement
+        //                    });
+        //                }
+        //            }
+        //            else
+        //            {
+        //                result.ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode();
+        //                result.ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription();
+        //            }
+        //        }
+        //        else
+        //        {
+        //            result.ResCode = ResponseStatusCodeEnum.AccountError.GetHashCode();
+        //            result.ResMsg = "没有配置信息" + Const.MESMaterialInitIncrement;
+        //        }
+        //    }
+        //    else
+        //    {
+        //        if (!string.IsNullOrEmpty(reqBody.MatCode))
+        //        {
+        //            resbody = JsonConvert.DeserializeObject<FJSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+        //            if (resbody.ResData.Any())
+        //            {
+        //                if (_fjService.SyncMaterInfo(resbody.ResData))
+        //                {
+
+        //                }
+        //            }
+        //        }
+        //    }
+        //    return result.ToCamelCaseString();
+        //}
+        /// <summary>
+        /// BOM信息传输接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        //[HttpPost]
+        //public SRes BomInfoTrans(BomInfoTransRequest reqDto)
+        //{
+        //    return ConcurrencyReqControl<BomInfoTransRequest, SRes>(lockerBomInfoTrans, "BomInfoTrans" + reqDto.BomCode, reqDto.BomCode, reqDto, _fjService.BomInfoTrans);
+        //}
+        #endregion
+
+        /// <summary>
+        /// 物料主数据推送接口
+        /// </summary>
+        /// <param name="reqBody"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes SyncMaterInfoList(FJSyncMaterInfoListRequest reqBody)
+        {
+            var res = new SRes();
+            if (reqBody.ListInfo == null || !reqBody.ListInfo.Any())
+            {
+                res.ResCode = ResponseStatusCodeEnum.DocDetailNotExist.GetHashCode();
+                res.ResMsg = ResponseStatusCodeEnum.DocDetailNotExist.GetDescription();
+                return res;
+            }
+            _fjService.SyncMaterInfo(_mapper.Map<List<FJSyncMaterInfoResponseItem>>(reqBody.ListInfo));
+            return res;
+        }
+        /// <summary>
+        /// 机台信息同步接口
+        /// </summary>
+        /// <param name=""></param>
+        /// <returns></returns>
+        [HttpPost(Name = "SyncMachineInfo")]
+        public SyncMachineInfoResponse SyncMachineInfo(SyncMachineInfoRequest reqDto)
+        {
+            SyncMachineInfoResponse resbody = JsonConvert.DeserializeObject<SyncMachineInfoResponse>(WmsServiceExportApi(reqDto));
+            if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode() && resbody.ResData != null && resbody.ResData.Any())
+            {
+                _fjService.SyncMachineInfo(resbody.ResData);
+            }
+
+            return resbody;
+        }
+
+        /// <summary>
+        /// 湿拉配方信息同步接口
+        /// </summary>
+        /// <param name=""></param>
+        /// <returns></returns>
+        [HttpPost(Name = "WetFormulaInfo")]
+        public SRes WetFormulaInfo(WetFormulaInfoRequest reqDto)
+        {
+            return ConcurrencyReqControl<WetFormulaInfoRequest, SRes>(lockerWetFormulaInfo, "WetFormulaInfo", reqDto.FeedCode, reqDto, _fjService.WetFormulaInfo);
+        }
+        /// <summary>
+        /// 帘线生产工单信息传输接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CurtainProductionOrder(CurtainProductionOrderRequest reqDto)
+        {
+            return ConcurrencyReqControl<CurtainProductionOrderRequest, SRes>(lockerCurtainProductionOrder, "CurtainProductionOrder", reqDto.BillCode, reqDto, _fjService.CurtainProductionOrder);
+        }
+
+        /// <summary>
+        /// 湿拉工单启动验证
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CurtainOrderStartCheck(CurtainOrderStartCheckRequest reqDto)
+        {
+            return ConcurrencyReqControl<CurtainOrderStartCheckRequest, SRes>(lockerCurtainOrderStartCheck, "CurtainOrderStartCheck", reqDto.BillCode, reqDto, _fjService.CurtainOrderStartCheck);
+        }
+
+        /// <summary>
+        /// 湿拉工字轮/芯股信息传输接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes SpoolMaterialInfoTrans(SpoolMaterialInfoTransRequest reqDto)
+        {
+            return ConcurrencyReqControl<SpoolMaterialInfoTransRequest, SRes>(lockerSpoolMaterialInfoTrans, "SpoolMaterialInfoTrans", reqDto.SpoolCode, reqDto, _fjService.SpoolMaterialInfoTrans);
+        }
+
+        private SRes ComPushData(SRes resbody, List<long> ids)
+        {
+            var res = new SRes();
+            try
+            {
+                if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                {
+                    //更新推送表数据
+                    _fjService.UpdateBillPushinfoModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                    {
+                        Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1 },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                    //删除单据表数据
+                    //_fjService.DeleteDoc(p => doccodelist.Contains(p.DocNo));
+                }
+                else
+                {
+                    //更新推送表数据
+                    _fjService.UpdateBillPushinfoModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                    {
+                        Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1 },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+            }
+            catch (Exception ex)
+            {
+                res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
+                res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
+                _logger.LogInformation("反馈数据推送" + ex.ToString());
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 湿拉工字轮入库反馈接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "WetProductStockInFeedBack")]
+        public SRes WetProductStockInFeedBack()
+        {
+            var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_StockIn.ToString());
+            var dtolist = _mapper.Map<List<WetProductStockInFeedBackRequestItem>>(list);
+            var dto = new WetProductStockInFeedBackRequest() { ListInfo = dtolist};
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return ComPushData(resbody, list.Select(p => p.Id).ToList());
+        }
+        /// <summary>
+        /// 帘线叫料接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "CurtainProductionStockOut")]
+        public SRes CurtainProductionStockOut(CurtainProductionStockOutRequest reqDto)
+        {
+            return ConcurrencyReqControl<CurtainProductionStockOutRequest, SRes>(lockerCurtainProductionStockOut, "CurtainProductionStockOut", reqDto.BillCode, reqDto, _fjService.CurtainProductionStockOut);
+        }
+        /// <summary>
+        /// 叫料信息反馈接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "CurtainProductionStockOutFeedBack")]
+        public SRes CurtainProductionStockOutFeedBack()
+        {
+            var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_StockOut.ToString());
+            var dtolist = _mapper.Map<List<CurtainProductionStockOutFeedBackRequestItem>>(list);
+            var dto = new CurtainProductionStockOutFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return ComPushData(resbody, list.Select(p => p.Id).ToList());
+        }
+        /// <summary>
+        /// 生产退料/余料接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ProductionBack(FjProductionBackRequest reqDto)
+        {
+            return ConcurrencyReqControl<FjProductionBackRequest, SRes>(lockerProductionBack, "ProductionBack", reqDto.BillCode, reqDto, _fjService.ProductionBack);
+        }
+        /// <summary>
+        /// 余料反馈接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ProductionLeftFeedBack()
+        {
+            var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_LeftStockIn.ToString());
+            var dtolist = _mapper.Map<List<ProductionLeftFeedBackRequestItem>>(list);
+            var dto = new ProductionLeftFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return ComPushData(resbody, list.Select(p => p.Id).ToList());
+        }
+        /// <summary>
+        /// 异常料出库单传输接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ErrorMaterialStockOut(FjErrorMaterialStockOutRequest reqDto)
+        {
+            return ConcurrencyReqControl<FjErrorMaterialStockOutRequest, SRes>(lockerErrorMaterialStockOut, "ErrorMaterialStockOut", reqDto.BillCode, reqDto, _fjService.ErrorMaterialStockOut);
+        }
+        /// <summary>
+        /// 异常料出库反馈接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ErrorMaterialStockOutFeedBack()
+        {
+            var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_ErrStockOut.ToString());
+            var dtolist = _mapper.Map<List<ErrorMaterialStockOutFeedBackRequestItem>>(list);
+            var dto = new ErrorMaterialStockOutFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return ComPushData(resbody, list.Select(p => p.Id).ToList());
+        }
+        /// <summary>
+        /// B站叫料单传输接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes BGradeMaterialStockOut(BGradeMaterialStockOutRequest reqDto)
+        {
+            return ConcurrencyReqControl<BGradeMaterialStockOutRequest, SRes>(lockerBGradeMaterialStockOut, "BGradeMaterialStockOut", reqDto.BillCode, reqDto, _fjService.BGradeMaterialStockOut);
+        }
+        /// <summary>
+        /// B站出库反馈接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes BGradeMaterialStockOutFeedBack()
+        {
+            var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_BGradeStockOut.ToString());
+            var dtolist = _mapper.Map<List<BGradeMaterialStockOutFeedBackRequestItem>>(list);
+            var dto = new BGradeMaterialStockOutFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return ComPushData(resbody, list.Select(p => p.Id).ToList());
+        }
+
+        /// <summary>
+        /// 库存改判
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes StockChange(FjStockChangeRequest reqDto)
+        {
+            return ConcurrencyReqControl<FjStockChangeRequest, SRes>(lockerlockerStockChange, "FJStockChange", reqDto.BillCode, reqDto, _fjService.StockChange);
+        }
+        /// <summary>
+        /// 改判反馈接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes StockChangeFeedBack()
+        {
+            var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_StockChanage.ToString());
+            var dtolist = _mapper.Map<List<StockChangeFeedBackRequestItem>>(list);
+            var dto = new StockChangeFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return ComPushData(resbody, list.Select(p => p.Id).ToList());
+        }
+        /// <summary>
+        /// 实时库存查询接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "GetFJCurStockList")]
+        public GetFJCurStockListResponse GetFJCurStockList(GetFJCurStockListRequest reqDto)
+        {
+            return _fjService.GetCurStockList(reqDto);
+        }
+
+        /// <summary>
+        /// 回库反馈接口(出库途中改判的,入库之后再次上传入库信息)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes StockChangeStockInFeedBack()
+        {
+            var list = _fjService.GetBillPushinfoList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == fjFackbeekType.InterfaceType_FJ_ChanageBack.ToString());
+            var dtolist = _mapper.Map<List<StockChangeStockInFeedBackRequestItem>>(list);
+            var dto = new StockChangeStockInFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return resbody;
+        }
+        /// <summary>
+        /// 人工组盘传输接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ManualBuildStockTrans(ManualBuildStockTransRequest reqDto)
+        {
+            return ConcurrencyReqControl<ManualBuildStockTransRequest, SRes>(lockerManualBuildStockTrans, "ManualBuildStockTrans", reqDto.PalletCode, reqDto, _fjService.ManualBuildStockTrans);
+        }
+        /// <summary>
+        /// 条码信息查询接口
+        /// </summary>
+        /// <param name="req"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetMesBarCodeInfo(string req)
+        {
+            return "";
+        }
+    }
+}

+ 1511 - 0
wms.api/Controllers/HjController.cs

@@ -0,0 +1,1511 @@
+using Apache.NMS;
+using Apache.NMS.ActiveMQ;
+using Apache.NMS.Util;
+using AutoMapper;
+using CSRedis;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json;
+using Org.BouncyCastle.Crypto;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using wms.api.Job;
+using wms.dto;
+using wms.dto.request;
+using wms.dto.request.cp.dto;
+using wms.dto.request.hj;
+using wms.dto.request.hj.dto;
+using wms.dto.request.share;
+using wms.dto.response;
+using wms.dto.response.hj;
+using wms.dto.response.share;
+using wms.service;
+using wms.service.IService;
+using wms.service.Service;
+using wms.sqlsugar;
+using wms.sqlsugar.model.hj;
+using wms.util;
+using wms.util.Check;
+using wms.util.Ext;
+using wms.util.Http;
+using static NPOI.HSSF.Util.HSSFColor;
+
+namespace wms.api.Controllers
+{
+    /// <summary>
+    /// 合金库控制器
+    /// </summary>
+    [Route("api/[controller]/[action]")]
+    [ApiController]
+    public class HjController : BaseController
+    {
+        private readonly IHJService _hJService;
+        private readonly ILogger<HjController> _logger;
+        private readonly IMapper _mapper;
+        static object lockerCopperLineReceiveInstr = new object();
+        static object lockerWetLineBackInApply = new object();
+        static object lockerStockChange = new object();
+        static object lockerSpecialPickMaterApply = new object();
+        static object lockerSyncMaterInfoList = new object();
+        static object lockerApplyStockOutTask = new object();
+        static object lockerWetLinePickMaterApply = new object();
+        static object lockerWetLinePickMaterApplyCheck = new object();
+        static object lockerCompleteTask = new object();
+        static object lockerApplyStockInLoc = new object();
+        static object lockerMoveTask = new object();
+        static object lockerSrmPickOutCompleted = new object();
+        static object lockWcsUploadInfo = new object();
+        static object lockerMannel = new object();
+        static object lockerCarryTask = new object();
+        static object lockerStockInfo = new object();
+        static object lockerPdaTaskInfo = new object();
+        static object lockerCancelOrComplet = new object();
+        static object lockerCopperLineToStockOut = new object();
+        static object lockerFlowDataMoveJob = new object();
+        Repository<SysJob> _sysJobrepository => new Repository<SysJob>();
+        public HjController(IHJService hJService, ILogger<HjController> logger, IMapper mapper) :base(hJService, logger)
+        {
+            _hJService = hJService;
+            _logger= logger;
+            _mapper = mapper;
+        }
+
+        #region 业务方法
+
+
+        /// <summary>
+        /// 货位初始化
+        /// </summary>
+        /// <param name="row"></param>
+        /// <param name="col"></param>
+        /// <param name="deot"></param>
+        /// <param name="rowcount"></param>
+        /// <param name="tun"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes WareCellInit(int row, int col, int deot, int rowcount, int tun)
+        {
+            return _hJService.WareCellInit(row, col, deot, rowcount, tun);
+        }
+
+        /// <summary>
+        /// 更新任务进程
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<int> WcsTaskCallBack(WcsTaskCallBackRequest reqEntity)
+        {
+           return  _hJService.WcsTaskCallBack(reqEntity);
+        }
+        /// <summary>
+        /// 获取巷道
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<string> GetTunnelPriorityList(GetTunnelPriorityListRequest reqEntity)
+        {
+            return _hJService.GetTunnelPriorityList(reqEntity);
+        }
+        /// <summary>
+        /// 分配货位
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<ApplyStockInLocResponse> ApplyStockInLoc(ApplyStockInLocRequest reqEntity)
+        {
+
+            lock (lockerCompleteTask)
+            {
+                return _hJService.ApplyStockInLoc(reqEntity);
+            }
+            //return ConcurrencyReqControl<ApplyStockInLocRequest, SRes<ApplyStockInLocResponse>>(lockerApplyStockInLoc, "ApplyStockInLoc" + reqEntity.TunnelNum, "分配货位" + reqEntity.PickUpEquipmentNo, reqEntity, _hJService.ApplyStockInLoc);
+        }
+        /// <summary>
+        /// 完成任务
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<int> CompleteTask(CompleteTaskRequest reqDto)
+        {
+            lock (lockerCompleteTask)
+            {
+                return _hJService.CompleteTask(reqDto);
+            }
+        }
+        /// <summary>
+        /// 申请移库任务
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<AddWcsMoveTaskResponse> AddWcsMoveTask(AddWcsMoveTaskRequest reqEntity)
+        {
+            lock (lockerCompleteTask)
+            {
+                return _hJService.AddWcsMoveTask(reqEntity);
+            }
+        }
+        /// <summary>
+        /// 堆垛机出库放货完成
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public  SRes<int> SrmPickOutCompleted(SrmPickOutCompletedRequest reqDto)
+        {
+            lock (lockerCompleteTask)
+            {
+                return _hJService.SrmPickOutCompleted(reqDto);
+            }
+        }
+
+        /// <summary>
+        /// WCS信息上传
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes WcsUploadInfo(WcsUploadInfoRequest reqDto)
+        {
+            lock (lockWcsUploadInfo)
+            {
+                //if (reqDto.Weight > 1)
+                //{
+                //    var webBaseUrl = AppSettings.GetConfig("maxweight");
+                //}
+                return _hJService.WcsUploadInfo(reqDto);
+            }
+        }
+
+        /// <summary>
+        /// 物料主数据推送接口
+        /// </summary>
+        /// <param name="reqBody"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes SyncMaterInfoList(HJSyncMaterInfoListRequest reqDto)
+        {
+            var res = new SRes();
+            if (string.IsNullOrEmpty(reqDto.ReqId))
+            {
+                res.ResCode = ResponseStatusCodeEnum.NotReqId.GetHashCode();
+                res.ResMsg = ResponseStatusCodeEnum.NotReqId.GetDescription();
+                return res;
+            }
+            if (reqDto.ListInfo == null || !reqDto.ListInfo.Any())
+            {
+                res.ResCode = ResponseStatusCodeEnum.DocDetailNotExist.GetHashCode();
+                res.ResMsg = ResponseStatusCodeEnum.DocDetailNotExist.GetDescription();
+                return res;
+            }
+          
+            res = ConcurrencyReqControl<HJSyncMaterInfoListRequest, SRes>(lockerSyncMaterInfoList, "SyncMaterInfoList", "物料主数据推送" + reqDto.ReqId, reqDto, _hJService.SyncMaterInfo);
+            try
+            {
+                HttpUtil.PostRequest("http://10.30.45.5:9191/databus/publish/syncMatBasicInfosForLiku", JsonConvert.SerializeObject(reqDto), 30000, "UTF-8", "application/json");
+            }
+            catch (Exception ex)
+            {
+                _logger.LogInformation("调用agv主数据异常" + ex.ToString());
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 镀铜满轮入库/550工字轮入库反馈接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "CopperLineStockInFeedBack")]
+        public CopperLineStockInFeedBackResponse CopperLineStockInFeedBack(string billcode)
+        {
+            var list = _hJService.GetBillFeedbackList(p => p.BillCode == billcode && p.ApiCode == "CopperLineStockInFeedBack" && p.PostResult == 0 ||( p.PostResult == 2 && p.PostNum < 5));
+            if (!list.Any())
+            {
+                return new CopperLineStockInFeedBackResponse() { ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode(), ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription() };
+            }
+            var dtolist = _mapper.Map<List<CopperLineStockInFeedBackItem>>(list);
+            CopperLineStockInFeedBackRequest dto = new CopperLineStockInFeedBackRequest();
+            dto.ListInfo = dtolist;
+            CopperLineStockInFeedBackResponse resbody = JsonConvert.DeserializeObject<CopperLineStockInFeedBackResponse>(WmsServiceExportApi(dto));
+            List<long> ids = list.Select(p => p.Id).ToList();
+            List<string> doccodelist = list.Select(p => p.BillCode).ToList();
+            if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+            {
+                //更新推送表数据
+                _hJService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns<hjBillFeedbackPush>()
+                {
+                    Columns = it => new hjBillFeedbackPush { PostResult = 1, PostNum = it.PostNum + 1 },
+                    WhereExpression = it => ids.Contains(it.Id)
+                });
+                //删除单据表数据
+                _hJService.DeleteDoc(p => doccodelist.Contains(p.DocNo));
+            }
+            else
+            {
+                //更新推送表数据
+                _hJService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns<hjBillFeedbackPush>()
+                {
+                    Columns = it => new hjBillFeedbackPush { PostResult = 2, PostNum = it.PostNum + 1 },
+                    WhereExpression = it => ids.Contains(it.Id)
+                });
+            }
+            return resbody;
+        }
+        /// <summary>
+        /// 湿拉生产退料/余料反馈接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "WetLineBackInFeedBack")]
+        public WetLineBackInFeedBackResponse WetLineBackInFeedBack(string billcode)
+        {
+            var list = _hJService.GetBillFeedbackList(p => p.BillCode == billcode && p.ApiCode == "WetLineBackInFeedBack" && p.PostResult == 0 || (p.PostResult == 2 && p.PostNum < 5));
+            var dtolist = _mapper.Map<List<WetLineBackInFeedBackRequestItem>>(list);
+            var dto = new WetLineBackInFeedBackRequest() { ListInfo = dtolist };
+            WetLineBackInFeedBackResponse resbody = JsonConvert.DeserializeObject<WetLineBackInFeedBackResponse>(WmsServiceExportApi(dtolist));
+            List<long> ids = list.Select(p => p.Id).ToList();
+            List<string> doccodelist = list.Select(p => p.BillCode).ToList();
+            if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+            {
+                //更新推送表数据
+                _hJService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns<hjBillFeedbackPush>()
+                {
+                    Columns = it => new hjBillFeedbackPush { PostResult = 1, PostNum = it.PostNum + 1 },
+                    WhereExpression = it => ids.Contains(it.Id)
+                });
+                //删除单据表数据
+                _hJService.DeleteDoc(p => doccodelist.Contains(p.DocNo));
+            }
+            else
+            {
+                //更新推送表数据
+                _hJService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns<hjBillFeedbackPush>()
+                {
+                    Columns = it => new hjBillFeedbackPush { PostResult = 2, PostNum = it.PostNum + 1 },
+                    WhereExpression = it => ids.Contains(it.Id)
+                });
+            }
+            return resbody;
+        }
+
+        /// <summary>
+        /// 改判反馈接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "StockChangeFeedBack")]
+        public StockChangeFeedBackResponse StockChangeFeedBack(string billcode)
+        {
+            var list = _hJService.GetBillFeedbackList(p => p.BillCode == billcode);
+            var dtolist = _mapper.Map<List<StockChangeRequestItem>>(list);
+            StockChangeFeedBackRequest dto = new StockChangeFeedBackRequest() { BillCode = billcode };
+            dto.ListInfo = dtolist;
+            StockChangeFeedBackResponse resbody = JsonConvert.DeserializeObject<StockChangeFeedBackResponse>(WmsServiceExportApi(dto));
+            List<long> ids = list.Select(p => p.Id).ToList();
+            List<string> doccodelist = list.Select(p => p.BillCode).ToList();
+            if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+            {
+                //更新推送表数据
+                _hJService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns<hjBillFeedbackPush>()
+                {
+                    Columns = it => new hjBillFeedbackPush { PostResult = 1, PostNum = it.PostNum + 1 },
+                    WhereExpression = it => ids.Contains(it.Id)
+                });
+                //删除单据表数据
+                _hJService.DeleteDoc(p => doccodelist.Contains(p.DocNo));
+            }
+            else
+            {
+                //更新推送表数据
+                _hJService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns<hjBillFeedbackPush>()
+                {
+                    Columns = it => new hjBillFeedbackPush { PostResult = 2, PostNum = it.PostNum + 1 },
+                    WhereExpression = it => ids.Contains(it.Id)
+                });
+            }
+            return resbody;
+        }
+
+        /// <summary>
+        /// 特殊料反馈接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "SpecialPickMaterFeedBack")]
+        public SpecialPickMaterFeedBackResponse SpecialPickMaterFeedBack(string billcode)
+        {
+            var list = _hJService.GetBillFeedbackList(p => p.BillCode == billcode && p.ApiCode == "SpecialPickMaterFeedBack" && p.PostResult == 0 || (p.PostResult == 2 && p.PostNum < 5));
+            var dtolist = _mapper.Map<List<SpecialPickMaterFeedBackRequestItem>>(list);
+            SpecialPickMaterFeedBackRequest dto = new SpecialPickMaterFeedBackRequest() { ListInfo = dtolist };
+            SpecialPickMaterFeedBackResponse resbody = JsonConvert.DeserializeObject<SpecialPickMaterFeedBackResponse>(WmsServiceExportApi(dtolist));
+            List<long> ids = list.Select(p => p.Id).ToList();
+            List<string> doccodelist = list.Select(p => p.BillCode).ToList();
+            if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+            {
+                //更新推送表数据
+                _hJService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns<hjBillFeedbackPush>()
+                {
+                    Columns = it => new hjBillFeedbackPush { PostResult = 1, PostNum = it.PostNum + 1 },
+                    WhereExpression = it => ids.Contains(it.Id)
+                });
+                //删除单据表数据
+                _hJService.DeleteDoc(p => doccodelist.Contains(p.DocNo));
+            }
+            else
+            {
+                //更新推送表数据
+                _hJService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns<hjBillFeedbackPush>()
+                {
+                    Columns = it => new hjBillFeedbackPush { PostResult = 2, PostNum = it.PostNum + 1 },
+                    WhereExpression = it => ids.Contains(it.Id)
+                });
+            }
+            return resbody;
+        }
+
+        /// <summary>
+        /// 移库货位上报MES接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "MoveStockFeedBack")]
+        public MoveStockFeedBackResponse MoveStockFeedBack(string billcode)
+        {
+            var list = _hJService.GetBillFeedbackList1(p => p.DocsNo == billcode && p.TypeCode == "MoveStockFeedBack" && p.PostResult == 0 || (p.PostResult == 2 && p.PostQty < 5));
+            var dtolist = _mapper.Map<List<MoveStockFeedBackRequestItem>>(list);
+            MoveStockFeedBackRequest dto = new MoveStockFeedBackRequest() { ListInfo = dtolist };
+            MoveStockFeedBackResponse resbody = JsonConvert.DeserializeObject<MoveStockFeedBackResponse>(WmsServiceExportApi(dto));
+            List<long> ids = list.Select(p => p.Id).ToList();
+            List<string> doccodelist = list.Select(p => p.DocsNo).ToList();
+            if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+            {
+                //更新推送表数据
+                _hJService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns<hjBillFeedbackPush>()
+                {
+                    Columns = it => new hjBillFeedbackPush { PostResult = 1, PostNum = it.PostNum + 1 },
+                    WhereExpression = it => ids.Contains(it.Id)
+                });
+            }
+            else
+            {
+                //更新推送表数据
+                _hJService.UpdateBillFeedbackPushModelColumns(new sqlsugar.model.UpdateModelColumns<hjBillFeedbackPush>()
+                {
+                    Columns = it => new hjBillFeedbackPush { PostResult = 2, PostNum = it.PostNum + 1 },
+                    WhereExpression = it => ids.Contains(it.Id)
+                });
+            }
+            return resbody;
+        }
+
+        /// <summary>
+        /// 条码信息查询接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "GetBarCodeInfo")]
+        public GetBarCodeInfoResponse GetBarCodeInfo(GetBarCodeInfoRequest barcode)
+        {
+            GetBarCodeInfoResponse resbody = JsonConvert.DeserializeObject<GetBarCodeInfoResponse>(WmsServiceExportApi(barcode));
+            return resbody;
+        }
+        /// <summary>
+        /// 镀铜补空/取满指令接收接口(包含550工字轮)
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "CopperLineReceiveInstr")]
+        public SRes CopperLineReceiveInstr(CopperLineNewRequest reqDtoList)
+        {
+            var res = new SRes();
+            if (reqDtoList != null && reqDtoList.data!= null && reqDtoList.data.Any())
+            {
+                foreach (var reqDto in reqDtoList.data)
+                {
+                    res = ConcurrencyReqControl<CopperLineRequest, SRes>(lockerCopperLineReceiveInstr, "CopperLineReceiveInstr" + reqDto.WbCode, reqDto.WbCode, reqDto, _hJService.CopperLineReceiveInstr);
+                    if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
+                    {
+                        continue;
+                    }
+                }
+            }
+           return res;
+        }
+
+        /// <summary>
+        /// 镀铜补空/取满指令接收接口(手持机用)
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "PdaCopperLineReceiveInstr")]
+        public SRes PdaCopperLineReceiveInstr(CopperLineRequest reqDto)
+        {
+            return  ConcurrencyReqControl<CopperLineRequest, SRes>(lockerCopperLineReceiveInstr, "CopperLineReceiveInstr" + reqDto.WbCode, reqDto.WbCode, reqDto, _hJService.PdaCopperLineReceiveInstr);
+        }
+
+
+        /// <summary>
+        /// 合金一楼满轮出库申请(mes调用)
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "CopperLineToStockOut")]
+        public SRes CopperLineToStockOut(CopperLineToStockOutRequest reqDto)
+        {
+            return ConcurrencyReqControl<CopperLineToStockOutRequest, SRes>(lockerCopperLineToStockOut, "CopperLineToStockOut", reqDto.MatCode, reqDto, _hJService.CopperLineToStockOut);
+        }
+
+        /// <summary>
+        /// 申请出库任务(一楼空轮)
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public ApplyStockOutTaskResponse ApplyStockOutTask(ApplyStockOutTaskRequest reqDto)
+        {
+            var result = new ApplyStockOutTaskResponse();
+            if (reqDto.OutType == 2)
+            {
+                if (string.IsNullOrEmpty(reqDto.Tunnel))
+                {
+                    return new ApplyStockOutTaskResponse()
+                    {
+                       ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode(),
+                       ResMsg = "巷道值没有传值"
+                    };
+                }
+                var req = new ApplyEmptySpoolRequest() { Tunnel = int.Parse(reqDto.Tunnel),OutEndPostion = reqDto.OutEndPostion };
+                return ConcurrencyReqControl<ApplyEmptySpoolRequest, ApplyStockOutTaskResponse>(lockerApplyStockOutTask, "ApplyStockOutTask", reqDto.OutEndPostion, req, _hJService.ApplyEmptySpoolService);
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 获取巷道空轮数量
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<GetTunnelEmptyConResponse> GetTunnelEmptyConCount(GetTunnelEmptyConCountRequest reqDto)
+        {
+            return _hJService.GetTunnelEmptyConCount(reqDto);
+        }
+
+        /// <summary>
+        /// 库存改判
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "StockChange")]
+        public StockChangeResponse StockChange(StockChangeRequest reqDto)
+        {
+            return ConcurrencyReqControl<StockChangeRequest, StockChangeResponse>(lockerStockChange, "HJStockChange", reqDto.BillCode, reqDto, _hJService.StockChange);
+        }
+
+        /// <summary>
+        /// 特殊出库领料申请接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "SpecialPickMaterApply")]
+        public SpecialPickMaterApplyResponse SpecialPickMaterApply(SpecialPickMaterApplyRequest reqDto)
+        {
+            return ConcurrencyReqControl<SpecialPickMaterApplyRequest, SpecialPickMaterApplyResponse>(lockerSpecialPickMaterApply, "SpecialPickMaterApply", reqDto.MatBarCode, reqDto, _hJService.SpecialPickMaterApply);
+
+        }
+
+        /// <summary>
+        /// 实时库存查询接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public GetCurStockListResponse GetCurStockList(GetCurStockListRequest reqDto)
+        {
+            return _hJService.GetCurStockList(reqDto);
+        }
+        #endregion
+
+        #region RCS调用接口
+      
+        /// <summary>
+        /// 镀铜一楼res下任务
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public GenAgvSchedulingTaskResponse CopperLineAgvTaskToRcs(GenAgvSchedulingTaskRequest reqDto)
+        {
+            var result = new GenAgvSchedulingTaskResponse();
+            //GenAgvSchedulingTaskRequest resReq = new GenAgvSchedulingTaskRequest();
+            var apiurl = wms.util.AppSettings.GetConfig("RcsCreateTaskPushUrl");
+            var strRes = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(reqDto), 30000);
+            if (string.IsNullOrEmpty(strRes))
+            {
+                result.message = "返回空";
+                return result;
+            }
+            return JsonConvert.DeserializeObject<GenAgvSchedulingTaskResponse>(strRes);
+        }
+        /// <summary>
+        /// 镀铜一楼res继续任务
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public GenAgvSchedulingTaskResponse CopperLineContinueTaskToRcs(GenAgvSchedulingTaskRequest reqDto)
+        {
+            var result = new GenAgvSchedulingTaskResponse();
+            //GenAgvSchedulingTaskRequest resReq = new GenAgvSchedulingTaskRequest()
+            //{ };
+            var apiurl = wms.util.AppSettings.GetConfig("RcsContinuePushUrl");
+            var strRes = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(reqDto), 30000);
+            if (string.IsNullOrEmpty(strRes))
+            {
+                result.message = "返回空";
+                return result;
+            }
+            return JsonConvert.DeserializeObject<GenAgvSchedulingTaskResponse>(strRes);
+        }
+        /// <summary>
+        /// 镀铜二楼IWMS下发满轮出库
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CopperLineAgvTaskStockOutToIWms(CopperLineAgvTaskStockOutToIWmsRequest reqDto)
+        {
+            var result = new SRes();
+            CopperLineAgvTaskStockOutToIWmsRequest resReq = new CopperLineAgvTaskStockOutToIWmsRequest()
+            { 
+                matCode = "",
+                wbCode = "满轮接驳口",
+                inSpoolFull = "1",
+                wetInto = true,
+                wetIntoSpec = false,
+                isSurplus = "",
+                isRework = "",
+                matNo = "",
+                spoolNo = "",
+                gradeCode = "",
+                taskNo = Guid.NewGuid().ToString(),
+
+            };
+            var apiurl = wms.util.AppSettings.GetConfig("IWmsStockOutPushUrl");
+            var strRes = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(reqDto), 30000);
+            if (string.IsNullOrEmpty(strRes))
+            {
+                //result.message = "返回空";
+                return result;
+            }
+            return JsonConvert.DeserializeObject<SRes>(strRes);
+        }
+        /// <summary>
+        /// 镀铜二楼IWMS下发空轮/退料/余料入库
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CopperLineAgvTaskStockInToIWms(CopperLineAgvTaskStockInToIWmsRequest reqDto)
+        {
+            var result = new SRes();
+            CopperLineAgvTaskStockInToIWmsRequest resReq = new CopperLineAgvTaskStockInToIWmsRequest()
+            {
+                matCode = "",
+                workAreaCode = "11",
+                outSpoolFull = "1",
+                taskNo = Guid.NewGuid().ToString()
+            };
+            var apiurl = wms.util.AppSettings.GetConfig("IWmsStockInPushUrl");
+            var strRes = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(reqDto), 30000);
+            if (string.IsNullOrEmpty(strRes))
+            {
+                //result.message = "返回空";
+                return result;
+            }
+            return JsonConvert.DeserializeObject<SRes>(strRes);
+        }
+
+        /// <summary>
+        /// 复核异常上报接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public RfidCheckDiffResponse RfidCheckDiff(RfidCheckDiffRequest request)
+        {
+            var res = new RfidCheckDiffResponse();
+            //异常
+            _hJService.RfidCheckDiffService(request);
+            _logger.LogInformation("复核异常上报接口RfidCheckDiff接收数据:" + JsonConvert.SerializeObject(request));
+            return res;
+        }
+
+        /// <summary>
+        /// 湿拉生产退料/余料/空轮申请接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes WetLineBackInApply(WetLineBackInApplyRequest reqDto)
+        {
+            //return ConcurrencyReqControl<WetLineBackInApplyRequest, SRes>(lockerWetLineBackInApply, "WetLineBackInApply", reqDto.MatBarCode, reqDto, _hJService.WetLineBackInApplyService);
+
+            lock (lockerWetLineBackInApply)
+            {
+                return _hJService.WetLineBackInApplyService(reqDto);
+            }
+        }
+
+        /// <summary>
+        /// 湿拉产线领料申请接口WetLinePickMaterApply
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes WetLinePickMaterApply(WetLinePickMaterApplyRequest reqDto)
+        {
+            reqDto.Priority = 0;//优先级暂时屏蔽
+            //return ConcurrencyReqControl<WetLinePickMaterApplyRequest, SRes>(lockerWetLinePickMaterApply, "WetLinePickMaterApply" + reqDto.MatCode, reqDto.MatCode, reqDto, _hJService.WetLinePickMaterApplyService);
+
+            lock (lockerWetLinePickMaterApply) 
+            {
+                return _hJService.WetLinePickMaterApplyService(reqDto);
+            }
+        }
+
+        /// <summary>
+        /// 湿拉产线领料申请复核验证
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes WetLinePickMaterApplyCheck(WetLinePickMaterApplyRequest reqDto)
+        {
+            reqDto.Priority = 0;//优先级暂时屏蔽
+            //return ConcurrencyReqControl<WetLinePickMaterApplyRequest, SRes>(lockerWetLinePickMaterApply, "WetLinePickMaterApply" + reqDto.MatCode, reqDto.MatCode, reqDto, _hJService.WetLinePickMaterApplyService);
+
+            lock (lockerWetLinePickMaterApplyCheck)
+            {
+                return _hJService.ApplyStockOutCheck(reqDto);
+            }
+        }
+        #endregion
+
+        #region 定时任务业务
+        /// <summary>
+        /// 添加定时任务
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string AddJob(AddJobRequest request)
+        {
+            request.Id = IdFactory.NewId();
+            return _hJService.AddJob(request);
+        }
+        /// <summar y>
+        /// 编辑定时任务
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public string UpdateJobEntity(AddJobRequest request)
+        {
+            return _hJService.UpdateJobEntity(request);
+        }
+        /// <summary>
+        /// 获取job根据id
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetSysJobById(long id)
+        {
+            return JsonConvert.SerializeObject(_hJService.GetSysJobById(id));
+        }
+        /// <summary>
+        /// 启用job
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string StartJob(DetailRequest2Str req)
+        {
+            var res = new SRes();
+            var sysjob = _sysJobrepository.GetById(req.Id);
+            if (sysjob == null)
+            {
+                res.ResCode = 0;
+                res.ResMsg = "没有找到对应的定时任务";
+                return res.ToCamelCaseString();
+            }
+            JobScheduler.Start(sysjob.Code, Type.GetType("wms.api.Job.PostJob"), sysjob.CronExpression);
+            return res.ToCamelCaseString();
+        }
+        /// <summary>
+        /// 执行job
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string ExecuteJob(DetailCodeRequest reqEntity)
+        {
+            var res = new SRes();
+            if (string.IsNullOrEmpty(reqEntity.Code))
+            {
+                res.ResCode = 0;
+                res.ResMsg = "参数错误";
+                return res.ToCamelCaseString();
+            }
+            var jobEntity = _sysJobrepository.GetSingle(p => p.Code == reqEntity.Code);
+            if (jobEntity == null)
+            {
+                res.ResCode = 0;
+                res.ResMsg = "没有找到该编码";
+                return res.ToCamelCaseString();
+            }
+            var jobapilist = _hJService.GetSysApiDetail(jobEntity.Id);
+            if (jobapilist.Any())
+            {
+                foreach (var item in jobapilist)
+                {
+                    Task.Run(() => { HttpUtil.PostRequest(item.ApiUrl, item.RequestBody); });
+                }
+            }
+            return res.ToCamelCaseString();
+        }
+        /// <summary>
+        /// 分页Job列表
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public List<dto.response.hj.SysJobDto> GetSysJobList(GetSysJobListRequest reqEntity)
+        {
+            var list = _sysJobrepository.GetList();
+            var listdto = _mapper.Map<List<dto.response.hj.SysJobDto>>(list);
+            if (listdto != null && listdto.Any())
+            {
+                for (int i = 0; i < list.Count; i++)
+                {
+                    listdto[i].JobExecuteStatus = GetExecuteStatus(new DetailCodeRequest() { Code = listdto[i].Code });
+                }
+                return listdto;
+            }
+            return new List<dto.response.hj.SysJobDto>();
+        }
+        /// <summary>
+        /// 获取执行状态
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetExecuteStatus(DetailCodeRequest reqEntity)
+        {
+            var jobInfo = _sysJobrepository.GetFirst(p=>p.Code == reqEntity.Code);
+            var jobs = JobScheduler.GetJobList(Const.JobGroupName).Result;
+            if (jobs != null)
+            {
+                var temp = jobs.Where(p => p.JobName == jobInfo.Code);
+                if (temp.Any())
+                {
+                    return temp.First().JobStatus;
+                }
+                else
+                {
+                    return "Stop";
+                }
+            }
+            else
+            {
+                return "Stop";
+            }
+        }
+        [HttpPost]
+        public string GetId()
+        {
+            return IdFactory.NewId().ToString();
+        }
+        #endregion
+
+        #region 库存管理
+        /// <summary>
+        /// 手动出库确定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string ManualTask(ManualTaskRequest request)
+        {
+            lock (lockerMannel)
+            {
+                return _hJService.ManualTask(request);
+            }
+        }
+        #endregion
+
+        #region 合金PDA
+        /// <summary>
+        /// 合金解绑
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<int> Unbounding(UnboundRequest request)
+        {
+            return _hJService.Unbounding(request);
+        }
+        #region pda出库
+        /// <summary>
+        /// pda指定出库确定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string PdaManualTask(ManualTaskRequest request)
+        {
+            request.BusType = TaskBusType.TaskBusType_HJ_PdaManualOut.GetHashCode().ToString();
+            return _hJService.ManualTask(request);
+        }
+        /// <summary>
+        /// pda质检领料出库确定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string PdaQualityTask(ManualTaskRequest request)
+        {
+            request.BusType = TaskBusType.TaskBusType_HJ_QualityOut.GetHashCode().ToString();
+            return _hJService.ManualTask(request);
+        }
+        /// <summary>
+        /// pda呆滞料出库确定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string PdaInactionStockTask(ManualTaskRequest request)
+        {
+            request.BusType = TaskBusType.TaskBusType_HJ_DullMaterOut.GetHashCode().ToString();
+            return _hJService.ManualTask(request);
+        }
+        #endregion
+
+        /// <summary>
+        /// pda单据查询
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetDocumentsAll(DocumentsRequest request)
+        {
+            return _hJService.GetPageDocumentsList(request).ToCamelCaseString();
+        }
+        /// <summary>
+        /// pda单据明细查询(传单号)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetDocumentDetails(DocumentsRequest request)
+        {
+            return _hJService.GetDocumentDetailListByDocsNo(request).ToCamelCaseString();
+        }
+        /// <summary>
+        /// 获取物料信息,根据RFID
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<MaterInfo> GetMaterInfoByRfid(PdaRfidRequest request)
+        {
+            return _hJService.MaterInfoByRfid(request);
+        }
+        /// <summary>
+        /// 提交(组盘)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string PdaGroupStock(PdaRfidRequest request)
+        {
+            lock (lockerStockInfo)
+            {
+                return _hJService.PdaGroupStock(request);
+            }
+        }
+        /// <summary>
+        /// pda 下发任务
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string PdaInsterInTask(PdaRfidRequest request)
+        {
+            lock (lockerPdaTaskInfo)
+            {
+                return _hJService.PdaInsertTask(request);
+            }
+            
+        }
+        /// <summary>
+        /// 获取设备报警信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetEquipErrorInfo(ErrorInfoRequest request)
+        {
+            var it = RedisHelper.Get("equoneRGV3");
+            return it;
+        }
+        /// <summary>
+        /// 获取物料报警信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetMaterErrorInfo(ErrorInfoRequest request)
+        {
+            return "";
+        }
+        /// <summary>
+        /// 获取业务报警信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetBusinessErrorInfo(ErrorInfoRequest request)
+        {
+            return "";
+        }
+        /// <summary>
+        /// agv空轮搬运任务(一楼空轮初始化)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string AgvTaskInfo(AgvTaskInfoRequest request)
+        {
+            return _hJService.AgvCarryTaskInfo(request);
+        }
+        #endregion
+        /// <summary>
+        /// 取消/完成任务验证(只验证不做业务处理,开放wcs系统调用)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CancelTaskVerify(CancelTaskRequest request)
+        {
+            lock (lockerCancelOrComplet)
+            {
+                return _hJService.CancelTaskVerify(request);
+            }
+        }
+        /// <summary>
+        /// 执行任务(开放wcs调用,前端不调用)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CarryTaskInfo(CancelTaskRequest request)
+        {
+            lock (lockerCarryTask)
+            {
+                return _hJService.CarryTaskInfo(request);
+            }
+        }
+        /// <summary>du
+        /// 异常任务的库存处理
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes GetErrorTaskInfo()
+        {
+            var res = new SRes();
+            //获取货位锁是出库锁,当前时间差大于等于1 
+            var list = _hJService.GetOutStateList();
+            //根据条码捞取历史任务表中的数据
+            var barcode = list.Select(p => p.ContGrpBarCode).ToList();
+            var task = _hJService.GetTaskHistoryByCode(barcode);
+            if (task.Any())
+            {
+                foreach (var item in task)
+                {
+                    if (item.Type != TaskType.OutDepot)
+                    {
+                        continue;
+                    }
+                    if (item.Status != dto.TaskStatus.Finish)
+                    {
+                        continue;
+                    }
+                    var info = CompleteTask(new CompleteTaskRequest() { TaskNum = item.ID, OperationType = 2, WCSUpdateName = "wcs" });
+                    if (info.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
+                    {
+                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                        res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription();
+                        return res;
+                    }
+                }
+            }
+            return res;
+        }
+        #region 推送数据
+        /// <summary>
+        /// 数据推送接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public PushResponse PushErpDate(PushDate request)
+        {
+            var result = new PushResponse();
+            if (request.init == 1)
+            {
+                //手动推送
+                if (!request.CLBarCode.Any())
+                {
+                    result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                    result.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription();
+                    return result;
+                }
+                var list = _hJService.GetPushDatelistMannel(request);
+                if (!list.Any())
+                {
+                    result.ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode();
+                    result.ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription();
+                    return result;
+                }
+                if (list.Where(p => p.TypeCode == FackbeekType.InterfaceType_HJ_1F_StockIn.ToString()).ToList().Any())
+                {
+                    PushRequest push = new PushRequest();
+                    var onefloor = list.Where(p => p.TypeCode == FackbeekType.InterfaceType_HJ_1F_StockIn.ToString()).ToList();
+                    var info = _mapper.Map<List<ListInfo>>(onefloor);
+                    push.list = info;
+                    var resbody = JsonConvert.DeserializeObject<PushResponse>(WmsServiceExportApi(push));
+                    var matBarCode = info.Select(p => p.MatBarCode).ToList();
+                    if (resbody.success == true)
+                    {
+                        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                        {
+                            Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "手动推送成功", EditTime = DateTime.Now },
+                            WhereExpression = it => matBarCode.Contains(it.CLBarCode)
+                        });
+                    }
+                    else
+                    {
+                        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                        {
+                            Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "手动推送失败", EditTime = DateTime.Now },
+                            WhereExpression = it => matBarCode.Contains(it.CLBarCode)
+                        });
+                    }
+                }
+                //退料
+                //if (list.Where(p => p.TypeCode == FackbeekType.InterfaceType_HJ_2F_BackStockIn.ToString()).ToList().Any())
+                //{
+                //    WetLineBackInFeedBackRequest wetLineBack = new WetLineBackInFeedBackRequest();
+                //    var back = _mapper.Map<List<WetLineBackInFeedBackRequestItem>>(list);
+                //    back.ForEach(p =>
+                //    {
+                //        p.BusType = "1";
+                //        p.WareName = "合金库";
+                //    });
+                //    wetLineBack.ListInfo = back;
+                //    var resbody = JsonConvert.DeserializeObject<WetLineBackInFeedBackResponse>(WmsServiceExportApi(wetLineBack));
+                //    var rfid = back.Select(p => p.RFID).ToList();
+                //    if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                //    {
+                //        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                //        {
+                //            Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "手动推送" },
+                //            WhereExpression = it => rfid.Contains(it.RFIDBarCode)
+                //        });
+                //    }
+                //    else
+                //    {
+                //        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                //        {
+                //            Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1 },
+                //            WhereExpression = it => rfid.Contains(it.RFIDBarCode)
+                //        });
+                //    }
+                //}
+                ////余料
+                //if (list.Where(p => p.TypeCode == FackbeekType.InterfaceType_HJ_2F_LeftStockIn.ToString()).ToList().Any())
+                //{
+                //    WetLineBackInFeedBackRequest wetLineBack = new WetLineBackInFeedBackRequest();
+                //    var back = _mapper.Map<List<WetLineBackInFeedBackRequestItem>>(list);
+                //    back.ForEach(p =>
+                //    {
+                //        p.BusType = "2";
+                //        p.WareName = "合金库";
+                //    });
+                //    wetLineBack.ListInfo = back;
+                //    var resbody = JsonConvert.DeserializeObject<WetLineBackInFeedBackResponse>(WmsServiceExportApi(wetLineBack));
+                //    var rfid = back.Select(p => p.RFID).ToList();
+                //    if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                //    {
+                //        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                //        {
+                //            Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "手动推送" },
+                //            WhereExpression = it => rfid.Contains(it.RFIDBarCode)
+                //        });
+                //    }
+                //    else
+                //    {
+                //        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                //        {
+                //            Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1 },
+                //            WhereExpression = it => rfid.Contains(it.RFIDBarCode)
+                //        });
+                //    }
+                //}
+            }
+            else
+            {
+                //自动推送
+                request.Type = FackbeekType.InterfaceType_HJ_1F_StockIn.ToString();
+                var list = _hJService.GetPushDatelistAuto(request);
+                //if (!list.Any())
+                //{
+                //    return new PushResponse() { ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode(), ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription() };
+                //}
+
+                if (list.Where(p => p.TypeCode == FackbeekType.InterfaceType_HJ_1F_StockIn.ToString()).ToList().Any())
+                {
+                    var onefloor = list.Where(p => p.TypeCode == FackbeekType.InterfaceType_HJ_1F_StockIn.ToString()).ToList();
+                    PushRequest push = new PushRequest();
+                    var info = _mapper.Map<List<ListInfo>>(onefloor);
+                    push.list = info;
+                    var resbody = JsonConvert.DeserializeObject<PushResponse>(WmsServiceExportApi(push));
+                    var matBarCode = info.Select(p => p.MatBarCode).ToList();
+                    if (resbody.success == true || resbody.ResCode == 200)
+                    {
+                        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                        {
+                            Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                            WhereExpression = it => matBarCode.Contains(it.CLBarCode)
+                        });
+                    }
+                    else
+                    {
+                        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                        {
+                            Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1, EditTime = DateTime.Now },
+                            WhereExpression = it => matBarCode.Contains(it.CLBarCode)
+                        });
+                    }
+                }
+
+                //request.Type = FackbeekType.InterfaceType_HJ_2F_BackStockIn.ToString();
+                //var listback = _hJService.GetPushDatelistAuto(request);
+                ////退料
+                //if (listback.Where(p => p.TypeCode == FackbeekType.InterfaceType_HJ_2F_BackStockIn.ToString()).ToList().Any())
+                //{
+                //    WetLineBackInFeedBackRequest wetLineBack = new WetLineBackInFeedBackRequest();
+                //    var back = _mapper.Map<List<WetLineBackInFeedBackRequestItem>>(listback);
+                //    back.ForEach(p =>
+                //    {
+                //        p.BusType = "1";
+                //        p.WareName = "合金库";
+                //    });
+                //    wetLineBack.ListInfo = back;
+                //    var resbody = JsonConvert.DeserializeObject<WetLineBackInFeedBackResponse>(WmsServiceExportApi(wetLineBack));
+                //    var rfid = back.Select(p => p.RFID).ToList();
+                //    if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                //    {
+                //        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                //        {
+                //            Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送" },
+                //            WhereExpression = it => rfid.Contains(it.RFIDBarCode)
+                //        });
+                //    }
+                //    else
+                //    {
+                //        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                //        {
+                //            Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1 },
+                //            WhereExpression = it => rfid.Contains(it.RFIDBarCode)
+                //        });
+                //    }
+                //}
+                //////余料
+                //request.Type = FackbeekType.InterfaceType_HJ_2F_LeftStockIn.ToString();
+                //var listleft = _hJService.GetPushDatelistAuto(request);
+                //if (listleft.Where(p => p.TypeCode == FackbeekType.InterfaceType_HJ_2F_LeftStockIn.ToString()).ToList().Any())
+                //{
+                //    WetLineBackInFeedBackRequest wetLineBack = new WetLineBackInFeedBackRequest();
+                //    var back = _mapper.Map<List<WetLineBackInFeedBackRequestItem>>(listleft);
+                //    back.ForEach(p =>
+                //    {
+                //        p.BusType = "2";
+                //        p.WareName = "合金库";
+                //    });
+                //    wetLineBack.ListInfo = back;
+                //    var resbody = JsonConvert.DeserializeObject<WetLineBackInFeedBackResponse>(WmsServiceExportApi(wetLineBack));
+                //    var rfid = back.Select(p => p.RFID).ToList();
+                //    if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                //    {
+                //        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                //        {
+                //            Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送" },
+                //            WhereExpression = it => rfid.Contains(it.RFIDBarCode)
+                //        });
+                //    }
+                //    else
+                //    {
+                //        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                //        {
+                //            Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1 },
+                //            WhereExpression = it => rfid.Contains(it.RFIDBarCode)
+                //        });
+                //    }
+                //}
+            }
+                return result;
+        }
+        /// <summary>
+        /// 退料/余料反馈
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public PushResponse PushBackInfoData(PushDate request)
+        {
+            var result = new PushResponse();
+            if (request.init == 1)
+            {
+            }
+            else
+            {
+                request.Type = FackbeekType.InterfaceType_HJ_2F_BackStockIn.ToString();
+                var listback = _hJService.GetPushDatelistAuto(request);
+                //退料
+                if (listback.Where(p => p.TypeCode == FackbeekType.InterfaceType_HJ_2F_BackStockIn.ToString()).ToList().Any())
+                {
+                    //WetLineBackInFeedBackRequest wetLineBack = new WetLineBackInFeedBackRequest();
+                    //var back = _mapper.Map<List<WetLineBackInFeedBackRequestItem>>(listback);
+                    //back.ForEach(p =>
+                    //{
+                    //    p.BusType = "1";
+                    //    p.WareName = "合金库";
+                    //});
+                    //wetLineBack.ListInfo = back;
+                    
+                    var wetLineBack = _mapper.Map<WetLineBackInFeedBackRequestItem>(listback.First());
+                    wetLineBack.BusType = "1";
+                    var resbody = JsonConvert.DeserializeObject<WetLineBackInFeedBackResponse>(WmsServiceExportApi(wetLineBack));
+                    var rfid = wetLineBack.RFID;
+                    if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                    {
+                        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                        {
+                            Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送",EditTime = DateTime.Now },
+                            WhereExpression = it => rfid.Contains(it.RFIDBarCode)
+                        });
+                    }
+                    else
+                    {
+                        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                        {
+                            Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1, EditTime = DateTime.Now },
+                            WhereExpression = it => rfid.Contains(it.RFIDBarCode)
+                        });
+                    }
+                }
+                //余料
+                request.Type = FackbeekType.InterfaceType_HJ_2F_LeftStockIn.ToString();
+                var listleft = _hJService.GetPushDatelistAuto(request);
+                if (listleft.Where(p => p.TypeCode == FackbeekType.InterfaceType_HJ_2F_LeftStockIn.ToString()).ToList().Any())
+                {
+                    var wetLineLeft = _mapper.Map<WetLineBackInFeedBackRequestItem>(listleft.First());
+                    wetLineLeft.BusType = "2";
+                    var resbody = JsonConvert.DeserializeObject<WetLineBackInFeedBackResponse>(WmsServiceExportApi(wetLineLeft));
+                    var rfid = wetLineLeft.RFID;
+                    if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                    {
+                        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                        {
+                            Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                            WhereExpression = it => rfid.Contains(it.RFIDBarCode)
+                        });
+                    }
+                    else
+                    {
+                        _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                        {
+                            Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1, EditTime = DateTime.Now },
+                            WhereExpression = it => rfid.Contains(it.RFIDBarCode)
+                        });
+                    }
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 数据推送接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public PushResponse PushStockOutErpDate(PushDate request)
+        {
+            var result = new PushResponse();
+            //自动推送
+            request.Type = FackbeekType.InterfaceType_HJ_StockOut.ToString();
+            var liststockout = _hJService.GetPushDatelistAuto(request);
+
+            //出库
+            if (liststockout.Where(p => p.TypeCode == FackbeekType.InterfaceType_HJ_StockOut.ToString()).ToList().Any())
+            {
+                StockOutFeedBackRequest wetLineBack = new StockOutFeedBackRequest()
+                {
+                    MatBarCode = liststockout.First().CLBarCode,
+                    MoveLoc = liststockout.First().Memo,
+                    MoveTime = liststockout.First().AddTime.ToString("yyyy-MM-dd HH:mm:ss"),
+                    RFID = liststockout.First().RFIDBarCode
+                };
+                var resbody = JsonConvert.DeserializeObject<WetLineBackInFeedBackResponse>(WmsServiceExportApi(wetLineBack));
+                if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                {
+                    _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                    {
+                        Columns = it => new BillPushinfo { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送" },
+                        WhereExpression = it => wetLineBack.MatBarCode.Contains(it.CLBarCode)
+                    });
+                }
+                else
+                {
+                    _hJService.UpdatePushModelColumns(new sqlsugar.model.UpdateModelColumns<BillPushinfo>()
+                    {
+                        Columns = it => new BillPushinfo { PostResult = 2, PostQty = it.PostQty + 1 },
+                        WhereExpression = it => wetLineBack.MatBarCode.Contains(it.CLBarCode)
+                    });
+                }
+            }
+            return result;
+        }
+        /// <summary>
+        /// 监控遗留的库存数据
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes MonitorLeftStock(WebErrorRequest request)
+        {
+            return null;
+            //return _hJService.MonitorLeftStock(request);
+        }
+        #endregion
+
+        #region 异常处理
+        /// <summary>
+        /// 强制取消任务
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ForceCancelTask(WebErrorRequest request)
+        {
+            return _hJService.ForceCancelTask(request);
+        }
+        /// <summary>
+        /// 删除库存信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes DeleteStockInfo(DetailCodeRequest request)
+        {
+            return _hJService.DeleteStockInfo(request);
+        }
+        /// <summary>
+        /// 修改库存状态
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes UpdateStockState(DetailCodeRequestdto request)
+        {
+            return _hJService.UpdateStockState(request);
+        }
+        /// <summary>
+        /// 修改货位状态
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes UpdateCellState(DetailCodeRequestdto request)
+        {
+            return _hJService.UpdateCellState(request);
+        }
+        /// <summary>
+        /// 货位数据互换
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes DataSwapCell(DataSwapCellRequest request)
+        {
+            return _hJService.DataSwapCell(request);
+        }
+        /// <summary>
+        /// 补数据
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes DataBasePatch(DetailCodeRequest request)
+        {
+            return _hJService.DataBasePatch(request);
+        }
+        /// <summary>
+        /// 库存转移
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes TransStock(DataSwapCellRequest request)
+        {
+            return _hJService.TransStock(request);
+        }
+
+
+
+        /// <summary>
+        ///  AGV上报状态变更接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public AgvCallbackResponse AgvCallback(AgvCallbackRequest reqDto)
+        {
+            return _hJService.AgvCallback(reqDto);
+            //return ConcurrencyReqControl<SpoolMaterialInfoTransRequest, SRes>(lockerSpoolMaterialInfoTrans, "SpoolMaterialInfoTrans", reqDto.SpoolCode, reqDto, _fjService.SpoolMaterialInfoTrans);
+        }
+
+
+        /// <summary>
+        /// 流水数据归档
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes FlowDataMoveJob(PushDate request)
+        {
+            lock (lockerFlowDataMoveJob)
+            {
+                return _hJService.FlowDataMoveJob(request);
+            }
+        }
+        #endregion
+    }
+}

+ 1403 - 0
wms.api/Controllers/PtController.cs

@@ -0,0 +1,1403 @@
+using AutoMapper;
+using MathNet.Numerics.Distributions;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json;
+using Org.BouncyCastle.Crypto;
+using Quartz.Util;
+using System.Text.RegularExpressions;
+using wms.api.Job;
+using wms.dto;
+using wms.dto.request;
+using wms.dto.request.cp;
+using wms.dto.request.hj;
+using wms.dto.request.hj.dto;
+using wms.dto.request.pt;
+using wms.dto.request.pt.dto;
+using wms.dto.request.share;
+using wms.dto.response;
+using wms.dto.response.pt;
+using wms.service.IService;
+using wms.service.Service;
+using wms.sqlsugar;
+using wms.sqlsugar.model.pt;
+using wms.util.Ext;
+using wms.util.Http;
+
+namespace wms.api.Controllers
+{
+    /// <summary>
+    /// 盘条库控制器
+    /// </summary>
+    [Route("api/[controller]/[action]")]
+    [ApiController]
+    public class PtController : BaseController
+    {
+        private readonly IPTService _ptService;
+        private readonly ILogger<PtController> _logger;
+        private readonly IMapper _mapper;
+        static object lockerPurchaseBillTrans = new object();
+        static object lockerErpUnlockStock = new object();
+        static object lockerProductionStockOut = new object();
+        static object lockerProductionFeedBack = new object();
+        static object lockerStockChange = new object();
+        static object lockerProductionBack = new object();
+        static object lockerPtPurchTaskIn = new object();
+        static object lockerPtApplyStockInLoc = new object();
+        static object lockerPtCompleteTask = new object();
+        static object lockerPtSrmPickOutCompleted = new object();
+        static object lockerSyncMaterInfoList = new object();
+        static object lockerPtWcsProductionOutTask = new object();
+        static object lockerGetPtTunnelList = new object();
+        static object lockerManualTaskOut = new object();
+        static object lockerPinkuInfoUpdate = new object();
+        static object lockerPinkucarryInTask = new object();
+        static object lockerPinkucarryOutTask = new object();
+        static object lockerPtCancelOrComplet = new object();
+        static object lockerPtCarryTask = new object();
+        static object lockerUpdatePuchState = new object();
+        static object lockerForceCancelTask = new object();
+        static object lockerDeleteStockInfo = new object();
+        static object lockerUpdateStockState = new object();
+        static object lockerUpdateCellState = new object();
+        static object lockerDataSwapCell = new object();
+        static object lockerDataBasePatch = new object();
+        static object lockerDataMoveCell = new object();
+        static object lockerProductRequisition = new object();
+        static object lockerPdaInsterInTask = new object();
+        static object lockerHandErrTask = new object();
+        static object lockerJKArriveInfo = new object();
+        static object lockerJKTransPTInfo = new object();
+        static object lockerPurchaseBillTransCheck = new object();
+        static object lockerFlowDataMoveJob = new object();
+
+
+        Repository<ptSysJob> _sysJobrepository => new Repository<ptSysJob>();
+        public PtController(IPTService ptService, ILogger<PtController> logger, IMapper mapper) : base(ptService)
+        {
+            _ptService = ptService;
+            _logger = logger;
+            _mapper = mapper;
+        }
+
+        /// <summary>
+        /// 同步物料基础信息
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string SyncMaterInfo(SyncMaterInfoRequest reqBody)
+        {
+            var result = new SRes();
+            //_logger.LogInformation("请求参数:{@reqBody},{aa}", reqBody,1);
+            PTSyncMaterInfoResponse resbody = JsonConvert.DeserializeObject<PTSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+            if (reqBody.SyncType == 1)
+            {
+                reqBody.PageIndex = 1;
+                while (resbody.ResData.Any())
+                {
+                    _ptService.SyncMaterInfo(resbody.ResData);
+                    reqBody.PageIndex++;
+                    resbody = JsonConvert.DeserializeObject<PTSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+                }
+            }
+            else if (reqBody.SyncType == 2)
+            {
+                //拿到增量
+                var increconf = _ptService.GetSysConfigByCode(Const.MESMaterialInitIncrement);
+                if (increconf != null)
+                {
+                    reqBody.StartTime = DateTime.Parse(increconf.SContent);
+                    //reqBody.Count = int.Parse(increconf.Remark);
+                    resbody = JsonConvert.DeserializeObject<PTSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+                    if (resbody.ResData.Any())
+                    {
+                        if (_ptService.SyncMaterInfo(resbody.ResData))
+                        {
+                            var lastdata = resbody.ResData.OrderBy(p => p.UpdatedTime).Last();
+                            _ptService.UpdateSysConfigModelColumns(new sqlsugar.model.UpdateModelColumns<ptSysConfig>()
+                            {
+                                Columns = it => new ptSysConfig { SContent = lastdata.UpdatedTime.ToString("yyyy-MM-dd HH:mm:ss.fff") },
+                                WhereExpression = it => it.Code == Const.MESMaterialInitIncrement
+                            });
+                        }
+                    }
+                    else
+                    {
+                        result.ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode();
+                        result.ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription();
+                    }
+                }
+                else
+                {
+                    result.ResCode = ResponseStatusCodeEnum.AccountError.GetHashCode();
+                    result.ResMsg = "没有配置信息" + Const.MESMaterialInitIncrement;
+                }
+            }
+            else
+            {
+                if (!string.IsNullOrEmpty(reqBody.MatCode))
+                {
+                    resbody = JsonConvert.DeserializeObject<PTSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+                    if (resbody.ResData.Any())
+                    {
+                        if (_ptService.SyncMaterInfo(resbody.ResData))
+                        {
+
+                        }
+                    }
+                }
+            }
+
+
+            return result.ToCamelCaseString();
+        }
+        /// <summary>
+        /// 采购到货单/采购退货单/到货重挂清单接口(二楼入库默认传2999)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PurchaseBillTrans(PurchaseBillTransReqest reqDto)
+        {
+          
+            reqDto.ListInfo = reqDto.ListInfo.Where(p => p.RFID.StartsWith("PT")).ToList();
+            var res = ConcurrencyReqControl<PurchaseBillTransReqest, SRes>(lockerPurchaseBillTrans, "PurchaseBillTrans", reqDto.BillCode, reqDto, _ptService.PurchaseBillTrans);
+            if (res.ResCode != 200)
+            {
+                return res;
+            }
+            if (string.IsNullOrEmpty(reqDto.Equip))
+            {
+                res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                res.ResMsg = "请扫描地码,地码没有传值";
+                return res;
+            }
+            if (!string.IsNullOrEmpty(reqDto.Equip) && res.ResCode == 200)
+            {
+                if (reqDto.ListInfo.Count > 1)
+                {
+                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                    res.ResMsg = "只能绑定一个盘条信息,当前接口传递多条数据F";
+                    return res;
+                }
+                res = PdaPurchaseTask(new PtPurchaseTaskReqest() { Equip = reqDto.Equip, ConBarCode = reqDto.ListInfo.First().RFID, MatBarCode = reqDto.ListInfo.First().MatBarCode });
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 采购到货单验证
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PurchaseBillTransCheck(PurchaseBillTransReqestCheck reqDto)
+        {
+            lock (lockerPurchaseBillTransCheck)
+            {
+                return _ptService.InsertBillInvinitCheck(reqDto);
+            }
+        }
+
+        /// <summary>
+        /// 盘条RFID验证
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PurchaseRFIDCheck(PurchaseRFIDCheckReqest reqDto)
+        {
+            lock (lockerPurchaseBillTransCheck)
+            {
+                return _ptService.PurchaseRFIDCheck(reqDto); ;
+            }
+        }
+        /// <summary>
+        /// 盘条主数据接收
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PtSyncMaterInfoList(PtSyncMaterInfoListRequest reqDto)
+        {
+            var res = new SRes();
+            return ConcurrencyReqControl<PtSyncMaterInfoListRequest, SRes>(lockerSyncMaterInfoList, "PtSyncMaterInfoList", "物料主数据推送", reqDto, _ptService.GetSyncMaterInfo);
+        }
+        /// <summary>
+        /// 采购到货单入库反馈/采购退货出库反馈/异常出库重挂反馈接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PurchaseBillTransFeedBack(PtAutoPurchData request)
+        {
+            var res = new SRes();
+            //自动推送
+            if (request.Type == "1")
+            {
+                var list = _ptService.GetBillFeedbackList(PtFackbeekType.InterfaceType_PT_PurchaseStockIn.ToString());
+                if (!list.Any())
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "没有取到符合条件的数据";
+                }
+                //采购入库单
+                if (list.Where(p => p.TypeCode == PtFackbeekType.InterfaceType_PT_PurchaseStockIn.ToString()).ToList().Any())
+                {
+                    var purch = list.Where(p => p.TypeCode == PtFackbeekType.InterfaceType_PT_PurchaseStockIn.ToString()).ToList();
+                    PurchaseBillTransFeedBackRequest purchaseBill = new PurchaseBillTransFeedBackRequest();
+                    var dtolist = _mapper.Map<List<PurchaseBillTransFeedBackRequestItem>>(purch);
+                    var purchs = purch.First();
+                    purchaseBill.ListInfo = dtolist;
+                    purchaseBill.BillCode = purchs.DocsNo;
+                    purchaseBill.BillType = purchs.TypeCode;
+                    purchaseBill.ReqId = purchs.ReqNo;
+                    var resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(purchaseBill));
+                    var ids = purch.Select(p => p.Id).ToList();
+                    if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                    {
+                        _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<ptBillPushinfo>()
+                        {
+                            Columns = it => new ptBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                            WhereExpression = it => ids.Contains(it.Id)
+                        });
+                    }
+                    else
+                    {
+                        _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<ptBillPushinfo>()
+                        {
+                            Columns = it => new ptBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                            WhereExpression = it => ids.Contains(it.Id)
+                        });
+                    }
+                }
+                var listAnewStockIn = _ptService.GetBillFeedbackList(PtFackbeekType.InterfaceType_PT_AnewStockIn.ToString());
+                //重挂
+                if (listAnewStockIn.Where(p => p.TypeCode == PtFackbeekType.InterfaceType_PT_AnewStockIn.ToString()).ToList().Any())
+                {
+                    var purch = listAnewStockIn.Where(p => p.TypeCode == PtFackbeekType.InterfaceType_PT_AnewStockIn.ToString()).ToList();
+                    PurchaseBillTransFeedBackRequest purchaseBill = new PurchaseBillTransFeedBackRequest();
+                    var dtolist = _mapper.Map<List<PurchaseBillTransFeedBackRequestItem>>(purch);
+                    var purchs = purch.First();
+                    purchaseBill.ListInfo = dtolist;
+                    purchaseBill.BillCode = purchs.DocsNo;
+                    purchaseBill.BillType = purchs.TypeCode;
+                    purchaseBill.ReqId = purchs.ReqNo;
+                    var resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(purchaseBill));
+                    var ids = purch.Select(p => p.Id).ToList();
+                    if (resbody.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
+                    {
+                        _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<ptBillPushinfo>()
+                        {
+                            Columns = it => new ptBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                            WhereExpression = it => ids.Contains(it.Id)
+                        });
+                    }
+                    else
+                    {
+                        _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<ptBillPushinfo>()
+                        {
+                            Columns = it => new ptBillPushinfo() { PostResult = 2, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                            WhereExpression = it => ids.Contains(it.Id)
+                        });
+                    }
+                }
+            }
+
+            return res;
+        }
+        /// <summary>
+        /// 放行单传输接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public ErpUnlockStockResponse ErpUnlockStock(ErpUnlockStockRequest reqDto)
+        {
+            return ConcurrencyReqControl<ErpUnlockStockRequest, ErpUnlockStockResponse>(lockerErpUnlockStock, "PtErpUnlockStock", reqDto.BillCode, reqDto, _ptService.ErpUnlockStock);
+        }
+        /// <summary>
+        /// 生产领料单传输接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ProductionStockOut(ProductionStockOutRequest reqDto)
+        {
+            return ConcurrencyReqControl<ProductionStockOutRequest, SRes>(lockerProductionStockOut, "PtProductionStockOut", reqDto.BillCode, reqDto, _ptService.ProductionStockOut);
+        }
+        /// <summary>
+        /// 自动叫料
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        //[HttpPost]
+        //public SRes WcsProductionOutRequest(WcsProductionOutRequest request)
+        //{
+        //    return ConcurrencyReqControl<WcsProductionOutRequest, SRes>(lockerPtWcsProductionOutTask, "PtWcsProductionOutRequest" , "自动叫料", request, _ptService.WcsProductionOutRequest);
+        //}
+        /// <summary>
+        /// 自动叫料新
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes WcsProductionOutRequestNew(WcsProductionOutRequest request)
+        {
+            return ConcurrencyReqControl<WcsProductionOutRequest, SRes>(lockerPtWcsProductionOutTask, "PtWcsProductionOutRequest", "自动叫料", request, _ptService.WcsProductionOutRequest2);
+        }
+
+
+
+        /// <summary>
+        /// 生产领料/退料/改判反馈接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ProductionFeedBack(PtAutoPurchData request)
+        {
+            var res = new SRes();
+            //自动推送
+            if (request.Type == "1")
+            {
+                var list = _ptService.GetProductionFeedBack();
+                if (!list.Any())
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "没有取到符合条件的数据";
+                    return res;
+                }
+                //生产领料反馈
+                if (list.Where(p => p.TypeCode == PtFackbeekType.PickMat.ToString()).ToList().Any())
+                {
+                    var purch = list.Where(p => p.TypeCode == PtFackbeekType.PickMat.ToString()).ToList();
+                    var purchs = purch.First();
+                    purch = purch.Where(p => p.DocsNo == purchs.DocsNo).ToList();
+                    ProductionFeedBackRequest purchaseBill = new ProductionFeedBackRequest();
+                    var dtolist = _mapper.Map<List<ProductionFeedBackRequestItem>>(purch);
+                    purchaseBill.ListInfo = dtolist;
+                    purchaseBill.BillCode = purchs.DocsNo;
+                    purchaseBill.BillType = purchs.TypeCode;
+                    WmsServiceExportMq(purchaseBill);
+                    var ids = purch.Select(p => p.Id).ToList();
+                    _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<ptBillPushinfo>()
+                    {
+                        Columns = it => new ptBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+              
+                //退料
+                if (true)
+                {
+
+                }
+                //改判
+                if (true)
+                {
+
+                }
+            }
+            return res;
+        }
+
+        /// <summary>
+        /// 手动出库反馈接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ProductionFeedBackManual(PtAutoPurchData request)
+        {
+            var res = new SRes();
+            //自动推送
+            if (request.Type == "1")
+            {
+                var list = _ptService.GetProductionFeedBack();
+                if (!list.Any())
+                {
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "没有取到符合条件的数据";
+                    return res;
+                }
+                if (list.Where(p => p.TypeCode == "Manual").ToList().Any())
+                {
+                    var purch = list.Where(p => p.TypeCode == "Manual").ToList();
+                    var purchs = purch.First();
+                    purch = purch.Where(p => p.DocsNo == purchs.DocsNo).ToList();
+                    ProductionFeedBackRequest purchaseBill = new ProductionFeedBackRequest();
+                    var dtolist = _mapper.Map<List<ProductionFeedBackRequestItem>>(purch);
+                    purchaseBill.ListInfo = dtolist;
+                    purchaseBill.BillCode = purchs.DocsNo;
+                    purchaseBill.BillType = purchs.TypeCode;
+                    WmsServiceExportApi(purchaseBill);
+                    var ids = purch.Select(p => p.Id).ToList();
+                    _ptService.UpdatePuchinfoModelColumns(new sqlsugar.model.UpdateModelColumns<ptBillPushinfo>()
+                    {
+                        Columns = it => new ptBillPushinfo() { PostResult = 1, PostQty = it.PostQty + 1, ResDesc = "自动推送", EditTime = DateTime.Now },
+                        WhereExpression = it => ids.Contains(it.Id)
+                    });
+                }
+
+              
+            }
+            return res;
+        }
+        /// <summary>
+        /// 炉号用完反馈给mes
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes BoilerNoFeedBack(PtAutoPurchData request)
+        {
+            var res = new SRes();
+            var list = _ptService.GetSysConfigListByExpression(p=>p.Default1 == "ProductPinKu" && p.Default6 == "0" && p.Default5 == p.Default7);
+            if (!list.Any())
+            {
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = "没有取到符合条件的数据";
+                return res;
+            }
+            foreach (var item in list)
+            {
+                BoilerNoRequest boilerNoRequest = new BoilerNoRequest();
+                boilerNoRequest.BoilerNo = item.Default5;
+
+                _logger.LogInformation("推送mes炉号用完信号请求:" + JsonConvert.SerializeObject(boilerNoRequest));
+                var resbody = JsonConvert.DeserializeObject<PushResponse1>(WmsServiceExportApi(boilerNoRequest));
+                _logger.LogInformation("推送mes炉号用完信号返回:" + JsonConvert.SerializeObject(resbody));
+                if (resbody.Success == true || resbody.Code == "200")
+                {
+                    _ptService.UpdateSysConfigModelColumns(new sqlsugar.model.UpdateModelColumns<ptSysConfig>()
+                    {
+                        Columns = it => new ptSysConfig() { Default6 = "1", EditTime = DateTime.Now },
+                        WhereExpression = it => it.Id == item.Id
+                    });
+                }
+            }
+            return res;
+        }
+        /// <summary>
+        /// 库存改判
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<StockChangeResItem> StockChange(PtStockChangeRequest reqDto)
+        {
+            lock (lockerStockChange)
+            {
+               return _ptService.StockChange(reqDto);
+            }
+            //return ConcurrencyReqControl<PtStockChangeRequest, SRes<StockChangeResItem>>(lockerStockChange, "PtStockChange", "PtStockChange", reqDto, _ptService.StockChange);
+        }
+        /// <summary>
+        /// 生产退料单接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ProductionBack(ProductionBackRequest reqDto)
+        {
+            return ConcurrencyReqControl<ProductionBackRequest, SRes>(lockerProductionBack, "PtProductionBack", reqDto.BillCode, reqDto, _ptService.ProductionBack);
+        }
+        [HttpPost]
+        public SRes WareCellInit(int row, int col, int deot, int rowcount, int tun)
+        {
+            return _ptService.WareCellInit(row, col, deot, rowcount, tun);
+        }
+        /// <summary>
+        /// 实时库存查询接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public PTGetCurStockListResponse GetPtCurStockList(PtGetCurStockListRequest reqDto)
+        {
+            return _ptService.GetCurStockList(reqDto);
+        }
+    
+        #region 盘条PDA功能
+        /// <summary>
+        /// 盘条解绑
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<int> Unbounding(PtUnboundRequest request)
+        {
+            return _ptService.Unbounding(request);
+        }
+        /// <summary>
+        /// pda单据查询
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetDocumentsAll(PtDocumentsRequest request)
+        {
+            return _ptService.GetPageDocumentsList(request).ToCamelCaseString();
+        }
+        /// <summary>
+        /// pda单据明细查询(传单号)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetDocumentDetails(PtDocumentsRequest request)
+        {
+            return _ptService.GetDocumentDetailListByDocsNo(request).ToCamelCaseString();
+        }
+        /// <summary>
+        /// pda指定出库确定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string PdaManualTask(PtManualTaskRequest request)
+        {
+            request.BusType = TaskBusType.TaskBusType_HJ_PdaManualOut.GetDescription();
+            return _ptService.ManualTask(request);
+        }
+        /// <summary>
+        /// pda质检领料出库确定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string PdaQualityTask(PtManualTaskRequest request)
+        {
+            request.BusType = TaskBusType.TaskBusType_HJ_QualityOut.GetDescription();
+            return _ptService.ManualTask(request);
+        }
+        /// <summary>
+        /// pda重挂出库确定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string PdaInactionStockTask(PtManualTaskRequest request)
+        {
+            request.BusType = TaskBusType.TaskBusType_HJ_AnewOut.GetDescription();
+            return _ptService.ManualTask(request);
+        }
+        /// <summary>
+        /// 获取设备报警信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetEquipErrorInfo(PtErrorInfoRequest request)
+        {
+            return "";
+        }
+        /// <summary>
+        /// 获取物料报警信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetMaterErrorInfo(PtErrorInfoRequest request)
+        {
+            return "";
+        }
+        /// <summary>
+        /// 获取业务报警信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetBusinessErrorInfo(PtErrorInfoRequest request)
+        {
+            return "";
+        }
+        /// <summary>
+        /// 手动入库
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PdaInsterInTask(PtGroupInTaskRequest request)
+        {
+            lock (lockerPdaInsterInTask)
+            {
+                request.Equip = Regex.Replace(request.Equip.Trim(), @"[\r\n]", "");
+                request.Rfid = Regex.Replace(request.Rfid.Trim(), @"[\r\n]", "");
+                return _ptService.PdaInsterInTask(request);
+            }
+        }
+        /// <summary>
+        /// PDA 采购入库
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PdaPurchaseTask(PtPurchaseTaskReqest request)
+        {
+            if (string.IsNullOrWhiteSpace(request.ConBarCode))
+            {
+                return new SRes() { 
+                 ResCode = 0,
+                 ResMsg = "条码不能传空值"
+                };
+            }
+            lock (lockerPtPurchTaskIn)
+            {
+                request.Equip = Regex.Replace(request.Equip.Trim(), @"[\r\n]", "");
+                return _ptService.PtPurchaseTask(request);
+            }
+        }
+        /// <summary>
+        /// PDA 生产领料确定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PdaProductRequisition(PtUnboundRequest request)
+        {
+            lock (lockerProductRequisition)
+            {
+                return _ptService.PdaProductRequisition(request);
+            }
+        }
+
+        /// <summary>
+        /// PDA 生产领料空架子发回
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PdaProductRequisition2(PtUnboundRequest request)
+        {
+            lock (lockerProductRequisition)
+            {
+                return _ptService.PdaProductRequisition2(request);
+            }
+        }
+        /// <summary>
+        /// 监控领料出扫过码的架子搬走
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes MoniterEmptCon(PtUnboundRequest request)
+        {
+            lock (lockerProductRequisition)
+            {
+                return _ptService.MoniterEmptCon(request);
+            }
+        }
+
+        #endregion
+        /// <summary>
+        /// 手动出库确定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string ManualTask(PtManualTaskRequest request)
+        {
+            lock (lockerManualTaskOut)
+            {
+                request.BusType = TaskBusType.TaskBusType_HJ_ManualOut.GetDescription();
+                return _ptService.ManualTask(request);
+            }
+        }
+        #region WCS调用
+        /// <summary>
+        /// 获取巷道
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<string> GetTunnelPriorityList(GetTunnelPriorityListRequest reqEntity)
+        {
+            lock (lockerGetPtTunnelList)
+            {
+                return _ptService.GetPtTunnelPriorityList(reqEntity);
+            } 
+        }
+        /// <summary>
+        /// 分配货位
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<PtApplyStockInLocResponse> ApplyStockInLoc(PtApplyStockInLocRequest reqEntity)
+        {
+            return ConcurrencyReqControl<PtApplyStockInLocRequest, SRes<PtApplyStockInLocResponse>>(lockerPtApplyStockInLoc, "PtApplyStockInLoc", "分配货位" + reqEntity.PickUpEquipmentNo, reqEntity, _ptService.PtApplyStockInLoc);
+        }
+        /// <summary>
+        /// 完成任务
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<int> CompleteTask(CompleteTaskRequest reqDto)
+        {
+            lock (lockerPtCompleteTask)
+            {
+                var res = new SRes<int>();
+                res = _ptService.PtCompleteTask(reqDto);
+                //如果是二楼入库,调用下机科的接口
+                if (res.Memo3 == "1")
+                {
+                    //try
+                    //{
+                    //    var tsk = _ptService.GetTask(reqDto.TaskNum);
+                    //    var req = new JKPalletizerRequest()
+                    //    {
+                    //        wmsNo = "YL01",
+                    //        taskId = tsk.ResData.Id.ToString(),
+                    //        rfId = tsk.ResData.BarCode,
+                    //        rowNo = tsk.ResData.Tunnel,
+                    //        palletizerNo = Math.Ceiling(decimal.Parse(tsk.ResData.Tunnel) / 2).ToString()
+                    //    };
+                    //    _logger.LogInformation("调用机科接口请求:" + JsonConvert.SerializeObject(req));
+                    //    var apiurl = wms.util.AppSettings.GetConfig("JKPushUrl");
+                    //    var strpost = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(req), 30000, "UTF-8", "application/json");
+                    //    _logger.LogInformation("调用机科接口返回:" + strpost);
+
+                    //}
+                    //catch (Exception ex)
+                    //{
+                    //    _logger.LogInformation("调用机科接口异常:" + ex.ToString());
+                    //}
+                }
+                return res;
+            }
+        }
+
+        /// <summary>
+        /// 堆垛机取货完成通知机科
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<int> NoticeToJK(CompleteTaskRequest reqDto)
+        {
+            lock (lockerPtCompleteTask)
+            {
+                var res = new SRes<int>();
+                try
+                {
+             
+                    var tsk = _ptService.GetCurTask(reqDto.TaskNum);
+                    if (tsk.ResData == null)
+                    {
+                        tsk.ResData = _mapper.Map<ptWCS_TaskInfo>(_ptService.GetTask(reqDto.TaskNum).ResData);
+                    }
+                    if (tsk.ResData.Type != TaskType.EnterDepot || tsk.ResData.AddrFrom != "2999")
+                    {
+                        res.ResMsg = reqDto.TaskNum + "不符合回调任务";
+                        return res;
+                    }
+                    var tasknum = RedisHelper.Get("Pt:NoticeToJK:Tun" + tsk.ResData.Tunnel);
+                    if (reqDto.TaskNum.ToString() == tasknum  && reqDto.OperationType == 1)
+                    {
+                        res.ResMsg = tasknum + "重复请求";
+                        return res;
+                    }
+
+                    var req = new JKPalletizerRequest()
+                    {
+                        wmsNo = "YL01",
+                        taskId = tsk.ResData.ID.ToString(),
+                        rfId = tsk.ResData.BarCode,
+                        rowNo = tsk.ResData.Tunnel,
+                        palletizerNo = Math.Ceiling(decimal.Parse(tsk.ResData.Tunnel) / 2).ToString()
+                    };
+                    _logger.LogInformation("调用机科接口请求:" + JsonConvert.SerializeObject(req));
+                    var apiurl = wms.util.AppSettings.GetConfig("JKPushUrl");
+                    var strpost = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(req), 30000, "UTF-8", "application/json");
+                    _logger.LogInformation("调用机科接口返回:" + strpost);
+                    RedisHelper.Set("Pt:NoticeToJK:Tun" + tsk.ResData.Tunnel, reqDto.TaskNum);
+                }
+                catch (Exception ex)
+                {
+                    _logger.LogInformation("调用机科接口异常:" + ex.ToString());
+                }
+                return res;
+            }
+        }
+
+
+        /// <summary>
+        /// 堆垛机出库放货完成
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes<int> SrmPickOutCompleted(PtSrmPickOutCompletedRequest reqDto)
+        {
+            lock (lockerPtSrmPickOutCompleted)
+            {
+                return _ptService.PtSrmPickOutCompleted(reqDto);
+            }
+        }
+        /// <summary>
+        /// 盘条库 取消/完成任务验证(只验证不做业务处理,开放wcs系统调用)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CancelTaskVerify(CancelTaskRequest request)
+        {
+            lock (lockerPtCancelOrComplet)
+            {
+                return _ptService.PtCancelTaskVerify(request);
+            }
+        }
+        /// <summary>
+        /// 盘条库 执行任务(开放wcs调用,前端不调用)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes CarryTaskInfo(CancelTaskRequest request)
+        {
+            lock (lockerPtCarryTask)
+            {
+                return _ptService.PtCarryTaskInfo(request);
+            }
+        }
+        /// <summary>
+        /// 移库确定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes MoveTaskInfo(MoveTaskRequest request)
+        {
+            lock (lockerPtCarryTask)
+            {
+                return _ptService.MoveTaskInfo(request);
+            }
+        }
+
+        /// <summary>
+        /// 架子管理接口,wcs上报agv取货完成信号,清除起始位置
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PinkuInfoManagement(PtSrmPickOutCompletedRequest request)
+        {
+            return ConcurrencyReqControl<PtSrmPickOutCompletedRequest, SRes>(lockerPinkuInfoUpdate, "PinkuInfoManagement", request.TaskNum.ToString(), request, _ptService.PinkuInfoManagement);
+        }
+        /// <summary>
+        /// 堆垛机入库站台架子搬运任务请求(入库站台到22支架)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PinKuCarryInTask(PinkucarryTaskRequest request)
+        {
+            lock (lockerProductRequisition)
+            {
+                return ConcurrencyReqControl<PinkucarryTaskRequest, SRes>(lockerPinkucarryInTask, "PinKuCarryInTask", request.Equip, request, _ptService.PinKuCarryInTask);
+            }
+        }
+        /// <summary>
+        /// 堆垛机出库站台架子搬运任务请求(交接区支架到出库口)
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes PinKuCarryOutTask(PinkucarryTaskRequest request)
+        {
+            return ConcurrencyReqControl<PinkucarryTaskRequest, SRes>(lockerPinkucarryOutTask, "PinKuCarryOutTask", request.Equip, request, _ptService.PinKuCarryOutTask);
+        }
+        #endregion
+        /// <summary>
+        /// 生产交接区6个点位的物料编码接收绑定
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ProductMaterInfo(ProductMaterInfoRequest request)
+        {
+            return ConcurrencyReqControl<ProductMaterInfoRequest, SRes>(lockerPinkucarryOutTask, "ProductMaterInfo", request.Equip, request, _ptService.ProductMaterInfo);
+        }
+        #region 异常处理功能
+        /// <summary>
+        /// 强制取消任务
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ForceCancelTask(ErrorTaskRequest request)
+        {
+            lock (lockerForceCancelTask)
+            {
+                return _ptService.ForceCancelTask(request);
+            }
+        }
+        /// <summary>
+        /// 删除库存信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes DeleteStockInfo(DetailCodeStrRequest request)
+        {
+            lock (lockerDeleteStockInfo)
+            {
+                return _ptService.DeleteStockInfo(request);
+            }
+        }
+
+        /// <summary>
+        /// 删除条码信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes DeleteBarCodeInfo(DetailCodeStrRequest request)
+        {
+            lock (lockerDeleteStockInfo)
+            {
+                return _ptService.DeleteBarCodeInfo(request);
+            }
+        }
+        /// <summary>
+        /// 修改库存状态
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes UpdateStockState(DetailCodeStr1Requestdto request)
+        {
+            lock (lockerUpdateStockState)
+            {
+                return _ptService.UpdateStockState(request);
+            }
+        }
+        /// <summary>
+        /// 修改货位状态
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes UpdateCellState(DetailCodeStr1Requestdto request)
+        {
+            lock (lockerUpdateCellState)
+            {
+                return _ptService.UpdateCellState(request);
+            }
+        }
+        /// <summary>
+        /// 货位数据互换
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes DataSwapCell(DataSwapCellStrRequest request)
+        {
+            lock (lockerDataSwapCell)
+            {
+                return _ptService.DataSwapCell(request);
+            }
+        }
+        /// <summary>
+        /// 补数据
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes DataBasePatch(DetailCodeStrRequest request)
+        {
+            lock (lockerDataBasePatch)
+            {
+                return _ptService.DataBasePatch(request);
+            }
+        }
+        /// <summary>
+        /// 货位数据转移
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes DataMoveCell(DataSwapCellStrRequest request)
+        {
+            lock (lockerDataMoveCell)
+            {
+                return _ptService.DataMoveCell(request);
+            }
+        }
+        #endregion
+
+        #region 定时器
+        /// <summary>
+        /// 启用job
+        /// </summary>
+        /// <param name="req"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string StartJob(AutoDetailRequest req)
+        {
+            var res = new SRes();
+            var sysjob = _ptService.GetJobEntityByid(req.Id);
+            if (sysjob == null)
+            {
+                res.ResCode = 0;
+                res.ResMsg = "没有找到对应的定时任务";
+                return res.ToCamelCaseString();
+            }
+            JobScheduler.Start(sysjob.Code, Type.GetType("wms.api.Job.PostJob"), sysjob.CronExpression);
+            return res.ToCamelCaseString();
+        }
+        /// <summary>
+        /// 执行job
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string ExecuteJob(DetailCodeStrRequest reqEntity)
+        {
+            var res = new SRes();
+            if (string.IsNullOrEmpty(reqEntity.Code))
+            {
+                res.ResCode = 0;
+                res.ResMsg = "参数错误";
+                return res.ToCamelCaseString();
+            }
+            var jobEntity = _ptService.GetJobEntityByCode(reqEntity.Code);
+            if (jobEntity == null)
+            {
+                res.ResCode = 0;
+                res.ResMsg = "没有找到该编码";
+                return res.ToCamelCaseString();
+            }
+            var jobapilist = _ptService.GetJobapilist(jobEntity.Id);
+            if (jobapilist.Any())
+            {
+                foreach (var item in jobapilist)
+                {
+                    Task.Run(() => { HttpUtil.PostRequest(item.ApiUrl, item.RequestBody); });
+                }
+            }
+            return res.ToCamelCaseString();
+        }
+        #endregion
+
+        [HttpPost]
+        public SRes UpdatePurchState(UpdatePurchStateRequest request)
+        {
+
+            lock (lockerUpdatePuchState)
+            {
+                return _ptService.UpdatePurchState(request);
+            }
+        }
+
+        /// <summary>
+        /// 监控遗留的库存数据
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes MonitorLeftStock(WebErrorRequest request)
+        {
+            return _ptService.MonitorLeftStock(request);
+        }
+
+        /// <summary>
+        /// 分页Job列表
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public List<dto.response.hj.SysJobDto> GetSysJobList(GetSysJobListRequest reqEntity)
+        {
+            var list = _sysJobrepository.GetList();
+            var listdto = _mapper.Map<List<dto.response.hj.SysJobDto>>(list);
+            if (listdto != null && listdto.Any())
+            {
+                for (int i = 0; i < list.Count; i++)
+                {
+                    listdto[i].JobExecuteStatus = GetExecuteStatus(new DetailCodeRequest() { Code = listdto[i].Code });
+                }
+                return listdto;
+            }
+            return new List<dto.response.hj.SysJobDto>();
+        }
+        /// <summary>
+        /// 获取执行状态
+        /// </summary>
+        /// <param name="reqEntity"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetExecuteStatus(DetailCodeRequest reqEntity)
+        {
+            var jobInfo = _sysJobrepository.GetFirst(p => p.Code == reqEntity.Code);
+            var jobs = JobScheduler.GetJobList(Const.JobGroupName).Result;
+            if (jobs != null)
+            {
+                var temp = jobs.Where(p => p.JobName == jobInfo.Code);
+                if (temp.Any())
+                {
+                    return temp.First().JobStatus;
+                }
+                else
+                {
+                    return "Stop";
+                }
+            }
+            else
+            {
+                return "Stop";
+            }
+        }
+        [HttpPost]
+        public SRes HandErrTask(DetailListRequest2Str request)
+        {
+            lock (lockerHandErrTask)
+            {
+                foreach (var item in request.IdList)
+                {
+                   var res =  _ptService.HandErrTask(new DetailRequest2Str() { Id = item });
+                    if (res.ResCode != 200)
+                    {
+                        return res;
+                    }
+                }
+                return new SRes();
+            }
+        }
+        /// <summary>
+        /// 更新单据状态
+        /// </summary>
+        /// <param name="req"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes UpdateDocState(UpdateDocStateReqest req)
+        {
+           return _ptService.UpdateDocState(req);
+        }
+        /// <summary>
+        /// 修改任务RFID
+        /// </summary>
+        /// <param name="req"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes UpdateTaskCont(UpdateTaskContRequest req)
+        {
+            return _ptService.UpdateTaskCont(req);
+        }
+        /// <summary>
+        /// 修改货位RFID
+        /// </summary>
+        /// <param name="req"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes UpdateLocationContGrpBarCode(UpdateLocationContGrpBarCode req)
+        {
+            return _ptService.UpdateLocationContGrpBarCode(req);
+        }
+
+        /// <summary>
+        /// 添加组盘信息
+        /// </summary>
+        /// <param name="req"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes AddStock(UpdateTaskContRequest req)
+        {
+            return _ptService.AddStock(req);
+        }
+
+        /// <summary>
+        /// 机科对接-获取巷道
+        /// </summary>
+        /// <param name="req"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public JKGetTunRes JKGetTun1(JKGetTunRequest req)
+        {
+            var res = new JKGetTunRes();
+            var task = _ptService.GetTaskNum(req.rfId);
+            if (task.ResData == 0)
+            {
+                res.palletizerNo = task.ResMsg;
+                return res;
+            }
+            var tun = GetTunnelPriorityList(new GetTunnelPriorityListRequest() { TaskNum = task.ResData }).ResData.Split(',')[0];
+            if (string.IsNullOrEmpty(tun))
+            {
+                res.palletizerNo = "没有可用的巷道";
+                return res;
+            }
+
+            res.rowNo = tun;
+            res.palletizerNo = Math.Ceiling(decimal.Parse(tun) / 2).ToString();
+            return res;
+        }
+
+        /// <summary>
+        /// 机科对接-获取巷道
+        /// </summary>
+        /// <param name="req"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public JKGetTunResNew JKGetTun(JKGetTunRequest req)
+        {
+            var res = new JKGetTunResNew() { ListData = new List<JKGetTunRes>() };
+            var task = _ptService.GetTaskNum(req.rfId);
+            if (task.ResData == 0)
+            {
+                //res.palletizerNo = task.ResMsg;
+                return res;
+            }
+            var tun = GetTunnelPriorityList(new GetTunnelPriorityListRequest() { TaskNum = task.ResData }).ResData.Split(',');
+            if (tun !=null && tun.Any())
+            {
+
+                foreach (var item in tun)
+                {
+                    res.ListData.Add(new JKGetTunRes() { 
+                     rowNo = item,
+                        palletizerNo = Math.Ceiling(decimal.Parse(item) / 2).ToString()
+                    });
+                }
+            }
+
+            //res.rowNo = tun;
+            //res.palletizerNo = Math.Ceiling(decimal.Parse(tun) / 2).ToString();
+            return res;
+        }
+
+
+
+        /// <summary>
+        /// 机科对接-达到二楼取货站台通知
+        /// </summary>
+        /// <param name="req"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public JKPalletizerRes JKArriveInfo(JKArrRequest req)
+        {
+            lock (lockerJKArriveInfo)
+            {
+                var res = new JKPalletizerRes();
+                var task = _ptService.GetTaskNum(req.rfId);
+                if (task.ResData == 0)
+                {
+                    res.code = 0;
+                    res.message = task.ResMsg;
+                    return res;
+                }
+                //更新任务表当前位置
+                var curpoint = "";
+                var srm = "";
+                switch (req.rowNo)
+                {
+                    case "1":
+                        curpoint = "1027";
+                        srm = "SRM1";
+                        break;
+                    case "2":
+                        curpoint = "1028";
+                        srm = "SRM1";
+                        break;
+                    case "3":
+                        curpoint = "1029";
+                        srm = "SRM2";
+                        break;
+                    case "4":
+                        curpoint = "1030";
+                        srm = "SRM2";
+                        break;
+                    case "5":
+                        curpoint = "1031";
+                        srm = "SRM3";
+                        break;
+                    case "6":
+                        curpoint = "1032";
+                        srm = "SRM3";
+                        break;
+                    case "7":
+                        curpoint = "1033";
+                        srm = "SRM4";
+                        break;
+                    case "8":
+                        curpoint = "1034";
+                        srm = "SRM4";
+                        break;
+                }
+                if (string.IsNullOrEmpty(curpoint))
+                {
+                    res.code = 0;
+                    res.message = "请确认巷道编号传输是否正确";
+                    return res;
+                }
+                _ptService.UpdateTask(task.ResData, curpoint, srm, req.rowNo);
+              return res;
+            }
+        }
+        /// <summary>
+        /// 机科对接-接收盘条信息接口
+        /// </summary>
+        /// <param name="req"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public JKPalletizerRes JKTransPTInfo(JKTransPTInfo req)
+        {
+            lock (lockerJKTransPTInfo)
+            {
+                var res = new JKPalletizerRes();
+                var temp = PurchaseBillTrans(new PurchaseBillTransReqest()
+                {
+                    BillCode = req.BillCode,
+                    BillType = req.BillType,
+                    Equip = "2999",
+                    ReqId = req.ReqId,
+                    SupCode = req.SupCode,
+                    SupName = req.SupName,
+                    WareCode = req.WareCode,
+                    ListInfo = new List<ListInfoItem>() {
+                  new ListInfoItem(){
+                   Batch= req.Batch,
+                   BoilerNo = req.BoilerNo,
+                   Brand = req.Brand,
+                   Carbon = req.Carbon,
+                   Describe = req.Describe,
+                   ExecStandard = req.ExecStandard,
+                   HoldDuration = req.HoldDuration,
+                   Licence = req.Licence,
+                   MatBarCode = req.MatBarCode,
+                   MatCode = req.MatCode,
+                   PackNo = req.PackNo,
+                   ProductDate = req.ProductDate,
+                   RFID = req.RFID,
+                   RodBar = req.RodBar,
+                   Weight = req.Weight
+                  }
+                 }
+                });
+                if (temp.ResCode != 200)
+                {
+                    res.code = 0;
+                    res.message = temp.ResMsg;
+                    return res;
+                }
+                return res;
+            }
+        }
+        /// <summary>
+        /// 流水数据归档
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes FlowDataMoveJob(PtAutoPurchData request)
+        {
+            lock (lockerFlowDataMoveJob)
+            {
+                return _ptService.FlowDataMoveJob(request);
+            }
+        }
+    }
+}

+ 242 - 0
wms.api/Controllers/SxController.cs

@@ -0,0 +1,242 @@
+using AutoMapper;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json;
+using wms.dto;
+using wms.dto.request;
+using wms.dto.request.sx;
+using wms.dto.response;
+using wms.dto.response.sx;
+using wms.service.IService;
+using wms.sqlsugar.model.sx;
+using wms.util.Ext;
+
+namespace wms.api.Controllers
+{
+    [Route("api/[controller]/[action]")]
+    [ApiController]
+    public class SxController : BaseController
+    {
+        private readonly ISXService _sxService;
+        private readonly ILogger<PtController> _logger;
+        private readonly IMapper _mapper;
+        static object lockerCurtainProductionOrder = new object();
+        static object lockerSpoolMaterialInfoTrans = new object();
+        static object lockerCurtainProductionStockOut = new object();
+        static object lockerProductionBack = new object();
+        static object lockerErrorMaterialStockOut = new object();
+        static object lockerBGradeMaterialStockOut = new object();
+        static object lockerlockerStockChange = new object();
+        static object lockerManualBuildStockTrans = new object();
+        static object lockerBomInfoTrans = new object();
+
+
+
+        public SxController(ISXService sxService, ILogger<PtController> logger, IMapper mapper) : base(sxService)
+        {
+            _sxService = sxService;
+            _logger = logger;
+            _mapper = mapper;
+        }
+
+        /// <summary>
+        /// 同步物料基础信息
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string SyncMaterInfo(SyncMaterInfoRequest reqBody)
+        {
+            var result = new SRes();
+            //_logger.LogInformation("请求参数:{@reqBody},{aa}", reqBody,1);
+            SXSyncMaterInfoResponse resbody = JsonConvert.DeserializeObject<SXSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+            if (reqBody.SyncType == 1)
+            {
+                reqBody.PageIndex = 1;
+                while (resbody.ResData.Any())
+                {
+                    _sxService.SyncMaterInfo(resbody.ResData);
+                    reqBody.PageIndex++;
+                    resbody = JsonConvert.DeserializeObject<SXSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+                }
+            }
+            else if (reqBody.SyncType == 2)
+            {
+                //拿到增量
+                var increconf = _sxService.GetSysConfigByCode(Const.MESMaterialInitIncrement);
+                if (increconf != null)
+                {
+                    reqBody.StartTime = DateTime.Parse(increconf.SContent);
+                    //reqBody.Count = int.Parse(increconf.Remark);
+                    resbody = JsonConvert.DeserializeObject<SXSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+                    if (resbody.ResData.Any())
+                    {
+                        if (_sxService.SyncMaterInfo(resbody.ResData))
+                        {
+                            var lastdata = resbody.ResData.OrderBy(p => p.UpdatedTime).Last();
+                            _sxService.UpdateSysConfigModelColumns(new sqlsugar.model.UpdateModelColumns<sxSysConfig>()
+                            {
+                                Columns = it => new sxSysConfig { SContent = lastdata.UpdatedTime.ToString("yyyy-MM-dd HH:mm:ss.fff") },
+                                WhereExpression = it => it.Code == Const.MESMaterialInitIncrement
+                            });
+                        }
+                    }
+                    else
+                    {
+                        result.ResCode = ResponseStatusCodeEnum.NoResult.GetHashCode();
+                        result.ResMsg = ResponseStatusCodeEnum.NoResult.GetDescription();
+                    }
+                }
+                else
+                {
+                    result.ResCode = ResponseStatusCodeEnum.AccountError.GetHashCode();
+                    result.ResMsg = "没有配置信息" + Const.MESMaterialInitIncrement;
+                }
+            }
+            else
+            {
+                if (!string.IsNullOrEmpty(reqBody.MatCode))
+                {
+                    resbody = JsonConvert.DeserializeObject<SXSyncMaterInfoResponse>(WmsServiceExportApi(reqBody));
+                    if (resbody.ResData.Any())
+                    {
+                        if (_sxService.SyncMaterInfo(resbody.ResData))
+                        {
+
+                        }
+                    }
+                }
+            }
+            return result.ToCamelCaseString();
+        }
+        /// <summary>
+        /// 帘线工字轮信息传输接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "SpoolMaterialInfoTrans")]
+        public SRes SpoolMaterialInfoTrans(SxSpoolMaterialInfoTransRequest reqDto)
+        {
+            return ConcurrencyReqControl<SxSpoolMaterialInfoTransRequest, SRes>(lockerSpoolMaterialInfoTrans, "SpoolMaterialInfoTrans" + reqDto.SpoolCode, reqDto.SpoolCode, reqDto, _sxService.SpoolMaterialInfoTrans);
+        }
+        /// <summary>
+        /// 时效库入库工字轮反馈接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "SXProductStockInFeedBack")]
+        public SRes SXProductStockInFeedBack(string doccode)
+        {
+            var list = _sxService.GetBillFeedbackList(p => p.BillCode == doccode);
+            var dtolist = _mapper.Map<List<SXProductStockInFeedBackRequestItem>>(list);
+            var dto = new SXProductStockInFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return resbody;
+        }
+        /// <summary>
+        /// 扭转检测结果值上传接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "TorsChkValFeedBack")]
+        public SRes TorsChkValFeedBack(string doccode)
+        {
+            var list = _sxService.GetBillFeedbackList(p => p.BillCode == doccode);
+            var dtolist = _mapper.Map<List<TorsChkValFeedBackRequestItem>>(list);
+            var dto = new TorsChkValFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return resbody;
+        }
+        /// <summary>
+        /// 时效库出库装箱工字轮信息反馈接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes EnchaseStockOutFeedBack(string doccode)
+        {
+            var list = _sxService.GetBillFeedbackList(p => p.BillCode == doccode);
+            var dtolist = _mapper.Map<List<EnchaseStockOutFeedBackRequestItem>>(list);
+            var dto = new EnchaseStockOutFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return resbody;
+        }
+        /// <summary>
+        /// 工字轮装箱位置信息上传接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes EnchaseCoordPosFeedBack(string doccode)
+        {
+            var list = _sxService.GetBillFeedbackList(p => p.BillCode == doccode);
+            var dtolist = _mapper.Map<List<EnchaseCoordPosFeedBackRequestItem>>(list);
+            var dto = new EnchaseCoordPosFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return resbody;
+        }
+        /// <summary>
+        /// 装箱称重信息上传接口
+        /// </summary>
+        /// <param name="billcode"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes ProBoxWeightFeedBack(string doccode)
+        {
+            var list = _sxService.GetBillFeedbackList(p => p.BillCode == doccode);
+            var dtolist = _mapper.Map<List<ProBoxWeightFeedBackRequestItem>>(list);
+            var dto = new ProBoxWeightFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return resbody;
+        }
+
+        /// <summary>
+        /// 库存改判
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes StockChange(SxStockChangeRequest reqDto)
+        {
+            return ConcurrencyReqControl<SxStockChangeRequest, SRes>(lockerlockerStockChange, "StockChange" + reqDto.BillCode, reqDto.BillCode, reqDto, _sxService.StockChange);
+        }
+        /// <summary>
+        /// 改判反馈接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes StockChangeFeedBack(string doccode)
+        {
+            var list = _sxService.GetBillFeedbackList(p => p.BillCode == doccode);
+            var dtolist = _mapper.Map<List<StockChangeFeedBackRequestItem>>(list);
+            var dto = new StockChangeFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return resbody;
+        }
+        /// <summary>
+        /// 实时库存查询接口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public string GetCurStockList(string reqDto)
+        {
+            return null;
+        }
+        /// <summary>
+        /// 移库货位上报MES接口
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public SRes MoveStockLocationFeedBack(string doccode)
+        {
+            var list = _sxService.GetBillFeedbackList(p => p.BillCode == doccode);
+            var dtolist = _mapper.Map<List<MoveStockLocationFeedBackRequestItem>>(list);
+            var dto = new MoveStockLocationFeedBackRequest() { ListInfo = dtolist };
+            SRes resbody = JsonConvert.DeserializeObject<SRes>(WmsServiceExportApi(dto));
+            return resbody;
+        }
+    }
+}

+ 70 - 0
wms.api/Controllers/WmsController.cs

@@ -0,0 +1,70 @@
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json;
+using System.Diagnostics;
+using wms.dto.request;
+using wms.dto.request.hj;
+using wms.dto.response;
+using wms.dto.response.hj;
+using wms.service;
+using wms.service.IService;
+using wms.util.Ext;
+using wms.util.Http;
+
+namespace wms.api.Controllers
+{
+    [Route("api/[controller]/[action]")]
+    [ApiController]
+    public class WmsController : ControllerBase
+    {
+        static object lockerCopperLineReceiveInstr = new object();
+        private readonly IHJService _hJService;
+        public WmsController(IHJService hJService)
+        {
+            _hJService = hJService;
+        }
+        /// <summary>
+        /// 接收ESB请求统一入口
+        /// </summary>
+        /// <param name="reqDto"></param>
+        /// <returns></returns>
+        [HttpPost(Name = "WmsServiceEntrance")]
+        public EsbRes WmsServiceEntrance(EsbReq reqDto)
+        {
+            var result = new EsbRes() { HTTPResponseHeader = new HeadersRes() };
+            //var methodname = RedisHelper.Get("ESBServiceCode" + reqDto.headers.serviceCode);
+            //if (string.IsNullOrEmpty(methodname))
+            //{
+            //    var conf = _hJService.GetSysConfigByExpression(p => p.SContent == reqDto.headers.serviceCode);
+            //    if (conf == null)
+            //    {
+            //        throw new Exception("没有找到该编码的配置信息"+ reqDto.headers.serviceCode);
+            //    }
+            //    methodname = conf.Code;
+            //    RedisHelper.Set("ESBServiceCode" + reqDto.headers.serviceCode, methodname);
+            //}
+            //switch (methodname)
+            //{
+            //    case "CopperLineReceiveInstr"://镀铜补空/取满指令接收接口(包含550工字轮)
+            //        var req = JsonConvert.DeserializeObject<CopperLineRequest>(reqDto.Body);
+            //        result.Body = ConcurrencyReqControl<CopperLineRequest>(lockerCopperLineReceiveInstr, "CopperLineReceiveInstr"+ req.WbCode, req.WbCode, req, _hJService.CopperLineReceiveInstr) .ToCamelCaseString();
+            //        break;
+            //    case "StockChange"://库存改判
+            //        result.Body = _hJService.StockChange(JsonConvert.DeserializeObject<StockChangeRequest>(reqDto.Body)).ToCamelCaseString();
+            //        break;
+            //    case "GetCurStockList"://实时库存查询接口
+            //        result.Body = _hJService.GetCurStockList(JsonConvert.DeserializeObject<GetCurStockListRequest>(reqDto.Body)).ToCamelCaseString();
+            //        break;
+            //    case "SpecialPickMaterApply"://特殊出库领料申请接口
+            //        result.Body = _hJService.SpecialPickMaterApply(JsonConvert.DeserializeObject<SpecialPickMaterApplyRequest>(reqDto.Body)).ToCamelCaseString();
+            //        break;
+            //    default:
+            //        break;
+            //}
+         
+            return result;
+        }
+      
+      
+    }
+}

+ 75 - 0
wms.api/Filter/LogFilter.cs

@@ -0,0 +1,75 @@
+using Microsoft.AspNetCore.Mvc.Abstractions;
+using Microsoft.AspNetCore.Mvc.Filters;
+using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Claims;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Controllers;
+using Newtonsoft.Json;
+
+namespace wms.api.Filter
+{
+    /// <summary>
+    /// 日志
+    /// </summary>
+    public class LogFilter : ActionFilterAttribute
+    {
+
+        public override void OnActionExecuting(ActionExecutingContext context)
+        {
+            ILogger _logUtil = context.HttpContext.RequestServices.GetRequiredService<ILogger<LogFilter>>();
+            var requestParam = context.ActionArguments;
+            object methodname = "";
+            var method = context.ActionDescriptor.DisplayName;
+            var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
+            var actionName = controllerActionDescriptor.ActionName;
+            if (!actionName.StartsWith("Get"))
+            {
+                if (actionName == "I_WCS_PutTaskStep" || actionName == "I_WCS_PutDevInfo" || actionName == "ExecuteJob" || actionName == "StartJob")
+                {
+                    //_logUtil.Debug(method + "请求参数:" + JilH.JilToJson(requestParam));
+                }
+                else
+                {
+                    _logUtil.LogInformation(method + context.HttpContext.Connection.RemoteIpAddress.ToString()+ "请求参数:{@requestParam}",requestParam);
+                    
+                }
+            }
+            base.OnActionExecuting(context);
+
+        }
+        public override void OnActionExecuted(ActionExecutedContext context)
+        {
+            string resContent = "";
+            if (context.Result is ObjectResult result)
+                resContent = JsonConvert.SerializeObject(result.Value);
+            ILogger _logUtil = context.HttpContext.RequestServices.GetRequiredService<ILogger<LogFilter>>();
+            var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
+            var actionName = controllerActionDescriptor.ActionName;
+            if (!actionName.StartsWith("Get"))
+            {
+                if (actionName == "I_WCS_PutTaskStep" || actionName == "I_WCS_PutDevInfo" || actionName == "ExecuteJob" || actionName == "StartJob")
+                {
+                    //_logUtil.Debug(context.ActionDescriptor.DisplayName + "响应结果:" + resContent.JilToJson());
+                }
+                else
+                {
+                  
+                       _logUtil.LogInformation(context.ActionDescriptor.DisplayName + "响应结果:{@resContent}" , resContent);
+                    
+                }
+            }
+            base.OnActionExecuted(context);
+        }
+
+        public override Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
+        {
+            return base.OnResultExecutionAsync(context, next);
+        }
+
+  
+    }
+}

+ 104 - 0
wms.api/Job/JobScheduler.cs

@@ -0,0 +1,104 @@
+using wms.dto.request.hj;
+using wms.dto;
+using Quartz;
+using Quartz.Impl;
+using Quartz.Impl.Matchers;
+using Quartz.Impl.Triggers;
+
+namespace wms.api.Job
+{
+    /// <summary>
+    /// 任务调度器
+    /// </summary>
+    public class JobScheduler
+    {
+        public static IScheduler InitScheduler()
+        {
+            //创建调度器工厂
+            ISchedulerFactory factory = new StdSchedulerFactory();
+            //创建调度器对象
+            IScheduler scheduler = factory.GetScheduler().Result;
+            ////创建任务
+            //IJobDetail job = JobBuilder.Create<PostJob>().Build();
+            ////创建触发器
+            //ITrigger trigger = TriggerBuilder.Create().WithIdentity("TimeTrigger", "TimeGroup").WithSimpleSchedule(p => p.WithIntervalInMinutes(1).RepeatForever()).Build();
+            ////任务、触发器添至调度器对象
+            //scheduler.ScheduleJob(job, trigger);
+            //scheduler.Start();
+            return scheduler;
+        }
+
+        public static void Start(string jobName, Type jobType, string timeCorn)
+        {
+            var sched = InitScheduler();
+            var jobList = GetJobList(Const.JobGroupName).Result;
+            var job = jobList.Where(p => jobName == p.JobName);
+            if (job.Count() > 0)
+            {
+                //if (job.First().JobStatus == "Stop")
+                {
+                    sched.DeleteJob(new JobKey(jobName, Const.JobGroupName));
+                    StartJob(jobName, jobType, timeCorn);
+                }
+                //else
+                //{
+                //    ResumeAsync(jobName, Const.JobGroupName);
+                //}
+            }
+            else
+            {
+                StartJob(jobName, jobType, timeCorn);
+            }
+        }
+        public static async Task<List<SysJobDto>> GetJobList(string jobGroup)
+        {
+            var result = new List<SysJobDto>();
+            try
+            {
+                var group = await InitScheduler().GetJobGroupNames();
+                var currentlyExecutingJobs = await InitScheduler().GetCurrentlyExecutingJobs();
+
+
+                var matcher = GroupMatcher<JobKey>.GroupEquals(jobGroup);
+                var jobs = await InitScheduler().GetJobKeys(matcher);
+                foreach (var item in jobs)
+                {
+                    var triggers = await InitScheduler().GetTriggersOfJob(item);
+                    var state = await InitScheduler().GetTriggerState(triggers.First().Key);
+
+                    var job = InitScheduler().GetJobDetail(item).Result;
+                    result.Add(new SysJobDto()
+                    {
+                        JobName = job.Key.Name,
+                        JobDesc = job.Description,
+                        JobStatus = state.ToString(),
+                        JobGroup = job.Key.Group
+                    });
+                }
+                return result;
+            }
+            catch (Exception ex)
+            { return result; }
+        }
+        public static void StartJob(string jobName, Type jobType, string timeCorn)
+        {
+            var scheduler = InitScheduler(); //获取对象
+            //创建任务
+            JobDetailImpl jobDetail = new JobDetailImpl();
+            jobDetail.Name = jobName;
+            jobDetail.JobType = jobType;
+            jobDetail.Group = Const.JobGroupName;
+            //创建触发器
+            CronTriggerImpl trigger = new CronTriggerImpl();
+            trigger.Name = jobName;
+            trigger.Group = Const.TiggerGroupName;
+            trigger.CronExpressionString = timeCorn;
+            //任务、触发器添至调度器对象
+            scheduler.ScheduleJob(jobDetail, trigger);
+            if (!scheduler.IsShutdown)
+            {
+                scheduler.Start();
+            }
+        }
+    }
+}

+ 43 - 0
wms.api/Job/PostJob.cs

@@ -0,0 +1,43 @@
+using Newtonsoft.Json;
+using Quartz;
+using wms.dto.request;
+using wms.dto.request.hj;
+using wms.util;
+using wms.util.Http;
+
+namespace wms.api.Job
+{
+    /// <summary>
+    /// 创建任务
+    /// </summary>
+    public class PostJob : IJob
+    {
+        public Task Execute(IJobExecutionContext context)
+        {
+            string jobCode = context.JobDetail.Key.Name;
+            Action<string> action = new Action<string>(PostRequest);
+            return Task.Run(() =>
+            {
+                PostRequest(jobCode);
+            });
+        }
+        public void PostRequest(string jobCode)
+        {
+
+            var webBaseUrl = AppSettings.GetConfig("webapi");
+            if (webBaseUrl == "http://10.30.44.3:8001")
+            {
+                HttpUtil.PostRequest(webBaseUrl + "/api/Hj/ExecuteJob", JsonConvert.SerializeObject(new DetailCodeRequest { Code = jobCode }));
+            }
+            else if (webBaseUrl == "http://10.30.44.4:8080")
+            {
+                HttpUtil.PostRequest(webBaseUrl + "/api/Pt/ExecuteJob", JsonConvert.SerializeObject(new DetailCodeStrRequest { Code = jobCode }));
+            }
+            else if (webBaseUrl == "http://10.30.44.4:8070")
+            {
+                HttpUtil.PostRequest(webBaseUrl + "/api/Cp/ExecuteJob", JsonConvert.SerializeObject(new DetailCodeStrRequest { Code = jobCode }));
+            }
+
+        }
+    }
+}

+ 76 - 0
wms.api/Program.cs

@@ -0,0 +1,76 @@
+using Autofac;
+using Autofac.Extensions.DependencyInjection;
+using CSRedis;
+using Microsoft.OpenApi.Models;
+using Serilog;
+using wms.api.autofac;
+using wms.api.Filter;
+using wms.service.mapper;
+
+var builder = WebApplication.CreateBuilder(args);
+
+// Add services to the container.
+
+builder.Services.AddControllers();
+// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
+builder.Services.AddEndpointsApiExplorer();
+builder.Services.AddCors(options =>
+{
+    options.AddPolicy(name: "cors", builders => builders.AllowAnyOrigin().AllowAnyHeader().WithMethods("GET", "POST", "HEAD", "PUT", "DELETE", "OPTIONS"));
+});
+builder.Services.AddSwaggerGen(c =>
+{
+    c.SwaggerDoc("v1", new OpenApiInfo
+    {
+        Title = "WMS接口文档",
+        Version = "1.0",
+        Description = "WMS接口文档"
+    });
+    var file = Path.Combine(AppContext.BaseDirectory, "wms.api.xml");  // xml文档绝对路径
+    var file1 = Path.Combine(AppContext.BaseDirectory, "wms.dto.xml");
+    var path = Path.Combine(AppContext.BaseDirectory, file); 
+    var path1 = Path.Combine(AppContext.BaseDirectory, file1);
+    c.IncludeXmlComments(path, true); // true : 显示控制器层注释
+    c.IncludeXmlComments(path1, true); // true : 显示dto注释
+    c.OrderActionsBy(o => o.RelativePath);
+
+});
+builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
+
+builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
+{
+    containerBuilder.RegisterModule(new AutofacModuleRegister());
+});
+builder.Host.UseSerilog((context, logger) =>
+{
+    logger.ReadFrom.Configuration(context.Configuration);
+    logger.Enrich.FromLogContext();
+});
+
+builder.Services.AddControllersWithViews(options =>
+{
+    options.Filters.Add<LogFilter>();
+});
+
+builder.Services.AddSingleton(new wms.util.AppSettings(builder.Configuration));
+RedisHelper.Initialization(new CSRedisClient(builder.Configuration.GetConnectionString("CSRedisConnectString")));
+builder.Services.AddAutoMapper(typeof(WmsPrifile));
+var app = builder.Build();
+
+// Configure the HTTP request pipeline.
+if (app.Environment.IsDevelopment())
+{
+    
+}
+app.UseSwagger();
+app.UseSwaggerUI();
+
+//app.UseHttpsRedirection();
+app.UseCors("cors");
+app.UseRouting();
+app.UseAuthorization();
+
+app.MapControllers();
+
+app.Run();
+

+ 31 - 0
wms.api/Properties/launchSettings.json

@@ -0,0 +1,31 @@
+{
+  "$schema": "https://json.schemastore.org/launchsettings.json",
+  "iisSettings": {
+    "windowsAuthentication": false,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:10539",
+      "sslPort": 44314
+    }
+  },
+  "profiles": {
+    "wms.api": {
+      "commandName": "Project",
+      "dotnetRunMessages": true,
+      "launchBrowser": true,
+      "launchUrl": "swagger",
+      "applicationUrl": "https://localhost:7044;http://localhost:5044",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": true,
+      "launchUrl": "swagger",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    }
+  }
+}

+ 8 - 0
wms.api/appsettings.Development.json

@@ -0,0 +1,8 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  }
+}

+ 71 - 0
wms.api/appsettings.json

@@ -0,0 +1,71 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  },
+  "AllowedHosts": "*",
+  "ConnectionConfigs": [
+    {
+      "ConnectionString": "Data Source=10.30.44.50;User ID=sa;Password=P@ssw0rd;Initial Catalog=WMS_ZT_01CP",
+      //"ConnectionString": "Data Source=.;User ID=sa;Password=Aa123456;Initial Catalog=WMS_ZT_01PT",
+      "DbType": 1,
+      "ConfigId": "cp",
+      "IsAutoCloseConnection": true
+    }
+  ],
+  "CSRedisConnectString": "127.0.0.1[:6379],password=123456,defaultDatabase=0",
+  "Serilog": {
+    "MinimumLevel": {
+      "Default": "Debug", //最小记录日志级别
+      "Override": {
+        "Default": "Warning",
+        "System": "Warning",
+        "Microsoft": "Warning"
+      }
+    },
+    "Enrich": [ "FromLogContext", "WithThreadId" ],
+    "WriteTo": [
+      {
+        "Name": "Console",
+        "Args": {
+          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {SourceContext} {ThreadId} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
+        }
+      },
+      {
+        "Name": "Debug",
+        "Args": {
+          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {SourceContext} {ThreadId} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
+        }
+      },
+      {
+        "Name": "File",
+        "Args": {
+          "path": "Logs/log.txt",
+          "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter",
+          "rollingInterval": "Day",
+          "outputTemplate": "{ClientIP}{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {SourceContext} {ThreadId} [{Level:u3}] {Message:lj}{NewLine}{Exception}",
+          "shared": true,
+          "rollOnFileSizeLimit": true,
+          "fileSizeLimitBytes": 102400000,
+          "retainedFileCountLimit": 365
+        }
+      }
+    ]
+  },
+  //"EsbMesPushUrl": "http://esb-pre.zt.net.cn:18080/esb/comm/api",
+  "EsbMesPushUrl": "http://esb.zt.net.cn:18080/esb/comm/api",
+  //"EsbMesPushUrl": "http://esb.zt.net.cn:18080/esb/comm/api",
+  "EsbMQUri": "tcp://172.27.8.100:61616",
+  //"EsbMQUri": "tcp://hamg1.zt.net.cn:61616,tcp://hamg2.zt.net.cn:61616",
+  "RcsCreateTaskPushUrl": "",
+  "RcsContinuePushUrl": "",
+  "JKPushUrl": "http://esb.zt.net.cn:18080/esb/comm/api",
+  "IWmsStockInPushUrl": "databus/publish/zhongTianOutStock",
+  "IWmsStockOutPushUrl": "databus/publish/zhongTianIntoStock",
+  "MoveReservedLocationCount": "1",
+  "CopperLineToEmptyAreaCode": "21",
+  "webapi": "https://localhost:7044",
+  "maxweight": "950"
+}

+ 38 - 0
wms.api/autofac/AutofacModuleRegister.cs

@@ -0,0 +1,38 @@
+using Autofac;
+using Autofac.Extras.Quartz;
+using System.Reflection;
+using wms.api.Job;
+
+namespace wms.api.autofac
+{
+    public class AutofacModuleRegister : Autofac.Module
+    {
+        //重写Autofac管道Load方法,在这里注册注入
+        protected override void Load(ContainerBuilder builder)
+        {
+            builder.RegisterAssemblyTypes(GetAssemblyByName("wms.service")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces().PropertiesAutowired();
+            builder.RegisterAssemblyTypes(GetAssemblyByName("wms.dataservice")).Where(a => a.Name.EndsWith("DataService")).AsImplementedInterfaces().PropertiesAutowired();
+
+            //builder.RegisterModule(new QuartzAutofacFactoryModule());
+            builder.RegisterModule(new QuartzAutofacJobsModule(typeof(PostJob).Assembly));
+            ////单一注册
+
+            //builder.RegisterType<NlogUtil>().Named<ILogUtil>(typeof(NlogUtil).Name);
+
+
+            //var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
+            //.Where(type => typeof(Microsoft.AspNetCore.Mvc.ControllerBase).IsAssignableFrom(type)).ToArray();
+            //builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
+
+        }
+        /// <summary>
+          /// 根据程序集名称获取程序集
+          /// </summary>
+          /// <param name="AssemblyName">程序集名称</param>
+        public static Assembly GetAssemblyByName(String AssemblyName)
+        {
+            return Assembly.Load(AssemblyName);
+        }
+    }
+
+}

+ 26 - 0
wms.api/wms.api.csproj

@@ -0,0 +1,26 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <GenerateDocumentationFile>True</GenerateDocumentationFile>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Apache.NMS.ActiveMQ.NetCore" Version="1.7.3" />
+    <PackageReference Include="Autofac.Extras.Quartz" Version="8.2.0" />
+    <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.0" />
+    <PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
+    <PackageReference Include="Quartz" Version="3.6.2" />
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\wms.dto\wms.dto.csproj" />
+    <ProjectReference Include="..\wms.package\wms.package.csproj" />
+    <ProjectReference Include="..\wms.service\wms.service.csproj" />
+    <ProjectReference Include="..\wms.util\wms.util.csproj" />
+  </ItemGroup>
+
+</Project>

+ 2 - 2
wms.service/Service/CPService.cs

@@ -1070,7 +1070,7 @@ namespace wms.service.Service
             {
                 locationlist = locationlist.Where(p => p.ContGrpType == request.TrayType).OrderByDescending(p => p.Tunnel);
             }
-            if (request.Equip == "8088" || request.Equip == "8094" || request.Equip == "8028")
+            if (request.Equip == "8088" || request.Equip == "8094" || request.Equip == "8028" || request.Equip == "8313")
             {
                 locationlist = locationlist.Where(p => p.Tunnel == 5);
             }
@@ -4968,7 +4968,7 @@ namespace wms.service.Service
                 try
                 {
                     var task = _wcstaskinfo.AsQueryable().With(SqlWith.NoLock).Where(p => p.TaskGroupKey == code && p.Type == TaskType.EnterDepot && (p.AddrFrom == "8090" ||
-                    p.AddrFrom == "8092" || p.AddrFrom == "8096" || p.AddrFrom == "8098")).First();
+                    p.AddrFrom == "8092" || p.AddrFrom == "8096" || p.AddrFrom == "8098" || p.AddrFrom == "8307")).First();
                     if (task == null)
                     {
                         res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();