kazelee
2025-05-16 6abc355aeb4e6f7960c11795dbbcc26396b0c888
博实物料下发同步接口开发,满箱入库、出库逻辑测试与优化
8个文件已添加
19个文件已修改
1个文件已删除
818 ■■■■■ 已修改文件
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/5c57b4d0-dbd7-49e3-9f10-3d5a4d6dc3f3.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/7b1f7e4e-45eb-4263-a455-827cb67bccfe.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/ab784fdf-fa93-4eaa-9449-8122428bc0ae.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/DebugController.cs 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/MesController.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/MoboxController.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/WmsController.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dtos/Request/AgvRequest.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dtos/Request/DebugRequest.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dtos/Request/MoboxRequest.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dtos/Request/WmsRequest.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dtos/Response/MoboxResponse.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dtos/Response/WmsResponse.cs 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.DSZSH.csproj 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Helpers/ResultHelper.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Helpers/TaskHelper.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Models/DebugModel.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Models/TN_CG_Detail.cs 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Models/TN_Outbound_Detail.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Models/TN_Outbound_Order.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Models/TN_Shift_Detail.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Models/TN_Task.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Program.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServiceCore/DebugCore.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Services/DebugService.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Services/MoboxService.cs 273 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Services/WmsService.cs 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/config.json 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/5c57b4d0-dbd7-49e3-9f10-3d5a4d6dc3f3.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/7b1f7e4e-45eb-4263-a455-827cb67bccfe.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/ab784fdf-fa93-4eaa-9449-8122428bc0ae.vsidx
Binary files differ
Controllers/DebugController.cs
@@ -29,37 +29,15 @@
        {
            return DebugService.AgvSeriesReports(model);
        }
        /// <summary>
        /// 初始化数据库
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [Route("CreateDatabase")]
        public string CreateDatabase() {
            return DebugService.CreateDatabase();
        }
        [HttpPost]
        [Route("InsertLocation")]
        public string InsertLocation(InsertLocationInfo model) {
            try {
                var db = DbHelper.GetDbClient();
                var locList = new List<TN_Location>();
                locList.Add(new TN_Location { S_AREA_CODE = model.AreaCode, S_CODE = model.Code});
                if (db.Insertable<TN_Location>(locList).ExecuteCommand() <= 0) {
                    return "失败";
                }
            }
            catch (Exception ex) {
                LogHelper.Info($"发生了异常");
                return "添加货位错误" + ex.Message;
            }
            //return res ? "成功" : "失败";
            return "成功";
        public string CreateDatabase(CoverInfo model) {
            return DebugService.CreateDatabase(model.IsCover);
        }
        /// <summary>
@@ -71,22 +49,5 @@
        public string InsertLocCntrCg() {
            return DebugService.InsertLocCntrCg();
        }
    }
    public class CgInfo {
        public string ItemCode { get; set; }
        public string CntId { get; set; }
        public string LocId { get; set; }
    }
    public class InsertLocationInfo {
        public string Code { set; get; }
        public string AreaCode { set; get; }
    }
    public class UpdateTaskWeightInfo {
        public string TaskID { set; get; }
        public float Weight { set; get; }
    }
}
Controllers/MesController.cs
New file
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
using HH.WCS.Mobox3.DSZSH.Services;
namespace HH.WCS.Mobox3.DSZSH.Controllers {
    /// <summary>
    /// MES 调用的接口
    /// </summary>
    [RoutePrefix("api")]
    public class MesController : ApiController {
    }
}
Controllers/MoboxController.cs
@@ -9,7 +9,6 @@
using static HH.WCS.Mobox3.DSZSH.Dtos.Request.MoboxRequest;
using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse;
using static HH.WCS.Mobox3.DSZSH.Helpers.ResultHelper;
namespace HH.WCS.Mobox3.DSZSH.Controllers {
    /// <summary>
@@ -62,30 +61,14 @@
        public SimpleResult EmptyInbound(EmptyInboundInfo model) {
            LogHelper.InfoApi("空托/空箱入库", model);
            var db = DbHelper.GetDbClient();
            var locCntrRel = db.Queryable<TN_Loc_Container>()
                .Where(lc => lc.S_CNTR_CODE == model.CntrCode).First();
            if (locCntrRel == null) {
                return BuildSimpleResult(-1, $"不存在已绑定容器的货位号:'{model.CnteType}'");
            if (model.CntrType == "托盘") {
                return MoboxService.EmptyInboundPallet(model);
            }
            if (locCntrRel.S_CNTR_TYPE == "托盘") {
                return MoboxService.EmptyInboundPallet(new EmptyInboundDetailInfo {
                    StartLoc = locCntrRel.S_LOC_CODE,
                    CntId = locCntrRel.S_CNTR_TYPE
                });
            }
            else if (locCntrRel.S_CNTR_TYPE == "好运箱") {
                return MoboxService.EmptyInboundGoodpack(new EmptyInboundDetailInfo {
                    StartLoc = locCntrRel.S_LOC_CODE,
                    CntId = locCntrRel.S_CNTR_TYPE
                });
            else if (model.CntrType == "好运箱") {
                return MoboxService.EmptyInboundGoodpack(model);
            }
            else {
                return BuildSimpleResult(-2, $"不合法的容器类型:'{locCntrRel.S_CNTR_CODE}'");
                return BuildSimpleResult(-1, $"容器类型 '{model.CntrType}' 不合法:应为 '托盘' 或 '好运箱'");
            }
        }
@@ -191,9 +174,7 @@
        public SimpleResult RestBack(RestBackInfo model) {
            return MoboxService.RestBack(model);
        }
        #endregion
        #region Mobox 接口
        /// <summary>
        /// 成品胶出库(PDA)
        /// </summary>
@@ -203,12 +184,17 @@
        [Route("finished-outbound")]
        public SimpleResult FinishedOutbound(FinishedOutboundInfo model) {
            LogHelper.InfoApi("成品胶出库(PDA)", model);
            if (model.ForcedOut) {
                return MoboxService.FinishedOutboundForce(model);
            }
            return MoboxService.FinishedOutbound(model);
            else {
                return MoboxService.FinishedOutbound(model);
            }
        }
        #endregion
        #region Mobox 接口
        /// <summary>
        /// 抽检-创建抽检单(WMS)
        /// </summary>
Controllers/WmsController.cs
@@ -1,7 +1,12 @@
using HH.WCS.Mobox3.DSZSH.AppStart;
using HH.WCS.Mobox3.DSZSH.Services;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Web.Http;
using static HH.WCS.Mobox3.DSZSH.Dtos.Request.WmsRequest;
using static HH.WCS.Mobox3.DSZSH.Dtos.Response.WmsResponse;
namespace HH.WCS.Mobox3.DSZSH.Controllers
{
@@ -9,8 +14,16 @@
    /// 第三方调用的接口
    /// </summary>
    [RoutePrefix("api")]
    public class WmsController : ApiController
    {
    public class WMSController : ApiController {
        /// <summary>
        /// 博实物料信息下发同步(MES)
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        //[Route("WMS/CgInfoSync")]
        public WmsResult CgInfoSync(CgInfoSyncInfo model) {
            return WmsService.CgInfoSync(model);
        }
    }
}
Dtos/Request/AgvRequest.cs
@@ -10,14 +10,25 @@
        /// HostToAGV 上报任务状态
        /// </summary>
        public class AgvTaskState {
            /// <summary>
            /// AGV 回报状态号
            /// </summary>
            public int state { get; set; }
            /// <summary>
            /// 任务号
            /// </summary>
            public string task_no { get; set; }
            /// <summary>
            /// AGV 车号
            /// </summary>
            public string forklift_no { get; set; }
            /// <summary>
            /// 安全门编号
            /// </summary>
            public string lock_no { get; set; }
            /// <summary>
            /// 附加信息
            /// </summary>
            public string ext_data { get; set; }
        }
Dtos/Request/DebugRequest.cs
@@ -25,5 +25,9 @@
            /// </summary>
            public int NextState { set; get; }
        }
        public class CoverInfo {
            public bool IsCover { set; get; } = true;
        }
    }
}
Dtos/Request/MoboxRequest.cs
@@ -13,20 +13,17 @@
            /// <summary>
            /// 物料编码
            /// </summary>
            [JsonProperty("s_item_code")]
            public string ItemCode { get; set; }
            ///// <summary>
            ///// 物料名称
            ///// </summary>
            //
            //[JsonProperty("item_name")]
            //public string ItemName { get; set; }
            /// <summary>
            /// 批次号
            /// </summary>
            [JsonProperty("s_batch_no")]
            [JsonProperty("s_batch")]
            public string BatchNo { get; set; }
            /// <summary>
            /// 物料规格
@@ -39,7 +36,7 @@
            [JsonProperty("n_num")]
            public int Qty { get; set; }
            /// <summary>
            /// 货位信息
            /// 起点货位信息
            /// </summary>
            [JsonProperty("s_start_loc")]
            public string StartLoc { get; set; }
@@ -117,12 +114,17 @@
            /// 容器类型
            /// </summary>
            [JsonProperty("cntr_type")]
            public string CnteType { get; set; }
            public string CntrType { get; set; }
            /// <summary>
            /// 终点库区编码
            /// </summary>
            [JsonProperty("end_area")]
            public string EndArea { get; set; }
            /// <summary>
            /// 起点货位
            /// </summary>
            [JsonProperty("start_loc")]
            public string StartLoc { get; set; }
        }
        public class EmptyInboundDetailInfo : StartCntInfo { }
@@ -220,7 +222,9 @@
            [JsonProperty("end_area")]
            public string EndArea { get; set; }
        }
        /// <summary>
        /// 抽检-合格回库(PDA) 数据类
        /// </summary>
        public class QualifiedBackInfo {
            /// <summary>
            /// 物料编码
@@ -256,13 +260,11 @@
            /// <summary>
            /// 物料编码
            /// </summary>
            [JsonProperty("item_code")]
            public string ItemCode { get; set; }
            ///// <summary>
            ///// 物料名称
            ///// </summary>
            //
            //[JsonProperty("item_name")]
            //public string ItemName { get; set; }
            /// <summary>
@@ -273,7 +275,6 @@
            /// <summary>
            /// 批次号
            /// </summary>
            [JsonProperty("batch_no")]
            public string BatchNo { get; set; }
            /// <summary>
@@ -284,20 +285,16 @@
            /// <summary>
            /// 容器类型
            /// </summary>
            [JsonProperty("cntr_type")]
            public string CntrType { get; set; }
            /// <summary>
            /// 出库终点货区
            /// </summary>
            [JsonProperty("end_area")]
            public string EndArea { get; set; }
            /// <summary>
            /// 是否强制出库
            /// </summary>
            [JsonProperty("force_out")]
            public bool ForcedOut { get; set; }
        }
Dtos/Request/WmsRequest.cs
New file
@@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace HH.WCS.Mobox3.DSZSH.Dtos.Request {
    public class WmsRequest {
        /// <summary>
        /// 物料信息下发同步 数据类
        /// </summary>
        public class CgInfoSyncInfo {
            /// <summary>
            /// 物料名称
            /// </summary>
            [JsonProperty("itemName")]
            public string ItemName { get; set; }
            /// <summary>
            /// 产品牌号
            /// </summary>
            [JsonProperty("itemCode")]
            public string ItemCode { get; set; }
            /// <summary>
            /// 批次号
            /// </summary>
            [JsonProperty("batchNo")]
            public string BatchNo { get; set; }
            /// <summary>
            /// 执行标准
            /// </summary>
            [JsonProperty("standard")]
            public string Standard { get; set; }
            /// <summary>
            /// 净含量
            /// </summary>
            [JsonProperty("netWeight")]
            public string NetWeight { get; set; }
            /// <summary>
            /// 质量等级
            /// </summary>
            [JsonProperty("qualityGrade")]
            public string QualityGrade { get; set; }
        }
    }
}
Dtos/Response/MoboxResponse.cs
@@ -24,6 +24,34 @@
        }
        /// <summary>
        /// 构建 <see cref="SimpleResult"/> 返回值,选择打印日志信息(默认打印)
        /// </summary>
        /// <param name="code"></param>
        /// <param name="message"></param>
        /// <param name="pringLog"></param>
        /// <returns></returns>
        public static SimpleResult BuildSimpleResult(int code, string message, bool pringLog = true) {
            if (pringLog) {
                LogHelper.Info(message);
            }
            return new SimpleResult { Code = code, Message = message };
        }
        /// <summary>
        /// 构建 <see cref="SimpleResult"/> 异常返回值,选择打印异常日志信息(默认打印)
        /// </summary>
        /// <param name="ex"></param>
        /// <param name="exCode"></param>
        /// <param name="pringLog"></param>
        /// <returns></returns>
        public static SimpleResult BuildSimpleEx(Exception ex, int exCode = 1, bool pringLog = true) {
            if (pringLog) {
                LogHelper.InfoEx(ex);
            }
            return new SimpleResult { Code = exCode, Message = ex.Message };
        }
        /// <summary>
        /// mobox 取消任务、标记完成任务
        /// </summary>
        public class MoboxTaskBase {
Dtos/Response/WmsResponse.cs
New file
@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace HH.WCS.Mobox3.DSZSH.Dtos.Response {
    public class WmsResponse {
        /// <summary>
        /// MES API 响应结果类
        /// </summary>
        public class WmsResult {
            /// <summary>
            /// 接口调用结果  1-成功  0-失败
            /// </summary>
            [JsonProperty("result")]
            public int Result { get; set; }
            /// <summary>
            /// 是否成功 True-成功,False:失败
            /// </summary>
            [JsonProperty("success")]
            public bool Success { get; set; }
            /// <summary>
            /// 这里是string类型,对结果的描述
            /// </summary>
            [JsonProperty("data")]
            public string Data { get; set; }
        }
        public static WmsResult MesResultBuilder(int code, string message = "", bool printLog = true) {
            if (printLog && string.IsNullOrEmpty(message)) {
                LogHelper.Info(message);
            }
            return new WmsResult {
                Result = code,
                Success = code == 0, // 仅当code=0时,success=true
                Data = message,
            };
        }
    }
}
HH.WCS.Mobox3.DSZSH.csproj
@@ -235,16 +235,18 @@
    <Compile Include="Consts\TaskName.cs" />
    <Compile Include="Controllers\DebugController.cs" />
    <Compile Include="Controllers\ErpController.cs" />
    <Compile Include="Controllers\MesController.cs" />
    <Compile Include="Controllers\MoboxController.cs" />
    <Compile Include="Controllers\AgvController.cs" />
    <Compile Include="App_Start\SwaggerControllerDescProvider.cs" />
    <Compile Include="Dtos\Request\WmsRequest.cs" />
    <Compile Include="Dtos\Response\WmsResponse.cs" />
    <Compile Include="Models\DebugModel.cs" />
    <Compile Include="Dtos\Request\DebugRequest.cs" />
    <Compile Include="Dtos\Response\DebugResponse.cs" />
    <Compile Include="Helpers\AgvHelper.cs" />
    <Compile Include="Helpers\ExprHelper.cs" />
    <Compile Include="Helpers\PathHelper.cs" />
    <Compile Include="Helpers\ResultHelper.cs" />
    <Compile Include="Helpers\DbHelper.cs" />
    <Compile Include="Models\TN_CNTR_ITEM.cs" />
    <Compile Include="Models\TN_Check_Detail.cs" />
@@ -256,6 +258,7 @@
    <Compile Include="Models\TN_Shift_Detail.cs" />
    <Compile Include="Models\TN_Shift_Order.cs" />
    <Compile Include="ServiceCore\CheckCore.cs" />
    <Compile Include="ServiceCore\DebugCore.cs" />
    <Compile Include="ServiceCore\OutboundCore.cs" />
    <Compile Include="ServiceCore\ShiftCore.cs" />
    <Compile Include="Services\DebugService.cs" />
@@ -286,10 +289,11 @@
    <Compile Include="Models\TN_Task_Action.cs" />
    <Compile Include="Helpers\DeviceProcess.cs" />
    <Compile Include="ServiceCore\TaskCore.cs" />
    <Compile Include="Controllers\WmsController.cs" />
    <Compile Include="Controllers\WMSController.cs" />
    <Compile Include="Dispatch\HostToAGV.cs" />
    <Compile Include="Helpers\TaskHelper.cs" />
    <Compile Include="Services\AgvService.cs" />
    <Compile Include="Services\WmsService.cs" />
    <Compile Include="Services\MoboxService.cs" />
    <Compile Include="Helpers\LogHelper.cs" />
    <Compile Include="Helpers\ContainerHelper.cs" />
@@ -331,8 +335,6 @@
      <Install>false</Install>
    </BootstrapperPackage>
  </ItemGroup>
  <ItemGroup>
    <Folder Include="Dtos\Internal\" />
  </ItemGroup>
  <ItemGroup />
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
Helpers/ResultHelper.cs
File was deleted
Helpers/TaskHelper.cs
@@ -12,7 +12,6 @@
using SqlSugar;
using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse;
using static HH.WCS.Mobox3.DSZSH.Helpers.ResultHelper;
namespace HH.WCS.Mobox3.DSZSH.Helpers {
    /// <summary>
@@ -57,6 +56,8 @@
                N_B_STATE = 0,
                S_CNTR_CODE = cnt,
                T_START_TIME = DateTime.Now,
                //T_END_TIME = null,
            };
            var db = DbHelper.GetDbClient();
Models/DebugModel.cs
@@ -7,20 +7,14 @@
namespace HH.WCS.Mobox3.DSZSH.Models {
    public class DebugModel {
        public class LocCntrCg {
            public string Note { get; set; } // 仅用于备注
            public string LocCode { get; set; }
            public string LocArea { get; set; }
            public string CntrCode { get; set; }
            public string CntrType { get; set; }
            public string CgId { get; set; }
            public string ItemCode { get; set; }
            public string BatchNo { get; set; }
        }
        public class OutboundOrder {
            public string No { get; set; }
            public string CgId { get; set; }
            public string BatchNo { get; set; }
            public string EndArea { get; set; }
            public int Qty { get; set; }
        }
    }
}
Models/TN_CG_Detail.cs
@@ -9,7 +9,7 @@
        /// <summary>
        /// 料箱商品标识
        /// </summary>
        public string S_CG_ID { get; set; } = "";
        public string S_CG_ID { get; set; } = string.Empty; // 暂时用不到,默认为空
        /// <summary>
        /// 物料编码
@@ -17,9 +17,9 @@
        public string S_ITEM_CODE { get; set; }
        /// <summary>
        /// 物料规格
        /// 物料名称
        /// </summary>
        public string S_SPE { get; set; }
        public string S_ITEM_NAME { get; set; } = string.Empty;
        /// <summary>
        /// 容器编码
@@ -44,6 +44,31 @@
        /// <summary>
        /// 货品数量
        /// </summary>
        public int N_QTY { get; set; }
        public int N_QTY { get; set; } = 0;
        /// <summary>
        /// 物料规格
        /// </summary>
        public string S_SPE { get; set; } = string.Empty;
        /// <summary>
        /// 执行标准
        /// </summary>
        public string S_STANDARD { get; set; } = string.Empty;
        /// <summary>
        /// 净含量
        /// </summary>
        public string S_NET_WEIGHT { get; set; } = string.Empty;
        /// <summary>
        /// 质量等级
        /// </summary>
        public string S_QUALITY_GRADE { get; set; } = string.Empty;
        /// <summary>
        /// 产线号
        /// </summary>
        public int N_PRODUCT_LINE { get; set; } = 0; // NOTE 后续MES可能会提供,先创建
    }
}
Models/TN_Outbound_Detail.cs
@@ -31,7 +31,7 @@
        /// <summary>
        /// 出库货品数量(整数,用于生成任务数)
        /// </summary>
        public int N_QTY { get; set; }
        public int N_COUNT { get; set; }
        /// <summary>
        /// 终点库区(由WMS下发任务时指定)
Models/TN_Outbound_Order.cs
@@ -26,11 +26,13 @@
        /// <summary>
        /// 批次号
        /// </summary>
        public string S_BATCH_NO { get; set; }
        public string S_BATCH { get; set; }
        /// <summary>
        /// 出库数量
        /// </summary>
        public int N_END_NUM { get; set; }
        public float F_QTY { get; set; }
        public float F_OUT_QTY { get; set; }
        //public float F_OUT_QTY { get; set; }
        /// <summary>
        /// 终点库区(由WMS下发任务时指定)
Models/TN_Shift_Detail.cs
@@ -6,6 +6,9 @@
using System.Threading.Tasks;
namespace HH.WCS.Mobox3.DSZSH.Models {
    /// <summary>
    /// 移库单明细
    /// </summary>
    internal class TN_Shift_Detail : BaseModel {
        public string S_NO { get; set; }
        public string S_ITEM_CODE { get; set; }
Models/TN_Task.cs
@@ -46,10 +46,11 @@
        /// <summary>
        /// 完成时间
        /// </summary>
        [SugarColumn(IsNullable = true)]
        public DateTime? T_END_TIME { get; set; }
        /// <summary>
        /// AGV 车号
        /// AGV 车号
        /// </summary>
        public string S_EQ_NO { get; set; }
Program.cs
@@ -129,7 +129,7 @@
                //tasks.Add(GetTask(CheckCore.CheckOrderState));
                //tasks.Add(GetTask(OutboundCore.CheckOrderState));
                tasks.Add(GetTask(OutboundCore.CheckOrderState));
                // 添加任务推送线程
ServiceCore/DebugCore.cs
New file
@@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HH.WCS.Mobox3.DSZSH.ServiceCore {
    public class DebugCore {
    }
}
Services/DebugService.cs
@@ -76,7 +76,6 @@
            return returnResults;
        }
        /// <summary>
        /// 初始数据库建立
        /// </summary>
@@ -175,16 +174,6 @@
                            loc = newLoc;
                        }
                        //if (loc.N_CURRENT_NUM == 0) {
                        //    loc.N_CURRENT_NUM = 1;
                        //    if (db.Updateable<TN_Location>(loc).UpdateColumns(
                        //        it => new { it.N_CURRENT_NUM, it.T_MODIFY }).ExecuteCommand() <= 0) {
                        //        tran.RollbackTran();
                        //        LogHelper.Info($"修改位置{locCntrCg.LocCode}失败");
                        //        continue;
                        //    }
                        //}
                        if (string.IsNullOrEmpty(locCntrCg.CntrCode)) {
                            LogHelper.Info("容器号为空,不再读取后面的数据");
                            continue;
@@ -210,23 +199,23 @@
                            }
                        }
                        if (string.IsNullOrEmpty(locCntrCg.CgId)) {
                        if (string.IsNullOrEmpty(locCntrCg.ItemCode)) {
                            LogHelper.Info("物料号为空,不再读取后面的数据");
                            continue;
                        }
                        var cgDetail = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == locCntrCg.CntrCode
                            && a.S_ITEM_CODE == locCntrCg.CgId);
                            && a.S_ITEM_CODE == locCntrCg.ItemCode);
                        if (cgDetail == null) {
                            var locList = new List<TN_CG_Detail>();
                            locList.Add(new TN_CG_Detail { S_CNTR_CODE = locCntrCg.CntrCode, S_ITEM_CODE = locCntrCg.CgId, S_BATCH_NO = locCntrCg.BatchNo ?? "" });
                            locList.Add(new TN_CG_Detail { S_CNTR_CODE = locCntrCg.CntrCode, S_ITEM_CODE = locCntrCg.ItemCode, S_BATCH_NO = locCntrCg.BatchNo ?? "" });
                            if (db.Insertable<TN_CG_Detail>(locList).ExecuteCommand() <= 0) {
                                tran.RollbackTran();
                                LogHelper.Info($"插入托盘物料关系{locCntrCg.CntrCode}-{locCntrCg}失败");
                                return "插入失败";
                            }
                        }
                    }
                    }
                    tran.CommitTran();
                }
@@ -240,42 +229,5 @@
                return $"Error reading CSV file: {ex.Message}";
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        //public string InsertOutboundOrder() {
        //    string filePath = PathHelper.GetProjDir("./debug/outbound_order.csv");
        //    var db = DbHelper.GetDbClient();
        //    try {
        //        var configuration = new CsvConfiguration(CultureInfo.InvariantCulture) {
        //            // 配置选项
        //            Delimiter = ",",               // 分隔符
        //            HasHeaderRecord = true,        // 有标题行
        //            MissingFieldFound = null,      // 忽略缺失字段
        //            HeaderValidated = null,        // 跳过标题验证
        //            BadDataFound = context => { }  // 处理错误数据
        //        };
        //        var locCntrCgList = new List<DebugModel.OutboundOrder>();
        //        using (var reader = new StreamReader(filePath))
        //        using (var csv = new CsvReader(reader, configuration)) {
        //            // 读取记录
        //            locCntrCgList = csv.GetRecords<DebugModel.OutboundOrder>().ToList();
        //        }
        //        using (var tran = db.Ado.UseTran()) {
        //        }
        //    }
        //    catch (Exception) {
        //        throw;
        //    }
        //}
    }
}
Services/MoboxService.cs
@@ -13,7 +13,6 @@
using static HH.WCS.Mobox3.DSZSH.Dtos.Request.MoboxRequest;
using static HH.WCS.Mobox3.DSZSH.Dtos.Response.MoboxResponse;
using static HH.WCS.Mobox3.DSZSH.Helpers.ResultHelper;
namespace HH.WCS.Mobox3.DSZSH.Services {
    public class MoboxService {
@@ -30,169 +29,185 @@
            var db = DbHelper.GetDbClient();
            try {
                // TODO 将PDA提供的物料编码与贴标机的信息比对
                // 将PDA提供的物料编码与贴标机的信息比对
                var cgDetail = db.Queryable<TN_CG_Detail>()
                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo) // 指定:物料编码、批次号
                    .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "待检") // NOTE 冗余检查:物料状态应该为 1待检
                    .First();
                var startLoc = db.Queryable<TN_Location>()
                    .Where(ExprHelper.LocCode(model.StartLoc))
                    .Where(ExprHelper.LocIsFree)
                    .Where(ExprHelper.LocIsEmpty.Negate()).First();
                if (startLoc == null) {
                    return BuildSimpleResult(2, $"起点位置 '{model.StartLoc}' 不存在或不具备取货要求");
                if (cgDetail == null) {
                    return BuildSimpleResult(2, $"PDA扫码物料信息与贴标机传递的信息不一致:" + JsonConvert.SerializeObject(model));
                }
                // 查看容器与起点货位是否绑定
                var locCntrRel = db.Queryable<TN_Loc_Container>().First(
                    a => a.S_LOC_CODE == startLoc.S_CODE);
                if (locCntrRel == null) {
                    return BuildSimpleResult(3, $"起点位置 '{model.StartLoc}' 无可出库的物料");
                var startLoc = db.Queryable<TN_Location>()
                    .Where(ExprHelper.LocCode(model.StartLoc)) // 指定:起点货位
                    .Where(ExprHelper.LocIsFree)
                    //.Where(ExprHelper.LocIsEmpty)
                    .First();
                if (startLoc == null) {
                    return BuildSimpleResult(3, $"起点位置 '{model.StartLoc}' 不存在或不具备取货要求");
                }
                // 绑定货位和容器号
                var locCntrRel = new TN_Loc_Container {
                    S_LOC_CODE = model.StartLoc,
                    S_CNTR_CODE = cgDetail.S_CNTR_CODE,
                    S_CNTR_TYPE = "好运箱",
                };
                if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
                    return BuildSimpleResult(4, $"插入货位容器关系失败:" + JsonConvert.SerializeObject(locCntrRel));
                }
                // TODO 满箱入库算法待优化
                var endLoc = db.Queryable<TN_Location>()
                    .Where(ExprHelper.LocBelongsToArea(AreaName.满箱存放区))
                    .Where(ExprHelper.LocIsFree)
                    .Where(ExprHelper.LocIsFree)
                    .Where(ExprHelper.LocIsEmpty)
                    .OrderBy(l => l.N_LAYER)
                    .OrderBy(l => l.S_AREA_CODE).First();
                if (endLoc == null) {
                    return BuildSimpleResult(4, "满箱入库暂时没有合适的货位可以入库");
                    return BuildSimpleResult(5, "满箱入库暂时没有合适的货位可以入库");
                }
                return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName);
                return TaskHelper.SimpleCreateTask(startLoc.S_CODE, locCntrRel.S_CNTR_CODE, endLoc.S_CODE, taskName, failCode: 6);
            }
            catch (Exception ex) {
                return BuildSimpleResult(1, $"发生了异常:{ex.Message}");
            }
        }
        /// <summary>
        /// 空托盘绑定(PDA)
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static SimpleResult EmptyBindPallet(EmptyBindInfo model) {
            var db = DbHelper.GetDbClient();
        ///// <summary>
        ///// 空托盘绑定(PDA)
        ///// </summary>
        ///// <param name="model"></param>
        ///// <returns></returns>
        //public static SimpleResult EmptyBindPallet(EmptyBindInfo model) {
        //    var db = DbHelper.GetDbClient();
            try {
                var loc = db.Queryable<TN_Location>()
                    .Where(ExprHelper.LocCode(model.LocCode))
                    .Where(ExprHelper.LocBelongsToArea(AreaName.空托盘接驳区))
                    .Where(ExprHelper.LocIsFree)
                    .Where(ExprHelper.LocIsEmpty).First();
        //    try {
        //        var loc = db.Queryable<TN_Location>()
        //            .Where(ExprHelper.LocCode(model.LocCode))
        //            .Where(ExprHelper.LocBelongsToArea(AreaName.空托盘接驳区))
        //            .Where(ExprHelper.LocIsFree)
        //            .Where(ExprHelper.LocIsEmpty).First();
                if (loc == null) {
                    return BuildSimpleResult(2, $"当前货位 '{model.LocCode}' 无法再绑定容器");
                }
        //        if (loc == null) {
        //            return BuildSimpleResult(2, $"当前货位 '{model.LocCode}' 无法再绑定容器");
        //        }
                var locCntrRel = db.Queryable<TN_Loc_Container>()
                    .Where(lc => lc.S_CNTR_CODE == model.LocCode).First();
        //        var locCntrRel = db.Queryable<TN_Loc_Container>()
        //            .Where(lc => lc.S_CNTR_CODE == model.LocCode).First();
                if (locCntrRel != null) {
                    return BuildSimpleResult(3, $"当前容器 '{model.CntrCode}' 已经与 '{locCntrRel.S_LOC_CODE}' 绑定");
                }
        //        if (locCntrRel != null) {
        //            return BuildSimpleResult(3, $"当前容器 '{model.CntrCode}' 已经与 '{locCntrRel.S_LOC_CODE}' 绑定");
        //        }
                //loc.N_CURRENT_NUM = model.PalletCount;
        //        //loc.N_CURRENT_NUM = model.PalletCount;
                locCntrRel = new TN_Loc_Container {
                    S_LOC_CODE = model.LocCode,
                    S_CNTR_CODE = model.CntrCode
                };
        //        locCntrRel = new TN_Loc_Container {
        //            S_LOC_CODE = model.LocCode,
        //            S_CNTR_CODE = model.CntrCode
        //        };
                using (var tran = db.Ado.UseTran()) {
                    if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0
                        && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) {
                        tran.CommitTran();
                        return BuildSimpleResult(0, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 成功");
                    }
                    else {
                        tran.RollbackTran();
                        return BuildSimpleResult(4, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 失败");
                    }
                }
            }
            catch (Exception ex) {
                return BuildSimpleEx(ex);
            }
        }
        //        using (var tran = db.Ado.UseTran()) {
        //            if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0
        //                && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) {
        //                tran.CommitTran();
        //                return BuildSimpleResult(0, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 成功");
        //            }
        //            else {
        //                tran.RollbackTran();
        //                return BuildSimpleResult(4, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 失败");
        //            }
        //        }
        //    }
        //    catch (Exception ex) {
        //        return BuildSimpleEx(ex);
        //    }
        //}
        /// <summary>
        /// 空箱绑定(PDA)
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static SimpleResult EmptyBindGoodpack(EmptyBindInfo model) {
            var db = DbHelper.GetDbClient();
        ///// <summary>
        ///// 空箱绑定(PDA)
        ///// </summary>
        ///// <param name="model"></param>
        ///// <returns></returns>
        //public static SimpleResult EmptyBindGoodpack(EmptyBindInfo model) {
        //    var db = DbHelper.GetDbClient();
            try {
                var loc = db.Queryable<TN_Location>()
                    .Where(ExprHelper.LocCode(model.LocCode))
                    .Where(ExprHelper.LocBelongsToArea(AreaName.空箱接驳区))
                    .Where(ExprHelper.LocIsFree)
                    .Where(ExprHelper.LocIsEmpty).First();
        //    try {
        //        var loc = db.Queryable<TN_Location>()
        //            .Where(ExprHelper.LocCode(model.LocCode))
        //            .Where(ExprHelper.LocBelongsToArea(AreaName.空箱接驳区))
        //            .Where(ExprHelper.LocIsFree)
        //            .Where(ExprHelper.LocIsEmpty).First();
                if (loc == null) {
                    return BuildSimpleResult(2, $"当前货位 '{model.LocCode}' 无法再绑定容器");
                }
        //        if (loc == null) {
        //            return BuildSimpleResult(2, $"当前货位 '{model.LocCode}' 无法再绑定容器");
        //        }
                var locCntrRel = db.Queryable<TN_Loc_Container>()
                    .Where(lc => lc.S_CNTR_CODE == model.LocCode).First();
        //        var locCntrRel = db.Queryable<TN_Loc_Container>()
        //            .Where(lc => lc.S_CNTR_CODE == model.LocCode).First();
                if (locCntrRel != null) {
                    return BuildSimpleResult(3, $"当前容器 '{model.CntrCode}' 已经与 '{locCntrRel.S_LOC_CODE}' 绑定");
                }
        //        if (locCntrRel != null) {
        //            return BuildSimpleResult(3, $"当前容器 '{model.CntrCode}' 已经与 '{locCntrRel.S_LOC_CODE}' 绑定");
        //        }
                loc.N_CURRENT_NUM = 1; // 空箱绑定时容器数必然为 1
        //        loc.N_CURRENT_NUM = 1; // 空箱绑定时容器数必然为 1
                locCntrRel = new TN_Loc_Container {
                    S_LOC_CODE = model.LocCode,
                    S_CNTR_CODE = model.CntrCode
                };
        //        locCntrRel = new TN_Loc_Container {
        //            S_LOC_CODE = model.LocCode,
        //            S_CNTR_CODE = model.CntrCode
        //        };
                using (var tran = db.Ado.UseTran()) {
                    if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0
                        && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) {
                        tran.CommitTran();
                        return BuildSimpleResult(0, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 成功");
                    }
                    else {
                        tran.RollbackTran();
                        return BuildSimpleResult(4, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 失败");
                    }
                }
            }
            catch (Exception ex) {
                return BuildSimpleEx(ex);
            }
        }
        //        using (var tran = db.Ado.UseTran()) {
        //            if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() > 0
        //                && db.Updateable<TN_Location>(loc).UpdateColumns(it => it.N_CURRENT_NUM).ExecuteCommand() > 0) {
        //                tran.CommitTran();
        //                return BuildSimpleResult(0, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 成功");
        //            }
        //            else {
        //                tran.RollbackTran();
        //                return BuildSimpleResult(4, $"绑定容器 '{model.CntrCode}' 与货位 '{model.LocCode}' 失败");
        //            }
        //        }
        //    }
        //    catch (Exception ex) {
        //        return BuildSimpleEx(ex);
        //    }
        //}
        /// <summary>
        /// 托盘-空托入库(PDA)
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static SimpleResult EmptyInboundPallet(EmptyInboundDetailInfo model) {
        public static SimpleResult EmptyInboundPallet(EmptyInboundInfo model) {
            var taskName = TaskName.托盘_空托入库;
            var db = DbHelper.GetDbClient();
            try {
                var startLoc = db.Queryable<TN_Location>()
                    .Where(ExprHelper.LocCode(model.StartLoc))
                    .Where(ExprHelper.LocIsFree)
                    .Where(ExprHelper.LocIsEmpty.Negate()).First();
                    .Where(ExprHelper.LocIsEmpty.Negate())
                    .First();
                if (startLoc == null) {
                    return BuildSimpleResult(2, $"起点位置 '{model.StartLoc}' 不存在或不具备取货要求");
                }
                // 查看容器与起点货位是否绑定
                var locCntrRel = db.Queryable<TN_Loc_Container>().First(
                    a => a.S_LOC_CODE == model.StartLoc
                    && a.S_CNTR_CODE == model.CntId);
                var locCntrRel = db.Queryable<TN_Loc_Container>()
                    .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode)
                    .First();
                if (locCntrRel == null) {
                    return BuildSimpleResult(3, $"起点位置 '{model.StartLoc}' 没有绑定容器 '{model.CntId}'");
                    return BuildSimpleResult(3, $"起点位置 '{model.StartLoc}' 没有绑定容器 '{model.CntrCode}'");
                }
                // TODO 暂定选择最低层按区位顺序入库,后面待修改
@@ -216,7 +231,7 @@
        /// 好运箱-空箱入库(PDA)
        /// </summary>
        /// <returns></returns>
        public static SimpleResult EmptyInboundGoodpack(EmptyInboundDetailInfo model) {
        public static SimpleResult EmptyInboundGoodpack(EmptyInboundInfo model) {
            var taskName = TaskName.好运箱_空箱入库;
            var db = DbHelper.GetDbClient();
@@ -231,11 +246,12 @@
                }
                // 查看容器与起点货位是否绑定
                var locCntrRel = db.Queryable<TN_Loc_Container>().First(
                    a => a.S_LOC_CODE == model.StartLoc
                    && a.S_CNTR_CODE == model.CntId);
                var locCntrRel = db.Queryable<TN_Loc_Container>()
                    .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode)
                    .First();
                if (locCntrRel == null) {
                    return BuildSimpleResult(3, $"起点位置 '{model.StartLoc}' 没有绑定容器 '{model.CntId}'");
                    return BuildSimpleResult(3, $"起点位置 '{model.StartLoc}' 没有绑定容器 '{model.CntrCode}'");
                }
                // TODO 暂定选择最低层按区位顺序入库,后面待修改
@@ -394,28 +410,31 @@
                return BuildSimpleEx(ex);
            }
        }
        /// <summary>
        /// 抽检-合格回库(PDA)
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static SimpleResult QualifiedBack(QualifiedBackInfo model) {
            var db = DbHelper.GetDbClient();
            try {
                var cgDetail = db.Queryable<TN_CG_Detail>()
                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_CNTR_CODE == model.CntrCode)
                    .First();
                
                if (cgDetail == null) {
                    return BuildSimpleResult(2, "没有找到待回库的抽检物料");
                    return BuildSimpleResult(2, "没有找到待回库的抽检物料:" + JsonConvert.SerializeObject(model));
                }
                cgDetail.N_ITEM_STATE = 0;
                cgDetail.S_ITEM_STATE = "合格";
                // TODO 不需要联立三个表
                var startLocCntrRel = db.Queryable<TN_Location, TN_Loc_Container>
                    ((l, c) => l.S_CODE == c.S_LOC_CODE)
                    .Where(ExprHelper.LocIsFree)
                    .Select((l, c) => c)
                    .Where((l, c) => c.S_CNTR_CODE == cgDetail.S_CNTR_CODE) // 指定容器号
                    .Where(ExprHelper.LocIsFree) // NOTE 检查
                    .Select((l, c) => c) // 筛选 Loc_Container
                    .First();
                if (startLocCntrRel == null) {
@@ -468,7 +487,6 @@
                cgDetail.N_ITEM_STATE = 2;
                cgDetail.S_ITEM_STATE = "不合格";
                // TODO 不需要联立三个表
                var startLocCntrRel = db.Queryable<TN_Location, TN_Loc_Container>
                    ((l, c) => l.S_CODE == c.S_LOC_CODE)
                    .Where(ExprHelper.LocIsFree)
@@ -573,6 +591,7 @@
                            S_ITEM_CODE = cgDetail.S_ITEM_CODE,
                            S_BATCH_NO = cgDetail.S_BATCH_NO,
                            S_CNTR_CODE = cgDetail.S_CNTR_CODE,
                            N_COUNT = cgDetail.N_QTY,
                            S_END_AREA = model.EndArea
                        };
@@ -585,9 +604,9 @@
                    var order = new TN_Outbound_Order {
                        S_NO = orderNo,
                        S_ITEM_CODE = model.ItemCode,
                        S_BATCH_NO = model.BatchNo,
                        F_QTY = model.Qty,
                        F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
                        S_BATCH = model.BatchNo,
                        N_END_NUM = model.Qty,
                        //F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
                        S_END_AREA = model.EndArea
                    };
@@ -646,9 +665,9 @@
                    var order = new TN_Outbound_Order {
                        S_NO = orderNo,
                        S_ITEM_CODE = model.ItemCode,
                        S_BATCH_NO = model.BatchNo,
                        F_QTY = model.Qty,
                        F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
                        S_BATCH = model.BatchNo,
                        N_END_NUM = model.Qty,
                        //F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
                        S_END_AREA = model.EndArea
                    };
@@ -692,7 +711,7 @@
                    .OrderBy(d => d.N_QTY, OrderByType.Desc)
                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
                if (sortedMaterials.Count == 0)//没有满足条件的
                if (sortedMaterials.Count == 0) //没有满足条件的
                {
                    return result;
                }
Services/WmsService.cs
New file
@@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HH.WCS.Mobox3.DSZSH.AppStart;
using HH.WCS.Mobox3.DSZSH.Helpers;
using HH.WCS.Mobox3.DSZSH.Models;
using Newtonsoft.Json;
using static HH.WCS.Mobox3.DSZSH.Dtos.Request.WmsRequest;
using static HH.WCS.Mobox3.DSZSH.Dtos.Response.WmsResponse;
namespace HH.WCS.Mobox3.DSZSH.Services {
    public class WmsService {
        /// <summary>
        /// 博实物料信息下发同步
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static WmsResult CgInfoSync(CgInfoSyncInfo model) {
            var db = DbHelper.GetDbClient();
            var random = new Random();
            try {
                var detail = new TN_CG_Detail {
                    S_ITEM_CODE = model.ItemCode,
                    S_ITEM_NAME = model.ItemName,
                    S_CNTR_CODE = Guid.NewGuid().ToString("D"), // NOTE 容器号:目前随机(后期可能会指定,或者PDA绑定时再填入)
                    S_BATCH_NO = model.BatchNo,
                    S_STANDARD = model.Standard,
                    S_NET_WEIGHT = model.NetWeight,
                    S_QUALITY_GRADE = model.QualityGrade,
                    N_PRODUCT_LINE = random.Next(0, 3), // NOTE 产线号:目前随机(后期可能会指定,或者PDA绑定时再填入)
                };
                // 货位容器绑定的逻辑,在好运箱下线PDA的流程中操作
                //var locCntrRel = new TN_Loc_Container {
                //    //S_LOC_CODE = Settings.Config.ProductionLines[detail.N_PRODUCT_LINE].OffLoc[0], // 好运箱的位置是操作区,不是产线
                //    S_CNTR_CODE = detail.S_CNTR_CODE,
                //    S_CNTR_TYPE = "好运箱", // 贴标机只针对好运箱
                //};
                //using (var tran = db.Ado.UseTran()) {
                //    if (db.Insertable<TN_CG_Detail>(detail).ExecuteCommand() <= 0
                //        && db.Insertable<TN_Loc_Container>(detail).ExecuteCommand() <= 0) {
                //        tran.RollbackTran();
                //        return MesResultBuilder(2, "插入物料信息失败:" + JsonConvert.SerializeObject(detail));
                //    }
                //    tran.CommitTran();
                //}
                if (db.Insertable<TN_CG_Detail>(detail).ExecuteCommand() <= 0) {
                    return MesResultBuilder(2, "插入物料信息失败:" + JsonConvert.SerializeObject(detail));
                }
                return MesResultBuilder(0, "插入物料信息成功");
            }
            catch (Exception ex) {
                return MesResultBuilder(1, ex.Message);
            }
        }
    }
}
config/config.json
@@ -1,7 +1,7 @@
{
    "WebApiUrl": "http://192.168.1.141:8901/",
    "WebApiUrl": "http://192.168.1.141:8901",
    "NdcApiUrl": "http://127.0.0.1:5201/api/order/",
    "SqlServer": "Data Source=(local);Initial Catalog=DSZSHTest;User ID=sa;Password=123456;",
    "SqlServer": "Data Source=192.168.1.87;Initial Catalog=AMS_OIMobox;User ID=sa;Password=123456;",
    "TcpServerIp": "127.0.0.1",
    "TcpServerPort": 8085,
    "Areas": [
@@ -108,12 +108,6 @@
        },
        {
            "Name": "成品胶出库"
        },
        {
            "Name": "托盘-空托绑定"
        },
        {
            "Name": "好运箱-空箱绑定"
        }
    ],
    "ProductionLines": [