{"id":62476,"date":"2026-01-20T00:58:36","date_gmt":"2026-01-19T16:58:36","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/62476.html"},"modified":"2026-01-20T00:58:36","modified_gmt":"2026-01-19T16:58:36","slug":"erp-mes%e8%ae%a1%e5%88%92%e6%8e%92%e7%a8%8b%e5%b7%a5%e4%bd%9c%e5%8f%b0%e7%95%8c%e9%9d%a2%e7%bb%84%e4%bb%b6","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/62476.html","title":{"rendered":"ERP\/MES\u8ba1\u5212\u6392\u7a0b\u5de5\u4f5c\u53f0\u754c\u9762\u7ec4\u4ef6"},"content":{"rendered":"<p>ERP\/MES \u7cfb\u7edf\u5728\u7269\u6599\u8ba1\u5212\u3001\u6392\u7a0b\u3001\u8c03\u62e8\u534f\u540c\u573a\u666f\u4e0b&#xff0c;\u5f00\u53d1\u9762\u5411 \u201c\u591a\u7aef\u6307\u4ee4 \/ \u4e1a\u52a1\u4e3b\u9898\u6c47\u603b\u201d \u7684\u5de5\u4f5c\u53f0&#xff08;\u7aef\u53f0&#xff09;WinForm \u4e2d\u95f4\u4ef6\u754c\u9762\u7ec4\u4ef6&#xff0c;\u6838\u5fc3\u89e3\u51b3\u7269\u6599\u9886\u57df\u591a\u4e1a\u52a1\u4e3b\u9898&#xff08;\u8ba1\u5212\u3001\u6392\u7a0b\u3001\u8c03\u62e8&#xff09;\u3001\u591a\u6307\u4ee4\u7aef&#xff08;ERP \u8ba1\u5212\u7aef\u3001MES \u6267\u884c\u7aef\u3001\u4ed3\u50a8\u7aef\u3001\u4ea7\u7ebf\u7aef\u3001\u91c7\u8d2d\u7aef&#xff09;\u7684\u4e8b\u9879\u96c6\u4e2d\u5c55\u793a\u3001\u6307\u4ee4\u534f\u540c\u3001\u72b6\u6001\u8ffd\u8e2a\u95ee\u9898&#xff0c;\u5b9e\u73b0\u7269\u6599\u5168\u6d41\u7a0b\u7684\u4e00\u7ad9\u5f0f\u7ba1\u63a7\u3002\u4ee5\u4e0b\u662f\u5b8c\u6574\u7684\u8bbe\u8ba1\u4e0e\u5b9e\u73b0\u65b9\u6848&#xff0c;\u5305\u542b\u4e1a\u52a1\u4e3b\u9898\u5efa\u6a21\u3001\u591a\u7aef\u6307\u4ee4\u534f\u540c\u3001WinForm \u5de5\u4f5c\u53f0\u7ec4\u4ef6\u53ca\u53ef\u76f4\u63a5\u843d\u5730\u7684\u4ee3\u7801\u793a\u4f8b\u3002<\/p>\n<h3>\u4e00\u3001 \u7ec4\u4ef6\u6838\u5fc3\u5b9a\u4f4d\u4e0e\u67b6\u6784\u8bbe\u8ba1<\/h3>\n<h4>1. \u6838\u5fc3\u5b9a\u4f4d&#xff08;\u7269\u6599\u8ba1\u5212\u6392\u7a0b\u8c03\u62e8\u534f\u540c&#xff09;<\/h4>\n<table>\n<tr>\u7ef4\u5ea6 \/ \u6a21\u5f0f\u6838\u5fc3\u529f\u80fdERP\/MES \u9002\u914d\u70b9<\/tr>\n<tbody>\n<tr>\n<td>\u4e1a\u52a1\u4e3b\u9898<\/td>\n<td>\u7269\u6599\u8ba1\u5212&#xff08;\u9700\u6c42 \/ \u4f9b\u7ed9&#xff09;\u3001\u7269\u6599\u6392\u7a0b&#xff08;\u4ea7\u80fd \/ \u9f50\u5957&#xff09;\u3001\u7269\u6599\u8c03\u62e8&#xff08;\u8de8\u5382 \/ \u8de8\u7ebf \/ \u8de8\u4ed3&#xff09;<\/td>\n<td>ERP \u7269\u6599\u9700\u6c42\u8ba1\u5212 (MRP)\u3001MES \u7269\u6599\u9f50\u5957\u68c0\u67e5\u3001\u4ed3\u50a8\u8c03\u62e8\u6267\u884c<\/td>\n<\/tr>\n<tr>\n<td>\u591a\u6307\u4ee4\u7aef<\/td>\n<td>ERP \u8ba1\u5212\u7aef\u3001MES \u6267\u884c\u7aef\u3001\u4ed3\u50a8\u7aef\u3001\u4ea7\u7ebf\u7aef\u3001\u91c7\u8d2d\u7aef\u3001\u8d28\u63a7\u7aef<\/td>\n<td>\u6307\u4ee4\u6309\u4e1a\u52a1\u4e3b\u9898\u5206\u7c7b\u3001\u591a\u7aef\u72b6\u6001\u5b9e\u65f6\u540c\u6b65<\/td>\n<\/tr>\n<tr>\n<td>\u5de5\u4f5c\u53f0&#xff08;\u7aef\u53f0&#xff09;<\/td>\n<td>\u4e8b\u9879\u6c47\u603b&#xff08;\u5f85\u529e \/ \u5728\u529e \/ \u5df2\u529e&#xff09;\u3001\u6307\u4ee4\u8ffd\u8e2a\u3001\u5f02\u5e38\u9884\u8b66\u3001\u6570\u636e\u770b\u677f\u3001\u5feb\u901f\u64cd\u4f5c<\/td>\n<td>\u9002\u914d\u7269\u6599\u534f\u540c\u5168\u6d41\u7a0b&#xff0c;\u652f\u6301\u591a\u7ef4\u5ea6\u7b5b\u9009\u3001\u4e00\u952e\u5904\u7406<\/td>\n<\/tr>\n<tr>\n<td>\u6838\u5fc3\u76ee\u6807<\/td>\n<td>\u6253\u7834\u7269\u6599\u8ba1\u5212 &#8211; \u6392\u7a0b &#8211; \u8c03\u62e8\u7684\u4fe1\u606f\u5b64\u5c9b&#xff0c;\u5b9e\u73b0\u591a\u7aef\u6307\u4ee4\u534f\u540c\u3001\u4e8b\u9879\u96c6\u4e2d\u7ba1\u63a7<\/td>\n<td>\u7269\u6599\u9f50\u5957\u7387\u63d0\u5347\u3001\u8c03\u62e8\u6548\u7387\u63d0\u5347\u3001\u5f02\u5e38\u54cd\u5e94\u65f6\u6548\u63d0\u5347<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 style=\"background-color:transparent\">2. \u6574\u4f53\u67b6\u6784&#xff08;WinForm \u4e2d\u95f4\u4ef6\u9002\u914d&#xff09;<\/h4>\n<table>\n<tr>\u5c42\u7ea7\u6838\u5fc3\u7ec4\u4ef6\u6280\u672f\u9009\u578b<\/tr>\n<tbody>\n<tr>\n<td>\u754c\u9762\u5c42<\/td>\n<td>WinForm \u5de5\u4f5c\u53f0\u7ec4\u4ef6&#xff08;\u4e8b\u9879\u6c47\u603b\u9762\u677f\u3001\u6307\u4ee4\u8ffd\u8e2a\u5217\u8868\u3001\u5f02\u5e38\u9884\u8b66\u770b\u677f\u3001\u5feb\u901f\u64cd\u4f5c\u533a&#xff09;<\/td>\n<td>.NET Framework 4.8 &#043; DevExpress&#xff08;\u63a8\u8350&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u4e1a\u52a1\u903b\u8f91\u5c42<\/td>\n<td>\u7269\u6599\u4e3b\u9898\u805a\u5408\u670d\u52a1\u3001\u591a\u7aef\u6307\u4ee4\u8def\u7531\u670d\u52a1\u3001\u4e8b\u9879\u72b6\u6001\u540c\u6b65\u670d\u52a1\u3001\u5f02\u5e38\u9884\u8b66\u670d\u52a1<\/td>\n<td>\u89c2\u5bdf\u8005\u6a21\u5f0f &#043; \u4e8b\u4ef6\u603b\u7ebf &#043; \u89c4\u5219\u5f15\u64ce<\/td>\n<\/tr>\n<tr>\n<td>\u6570\u636e\u8bbf\u95ee\u5c42<\/td>\n<td>\u7269\u6599\u8ba1\u5212 DAO\u3001\u7269\u6599\u6392\u7a0b DAO\u3001\u7269\u6599\u8c03\u62e8 DAO\u3001\u591a\u7aef\u6307\u4ee4\u65e5\u5fd7 DAO<\/td>\n<td>SQL Server &#043; Dapper &#043; \u8bfb\u5199\u5206\u79bb<\/td>\n<\/tr>\n<tr>\n<td>\u57fa\u7840\u652f\u6491\u5c42<\/td>\n<td>\u4e8b\u9879\u5206\u7c7b\u5f15\u64ce\u3001\u6307\u4ee4\u89e3\u6790\u5668\u3001\u8de8\u7ebf\u7a0b\u5de5\u5177\u3001\u7f13\u5b58\u7ec4\u4ef6<\/td>\n<td>Log4net &#043; MemoryCache &#043; Quartz<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>3. \u6838\u5fc3\u6570\u636e\u6a21\u578b&#xff08;\u7269\u6599\u534f\u540c &#043; \u591a\u7aef\u6307\u4ee4&#xff09;<\/h4>\n<p>csharp<\/p>\n<p>\u8fd0\u884c<\/p>\n<p>\/\/ \u7269\u6599\u8ba1\u5212\u4e3b\u6a21\u578b&#xff08;ERP\u5c42\u9762&#xff09;<br \/>\npublic class MaterialPlan<br \/>\n{<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u8ba1\u5212\u7f16\u53f7<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string PlanNo { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u7269\u6599\u7f16\u7801<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string MaterialCode { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u7269\u6599\u540d\u79f0<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string MaterialName { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u9700\u6c42\u6570\u91cf<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public decimal ReqQty { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u4f9b\u7ed9\u6570\u91cf<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public decimal SupplyQty { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u9700\u6c42\u65e5\u671f<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public DateTime ReqDate { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u8ba1\u5212\u72b6\u6001&#xff1a;\u5f85\u786e\u8ba4\/\u5df2\u786e\u8ba4\/\u6267\u884c\u4e2d\/\u5df2\u5b8c\u6210\/\u6682\u505c\/\u53d6\u6d88<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string PlanStatus { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6240\u5c5e\u5de5\u5382\/\u8f66\u95f4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string WorkShop { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u5173\u8054\u5de5\u5355\/\u751f\u4ea7\u8ba2\u5355<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string RelateOrderNo { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u8ba1\u5212\u7c7b\u578b&#xff1a;MRP\u8ba1\u5212\/\u624b\u5de5\u8ba1\u5212\/\u8865\u6599\u8ba1\u5212<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string PlanType { get; set; }<br \/>\n}<\/p>\n<p>\/\/ \u7269\u6599\u6392\u7a0b\u6a21\u578b&#xff08;MES\u5c42\u9762&#xff09;<br \/>\npublic class MaterialSchedule<br \/>\n{<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6392\u7a0bID<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public int ScheduleId { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u5173\u8054\u7269\u6599\u8ba1\u5212\u7f16\u53f7<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string PlanNo { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u7269\u6599\u7f16\u7801<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string MaterialCode { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6392\u7a0b\u6570\u91cf<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public decimal ScheduleQty { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6392\u7a0b\u5f00\u59cb\u65f6\u95f4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public DateTime ScheduleStartTime { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6392\u7a0b\u7ed3\u675f\u65f6\u95f4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public DateTime ScheduleEndTime { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u9f50\u5957\u6570\u91cf<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public decimal KitQty { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u9f50\u5957\u7387(%)<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public decimal KitRate { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6392\u7a0b\u72b6\u6001&#xff1a;\u5f85\u6392\u7a0b\/\u5df2\u6392\u7a0b\/\u9f50\u5957\u68c0\u67e5\u4e2d\/\u5df2\u9f50\u5957\/\u7f3a\u6599\/\u5f02\u5e38<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string ScheduleStatus { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6240\u5c5e\u4ea7\u7ebf<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string LineCode { get; set; }<br \/>\n}<\/p>\n<p>\/\/ \u7269\u6599\u8c03\u62e8\u6a21\u578b&#xff08;\u4ed3\u50a8\/\u8de8\u7ec4\u7ec7\u5c42\u9762&#xff09;<br \/>\npublic class MaterialTransfer<br \/>\n{<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u8c03\u62e8\u5355\u53f7<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string TransferNo { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u7269\u6599\u7f16\u7801<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string MaterialCode { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u8c03\u62e8\u6570\u91cf<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public decimal TransferQty { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u8c03\u51fa\u4ed3\u5e93\/\u8f66\u95f4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string OutWhCode { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u8c03\u5165\u4ed3\u5e93\/\u8f66\u95f4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string InWhCode { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u8c03\u62e8\u72b6\u6001&#xff1a;\u5f85\u8c03\u62e8\/\u8c03\u62e8\u4e2d\/\u5df2\u5b8c\u6210\/\u5df2\u53d6\u6d88\/\u5f02\u5e38<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string TransferStatus { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u8c03\u62e8\u7c7b\u578b&#xff1a;\u8de8\u5382\/\u8de8\u7ebf\/\u8de8\u4ed3\/\u8865\u6599<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string TransferType { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u8ba1\u5212\u8c03\u62e8\u65f6\u95f4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public DateTime PlanTransferTime { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u5b9e\u9645\u8c03\u62e8\u65f6\u95f4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public DateTime? ActualTransferTime { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u5173\u8054\u6392\u7a0bID<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public int? RelateScheduleId { get; set; }<br \/>\n}<\/p>\n<p>\/\/ \u591a\u7aef\u6307\u4ee4\u6a21\u578b&#xff08;\u7269\u6599\u534f\u540c\u4e13\u7528&#xff09;<br \/>\npublic class MaterialCommand<br \/>\n{<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6307\u4ee4ID<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string CommandId { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6307\u4ee4\u6765\u6e90\u7aef&#xff1a;ERP_PLAN\/MES_EXEC\/WH_STORAGE\/PRO_LINE\/PURCHASE\/QUALITY<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string SourceTerminal { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6307\u4ee4\u76ee\u6807\u7aef<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string TargetTerminal { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u4e1a\u52a1\u4e3b\u9898&#xff1a;\u7269\u6599\u8ba1\u5212\/\u7269\u6599\u6392\u7a0b\/\u7269\u6599\u8c03\u62e8\/\u9f50\u5957\u68c0\u67e5\/\u7f3a\u6599\u9884\u8b66<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string BusinessTopic { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6307\u4ee4\u7c7b\u578b&#xff1a;\u8ba1\u5212\u786e\u8ba4\/\u6392\u7a0b\u8c03\u6574\/\u8c03\u62e8\u6267\u884c\/\u9f50\u5957\u68c0\u67e5\/\u7f3a\u6599\u4e0a\u62a5\/\u5f02\u5e38\u5904\u7406<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string CommandType { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u5173\u8054\u5355\u53f7&#xff08;\u8ba1\u5212\/\u6392\u7a0b\/\u8c03\u62e8\u5355\u53f7&#xff09;<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string RelateNo { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u7269\u6599\u7f16\u7801<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string MaterialCode { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6307\u4ee4\u5185\u5bb9&#xff08;JSON&#xff09;<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string CommandContent { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6307\u4ee4\u72b6\u6001&#xff1a;\u5f85\u5904\u7406\/\u5df2\u63a5\u6536\/\u5df2\u6267\u884c\/\u6267\u884c\u5931\u8d25\/\u5df2\u56de\u6eda<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string CommandStatus { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6307\u4ee4\u4f18\u5148\u7ea7&#xff1a;\u9ad8\/\u4e2d\/\u4f4e<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string Priority { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6307\u4ee4\u521b\u5efa\u65f6\u95f4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public DateTime CreateTime { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6307\u4ee4\u6267\u884c\u65f6\u95f4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public DateTime? ExecuteTime { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u5904\u7406\u4eba<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string Handler { get; set; }<br \/>\n}<\/p>\n<p>\/\/ \u5de5\u4f5c\u53f0\u4e8b\u9879\u6a21\u578b&#xff08;\u805a\u5408\u591a\u4e1a\u52a1\u4e3b\u9898&#xff09;<br \/>\npublic class WorkbenchItem<br \/>\n{<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u4e8b\u9879ID<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string ItemId { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u4e8b\u9879\u6807\u9898<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string ItemTitle { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u4e1a\u52a1\u4e3b\u9898&#xff1a;\u7269\u6599\u8ba1\u5212\/\u7269\u6599\u6392\u7a0b\/\u7269\u6599\u8c03\u62e8<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string BusinessTopic { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u4e8b\u9879\u7c7b\u578b&#xff1a;\u5f85\u529e\/\u5728\u529e\/\u5df2\u529e\/\u9884\u8b66\/\u5f02\u5e38<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string ItemType { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u5173\u8054\u5355\u53f7<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string RelateNo { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u7269\u6599\u7f16\u7801<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string MaterialCode { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u7269\u6599\u540d\u79f0<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string MaterialName { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6570\u91cf<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public decimal Qty { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u72b6\u6001<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string Status { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u4f18\u5148\u7ea7&#xff1a;\u9ad8\/\u4e2d\/\u4f4e<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string Priority { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u622a\u6b62\u65f6\u95f4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public DateTime Deadline { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u521b\u5efa\u65f6\u95f4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public DateTime CreateTime { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u5904\u7406\u72b6\u6001&#xff1a;\u672a\u5904\u7406\/\u5904\u7406\u4e2d\/\u5df2\u5904\u7406\/\u65e0\u9700\u5904\u7406<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string HandleStatus { get; set; }<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6240\u5c5e\u6307\u4ee4\u7aef<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public string Terminal { get; set; }<br \/>\n}<\/p>\n<h3>\u4e8c\u3001 \u6838\u5fc3\u4e1a\u52a1\u7ec4\u4ef6\u5b9e\u73b0&#xff08;\u7269\u6599\u534f\u540c &#043; \u5de5\u4f5c\u53f0\u805a\u5408&#xff09;<\/h3>\n<h4>1. \u7269\u6599\u5de5\u4f5c\u53f0\u4e8b\u9879\u805a\u5408\u670d\u52a1&#xff08;\u6838\u5fc3&#xff09;<\/h4>\n<p>csharp<\/p>\n<p>\u8fd0\u884c<\/p>\n<p>\/\/\/ &lt;summary&gt;<br \/>\n\/\/\/ \u7269\u6599\u5de5\u4f5c\u53f0\u4e8b\u9879\u805a\u5408\u670d\u52a1&#xff08;\u6574\u5408\u8ba1\u5212\/\u6392\u7a0b\/\u8c03\u62e8\u591a\u4e1a\u52a1\u4e3b\u9898&#xff09;<br \/>\n\/\/\/ &lt;\/summary&gt;<br \/>\npublic class MaterialWorkbenchAggregationService<br \/>\n{<br \/>\n    private readonly IDbConnection _dbConn;<br \/>\n    private readonly LogHelper _logHelper;<\/p>\n<p>    public MaterialWorkbenchAggregationService(string connStr)<br \/>\n    {<br \/>\n        _dbConn &#061; new SqlConnection(connStr);<br \/>\n        _logHelper &#061; new LogHelper();<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u805a\u5408\u5de5\u4f5c\u53f0\u4e8b\u9879&#xff08;\u591a\u4e1a\u52a1\u4e3b\u9898&#xff09;<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public List&lt;WorkbenchItem&gt; AggregateWorkbenchItems(<br \/>\n        string itemType &#061; &#034;&#034;,<br \/>\n        string businessTopic &#061; &#034;&#034;,<br \/>\n        string terminal &#061; &#034;&#034;,<br \/>\n        DateTime? startTime &#061; null,<br \/>\n        string materialCode &#061; &#034;&#034;)<br \/>\n    {<br \/>\n        try<br \/>\n        {<br \/>\n            var items &#061; new List&lt;WorkbenchItem&gt;();<\/p>\n<p>            \/\/ 1. \u805a\u5408\u7269\u6599\u8ba1\u5212\u4e8b\u9879<br \/>\n            items.AddRange(AggregateMaterialPlanItems(itemType, businessTopic, startTime, materialCode));<\/p>\n<p>            \/\/ 2. \u805a\u5408\u7269\u6599\u6392\u7a0b\u4e8b\u9879<br \/>\n            items.AddRange(AggregateMaterialScheduleItems(itemType, businessTopic, startTime, materialCode));<\/p>\n<p>            \/\/ 3. \u805a\u5408\u7269\u6599\u8c03\u62e8\u4e8b\u9879<br \/>\n            items.AddRange(AggregateMaterialTransferItems(itemType, businessTopic, startTime, materialCode));<\/p>\n<p>            \/\/ 4. \u6309\u7ec8\u7aef\u7b5b\u9009<br \/>\n            if (!string.IsNullOrEmpty(terminal))<br \/>\n            {<br \/>\n                items &#061; items.Where(i &#061;&gt; i.Terminal &#061;&#061; terminal).ToList();<br \/>\n            }<\/p>\n<p>            \/\/ 5. \u6309\u4f18\u5148\u7ea7\u6392\u5e8f&#xff08;\u9ad8\u2192\u4e2d\u2192\u4f4e&#xff09;&#043; \u622a\u6b62\u65f6\u95f4<br \/>\n            items &#061; items.OrderByDescending(i &#061;&gt; i.Priority switch<br \/>\n            {<br \/>\n                &#034;\u9ad8&#034; &#061;&gt; 3,<br \/>\n                &#034;\u4e2d&#034; &#061;&gt; 2,<br \/>\n                &#034;\u4f4e&#034; &#061;&gt; 1,<br \/>\n                _ &#061;&gt; 0<br \/>\n            }).ThenBy(i &#061;&gt; i.Deadline).ToList();<\/p>\n<p>            _logHelper.Info($&#034;\u5de5\u4f5c\u53f0\u4e8b\u9879\u805a\u5408\u5b8c\u6210&#xff0c;\u5171\u805a\u5408{items.Count}\u6761\u4e8b\u9879&#034;);<br \/>\n            return items;<br \/>\n        }<br \/>\n        catch (Exception ex)<br \/>\n        {<br \/>\n            _logHelper.Error($&#034;\u5de5\u4f5c\u53f0\u4e8b\u9879\u805a\u5408\u5931\u8d25&#xff1a;{ex.Message}&#034;, ex);<br \/>\n            return new List&lt;WorkbenchItem&gt;();<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u805a\u5408\u7269\u6599\u8ba1\u5212\u4e8b\u9879<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private List&lt;WorkbenchItem&gt; AggregateMaterialPlanItems(<br \/>\n        string itemType, string businessTopic, DateTime? startTime, string materialCode)<br \/>\n    {<br \/>\n        var planItems &#061; new List&lt;WorkbenchItem&gt;();<br \/>\n        if (string.IsNullOrEmpty(businessTopic) || businessTopic &#061;&#061; &#034;\u7269\u6599\u8ba1\u5212&#034;)<br \/>\n        {<br \/>\n            string sql &#061; &#034;SELECT * FROM MaterialPlan WHERE 1&#061;1 &#034;;<br \/>\n            var param &#061; new DynamicParameters();<\/p>\n<p>            \/\/ \u65f6\u95f4\u7b5b\u9009<br \/>\n            if (startTime.HasValue)<br \/>\n            {<br \/>\n                sql &#043;&#061; &#034;AND ReqDate &gt;&#061; &#064;StartTime &#034;;<br \/>\n                param.Add(&#034;StartTime&#034;, startTime.Value);<br \/>\n            }<\/p>\n<p>            \/\/ \u7269\u6599\u7b5b\u9009<br \/>\n            if (!string.IsNullOrEmpty(materialCode))<br \/>\n            {<br \/>\n                sql &#043;&#061; &#034;AND MaterialCode &#061; &#064;MaterialCode &#034;;<br \/>\n                param.Add(&#034;MaterialCode&#034;, materialCode);<br \/>\n            }<\/p>\n<p>            \/\/ \u72b6\u6001\u7b5b\u9009&#xff08;\u5bf9\u5e94\u4e8b\u9879\u7c7b\u578b&#xff09;<br \/>\n            if (!string.IsNullOrEmpty(itemType))<br \/>\n            {<br \/>\n                switch (itemType)<br \/>\n                {<br \/>\n                    case &#034;\u5f85\u529e&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND PlanStatus IN (&#039;\u5f85\u786e\u8ba4&#039;) &#034;;<br \/>\n                        break;<br \/>\n                    case &#034;\u5728\u529e&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND PlanStatus IN (&#039;\u5df2\u786e\u8ba4&#039;, &#039;\u6267\u884c\u4e2d&#039;) &#034;;<br \/>\n                        break;<br \/>\n                    case &#034;\u5df2\u529e&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND PlanStatus IN (&#039;\u5df2\u5b8c\u6210&#039;, &#039;\u53d6\u6d88&#039;) &#034;;<br \/>\n                        break;<br \/>\n                    case &#034;\u9884\u8b66&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND PlanStatus IN (&#039;\u6682\u505c&#039;) AND ReqDate &lt; GETDATE() &#034;;<br \/>\n                        break;<br \/>\n                    case &#034;\u5f02\u5e38&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND PlanStatus IN (&#039;\u5f02\u5e38&#039;) &#034;;<br \/>\n                        break;<br \/>\n                }<br \/>\n            }<\/p>\n<p>            var plans &#061; _dbConn.Query&lt;MaterialPlan&gt;(sql, param);<br \/>\n            foreach (var plan in plans)<br \/>\n            {<br \/>\n                planItems.Add(new WorkbenchItem<br \/>\n                {<br \/>\n                    ItemId &#061; $&#034;PLAN_{plan.PlanNo}&#034;,<br \/>\n                    ItemTitle &#061; $&#034;\u7269\u6599\u8ba1\u5212\u786e\u8ba4 &#8211; {plan.MaterialName}({plan.MaterialCode})&#034;,<br \/>\n                    BusinessTopic &#061; &#034;\u7269\u6599\u8ba1\u5212&#034;,<br \/>\n                    ItemType &#061; GetPlanItemType(plan.PlanStatus, plan.ReqDate),<br \/>\n                    RelateNo &#061; plan.PlanNo,<br \/>\n                    MaterialCode &#061; plan.MaterialCode,<br \/>\n                    MaterialName &#061; plan.MaterialName,<br \/>\n                    Qty &#061; plan.ReqQty &#8211; plan.SupplyQty,<br \/>\n                    Status &#061; plan.PlanStatus,<br \/>\n                    Priority &#061; plan.ReqDate &lt; DateTime.Now ? &#034;\u9ad8&#034; : &#034;\u4e2d&#034;,<br \/>\n                    Deadline &#061; plan.ReqDate,<br \/>\n                    CreateTime &#061; DateTime.Now, \/\/ \u5b9e\u9645\u5e94\u53d6\u8ba1\u5212\u521b\u5efa\u65f6\u95f4<br \/>\n                    HandleStatus &#061; plan.PlanStatus &#061;&#061; &#034;\u5f85\u786e\u8ba4&#034; ? &#034;\u672a\u5904\u7406&#034; : &#034;\u5df2\u5904\u7406&#034;,<br \/>\n                    Terminal &#061; &#034;ERP_PLAN&#034;<br \/>\n                });<br \/>\n            }<br \/>\n        }<br \/>\n        return planItems;<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u805a\u5408\u7269\u6599\u6392\u7a0b\u4e8b\u9879<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private List&lt;WorkbenchItem&gt; AggregateMaterialScheduleItems(<br \/>\n        string itemType, string businessTopic, DateTime? startTime, string materialCode)<br \/>\n    {<br \/>\n        var scheduleItems &#061; new List&lt;WorkbenchItem&gt;();<br \/>\n        if (string.IsNullOrEmpty(businessTopic) || businessTopic &#061;&#061; &#034;\u7269\u6599\u6392\u7a0b&#034;)<br \/>\n        {<br \/>\n            string sql &#061; &#034;SELECT s.*, m.MaterialName FROM MaterialSchedule s &#034; &#043;<br \/>\n                         &#034;LEFT JOIN MaterialPlan m ON s.PlanNo &#061; m.PlanNo WHERE 1&#061;1 &#034;;<br \/>\n            var param &#061; new DynamicParameters();<\/p>\n<p>            if (startTime.HasValue)<br \/>\n            {<br \/>\n                sql &#043;&#061; &#034;AND s.ScheduleStartTime &gt;&#061; &#064;StartTime &#034;;<br \/>\n                param.Add(&#034;StartTime&#034;, startTime.Value);<br \/>\n            }<\/p>\n<p>            if (!string.IsNullOrEmpty(materialCode))<br \/>\n            {<br \/>\n                sql &#043;&#061; &#034;AND s.MaterialCode &#061; &#064;MaterialCode &#034;;<br \/>\n                param.Add(&#034;MaterialCode&#034;, materialCode);<br \/>\n            }<\/p>\n<p>            if (!string.IsNullOrEmpty(itemType))<br \/>\n            {<br \/>\n                switch (itemType)<br \/>\n                {<br \/>\n                    case &#034;\u5f85\u529e&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND s.ScheduleStatus IN (&#039;\u5f85\u6392\u7a0b&#039;, &#039;\u9f50\u5957\u68c0\u67e5\u4e2d&#039;) &#034;;<br \/>\n                        break;<br \/>\n                    case &#034;\u5728\u529e&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND s.ScheduleStatus IN (&#039;\u5df2\u6392\u7a0b&#039;) &#034;;<br \/>\n                        break;<br \/>\n                    case &#034;\u5df2\u529e&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND s.ScheduleStatus IN (&#039;\u5df2\u9f50\u5957&#039;) &#034;;<br \/>\n                        break;<br \/>\n                    case &#034;\u9884\u8b66&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND s.KitRate &lt; 100 AND s.ScheduleEndTime &lt; GETDATE() &#034;;<br \/>\n                        break;<br \/>\n                    case &#034;\u5f02\u5e38&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND s.ScheduleStatus IN (&#039;\u7f3a\u6599&#039;, &#039;\u5f02\u5e38&#039;) &#034;;<br \/>\n                        break;<br \/>\n                }<br \/>\n            }<\/p>\n<p>            var schedules &#061; _dbConn.Query(sql, param);<br \/>\n            foreach (var schedule in schedules)<br \/>\n            {<br \/>\n                scheduleItems.Add(new WorkbenchItem<br \/>\n                {<br \/>\n                    ItemId &#061; $&#034;SCHEDULE_{schedule.ScheduleId}&#034;,<br \/>\n                    ItemTitle &#061; $&#034;\u7269\u6599\u6392\u7a0b\u9f50\u5957\u68c0\u67e5 &#8211; {schedule.MaterialName}({schedule.MaterialCode})&#034;,<br \/>\n                    BusinessTopic &#061; &#034;\u7269\u6599\u6392\u7a0b&#034;,<br \/>\n                    ItemType &#061; GetScheduleItemType(schedule.ScheduleStatus, schedule.KitRate, schedule.ScheduleEndTime),<br \/>\n                    RelateNo &#061; schedule.ScheduleId.ToString(),<br \/>\n                    MaterialCode &#061; schedule.MaterialCode,<br \/>\n                    MaterialName &#061; schedule.MaterialName,<br \/>\n                    Qty &#061; schedule.ScheduleQty &#8211; schedule.KitQty,<br \/>\n                    Status &#061; schedule.ScheduleStatus,<br \/>\n                    Priority &#061; schedule.KitRate &lt; 80 ? &#034;\u9ad8&#034; : (schedule.KitRate &lt; 100 ? &#034;\u4e2d&#034; : &#034;\u4f4e&#034;),<br \/>\n                    Deadline &#061; schedule.ScheduleEndTime,<br \/>\n                    CreateTime &#061; DateTime.Now,<br \/>\n                    HandleStatus &#061; schedule.ScheduleStatus &#061;&#061; &#034;\u5f85\u6392\u7a0b&#034; ? &#034;\u672a\u5904\u7406&#034; : &#034;\u5df2\u5904\u7406&#034;,<br \/>\n                    Terminal &#061; &#034;MES_EXEC&#034;<br \/>\n                });<br \/>\n            }<br \/>\n        }<br \/>\n        return scheduleItems;<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u805a\u5408\u7269\u6599\u8c03\u62e8\u4e8b\u9879<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private List&lt;WorkbenchItem&gt; AggregateMaterialTransferItems(<br \/>\n        string itemType, string businessTopic, DateTime? startTime, string materialCode)<br \/>\n    {<br \/>\n        var transferItems &#061; new List&lt;WorkbenchItem&gt;();<br \/>\n        if (string.IsNullOrEmpty(businessTopic) || businessTopic &#061;&#061; &#034;\u7269\u6599\u8c03\u62e8&#034;)<br \/>\n        {<br \/>\n            string sql &#061; &#034;SELECT t.*, m.MaterialName FROM MaterialTransfer t &#034; &#043;<br \/>\n                         &#034;LEFT JOIN MaterialPlan m ON t.MaterialCode &#061; m.MaterialCode WHERE 1&#061;1 &#034;;<br \/>\n            var param &#061; new DynamicParameters();<\/p>\n<p>            if (startTime.HasValue)<br \/>\n            {<br \/>\n                sql &#043;&#061; &#034;AND t.PlanTransferTime &gt;&#061; &#064;StartTime &#034;;<br \/>\n                param.Add(&#034;StartTime&#034;, startTime.Value);<br \/>\n            }<\/p>\n<p>            if (!string.IsNullOrEmpty(materialCode))<br \/>\n            {<br \/>\n                sql &#043;&#061; &#034;AND t.MaterialCode &#061; &#064;MaterialCode &#034;;<br \/>\n                param.Add(&#034;MaterialCode&#034;, materialCode);<br \/>\n            }<\/p>\n<p>            if (!string.IsNullOrEmpty(itemType))<br \/>\n            {<br \/>\n                switch (itemType)<br \/>\n                {<br \/>\n                    case &#034;\u5f85\u529e&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND t.TransferStatus IN (&#039;\u5f85\u8c03\u62e8&#039;) &#034;;<br \/>\n                        break;<br \/>\n                    case &#034;\u5728\u529e&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND t.TransferStatus IN (&#039;\u8c03\u62e8\u4e2d&#039;) &#034;;<br \/>\n                        break;<br \/>\n                    case &#034;\u5df2\u529e&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND t.TransferStatus IN (&#039;\u5df2\u5b8c\u6210&#039;) &#034;;<br \/>\n                        break;<br \/>\n                    case &#034;\u9884\u8b66&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND t.TransferStatus IN (&#039;\u5f85\u8c03\u62e8&#039;) AND t.PlanTransferTime &lt; GETDATE() &#034;;<br \/>\n                        break;<br \/>\n                    case &#034;\u5f02\u5e38&#034;:<br \/>\n                        sql &#043;&#061; &#034;AND t.TransferStatus IN (&#039;\u5f02\u5e38&#039;, &#039;\u5df2\u53d6\u6d88&#039;) &#034;;<br \/>\n                        break;<br \/>\n                }<br \/>\n            }<\/p>\n<p>            var transfers &#061; _dbConn.Query(sql, param);<br \/>\n            foreach (var transfer in transfers)<br \/>\n            {<br \/>\n                transferItems.Add(new WorkbenchItem<br \/>\n                {<br \/>\n                    ItemId &#061; $&#034;TRANSFER_{transfer.TransferNo}&#034;,<br \/>\n                    ItemTitle &#061; $&#034;\u7269\u6599\u8c03\u62e8\u6267\u884c &#8211; {transfer.MaterialName}({transfer.MaterialCode})&#034;,<br \/>\n                    BusinessTopic &#061; &#034;\u7269\u6599\u8c03\u62e8&#034;,<br \/>\n                    ItemType &#061; GetTransferItemType(transfer.TransferStatus, transfer.PlanTransferTime),<br \/>\n                    RelateNo &#061; transfer.TransferNo,<br \/>\n                    MaterialCode &#061; transfer.MaterialCode,<br \/>\n                    MaterialName &#061; transfer.MaterialName,<br \/>\n                    Qty &#061; transfer.TransferQty,<br \/>\n                    Status &#061; transfer.TransferStatus,<br \/>\n                    Priority &#061; transfer.PlanTransferTime &lt; DateTime.Now ? &#034;\u9ad8&#034; : &#034;\u4e2d&#034;,<br \/>\n                    Deadline &#061; transfer.PlanTransferTime,<br \/>\n                    CreateTime &#061; DateTime.Now,<br \/>\n                    HandleStatus &#061; transfer.TransferStatus &#061;&#061; &#034;\u5f85\u8c03\u62e8&#034; ? &#034;\u672a\u5904\u7406&#034; : &#034;\u5df2\u5904\u7406&#034;,<br \/>\n                    Terminal &#061; &#034;WH_STORAGE&#034;<br \/>\n                });<br \/>\n            }<br \/>\n        }<br \/>\n        return transferItems;<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u83b7\u53d6\u8ba1\u5212\u4e8b\u9879\u7c7b\u578b<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private string GetPlanItemType(string planStatus, DateTime reqDate)<br \/>\n    {<br \/>\n        return planStatus switch<br \/>\n        {<br \/>\n            &#034;\u5f85\u786e\u8ba4&#034; &#061;&gt; &#034;\u5f85\u529e&#034;,<br \/>\n            &#034;\u5df2\u786e\u8ba4&#034; or &#034;\u6267\u884c\u4e2d&#034; &#061;&gt; &#034;\u5728\u529e&#034;,<br \/>\n            &#034;\u5df2\u5b8c\u6210&#034; or &#034;\u53d6\u6d88&#034; &#061;&gt; &#034;\u5df2\u529e&#034;,<br \/>\n            &#034;\u6682\u505c&#034; when reqDate &lt; DateTime.Now &#061;&gt; &#034;\u9884\u8b66&#034;,<br \/>\n            &#034;\u5f02\u5e38&#034; &#061;&gt; &#034;\u5f02\u5e38&#034;,<br \/>\n            _ &#061;&gt; &#034;\u5176\u4ed6&#034;<br \/>\n        };<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u83b7\u53d6\u6392\u7a0b\u4e8b\u9879\u7c7b\u578b<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private string GetScheduleItemType(string scheduleStatus, decimal kitRate, DateTime scheduleEndTime)<br \/>\n    {<br \/>\n        if (scheduleStatus &#061;&#061; &#034;\u7f3a\u6599&#034; || scheduleStatus &#061;&#061; &#034;\u5f02\u5e38&#034;) return &#034;\u5f02\u5e38&#034;;<br \/>\n        if (kitRate &lt; 100 &amp;&amp; scheduleEndTime &lt; DateTime.Now) return &#034;\u9884\u8b66&#034;;<br \/>\n        return scheduleStatus switch<br \/>\n        {<br \/>\n            &#034;\u5f85\u6392\u7a0b&#034; or &#034;\u9f50\u5957\u68c0\u67e5\u4e2d&#034; &#061;&gt; &#034;\u5f85\u529e&#034;,<br \/>\n            &#034;\u5df2\u6392\u7a0b&#034; &#061;&gt; &#034;\u5728\u529e&#034;,<br \/>\n            &#034;\u5df2\u9f50\u5957&#034; &#061;&gt; &#034;\u5df2\u529e&#034;,<br \/>\n            _ &#061;&gt; &#034;\u5176\u4ed6&#034;<br \/>\n        };<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u83b7\u53d6\u8c03\u62e8\u4e8b\u9879\u7c7b\u578b<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private string GetTransferItemType(string transferStatus, DateTime planTransferTime)<br \/>\n    {<br \/>\n        if (transferStatus &#061;&#061; &#034;\u5f02\u5e38&#034; || transferStatus &#061;&#061; &#034;\u5df2\u53d6\u6d88&#034;) return &#034;\u5f02\u5e38&#034;;<br \/>\n        if (transferStatus &#061;&#061; &#034;\u5f85\u8c03\u62e8&#034; &amp;&amp; planTransferTime &lt; DateTime.Now) return &#034;\u9884\u8b66&#034;;<br \/>\n        return transferStatus switch<br \/>\n        {<br \/>\n            &#034;\u5f85\u8c03\u62e8&#034; &#061;&gt; &#034;\u5f85\u529e&#034;,<br \/>\n            &#034;\u8c03\u62e8\u4e2d&#034; &#061;&gt; &#034;\u5728\u529e&#034;,<br \/>\n            &#034;\u5df2\u5b8c\u6210&#034; &#061;&gt; &#034;\u5df2\u529e&#034;,<br \/>\n            _ &#061;&gt; &#034;\u5176\u4ed6&#034;<br \/>\n        };<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u83b7\u53d6\u5de5\u4f5c\u53f0\u7edf\u8ba1\u6570\u636e&#xff08;\u9002\u914d\u770b\u677f&#xff09;<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public Dictionary&lt;string, int&gt; GetWorkbenchStatistics()<br \/>\n    {<br \/>\n        var stats &#061; new Dictionary&lt;string, int&gt;();<\/p>\n<p>        \/\/ \u6309\u4e8b\u9879\u7c7b\u578b\u7edf\u8ba1<br \/>\n        var allItems &#061; AggregateWorkbenchItems();<br \/>\n        stats[&#034;\u5f85\u529e\u4e8b\u9879&#034;] &#061; allItems.Count(i &#061;&gt; i.ItemType &#061;&#061; &#034;\u5f85\u529e&#034;);<br \/>\n        stats[&#034;\u5728\u529e\u4e8b\u9879&#034;] &#061; allItems.Count(i &#061;&gt; i.ItemType &#061;&#061; &#034;\u5728\u529e&#034;);<br \/>\n        stats[&#034;\u5df2\u529e\u4e8b\u9879&#034;] &#061; allItems.Count(i &#061;&gt; i.ItemType &#061;&#061; &#034;\u5df2\u529e&#034;);<br \/>\n        stats[&#034;\u9884\u8b66\u4e8b\u9879&#034;] &#061; allItems.Count(i &#061;&gt; i.ItemType &#061;&#061; &#034;\u9884\u8b66&#034;);<br \/>\n        stats[&#034;\u5f02\u5e38\u4e8b\u9879&#034;] &#061; allItems.Count(i &#061;&gt; i.ItemType &#061;&#061; &#034;\u5f02\u5e38&#034;);<\/p>\n<p>        \/\/ \u6309\u4e1a\u52a1\u4e3b\u9898\u7edf\u8ba1<br \/>\n        stats[&#034;\u7269\u6599\u8ba1\u5212&#034;] &#061; allItems.Count(i &#061;&gt; i.BusinessTopic &#061;&#061; &#034;\u7269\u6599\u8ba1\u5212&#034;);<br \/>\n        stats[&#034;\u7269\u6599\u6392\u7a0b&#034;] &#061; allItems.Count(i &#061;&gt; i.BusinessTopic &#061;&#061; &#034;\u7269\u6599\u6392\u7a0b&#034;);<br \/>\n        stats[&#034;\u7269\u6599\u8c03\u62e8&#034;] &#061; allItems.Count(i &#061;&gt; i.BusinessTopic &#061;&#061; &#034;\u7269\u6599\u8c03\u62e8&#034;);<\/p>\n<p>        \/\/ \u6309\u4f18\u5148\u7ea7\u7edf\u8ba1<br \/>\n        stats[&#034;\u9ad8\u4f18\u5148\u7ea7&#034;] &#061; allItems.Count(i &#061;&gt; i.Priority &#061;&#061; &#034;\u9ad8&#034;);<br \/>\n        stats[&#034;\u4e2d\u4f18\u5148\u7ea7&#034;] &#061; allItems.Count(i &#061;&gt; i.Priority &#061;&#061; &#034;\u4e2d&#034;);<br \/>\n        stats[&#034;\u4f4e\u4f18\u5148\u7ea7&#034;] &#061; allItems.Count(i &#061;&gt; i.Priority &#061;&#061; &#034;\u4f4e&#034;);<\/p>\n<p>        return stats;<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u66f4\u65b0\u4e8b\u9879\u5904\u7406\u72b6\u6001<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public bool UpdateItemHandleStatus(string itemId, string handleStatus, string handler)<br \/>\n    {<br \/>\n        try<br \/>\n        {<br \/>\n            \/\/ \u89e3\u6790\u4e8b\u9879\u7c7b\u578b\u548c\u5173\u8054\u5355\u53f7<br \/>\n            var parts &#061; itemId.Split(&#039;_&#039;);<br \/>\n            if (parts.Length &lt; 2) return false;<\/p>\n<p>            var itemType &#061; parts[0];<br \/>\n            var relateNo &#061; parts[1];<\/p>\n<p>            \/\/ \u6839\u636e\u4e8b\u9879\u7c7b\u578b\u66f4\u65b0\u5bf9\u5e94\u4e1a\u52a1\u8868\u72b6\u6001<br \/>\n            switch (itemType)<br \/>\n            {<br \/>\n                case &#034;PLAN&#034;:<br \/>\n                    \/\/ \u66f4\u65b0\u7269\u6599\u8ba1\u5212\u72b6\u6001<br \/>\n                    _dbConn.Execute(<br \/>\n                        &#034;UPDATE MaterialPlan SET PlanStatus &#061; CASE WHEN &#064;HandleStatus&#061;&#039;\u5df2\u5904\u7406&#039; THEN &#039;\u5df2\u786e\u8ba4&#039; ELSE PlanStatus END &#034; &#043;<br \/>\n                        &#034;WHERE PlanNo &#061; &#064;RelateNo&#034;,<br \/>\n                        new { HandleStatus &#061; handleStatus, RelateNo &#061; relateNo });<br \/>\n                    break;<br \/>\n                case &#034;SCHEDULE&#034;:<br \/>\n                    \/\/ \u66f4\u65b0\u7269\u6599\u6392\u7a0b\u72b6\u6001<br \/>\n                    _dbConn.Execute(<br \/>\n                        &#034;UPDATE MaterialSchedule SET ScheduleStatus &#061; CASE WHEN &#064;HandleStatus&#061;&#039;\u5df2\u5904\u7406&#039; THEN &#039;\u9f50\u5957\u68c0\u67e5\u4e2d&#039; ELSE ScheduleStatus END &#034; &#043;<br \/>\n                        &#034;WHERE ScheduleId &#061; &#064;RelateNo&#034;,<br \/>\n                        new { HandleStatus &#061; handleStatus, RelateNo &#061; int.Parse(relateNo) });<br \/>\n                    break;<br \/>\n                case &#034;TRANSFER&#034;:<br \/>\n                    \/\/ \u66f4\u65b0\u7269\u6599\u8c03\u62e8\u72b6\u6001<br \/>\n                    _dbConn.Execute(<br \/>\n                        &#034;UPDATE MaterialTransfer SET TransferStatus &#061; CASE WHEN &#064;HandleStatus&#061;&#039;\u5df2\u5904\u7406&#039; THEN &#039;\u8c03\u62e8\u4e2d&#039; ELSE TransferStatus END &#034; &#043;<br \/>\n                        &#034;WHERE TransferNo &#061; &#064;RelateNo&#034;,<br \/>\n                        new { HandleStatus &#061; handleStatus, RelateNo &#061; relateNo });<br \/>\n                    break;<br \/>\n            }<\/p>\n<p>            _logHelper.Info($&#034;\u5de5\u4f5c\u53f0\u4e8b\u9879{itemId}\u5904\u7406\u72b6\u6001\u5df2\u66f4\u65b0\u4e3a{handleStatus}&#xff0c;\u5904\u7406\u4eba&#xff1a;{handler}&#034;);<br \/>\n            return true;<br \/>\n        }<br \/>\n        catch (Exception ex)<br \/>\n        {<br \/>\n            _logHelper.Error($&#034;\u66f4\u65b0\u4e8b\u9879\u5904\u7406\u72b6\u6001\u5931\u8d25&#xff1a;{ex.Message}&#034;, ex);<br \/>\n            return false;<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<p>\/\/ \u901a\u7528\u65e5\u5fd7\u8f85\u52a9\u7c7b<br \/>\npublic static class LogHelper<br \/>\n{<br \/>\n    private static readonly ILog _log &#061; LogManager.GetLogger(typeof(LogHelper));<br \/>\n    public static void Info(string message) &#061;&gt; _log.Info(message);<br \/>\n    public static void Warn(string message) &#061;&gt; _log.Warn(message);<br \/>\n    public static void Error(string message) &#061;&gt; _log.Error(message);<br \/>\n    public static void Error(string message, Exception ex) &#061;&gt; _log.Error(message, ex);<br \/>\n}<\/p>\n<h4>2. \u591a\u7aef\u6307\u4ee4\u8c03\u5ea6\u670d\u52a1&#xff08;\u7269\u6599\u534f\u540c\u4e13\u7528&#xff09;<\/h4>\n<p>csharp<\/p>\n<p>\u8fd0\u884c<\/p>\n<p>\/\/\/ &lt;summary&gt;<br \/>\n\/\/\/ \u7269\u6599\u534f\u540c\u591a\u7aef\u6307\u4ee4\u8c03\u5ea6\u670d\u52a1&#xff08;\u4e8b\u4ef6\u603b\u7ebf&#043;\u961f\u5217\u6a21\u5f0f&#xff09;<br \/>\n\/\/\/ &lt;\/summary&gt;<br \/>\npublic class MaterialMultiTerminalDispatcher<br \/>\n{<br \/>\n    private readonly IDbConnection _dbConn;<br \/>\n    private readonly LogHelper _logHelper;<br \/>\n    private readonly Queue&lt;MaterialCommand&gt; _commandQueue &#061; new Queue&lt;MaterialCommand&gt;();<br \/>\n    private readonly Thread _commandProcessThread;<br \/>\n    private readonly object _queueLock &#061; new object();<\/p>\n<p>    \/\/ \u6307\u4ee4\u4e8b\u4ef6&#xff08;WinForm\u5de5\u4f5c\u53f0\u8ba2\u9605&#xff09;<br \/>\n    public event EventHandler&lt;MaterialCommandEventArgs&gt; CommandProcessed;<\/p>\n<p>    \/\/ \u6ce8\u518c\u7684\u6307\u4ee4\u7aef<br \/>\n    private readonly List&lt;string&gt; _registeredTerminals &#061; new List&lt;string&gt;<br \/>\n    {<br \/>\n        &#034;ERP_PLAN&#034;,         \/\/ ERP\u8ba1\u5212\u7aef<br \/>\n        &#034;MES_EXEC&#034;,         \/\/ MES\u6267\u884c\u7aef<br \/>\n        &#034;WH_STORAGE&#034;,       \/\/ \u4ed3\u50a8\u7aef<br \/>\n        &#034;PRO_LINE&#034;,         \/\/ \u4ea7\u7ebf\u7aef<br \/>\n        &#034;PURCHASE&#034;,         \/\/ \u91c7\u8d2d\u7aef<br \/>\n        &#034;QUALITY&#034;           \/\/ \u8d28\u63a7\u7aef<br \/>\n    };<\/p>\n<p>    public MaterialMultiTerminalDispatcher(string connStr)<br \/>\n    {<br \/>\n        _dbConn &#061; new SqlConnection(connStr);<br \/>\n        _logHelper &#061; new LogHelper();<\/p>\n<p>        \/\/ \u542f\u52a8\u6307\u4ee4\u5904\u7406\u7ebf\u7a0b<br \/>\n        _commandProcessThread &#061; new Thread(ProcessCommandQueue) { IsBackground &#061; true };<br \/>\n        _commandProcessThread.Start();<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u63d0\u4ea4\u7269\u6599\u534f\u540c\u6307\u4ee4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public bool SubmitCommand(MaterialCommand command)<br \/>\n    {<br \/>\n        try<br \/>\n        {<br \/>\n            \/\/ \u6821\u9a8c\u6307\u4ee4\u7aef<br \/>\n            if (!_registeredTerminals.Contains(command.SourceTerminal) ||<br \/>\n                !_registeredTerminals.Contains(command.TargetTerminal))<br \/>\n            {<br \/>\n                _logHelper.Warn($&#034;\u6307\u4ee4\u7aef\u672a\u6ce8\u518c&#xff1a;\u6765\u6e90&#061;{command.SourceTerminal}&#xff0c;\u76ee\u6807&#061;{command.TargetTerminal}&#034;);<br \/>\n                return false;<br \/>\n            }<\/p>\n<p>            \/\/ \u521d\u59cb\u5316\u6307\u4ee4\u4fe1\u606f<br \/>\n            command.CommandId &#061; Guid.NewGuid().ToString(&#034;N&#034;);<br \/>\n            command.CreateTime &#061; DateTime.Now;<br \/>\n            command.CommandStatus &#061; &#034;\u5f85\u5904\u7406&#034;;<br \/>\n            command.Handler &#061; Environment.UserName;<\/p>\n<p>            \/\/ \u52a0\u5165\u961f\u5217<br \/>\n            lock (_queueLock)<br \/>\n            {<br \/>\n                _commandQueue.Enqueue(command);<br \/>\n            }<\/p>\n<p>            \/\/ \u4fdd\u5b58\u6307\u4ee4\u65e5\u5fd7<br \/>\n            SaveCommandLog(command);<\/p>\n<p>            _logHelper.Info($&#034;\u7269\u6599\u534f\u540c\u6307\u4ee4{command.CommandId}\u5df2\u63d0\u4ea4&#xff0c;\u4e1a\u52a1\u4e3b\u9898&#xff1a;{command.BusinessTopic}&#xff0c;\u7269\u6599&#xff1a;{command.MaterialCode}&#034;);<br \/>\n            return true;<br \/>\n        }<br \/>\n        catch (Exception ex)<br \/>\n        {<br \/>\n            _logHelper.Error($&#034;\u63d0\u4ea4\u6307\u4ee4\u5931\u8d25&#xff1a;{ex.Message}&#034;, ex);<br \/>\n            return false;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u5904\u7406\u6307\u4ee4\u961f\u5217<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void ProcessCommandQueue()<br \/>\n    {<br \/>\n        while (true)<br \/>\n        {<br \/>\n            MaterialCommand command &#061; null;<\/p>\n<p>            \/\/ \u4ece\u961f\u5217\u53d6\u51fa\u6307\u4ee4<br \/>\n            lock (_queueLock)<br \/>\n            {<br \/>\n                if (_commandQueue.Count &gt; 0)<br \/>\n                {<br \/>\n                    command &#061; _commandQueue.Dequeue();<br \/>\n                }<br \/>\n            }<\/p>\n<p>            if (command !&#061; null)<br \/>\n            {<br \/>\n                try<br \/>\n                {<br \/>\n                    \/\/ \u6267\u884c\u6307\u4ee4<br \/>\n                    ExecuteCommand(command);<br \/>\n                    command.CommandStatus &#061; &#034;\u5df2\u6267\u884c&#034;;<br \/>\n                    command.ExecuteTime &#061; DateTime.Now;<br \/>\n                    _logHelper.Info($&#034;\u6307\u4ee4{command.CommandId}\u6267\u884c\u6210\u529f&#034;);<br \/>\n                }<br \/>\n                catch (Exception ex)<br \/>\n                {<br \/>\n                    command.CommandStatus &#061; &#034;\u6267\u884c\u5931\u8d25&#034;;<br \/>\n                    command.ExecuteTime &#061; DateTime.Now;<br \/>\n                    command.CommandContent &#043;&#061; $&#034;||\u6267\u884c\u5931\u8d25\u539f\u56e0&#xff1a;{ex.Message}&#034;;<br \/>\n                    _logHelper.Error($&#034;\u6267\u884c\u6307\u4ee4{command.CommandId}\u5931\u8d25&#xff1a;{ex.Message}&#034;, ex);<br \/>\n                }<br \/>\n                finally<br \/>\n                {<br \/>\n                    \/\/ \u66f4\u65b0\u6307\u4ee4\u65e5\u5fd7<br \/>\n                    UpdateCommandLog(command);<br \/>\n                    \/\/ \u89e6\u53d1\u754c\u9762\u66f4\u65b0\u4e8b\u4ef6<br \/>\n                    OnCommandProcessed(new MaterialCommandEventArgs(command));<br \/>\n                }<br \/>\n            }<br \/>\n            else<br \/>\n            {<br \/>\n                Thread.Sleep(1000); \/\/ \u65e0\u6307\u4ee4\u65f6\u4f11\u7720<br \/>\n            }<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6267\u884c\u5177\u4f53\u6307\u4ee4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void ExecuteCommand(MaterialCommand command)<br \/>\n    {<br \/>\n        switch (command.CommandType)<br \/>\n        {<br \/>\n            case &#034;\u8ba1\u5212\u786e\u8ba4&#034;:<br \/>\n                ExecutePlanConfirmCommand(command);<br \/>\n                break;<br \/>\n            case &#034;\u6392\u7a0b\u8c03\u6574&#034;:<br \/>\n                ExecuteScheduleAdjustCommand(command);<br \/>\n                break;<br \/>\n            case &#034;\u8c03\u62e8\u6267\u884c&#034;:<br \/>\n                ExecuteTransferExecuteCommand(command);<br \/>\n                break;<br \/>\n            case &#034;\u9f50\u5957\u68c0\u67e5&#034;:<br \/>\n                ExecuteKitCheckCommand(command);<br \/>\n                break;<br \/>\n            case &#034;\u7f3a\u6599\u4e0a\u62a5&#034;:<br \/>\n                ExecuteShortageReportCommand(command);<br \/>\n                break;<br \/>\n            case &#034;\u5f02\u5e38\u5904\u7406&#034;:<br \/>\n                ExecuteExceptionHandleCommand(command);<br \/>\n                break;<br \/>\n            default:<br \/>\n                throw new NotSupportedException($&#034;\u4e0d\u652f\u6301\u7684\u6307\u4ee4\u7c7b\u578b&#xff1a;{command.CommandType}&#034;);<br \/>\n        }<br \/>\n    }<\/p>\n<p>    #region \u6307\u4ee4\u6267\u884c\u5177\u4f53\u5b9e\u73b0<br \/>\n    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6267\u884c\u8ba1\u5212\u786e\u8ba4\u6307\u4ee4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void ExecutePlanConfirmCommand(MaterialCommand command)<br \/>\n    {<br \/>\n        var cmdContent &#061; JsonConvert.DeserializeObject&lt;PlanConfirmContent&gt;(command.CommandContent);<\/p>\n<p>        \/\/ \u66f4\u65b0\u7269\u6599\u8ba1\u5212\u72b6\u6001<br \/>\n        _dbConn.Execute(<br \/>\n            &#034;UPDATE MaterialPlan SET PlanStatus&#061;&#039;\u5df2\u786e\u8ba4&#039;, SupplyQty&#061;&#064;SupplyQty WHERE PlanNo&#061;&#064;PlanNo&#034;,<br \/>\n            new { cmdContent.SupplyQty, cmdContent.PlanNo });<\/p>\n<p>        \/\/ \u81ea\u52a8\u521b\u5efa\u6392\u7a0b\u4efb\u52a1<br \/>\n        var plan &#061; _dbConn.QuerySingle&lt;MaterialPlan&gt;(<br \/>\n            &#034;SELECT * FROM MaterialPlan WHERE PlanNo &#061; &#064;PlanNo&#034;,<br \/>\n            new { cmdContent.PlanNo });<\/p>\n<p>        _dbConn.Execute(<br \/>\n            &#034;INSERT INTO MaterialSchedule (PlanNo, MaterialCode, ScheduleQty, ScheduleStartTime, ScheduleEndTime, &#034; &#043;<br \/>\n            &#034;KitQty, KitRate, ScheduleStatus, LineCode) &#034; &#043;<br \/>\n            &#034;VALUES (&#064;PlanNo, &#064;MaterialCode, &#064;ScheduleQty, &#064;ScheduleStartTime, &#064;ScheduleEndTime, 0, 0, &#039;\u5f85\u6392\u7a0b&#039;, &#064;LineCode)&#034;,<br \/>\n            new<br \/>\n            {<br \/>\n                plan.PlanNo,<br \/>\n                plan.MaterialCode,<br \/>\n                ScheduleQty &#061; plan.ReqQty,<br \/>\n                ScheduleStartTime &#061; DateTime.Now,<br \/>\n                ScheduleEndTime &#061; plan.ReqDate.AddHours(-2),<br \/>\n                LineCode &#061; cmdContent.LineCode<br \/>\n            });<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6267\u884c\u6392\u7a0b\u8c03\u6574\u6307\u4ee4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void ExecuteScheduleAdjustCommand(MaterialCommand command)<br \/>\n    {<br \/>\n        var cmdContent &#061; JsonConvert.DeserializeObject&lt;ScheduleAdjustContent&gt;(command.CommandContent);<\/p>\n<p>        _dbConn.Execute(<br \/>\n            &#034;UPDATE MaterialSchedule SET ScheduleQty&#061;&#064;NewQty, ScheduleStartTime&#061;&#064;NewStartTime, &#034; &#043;<br \/>\n            &#034;ScheduleEndTime&#061;&#064;NewEndTime WHERE ScheduleId&#061;&#064;ScheduleId&#034;,<br \/>\n            new { cmdContent.NewQty, cmdContent.NewStartTime, cmdContent.NewEndTime, cmdContent.ScheduleId });<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6267\u884c\u8c03\u62e8\u6267\u884c\u6307\u4ee4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void ExecuteTransferExecuteCommand(MaterialCommand command)<br \/>\n    {<br \/>\n        var cmdContent &#061; JsonConvert.DeserializeObject&lt;TransferExecuteContent&gt;(command.CommandContent);<\/p>\n<p>        \/\/ \u66f4\u65b0\u8c03\u62e8\u72b6\u6001<br \/>\n        _dbConn.Execute(<br \/>\n            &#034;UPDATE MaterialTransfer SET TransferStatus&#061;&#039;\u8c03\u62e8\u4e2d&#039;, ActualTransferTime&#061;GETDATE() WHERE TransferNo&#061;&#064;TransferNo&#034;,<br \/>\n            new { cmdContent.TransferNo });<\/p>\n<p>        \/\/ \u6267\u884c\u5e93\u5b58\u6263\u51cf\/\u589e\u52a0&#xff08;\u7b80\u5316\u7248&#xff09;<br \/>\n        \/\/ \u5b9e\u9645\u573a\u666f\u9700\u5bf9\u63a5WMS\u7cfb\u7edf<br \/>\n        _logHelper.Info($&#034;\u6267\u884c\u5e93\u5b58\u8c03\u62e8&#xff1a;{cmdContent.OutWhCode}\u2192{cmdContent.InWhCode}&#xff0c;\u7269\u6599{command.MaterialCode}&#xff0c;\u6570\u91cf{cmdContent.TransferQty}&#034;);<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6267\u884c\u9f50\u5957\u68c0\u67e5\u6307\u4ee4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void ExecuteKitCheckCommand(MaterialCommand command)<br \/>\n    {<br \/>\n        var cmdContent &#061; JsonConvert.DeserializeObject&lt;KitCheckContent&gt;(command.CommandContent);<\/p>\n<p>        \/\/ \u67e5\u8be2\u5f53\u524d\u5e93\u5b58<br \/>\n        var stockQty &#061; _dbConn.QuerySingle&lt;decimal&gt;(<br \/>\n            &#034;SELECT ISNULL(SUM(StockQty),0) FROM MaterialStock WHERE MaterialCode &#061; &#064;MaterialCode AND WhCode &#061; &#064;WhCode&#034;,<br \/>\n            new { command.MaterialCode, cmdContent.WhCode });<\/p>\n<p>        \/\/ \u66f4\u65b0\u9f50\u5957\u4fe1\u606f<br \/>\n        var schedule &#061; _dbConn.QuerySingle&lt;MaterialSchedule&gt;(<br \/>\n            &#034;SELECT * FROM MaterialSchedule WHERE ScheduleId &#061; &#064;ScheduleId&#034;,<br \/>\n            new { cmdContent.ScheduleId });<\/p>\n<p>        decimal kitRate &#061; stockQty &gt;&#061; schedule.ScheduleQty ? 100 : (stockQty \/ schedule.ScheduleQty) * 100;<\/p>\n<p>        _dbConn.Execute(<br \/>\n            &#034;UPDATE MaterialSchedule SET KitQty&#061;&#064;KitQty, KitRate&#061;&#064;KitRate, &#034; &#043;<br \/>\n            &#034;ScheduleStatus&#061;CASE WHEN &#064;KitRate&#061;100 THEN &#039;\u5df2\u9f50\u5957&#039; ELSE &#039;\u7f3a\u6599&#039; END &#034; &#043;<br \/>\n            &#034;WHERE ScheduleId&#061;&#064;ScheduleId&#034;,<br \/>\n            new { KitQty &#061; stockQty, KitRate &#061; kitRate, cmdContent.ScheduleId });<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6267\u884c\u7f3a\u6599\u4e0a\u62a5\u6307\u4ee4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void ExecuteShortageReportCommand(MaterialCommand command)<br \/>\n    {<br \/>\n        var cmdContent &#061; JsonConvert.DeserializeObject&lt;ShortageReportContent&gt;(command.CommandContent);<\/p>\n<p>        \/\/ \u8bb0\u5f55\u7f3a\u6599\u4fe1\u606f<br \/>\n        _dbConn.Execute(<br \/>\n            &#034;INSERT INTO MaterialShortageLog (MaterialCode, ShortageQty, ReportTime, Reporter, RelateScheduleId, Status) &#034; &#043;<br \/>\n            &#034;VALUES (&#064;MaterialCode, &#064;ShortageQty, GETDATE(), &#064;Reporter, &#064;RelateScheduleId, &#039;\u5f85\u5904\u7406&#039;)&#034;,<br \/>\n            new { command.MaterialCode, cmdContent.ShortageQty, cmdContent.Reporter, cmdContent.RelateScheduleId });<\/p>\n<p>        \/\/ \u66f4\u65b0\u6392\u7a0b\u72b6\u6001<br \/>\n        _dbConn.Execute(<br \/>\n            &#034;UPDATE MaterialSchedule SET ScheduleStatus&#061;&#039;\u7f3a\u6599&#039; WHERE ScheduleId&#061;&#064;ScheduleId&#034;,<br \/>\n            new { cmdContent.RelateScheduleId });<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6267\u884c\u5f02\u5e38\u5904\u7406\u6307\u4ee4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void ExecuteExceptionHandleCommand(MaterialCommand command)<br \/>\n    {<br \/>\n        var cmdContent &#061; JsonConvert.DeserializeObject&lt;ExceptionHandleContent&gt;(command.CommandContent);<\/p>\n<p>        \/\/ \u66f4\u65b0\u5bf9\u5e94\u4e1a\u52a1\u72b6\u6001<br \/>\n        switch (cmdContent.BusinessType)<br \/>\n        {<br \/>\n            case &#034;\u7269\u6599\u8ba1\u5212&#034;:<br \/>\n                _dbConn.Execute(<br \/>\n                    &#034;UPDATE MaterialPlan SET PlanStatus&#061;&#039;\u5df2\u5b8c\u6210&#039; WHERE PlanNo&#061;&#064;RelateNo&#034;,<br \/>\n                    new { cmdContent.RelateNo });<br \/>\n                break;<br \/>\n            case &#034;\u7269\u6599\u6392\u7a0b&#034;:<br \/>\n                _dbConn.Execute(<br \/>\n                    &#034;UPDATE MaterialSchedule SET ScheduleStatus&#061;&#039;\u5df2\u9f50\u5957&#039; WHERE ScheduleId&#061;&#064;RelateNo&#034;,<br \/>\n                    new { RelateNo &#061; int.Parse(cmdContent.RelateNo) });<br \/>\n                break;<br \/>\n            case &#034;\u7269\u6599\u8c03\u62e8&#034;:<br \/>\n                _dbConn.Execute(<br \/>\n                    &#034;UPDATE MaterialTransfer SET TransferStatus&#061;&#039;\u5df2\u5b8c\u6210&#039; WHERE TransferNo&#061;&#064;RelateNo&#034;,<br \/>\n                    new { cmdContent.RelateNo });<br \/>\n                break;<br \/>\n        }<\/p>\n<p>        \/\/ \u8bb0\u5f55\u5f02\u5e38\u5904\u7406\u65e5\u5fd7<br \/>\n        _dbConn.Execute(<br \/>\n            &#034;INSERT INTO MaterialExceptionLog (RelateNo, BusinessType, ExceptionDesc, HandleDesc, HandleTime, Handler) &#034; &#043;<br \/>\n            &#034;VALUES (&#064;RelateNo, &#064;BusinessType, &#064;ExceptionDesc, &#064;HandleDesc, GETDATE(), &#064;Handler)&#034;,<br \/>\n            new { cmdContent.RelateNo, cmdContent.BusinessType, cmdContent.ExceptionDesc, cmdContent.HandleDesc, command.Handler });<br \/>\n    }<br \/>\n    #endregion<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u4fdd\u5b58\u6307\u4ee4\u65e5\u5fd7<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void SaveCommandLog(MaterialCommand command)<br \/>\n    {<br \/>\n        _dbConn.Execute(<br \/>\n            &#034;INSERT INTO MaterialCommandLog (CommandId, SourceTerminal, TargetTerminal, BusinessTopic, &#034; &#043;<br \/>\n            &#034;CommandType, RelateNo, MaterialCode, CommandContent, CommandStatus, Priority, &#034; &#043;<br \/>\n            &#034;CreateTime, ExecuteTime, Handler) &#034; &#043;<br \/>\n            &#034;VALUES (&#064;CommandId, &#064;SourceTerminal, &#064;TargetTerminal, &#064;BusinessTopic, &#034; &#043;<br \/>\n            &#034;&#064;CommandType, &#064;RelateNo, &#064;MaterialCode, &#064;CommandContent, &#064;CommandStatus, &#064;Priority, &#034; &#043;<br \/>\n            &#034;&#064;CreateTime, &#064;ExecuteTime, &#064;Handler)&#034;,<br \/>\n            command);<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u66f4\u65b0\u6307\u4ee4\u65e5\u5fd7<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void UpdateCommandLog(MaterialCommand command)<br \/>\n    {<br \/>\n        _dbConn.Execute(<br \/>\n            &#034;UPDATE MaterialCommandLog SET CommandStatus &#061; &#064;CommandStatus, ExecuteTime &#061; &#064;ExecuteTime, &#034; &#043;<br \/>\n            &#034;CommandContent &#061; &#064;CommandContent, Handler &#061; &#064;Handler WHERE CommandId &#061; &#064;CommandId&#034;,<br \/>\n            new { command.CommandStatus, command.ExecuteTime, command.CommandContent, command.Handler, command.CommandId });<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u83b7\u53d6\u6307\u4ee4\u6c47\u603b&#xff08;\u9002\u914dWinForm\u5c55\u793a&#xff09;<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    public DataTable GetCommandSummary(<br \/>\n        DateTime startTime,<br \/>\n        string businessTopic &#061; &#034;&#034;,<br \/>\n        string commandType &#061; &#034;&#034;,<br \/>\n        string materialCode &#061; &#034;&#034;)<br \/>\n    {<br \/>\n        var dt &#061; new DataTable();<br \/>\n        dt.Columns.Add(&#034;\u6307\u4ee4ID&#034;, typeof(string));<br \/>\n        dt.Columns.Add(&#034;\u4e1a\u52a1\u4e3b\u9898&#034;, typeof(string));<br \/>\n        dt.Columns.Add(&#034;\u6307\u4ee4\u7c7b\u578b&#034;, typeof(string));<br \/>\n        dt.Columns.Add(&#034;\u6765\u6e90\u7aef&#034;, typeof(string));<br \/>\n        dt.Columns.Add(&#034;\u76ee\u6807\u7aef&#034;, typeof(string));<br \/>\n        dt.Columns.Add(&#034;\u7269\u6599\u7f16\u7801&#034;, typeof(string));<br \/>\n        dt.Columns.Add(&#034;\u5173\u8054\u5355\u53f7&#034;, typeof(string));<br \/>\n        dt.Columns.Add(&#034;\u6307\u4ee4\u72b6\u6001&#034;, typeof(string));<br \/>\n        dt.Columns.Add(&#034;\u4f18\u5148\u7ea7&#034;, typeof(string));<br \/>\n        dt.Columns.Add(&#034;\u521b\u5efa\u65f6\u95f4&#034;, typeof(DateTime));<br \/>\n        dt.Columns.Add(&#034;\u5904\u7406\u4eba&#034;, typeof(string));<\/p>\n<p>        string sql &#061; &#034;SELECT CommandId, BusinessTopic, CommandType, SourceTerminal, TargetTerminal, &#034; &#043;<br \/>\n                     &#034;MaterialCode, RelateNo, CommandStatus, Priority, CreateTime, Handler &#034; &#043;<br \/>\n                     &#034;FROM MaterialCommandLog WHERE CreateTime &gt;&#061; &#064;StartTime &#034;;<br \/>\n        var param &#061; new DynamicParameters();<br \/>\n        param.Add(&#034;StartTime&#034;, startTime);<\/p>\n<p>        if (!string.IsNullOrEmpty(businessTopic))<br \/>\n        {<br \/>\n            sql &#043;&#061; &#034;AND BusinessTopic &#061; &#064;BusinessTopic &#034;;<br \/>\n            param.Add(&#034;BusinessTopic&#034;, businessTopic);<br \/>\n        }<br \/>\n        if (!string.IsNullOrEmpty(commandType))<br \/>\n        {<br \/>\n            sql &#043;&#061; &#034;AND CommandType &#061; &#064;CommandType &#034;;<br \/>\n            param.Add(&#034;CommandType&#034;, commandType);<br \/>\n        }<br \/>\n        if (!string.IsNullOrEmpty(materialCode))<br \/>\n        {<br \/>\n            sql &#043;&#061; &#034;AND MaterialCode &#061; &#064;MaterialCode &#034;;<br \/>\n            param.Add(&#034;MaterialCode&#034;, materialCode);<br \/>\n        }<\/p>\n<p>        sql &#043;&#061; &#034;ORDER BY CreateTime DESC&#034;;<\/p>\n<p>        var logs &#061; _dbConn.Query(sql, param);<br \/>\n        foreach (var log in logs)<br \/>\n        {<br \/>\n            dt.Rows.Add(<br \/>\n                log.CommandId,<br \/>\n                log.BusinessTopic,<br \/>\n                log.CommandType,<br \/>\n                log.SourceTerminal,<br \/>\n                log.TargetTerminal,<br \/>\n                log.MaterialCode,<br \/>\n                log.RelateNo,<br \/>\n                log.CommandStatus,<br \/>\n                log.Priority,<br \/>\n                log.CreateTime,<br \/>\n                log.Handler<br \/>\n            );<br \/>\n        }<\/p>\n<p>        return dt;<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u89e6\u53d1\u6307\u4ee4\u5904\u7406\u4e8b\u4ef6<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    protected virtual void OnCommandProcessed(MaterialCommandEventArgs e)<br \/>\n    {<br \/>\n        CommandProcessed?.Invoke(this, e);<br \/>\n    }<br \/>\n}<\/p>\n<p>\/\/ \u6307\u4ee4\u4e8b\u4ef6\u53c2\u6570<br \/>\npublic class MaterialCommandEventArgs : EventArgs<br \/>\n{<br \/>\n    public MaterialCommand Command { get; set; }<br \/>\n    public MaterialCommandEventArgs(MaterialCommand command)<br \/>\n    {<br \/>\n        Command &#061; command;<br \/>\n    }<br \/>\n}<\/p>\n<p>\/\/ \u6307\u4ee4\u5185\u5bb9DTO<br \/>\npublic class PlanConfirmContent { public string PlanNo { get; set; } public decimal SupplyQty { get; set; } public string LineCode { get; set; } }<br \/>\npublic class ScheduleAdjustContent { public int ScheduleId { get; set; } public decimal NewQty { get; set; } public DateTime NewStartTime { get; set; } public DateTime NewEndTime { get; set; } }<br \/>\npublic class TransferExecuteContent { public string TransferNo { get; set; } public string OutWhCode { get; set; } public string InWhCode { get; set; } public decimal TransferQty { get; set; } }<br \/>\npublic class KitCheckContent { public int ScheduleId { get; set; } public string WhCode { get; set; } }<br \/>\npublic class ShortageReportContent { public int RelateScheduleId { get; set; } public decimal ShortageQty { get; set; } public string Reporter { get; set; } }<br \/>\npublic class ExceptionHandleContent { public string RelateNo { get; set; } public string BusinessType { get; set; } public string ExceptionDesc { get; set; } public string HandleDesc { get; set; } }<\/p>\n<h3>\u4e09\u3001 WinForm \u5de5\u4f5c\u53f0\u754c\u9762\u7ec4\u4ef6\u5b9e\u73b0&#xff08;\u6838\u5fc3\u754c\u9762&#xff09;<\/h3>\n<h4>1. \u7269\u6599\u534f\u540c\u5de5\u4f5c\u53f0\u4e3b\u754c\u9762&#xff08;\u6838\u5fc3&#xff09;<\/h4>\n<p>csharp<\/p>\n<p>\u8fd0\u884c<\/p>\n<p>public partial class MaterialWorkbenchMainForm : Form<br \/>\n{<br \/>\n    private readonly MaterialWorkbenchAggregationService _aggregationService;<br \/>\n    private readonly MaterialMultiTerminalDispatcher _dispatcher;<br \/>\n    private readonly string _connStr;<\/p>\n<p>    public MaterialWorkbenchMainForm()<br \/>\n    {<br \/>\n        InitializeComponent();<br \/>\n        _connStr &#061; ConfigHelper.GetConnStr();<br \/>\n        _aggregationService &#061; new MaterialWorkbenchAggregationService(_connStr);<br \/>\n        _dispatcher &#061; new MaterialMultiTerminalDispatcher(_connStr);<br \/>\n        _dispatcher.CommandProcessed &#043;&#061; OnCommandProcessed;<\/p>\n<p>        \/\/ \u521d\u59cb\u5316\u7b5b\u9009\u6761\u4ef6<br \/>\n        InitFilterConditions();<br \/>\n        \/\/ \u52a0\u8f7d\u5de5\u4f5c\u53f0\u6570\u636e<br \/>\n        LoadWorkbenchData();<br \/>\n        \/\/ \u52a0\u8f7d\u6570\u636e\u770b\u677f<br \/>\n        LoadWorkbenchDashboard();<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u521d\u59cb\u5316\u7b5b\u9009\u6761\u4ef6<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void InitFilterConditions()<br \/>\n    {<br \/>\n        \/\/ \u4e8b\u9879\u7c7b\u578b<br \/>\n        cboItemType.Items.AddRange(new string[] { &#034;\u5168\u90e8&#034;, &#034;\u5f85\u529e&#034;, &#034;\u5728\u529e&#034;, &#034;\u5df2\u529e&#034;, &#034;\u9884\u8b66&#034;, &#034;\u5f02\u5e38&#034; });<br \/>\n        cboItemType.SelectedIndex &#061; 0;<\/p>\n<p>        \/\/ \u4e1a\u52a1\u4e3b\u9898<br \/>\n        cboBusinessTopic.Items.AddRange(new string[] { &#034;\u5168\u90e8&#034;, &#034;\u7269\u6599\u8ba1\u5212&#034;, &#034;\u7269\u6599\u6392\u7a0b&#034;, &#034;\u7269\u6599\u8c03\u62e8&#034; });<br \/>\n        cboBusinessTopic.SelectedIndex &#061; 0;<\/p>\n<p>        \/\/ \u6307\u4ee4\u7aef<br \/>\n        cboTerminal.Items.AddRange(new string[] { &#034;\u5168\u90e8&#034;, &#034;ERP_PLAN&#034;, &#034;MES_EXEC&#034;, &#034;WH_STORAGE&#034;, &#034;PRO_LINE&#034;, &#034;PURCHASE&#034;, &#034;QUALITY&#034; });<br \/>\n        cboTerminal.SelectedIndex &#061; 0;<\/p>\n<p>        \/\/ \u65f6\u95f4\u8303\u56f4<br \/>\n        dtpStartTime.Value &#061; DateTime.Today.AddDays(-7);<br \/>\n        dtpEndTime.Value &#061; DateTime.Today;<\/p>\n<p>        \/\/ \u4f18\u5148\u7ea7<br \/>\n        cboPriority.Items.AddRange(new string[] { &#034;\u5168\u90e8&#034;, &#034;\u9ad8&#034;, &#034;\u4e2d&#034;, &#034;\u4f4e&#034; });<br \/>\n        cboPriority.SelectedIndex &#061; 0;<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u52a0\u8f7d\u5de5\u4f5c\u53f0\u6570\u636e<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void LoadWorkbenchData()<br \/>\n    {<br \/>\n        \/\/ \u83b7\u53d6\u7b5b\u9009\u6761\u4ef6<br \/>\n        var itemType &#061; cboItemType.Text &#061;&#061; &#034;\u5168\u90e8&#034; ? &#034;&#034; : cboItemType.Text;<br \/>\n        var businessTopic &#061; cboBusinessTopic.Text &#061;&#061; &#034;\u5168\u90e8&#034; ? &#034;&#034; : cboBusinessTopic.Text;<br \/>\n        var terminal &#061; cboTerminal.Text &#061;&#061; &#034;\u5168\u90e8&#034; ? &#034;&#034; : cboTerminal.Text;<br \/>\n        var materialCode &#061; txtMaterialCode.Text.Trim();<\/p>\n<p>        \/\/ \u805a\u5408\u4e8b\u9879\u6570\u636e<br \/>\n        var items &#061; _aggregationService.AggregateWorkbenchItems(<br \/>\n            itemType, businessTopic, terminal, dtpStartTime.Value, materialCode);<\/p>\n<p>        \/\/ \u6309\u4f18\u5148\u7ea7\u4e8c\u6b21\u7b5b\u9009<br \/>\n        if (cboPriority.Text !&#061; &#034;\u5168\u90e8&#034;)<br \/>\n        {<br \/>\n            items &#061; items.Where(i &#061;&gt; i.Priority &#061;&#061; cboPriority.Text).ToList();<br \/>\n        }<\/p>\n<p>        \/\/ \u7ed1\u5b9a\u5230DataGridView<br \/>\n        dgvWorkbenchItems.DataSource &#061; items;<\/p>\n<p>        \/\/ \u8bbe\u7f6e\u884c\u6837\u5f0f<br \/>\n        SetWorkbenchItemRowStyle();<\/p>\n<p>        \/\/ \u66f4\u65b0\u7edf\u8ba1\u4fe1\u606f<br \/>\n        lblTotalCount.Text &#061; $&#034;\u603b\u8ba1&#xff1a;{items.Count} \u6761&#034;;<br \/>\n        lblTodoCount.Text &#061; $&#034;\u5f85\u529e&#xff1a;{items.Count(i &#061;&gt; i.ItemType &#061;&#061; &#034;\u5f85\u529e&#034;)} \u6761&#034;;<br \/>\n        lblWarningCount.Text &#061; $&#034;\u9884\u8b66&#xff1a;{items.Count(i &#061;&gt; i.ItemType &#061;&#061; &#034;\u9884\u8b66&#034;)} \u6761&#034;;<br \/>\n        lblExceptionCount.Text &#061; $&#034;\u5f02\u5e38&#xff1a;{items.Count(i &#061;&gt; i.ItemType &#061;&#061; &#034;\u5f02\u5e38&#034;)} \u6761&#034;;<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u8bbe\u7f6e\u5de5\u4f5c\u53f0\u4e8b\u9879\u884c\u6837\u5f0f<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void SetWorkbenchItemRowStyle()<br \/>\n    {<br \/>\n        foreach (DataGridViewRow row in dgvWorkbenchItems.Rows)<br \/>\n        {<br \/>\n            if (row.IsNewRow) continue;<\/p>\n<p>            var itemType &#061; row.Cells[&#034;ItemType&#034;].Value.ToString();<br \/>\n            var priority &#061; row.Cells[&#034;Priority&#034;].Value.ToString();<\/p>\n<p>            \/\/ \u6309\u4e8b\u9879\u7c7b\u578b\u8bbe\u7f6e\u80cc\u666f\u8272<br \/>\n            switch (itemType)<br \/>\n            {<br \/>\n                case &#034;\u5f85\u529e&#034;:<br \/>\n                    row.DefaultCellStyle.BackColor &#061; Color.LightYellow;<br \/>\n                    break;<br \/>\n                case &#034;\u9884\u8b66&#034;:<br \/>\n                    row.DefaultCellStyle.BackColor &#061; Color.Orange;<br \/>\n                    row.DefaultCellStyle.ForeColor &#061; Color.White;<br \/>\n                    break;<br \/>\n                case &#034;\u5f02\u5e38&#034;:<br \/>\n                    row.DefaultCellStyle.BackColor &#061; Color.LightCoral;<br \/>\n                    row.DefaultCellStyle.ForeColor &#061; Color.White;<br \/>\n                    break;<br \/>\n                case &#034;\u5df2\u529e&#034;:<br \/>\n                    row.DefaultCellStyle.BackColor &#061; Color.LightGray;<br \/>\n                    break;<br \/>\n            }<\/p>\n<p>            \/\/ \u9ad8\u4f18\u5148\u7ea7\u52a0\u7ea2\u8272\u8fb9\u6846<br \/>\n            if (priority &#061;&#061; &#034;\u9ad8&#034;)<br \/>\n            {<br \/>\n                row.DefaultCellStyle.BorderWidth &#061; 2;<br \/>\n                row.DefaultCellStyle.BorderStyle &#061; DataGridViewBorderStyle.Single;<br \/>\n            }<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u52a0\u8f7d\u5de5\u4f5c\u53f0\u6570\u636e\u770b\u677f<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void LoadWorkbenchDashboard()<br \/>\n    {<br \/>\n        var stats &#061; _aggregationService.GetWorkbenchStatistics();<\/p>\n<p>        \/\/ 1. \u4e8b\u9879\u7c7b\u578b\u5206\u5e03\u997c\u56fe<br \/>\n        chartItemType.Series.Clear();<br \/>\n        var itemTypeSeries &#061; new Series(&#034;\u4e8b\u9879\u7c7b\u578b\u5206\u5e03&#034;, SeriesChartType.Pie);<br \/>\n        itemTypeSeries.Points.Add(new DataPoint(&#034;\u5f85\u529e&#034;, stats[&#034;\u5f85\u529e\u4e8b\u9879&#034;]));<br \/>\n        itemTypeSeries.Points.Add(new DataPoint(&#034;\u5728\u529e&#034;, stats[&#034;\u5728\u529e\u4e8b\u9879&#034;]));<br \/>\n        itemTypeSeries.Points.Add(new DataPoint(&#034;\u5df2\u529e&#034;, stats[&#034;\u5df2\u529e\u4e8b\u9879&#034;]));<br \/>\n        itemTypeSeries.Points.Add(new DataPoint(&#034;\u9884\u8b66&#034;, stats[&#034;\u9884\u8b66\u4e8b\u9879&#034;]));<br \/>\n        itemTypeSeries.Points.Add(new DataPoint(&#034;\u5f02\u5e38&#034;, stats[&#034;\u5f02\u5e38\u4e8b\u9879&#034;]));<br \/>\n        chartItemType.Series.Add(itemTypeSeries);<\/p>\n<p>        \/\/ 2. \u4e1a\u52a1\u4e3b\u9898\u5206\u5e03\u67f1\u72b6\u56fe<br \/>\n        chartBusinessTopic.Series.Clear();<br \/>\n        var topicSeries &#061; new Series(&#034;\u4e1a\u52a1\u4e3b\u9898\u5206\u5e03&#034;, SeriesChartType.Column);<br \/>\n        topicSeries.Points.Add(new DataPoint(&#034;\u7269\u6599\u8ba1\u5212&#034;, stats[&#034;\u7269\u6599\u8ba1\u5212&#034;]));<br \/>\n        topicSeries.Points.Add(new DataPoint(&#034;\u7269\u6599\u6392\u7a0b&#034;, stats[&#034;\u7269\u6599\u6392\u7a0b&#034;]));<br \/>\n        topicSeries.Points.Add(new DataPoint(&#034;\u7269\u6599\u8c03\u62e8&#034;, stats[&#034;\u7269\u6599\u8c03\u62e8&#034;]));<br \/>\n        chartBusinessTopic.Series.Add(topicSeries);<\/p>\n<p>        \/\/ 3. \u4f18\u5148\u7ea7\u5206\u5e03<br \/>\n        chartPriority.Series.Clear();<br \/>\n        var prioritySeries &#061; new Series(&#034;\u4f18\u5148\u7ea7\u5206\u5e03&#034;, SeriesChartType.Bar);<br \/>\n        prioritySeries.Points.Add(new DataPoint(&#034;\u9ad8&#034;, stats[&#034;\u9ad8\u4f18\u5148\u7ea7&#034;]));<br \/>\n        prioritySeries.Points.Add(new DataPoint(&#034;\u4e2d&#034;, stats[&#034;\u4e2d\u4f18\u5148\u7ea7&#034;]));<br \/>\n        prioritySeries.Points.Add(new DataPoint(&#034;\u4f4e&#034;, stats[&#034;\u4f4e\u4f18\u5148\u7ea7&#034;]));<br \/>\n        chartPriority.Series.Add(prioritySeries);<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u7b5b\u9009\u6761\u4ef6\u53d8\u66f4<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void cboItemType_SelectedIndexChanged(object sender, EventArgs e)<br \/>\n    {<br \/>\n        LoadWorkbenchData();<br \/>\n    }<\/p>\n<p>    private void cboBusinessTopic_SelectedIndexChanged(object sender, EventArgs e)<br \/>\n    {<br \/>\n        LoadWorkbenchData();<br \/>\n    }<\/p>\n<p>    private void cboTerminal_SelectedIndexChanged(object sender, EventArgs e)<br \/>\n    {<br \/>\n        LoadWorkbenchData();<br \/>\n    }<\/p>\n<p>    private void cboPriority_SelectedIndexChanged(object sender, EventArgs e)<br \/>\n    {<br \/>\n        LoadWorkbenchData();<br \/>\n    }<\/p>\n<p>    private void dtpStartTime_ValueChanged(object sender, EventArgs e)<br \/>\n    {<br \/>\n        LoadWorkbenchData();<br \/>\n    }<\/p>\n<p>    private void btnSearch_Click(object sender, EventArgs e)<br \/>\n    {<br \/>\n        LoadWorkbenchData();<br \/>\n        LoadWorkbenchDashboard();<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u5904\u7406\u9009\u4e2d\u4e8b\u9879<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void btnHandleItem_Click(object sender, EventArgs e)<br \/>\n    {<br \/>\n        if (dgvWorkbenchItems.SelectedRows.Count &#061;&#061; 0)<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u8bf7\u9009\u62e9\u8981\u5904\u7406\u7684\u4e8b\u9879&#034;);<br \/>\n            return;<br \/>\n        }<\/p>\n<p>        var selectedRow &#061; dgvWorkbenchItems.SelectedRows[0];<br \/>\n        var itemId &#061; selectedRow.Cells[&#034;ItemId&#034;].Value.ToString();<br \/>\n        var businessTopic &#061; selectedRow.Cells[&#034;BusinessTopic&#034;].Value.ToString();<br \/>\n        var relateNo &#061; selectedRow.Cells[&#034;RelateNo&#034;].Value.ToString();<br \/>\n        var materialCode &#061; selectedRow.Cells[&#034;MaterialCode&#034;].Value.ToString();<\/p>\n<p>        \/\/ \u6839\u636e\u4e1a\u52a1\u4e3b\u9898\u6253\u5f00\u5904\u7406\u7a97\u4f53<br \/>\n        switch (businessTopic)<br \/>\n        {<br \/>\n            case &#034;\u7269\u6599\u8ba1\u5212&#034;:<br \/>\n                var planForm &#061; new MaterialPlanHandleForm(relateNo, _dispatcher);<br \/>\n                planForm.ShowDialog();<br \/>\n                break;<br \/>\n            case &#034;\u7269\u6599\u6392\u7a0b&#034;:<br \/>\n                var scheduleForm &#061; new MaterialScheduleHandleForm(int.Parse(relateNo), _dispatcher);<br \/>\n                scheduleForm.ShowDialog();<br \/>\n                break;<br \/>\n            case &#034;\u7269\u6599\u8c03\u62e8&#034;:<br \/>\n                var transferForm &#061; new MaterialTransferHandleForm(relateNo, _dispatcher);<br \/>\n                transferForm.ShowDialog();<br \/>\n                break;<br \/>\n        }<\/p>\n<p>        \/\/ \u66f4\u65b0\u4e8b\u9879\u5904\u7406\u72b6\u6001<br \/>\n        _aggregationService.UpdateItemHandleStatus(itemId, &#034;\u5df2\u5904\u7406&#034;, Environment.UserName);<\/p>\n<p>        \/\/ \u5237\u65b0\u6570\u636e<br \/>\n        LoadWorkbenchData();<br \/>\n        LoadWorkbenchDashboard();<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6307\u4ee4\u5904\u7406\u4e8b\u4ef6&#xff08;\u5237\u65b0\u754c\u9762&#xff09;<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void OnCommandProcessed(object sender, MaterialCommandEventArgs e)<br \/>\n    {<br \/>\n        Invoke(new Action(() &#061;&gt;<br \/>\n        {<br \/>\n            LoadWorkbenchData();<br \/>\n            LoadWorkbenchDashboard();<br \/>\n            \/\/ \u5237\u65b0\u6307\u4ee4\u8ffd\u8e2a\u6807\u7b7e\u9875<br \/>\n            if (tabControl1.SelectedTab &#061;&#061; tabPageCommandTrack)<br \/>\n            {<br \/>\n                LoadCommandTrackingData();<br \/>\n            }<br \/>\n        }));<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u52a0\u8f7d\u6307\u4ee4\u8ffd\u8e2a\u6570\u636e<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void LoadCommandTrackingData()<br \/>\n    {<br \/>\n        var businessTopic &#061; cboTrackBusinessTopic.Text &#061;&#061; &#034;\u5168\u90e8&#034; ? &#034;&#034; : cboTrackBusinessTopic.Text;<br \/>\n        var commandType &#061; cboTrackCommandType.Text &#061;&#061; &#034;\u5168\u90e8&#034; ? &#034;&#034; : cboTrackCommandType.Text;<br \/>\n        var materialCode &#061; txtTrackMaterialCode.Text.Trim();<\/p>\n<p>        dgvCommandTrack.DataSource &#061; _dispatcher.GetCommandSummary(<br \/>\n            dtpTrackStartTime.Value, businessTopic, commandType, materialCode);<\/p>\n<p>        \/\/ \u5931\u8d25\u6307\u4ee4\u6807\u7ea2<br \/>\n        foreach (DataGridViewRow row in dgvCommandTrack.Rows)<br \/>\n        {<br \/>\n            if (row.Cells[&#034;\u6307\u4ee4\u72b6\u6001&#034;].Value.ToString() &#061;&#061; &#034;\u6267\u884c\u5931\u8d25&#034;)<br \/>\n            {<br \/>\n                row.DefaultCellStyle.BackColor &#061; Color.LightPink;<br \/>\n                row.DefaultCellStyle.ForeColor &#061; Color.Red;<br \/>\n            }<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u6307\u4ee4\u8ffd\u8e2a\u7b5b\u9009<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void btnTrackSearch_Click(object sender, EventArgs e)<br \/>\n    {<br \/>\n        LoadCommandTrackingData();<br \/>\n    }<\/p>\n<p>    \/\/\/ &lt;summary&gt;<br \/>\n    \/\/\/ \u5207\u6362\u6807\u7b7e\u9875<br \/>\n    \/\/\/ &lt;\/summary&gt;<br \/>\n    private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)<br \/>\n    {<br \/>\n        if (tabControl1.SelectedTab &#061;&#061; tabPageCommandTrack)<br \/>\n        {<br \/>\n            LoadCommandTrackingData();<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<p>\/\/ \u7269\u6599\u8ba1\u5212\u5904\u7406\u7a97\u4f53<br \/>\npublic partial class MaterialPlanHandleForm : Form<br \/>\n{<br \/>\n    private readonly string _planNo;<br \/>\n    private readonly MaterialMultiTerminalDispatcher _dispatcher;<\/p>\n<p>    public MaterialPlanHandleForm(string planNo, MaterialMultiTerminalDispatcher dispatcher)<br \/>\n    {<br \/>\n        InitializeComponent();<br \/>\n        _planNo &#061; planNo;<br \/>\n        _dispatcher &#061; dispatcher;<\/p>\n<p>        \/\/ \u52a0\u8f7d\u8ba1\u5212\u4fe1\u606f<br \/>\n        LoadPlanInfo();<br \/>\n    }<\/p>\n<p>    private void LoadPlanInfo()<br \/>\n    {<br \/>\n        using (var conn &#061; new SqlConnection(ConfigHelper.GetConnStr()))<br \/>\n        {<br \/>\n            var plan &#061; conn.QuerySingle&lt;MaterialPlan&gt;(<br \/>\n                &#034;SELECT * FROM MaterialPlan WHERE PlanNo &#061; &#064;PlanNo&#034;,<br \/>\n                new { _planNo });<\/p>\n<p>            lblPlanNo.Text &#061; plan.PlanNo;<br \/>\n            lblMaterialCode.Text &#061; plan.MaterialCode;<br \/>\n            lblMaterialName.Text &#061; plan.MaterialName;<br \/>\n            lblReqQty.Text &#061; plan.ReqQty.ToString();<br \/>\n            lblSupplyQty.Text &#061; plan.SupplyQty.ToString();<br \/>\n            lblReqDate.Text &#061; plan.ReqDate.ToString(&#034;yyyy-MM-dd&#034;);<br \/>\n            lblPlanStatus.Text &#061; plan.PlanStatus;<\/p>\n<p>            txtSupplyQty.Text &#061; plan.SupplyQty.ToString();<br \/>\n            cboLineCode.SelectedValue &#061; plan.RelateOrderNo.Split(&#039;_&#039;)[0]; \/\/ \u7b80\u5316\u5904\u7406<br \/>\n        }<br \/>\n    }<\/p>\n<p>    private void btnConfirmPlan_Click(object sender, EventArgs e)<br \/>\n    {<br \/>\n        \/\/ \u63d0\u4ea4\u8ba1\u5212\u786e\u8ba4\u6307\u4ee4<br \/>\n        var result &#061; _dispatcher.SubmitCommand(new MaterialCommand<br \/>\n        {<br \/>\n            SourceTerminal &#061; &#034;ERP_PLAN&#034;,<br \/>\n            TargetTerminal &#061; &#034;MES_EXEC&#034;,<br \/>\n            BusinessTopic &#061; &#034;\u7269\u6599\u8ba1\u5212&#034;,<br \/>\n            CommandType &#061; &#034;\u8ba1\u5212\u786e\u8ba4&#034;,<br \/>\n            RelateNo &#061; _planNo,<br \/>\n            MaterialCode &#061; lblMaterialCode.Text,<br \/>\n            CommandContent &#061; JsonConvert.SerializeObject(new PlanConfirmContent<br \/>\n            {<br \/>\n                PlanNo &#061; _planNo,<br \/>\n                SupplyQty &#061; decimal.Parse(txtSupplyQty.Text),<br \/>\n                LineCode &#061; cboLineCode.SelectedValue.ToString()<br \/>\n            }),<br \/>\n            Priority &#061; &#034;\u9ad8&#034;<br \/>\n        });<\/p>\n<p>        if (result)<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u7269\u6599\u8ba1\u5212\u5df2\u786e\u8ba4&#xff0c;\u81ea\u52a8\u521b\u5efa\u6392\u7a0b\u4efb\u52a1&#034;);<br \/>\n            Close();<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u8ba1\u5212\u786e\u8ba4\u5931\u8d25&#034;, &#034;\u9519\u8bef&#034;, MessageBoxButtons.OK, MessageBoxIcon.Error);<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<p>\/\/ \u7269\u6599\u6392\u7a0b\u5904\u7406\u7a97\u4f53<br \/>\npublic partial class MaterialScheduleHandleForm : Form<br \/>\n{<br \/>\n    private readonly int _scheduleId;<br \/>\n    private readonly MaterialMultiTerminalDispatcher _dispatcher;<\/p>\n<p>    public MaterialScheduleHandleForm(int scheduleId, MaterialMultiTerminalDispatcher dispatcher)<br \/>\n    {<br \/>\n        InitializeComponent();<br \/>\n        _scheduleId &#061; scheduleId;<br \/>\n        _dispatcher &#061; dispatcher;<\/p>\n<p>        LoadScheduleInfo();<br \/>\n    }<\/p>\n<p>    private void LoadScheduleInfo()<br \/>\n    {<br \/>\n        using (var conn &#061; new SqlConnection(ConfigHelper.GetConnStr()))<br \/>\n        {<br \/>\n            var schedule &#061; conn.QuerySingle&lt;MaterialSchedule&gt;(<br \/>\n                &#034;SELECT * FROM MaterialSchedule WHERE ScheduleId &#061; &#064;ScheduleId&#034;,<br \/>\n                new { _scheduleId });<\/p>\n<p>            lblScheduleId.Text &#061; schedule.ScheduleId.ToString();<br \/>\n            lblPlanNo.Text &#061; schedule.PlanNo;<br \/>\n            lblMaterialCode.Text &#061; schedule.MaterialCode;<br \/>\n            lblScheduleQty.Text &#061; schedule.ScheduleQty.ToString();<br \/>\n            lblKitQty.Text &#061; schedule.KitQty.ToString();<br \/>\n            lblKitRate.Text &#061; $&#034;{schedule.KitRate}%&#034;;<br \/>\n            lblScheduleStatus.Text &#061; schedule.ScheduleStatus;<\/p>\n<p>            txtNewQty.Text &#061; schedule.ScheduleQty.ToString();<br \/>\n            dtpNewStartTime.Value &#061; schedule.ScheduleStartTime;<br \/>\n            dtpNewEndTime.Value &#061; schedule.ScheduleEndTime;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    private void btnAdjustSchedule_Click(object sender, EventArgs e)<br \/>\n    {<br \/>\n        \/\/ \u63d0\u4ea4\u6392\u7a0b\u8c03\u6574\u6307\u4ee4<br \/>\n        var result &#061; _dispatcher.SubmitCommand(new MaterialCommand<br \/>\n        {<br \/>\n            SourceTerminal &#061; &#034;MES_EXEC&#034;,<br \/>\n            TargetTerminal &#061; &#034;MES_EXEC&#034;,<br \/>\n            BusinessTopic &#061; &#034;\u7269\u6599\u6392\u7a0b&#034;,<br \/>\n            CommandType &#061; &#034;\u6392\u7a0b\u8c03\u6574&#034;,<br \/>\n            RelateNo &#061; _scheduleId.ToString(),<br \/>\n            MaterialCode &#061; lblMaterialCode.Text,<br \/>\n            CommandContent &#061; JsonConvert.SerializeObject(new ScheduleAdjustContent<br \/>\n            {<br \/>\n                ScheduleId &#061; _scheduleId,<br \/>\n                NewQty &#061; decimal.Parse(txtNewQty.Text),<br \/>\n                NewStartTime &#061; dtpNewStartTime.Value,<br \/>\n                NewEndTime &#061; dtpNewEndTime.Value<br \/>\n            }),<br \/>\n            Priority &#061; &#034;\u4e2d&#034;<br \/>\n        });<\/p>\n<p>        if (result)<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u6392\u7a0b\u8c03\u6574\u6307\u4ee4\u5df2\u63d0\u4ea4&#034;);<br \/>\n            Close();<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u6392\u7a0b\u8c03\u6574\u5931\u8d25&#034;, &#034;\u9519\u8bef&#034;, MessageBoxButtons.OK, MessageBoxIcon.Error);<br \/>\n        }<br \/>\n    }<\/p>\n<p>    private void btnKitCheck_Click(object sender, EventArgs e)<br \/>\n    {<br \/>\n        \/\/ \u63d0\u4ea4\u9f50\u5957\u68c0\u67e5\u6307\u4ee4<br \/>\n        var result &#061; _dispatcher.SubmitCommand(new MaterialCommand<br \/>\n        {<br \/>\n            SourceTerminal &#061; &#034;MES_EXEC&#034;,<br \/>\n            TargetTerminal &#061; &#034;WH_STORAGE&#034;,<br \/>\n            BusinessTopic &#061; &#034;\u7269\u6599\u6392\u7a0b&#034;,<br \/>\n            CommandType &#061; &#034;\u9f50\u5957\u68c0\u67e5&#034;,<br \/>\n            RelateNo &#061; _scheduleId.ToString(),<br \/>\n            MaterialCode &#061; lblMaterialCode.Text,<br \/>\n            CommandContent &#061; JsonConvert.SerializeObject(new KitCheckContent<br \/>\n            {<br \/>\n                ScheduleId &#061; _scheduleId,<br \/>\n                WhCode &#061; cboWhCode.SelectedValue.ToString()<br \/>\n            }),<br \/>\n            Priority &#061; &#034;\u9ad8&#034;<br \/>\n        });<\/p>\n<p>        if (result)<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u9f50\u5957\u68c0\u67e5\u6307\u4ee4\u5df2\u63d0\u4ea4&#xff0c;\u7ed3\u679c\u5c06\u540c\u6b65\u66f4\u65b0&#034;);<br \/>\n            LoadScheduleInfo();<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u9f50\u5957\u68c0\u67e5\u5931\u8d25&#034;, &#034;\u9519\u8bef&#034;, MessageBoxButtons.OK, MessageBoxIcon.Error);<br \/>\n        }<br \/>\n    }<\/p>\n<p>    private void btnReportShortage_Click(object sender, EventArgs e)<br \/>\n    {<br \/>\n        \/\/ \u63d0\u4ea4\u7f3a\u6599\u4e0a\u62a5\u6307\u4ee4<br \/>\n        var result &#061; _dispatcher.SubmitCommand(new MaterialCommand<br \/>\n        {<br \/>\n            SourceTerminal &#061; &#034;MES_EXEC&#034;,<br \/>\n            TargetTerminal &#061; &#034;PURCHASE&#034;,<br \/>\n            BusinessTopic &#061; &#034;\u7269\u6599\u6392\u7a0b&#034;,<br \/>\n            CommandType &#061; &#034;\u7f3a\u6599\u4e0a\u62a5&#034;,<br \/>\n            RelateNo &#061; _scheduleId.ToString(),<br \/>\n            MaterialCode &#061; lblMaterialCode.Text,<br \/>\n            CommandContent &#061; JsonConvert.SerializeObject(new ShortageReportContent<br \/>\n            {<br \/>\n                RelateScheduleId &#061; _scheduleId,<br \/>\n                ShortageQty &#061; decimal.Parse(txtShortageQty.Text),<br \/>\n                Reporter &#061; Environment.UserName<br \/>\n            }),<br \/>\n            Priority &#061; &#034;\u9ad8&#034;<br \/>\n        });<\/p>\n<p>        if (result)<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u7f3a\u6599\u4e0a\u62a5\u6307\u4ee4\u5df2\u63d0\u4ea4&#xff0c;\u91c7\u8d2d\u7aef\u5c06\u5904\u7406&#034;);<br \/>\n            Close();<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u7f3a\u6599\u4e0a\u62a5\u5931\u8d25&#034;, &#034;\u9519\u8bef&#034;, MessageBoxButtons.OK, MessageBoxIcon.Error);<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<p>\/\/ \u7269\u6599\u8c03\u62e8\u5904\u7406\u7a97\u4f53<br \/>\npublic partial class MaterialTransferHandleForm : Form<br \/>\n{<br \/>\n    private readonly string _transferNo;<br \/>\n    private readonly MaterialMultiTerminalDispatcher _dispatcher;<\/p>\n<p>    public MaterialTransferHandleForm(string transferNo, MaterialMultiTerminalDispatcher dispatcher)<br \/>\n    {<br \/>\n        InitializeComponent();<br \/>\n        _transferNo &#061; transferNo;<br \/>\n        _dispatcher &#061; dispatcher;<\/p>\n<p>        LoadTransferInfo();<br \/>\n    }<\/p>\n<p>    private void LoadTransferInfo()<br \/>\n    {<br \/>\n        using (var conn &#061; new SqlConnection(ConfigHelper.GetConnStr()))<br \/>\n        {<br \/>\n            var transfer &#061; conn.QuerySingle&lt;MaterialTransfer&gt;(<br \/>\n                &#034;SELECT * FROM MaterialTransfer WHERE TransferNo &#061; &#064;TransferNo&#034;,<br \/>\n                new { _transferNo });<\/p>\n<p>            lblTransferNo.Text &#061; transfer.TransferNo;<br \/>\n            lblMaterialCode.Text &#061; transfer.MaterialCode;<br \/>\n            lblTransferQty.Text &#061; transfer.TransferQty.ToString();<br \/>\n            lblOutWhCode.Text &#061; transfer.OutWhCode;<br \/>\n            lblInWhCode.Text &#061; transfer.InWhCode;<br \/>\n            lblTransferStatus.Text &#061; transfer.TransferStatus;<br \/>\n            lblPlanTime.Text &#061; transfer.PlanTransferTime.ToString(&#034;yyyy-MM-dd HH:mm&#034;);<br \/>\n        }<br \/>\n    }<\/p>\n<p>    private void btnExecuteTransfer_Click(object sender, EventArgs e)<br \/>\n    {<br \/>\n        \/\/ \u63d0\u4ea4\u8c03\u62e8\u6267\u884c\u6307\u4ee4<br \/>\n        var result &#061; _dispatcher.SubmitCommand(new MaterialCommand<br \/>\n        {<br \/>\n            SourceTerminal &#061; &#034;WH_STORAGE&#034;,<br \/>\n            TargetTerminal &#061; &#034;WH_STORAGE&#034;,<br \/>\n            BusinessTopic &#061; &#034;\u7269\u6599\u8c03\u62e8&#034;,<br \/>\n            CommandType &#061; &#034;\u8c03\u62e8\u6267\u884c&#034;,<br \/>\n            RelateNo &#061; _transferNo,<br \/>\n            MaterialCode &#061; lblMaterialCode.Text,<br \/>\n            CommandContent &#061; JsonConvert.SerializeObject(new TransferExecuteContent<br \/>\n            {<br \/>\n                TransferNo &#061; _transferNo,<br \/>\n                OutWhCode &#061; lblOutWhCode.Text,<br \/>\n                InWhCode &#061; lblInWhCode.Text,<br \/>\n                TransferQty &#061; decimal.Parse(lblTransferQty.Text)<br \/>\n            }),<br \/>\n            Priority &#061; &#034;\u9ad8&#034;<br \/>\n        });<\/p>\n<p>        if (result)<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u8c03\u62e8\u6267\u884c\u6307\u4ee4\u5df2\u63d0\u4ea4&#xff0c;\u5e93\u5b58\u5c06\u540c\u6b65\u66f4\u65b0&#034;);<br \/>\n            LoadTransferInfo();<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u8c03\u62e8\u6267\u884c\u5931\u8d25&#034;, &#034;\u9519\u8bef&#034;, MessageBoxButtons.OK, MessageBoxIcon.Error);<br \/>\n        }<br \/>\n    }<\/p>\n<p>    private void btnHandleException_Click(object sender, EventArgs e)<br \/>\n    {<br \/>\n        \/\/ \u63d0\u4ea4\u5f02\u5e38\u5904\u7406\u6307\u4ee4<br \/>\n        var result &#061; _dispatcher.SubmitCommand(new MaterialCommand<br \/>\n        {<br \/>\n            SourceTerminal &#061; &#034;WH_STORAGE&#034;,<br \/>\n            TargetTerminal &#061; &#034;ERP_PLAN&#034;,<br \/>\n            BusinessTopic &#061; &#034;\u7269\u6599\u8c03\u62e8&#034;,<br \/>\n            CommandType &#061; &#034;\u5f02\u5e38\u5904\u7406&#034;,<br \/>\n            RelateNo &#061; _transferNo,<br \/>\n            MaterialCode &#061; lblMaterialCode.Text,<br \/>\n            CommandContent &#061; JsonConvert.SerializeObject(new ExceptionHandleContent<br \/>\n            {<br \/>\n                RelateNo &#061; _transferNo,<br \/>\n                BusinessType &#061; &#034;\u7269\u6599\u8c03\u62e8&#034;,<br \/>\n                ExceptionDesc &#061; txtExceptionDesc.Text.Trim(),<br \/>\n                HandleDesc &#061; txtHandleDesc.Text.Trim()<br \/>\n            }),<br \/>\n            Priority &#061; &#034;\u9ad8&#034;<br \/>\n        });<\/p>\n<p>        if (result)<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u5f02\u5e38\u5904\u7406\u6307\u4ee4\u5df2\u63d0\u4ea4&#034;);<br \/>\n            Close();<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            MessageBox.Show(&#034;\u5f02\u5e38\u5904\u7406\u5931\u8d25&#034;, &#034;\u9519\u8bef&#034;, MessageBoxButtons.OK, MessageBoxIcon.Error);<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<h3>\u56db\u3001 \u7269\u6599\u534f\u540c\u9002\u914d\u8981\u70b9\u4e0e\u6269\u5c55<\/h3>\n<h4>1. \u6838\u5fc3\u9002\u914d\u8981\u70b9<\/h4>\n<ul>\n<li>\u591a\u4e1a\u52a1\u4e3b\u9898\u805a\u5408&#xff1a;\u5c06\u7269\u6599\u8ba1\u5212\u3001\u6392\u7a0b\u3001\u8c03\u62e8\u4e09\u5927\u6838\u5fc3\u4e1a\u52a1\u4e3b\u9898\u805a\u5408\u5230\u7edf\u4e00\u5de5\u4f5c\u53f0&#xff0c;\u6253\u7834\u4fe1\u606f\u5b64\u5c9b&#xff0c;\u9002\u914d ERP\/MES \u7269\u6599\u534f\u540c\u5168\u6d41\u7a0b&#xff1b;<\/li>\n<li>\u591a\u7aef\u6307\u4ee4\u534f\u540c&#xff1a;\u6307\u4ee4\u6309\u4e1a\u52a1\u4e3b\u9898 &#043; \u6307\u4ee4\u7aef\u8def\u7531&#xff0c;\u5982\u7f3a\u6599\u6307\u4ee4\u81ea\u52a8\u63a8\u9001\u5230\u91c7\u8d2d\u7aef&#xff0c;\u8c03\u62e8\u6307\u4ee4\u81ea\u52a8\u63a8\u9001\u5230\u4ed3\u50a8\u7aef&#xff0c;\u4fdd\u969c\u591a\u7aef\u534f\u540c\u6548\u7387&#xff1b;<\/li>\n<li>\u4e8b\u9879\u5206\u7c7b\u7ba1\u63a7&#xff1a;\u6309\u5f85\u529e \/ \u5728\u529e \/ \u5df2\u529e \/ \u9884\u8b66 \/ \u5f02\u5e38\u5206\u7c7b\u5c55\u793a\u7269\u6599\u4e8b\u9879&#xff0c;\u9ad8\u4f18\u5148\u7ea7 \/ \u8d85\u671f\u4e8b\u9879\u9192\u76ee\u5c55\u793a&#xff0c;\u9002\u914d\u7269\u6599\u534f\u540c\u7684\u7d27\u6025\u5ea6\u7ba1\u63a7&#xff1b;<\/li>\n<li>\u53ef\u89c6\u5316\u770b\u677f&#xff1a;\u901a\u8fc7\u56fe\u8868\u76f4\u89c2\u5c55\u793a\u7269\u6599\u4e8b\u9879\u5206\u5e03\u3001\u4e1a\u52a1\u4e3b\u9898\u5360\u6bd4\u3001\u4f18\u5148\u7ea7\u5206\u5e03&#xff0c;\u652f\u6301\u51b3\u7b56\u5c42\u5feb\u901f\u638c\u63e1\u7269\u6599\u534f\u540c\u6574\u4f53\u72b6\u6001&#xff1b;<\/li>\n<li>\u4e00\u952e\u5f0f\u5904\u7406&#xff1a;\u9488\u5bf9\u4e0d\u540c\u4e1a\u52a1\u4e3b\u9898\u63d0\u4f9b\u6807\u51c6\u5316\u5904\u7406\u754c\u9762&#xff0c;\u652f\u6301\u8ba1\u5212\u786e\u8ba4\u3001\u6392\u7a0b\u8c03\u6574\u3001\u8c03\u62e8\u6267\u884c\u3001\u9f50\u5957\u68c0\u67e5\u7b49\u5feb\u901f\u64cd\u4f5c&#xff0c;\u63d0\u5347\u5904\u7406\u6548\u7387\u3002<\/li>\n<\/ul>\n<h4>2. \u6269\u5c55\u65b9\u5411<\/h4>\n<ul>\n<li>\u667a\u80fd\u9884\u8b66\u89c4\u5219&#xff1a;\u96c6\u6210\u89c4\u5219\u5f15\u64ce&#xff0c;\u652f\u6301\u81ea\u5b9a\u4e49\u9884\u8b66\u89c4\u5219&#xff08;\u5982\u9f50\u5957\u7387 &lt; 80%\u3001\u8c03\u62e8\u8d85\u671f 2 \u5c0f\u65f6\u7b49&#xff09;&#xff0c;\u81ea\u52a8\u89e6\u53d1\u9884\u8b66\u5e76\u63a8\u9001&#xff1b;<\/li>\n<li>\u79fb\u52a8\u7aef\u63a8\u9001&#xff1a;\u5bf9\u63a5\u4f01\u4e1a\u5fae\u4fe1 \/ \u9489\u9489&#xff0c;\u5c06\u9ad8\u4f18\u5148\u7ea7 \/ \u9884\u8b66 \/ \u5f02\u5e38\u4e8b\u9879\u63a8\u9001\u5230\u76f8\u5173\u4eba\u5458\u79fb\u52a8\u7aef&#xff0c;\u652f\u6301\u79fb\u52a8\u7aef\u5feb\u901f\u5904\u7406&#xff1b;<\/li>\n<li>WMS\/ERP \u96c6\u6210&#xff1a;\u6df1\u5ea6\u5bf9\u63a5 WMS \u5e93\u5b58\u7cfb\u7edf\u3001ERP \u8ba1\u5212\u7cfb\u7edf&#xff0c;\u5b9e\u73b0\u5e93\u5b58\u6570\u636e\u81ea\u52a8\u540c\u6b65\u3001\u8ba1\u5212\u72b6\u6001\u5b9e\u65f6\u66f4\u65b0&#xff1b;<\/li>\n<li>\u667a\u80fd\u6392\u7a0b\u7b97\u6cd5&#xff1a;\u96c6\u6210\u9057\u4f20\u7b97\u6cd5 \/ \u8681\u7fa4\u7b97\u6cd5&#xff0c;\u6839\u636e\u7269\u6599\u9f50\u5957\u7387\u3001\u4ea7\u7ebf\u4ea7\u80fd\u3001\u8ba2\u5355\u4f18\u5148\u7ea7\u81ea\u52a8\u4f18\u5316\u7269\u6599\u6392\u7a0b&#xff1b;<\/li>\n<li>\u7269\u6599\u8ffd\u6eaf&#xff1a;\u8bb0\u5f55\u7269\u6599\u4ece\u8ba1\u5212\u2192\u6392\u7a0b\u2192\u8c03\u62e8\u2192\u4f7f\u7528\u7684\u5168\u6d41\u7a0b\u8f68\u8ff9&#xff0c;\u652f\u6301\u7269\u6599\u6279\u6b21 \/ \u4f9b\u5e94\u5546 \/ \u5e93\u4f4d\u7684\u7cbe\u51c6\u8ffd\u6eaf&#xff1b;<\/li>\n<li>\u6570\u636e\u5927\u5c4f&#xff1a;\u6269\u5c55\u81f3\u8f66\u95f4 \/ \u4ed3\u50a8\u5927\u5c4f&#xff0c;\u5b9e\u65f6\u5c55\u793a\u7269\u6599\u9f50\u5957\u7387\u3001\u8c03\u62e8\u8fdb\u5ea6\u3001\u7f3a\u6599\u9884\u8b66\u7b49\u6838\u5fc3\u6307\u6807\u3002<\/li>\n<\/ul>\n<h3>\u603b\u7ed3<\/h3>\n<h4>\u6838\u5fc3\u5173\u952e\u70b9<\/h4>\n<li>\u591a\u4e3b\u9898\u805a\u5408&#xff1a;\u5c06 ERP\/MES \u7269\u6599\u8ba1\u5212\u3001\u6392\u7a0b\u3001\u8c03\u62e8\u4e09\u5927\u4e1a\u52a1\u4e3b\u9898\u805a\u5408\u5230\u7edf\u4e00 WinForm \u5de5\u4f5c\u53f0&#xff0c;\u5b9e\u73b0\u7269\u6599\u534f\u540c\u4e8b\u9879\u7684\u96c6\u4e2d\u7ba1\u63a7&#xff1b;<\/li>\n<li>\u591a\u7aef\u6307\u4ee4\u8def\u7531&#xff1a;\u57fa\u4e8e\u4e8b\u4ef6\u603b\u7ebf &#043; \u961f\u5217\u6a21\u5f0f\u5b9e\u73b0 ERP \u8ba1\u5212\u7aef\u3001MES \u6267\u884c\u7aef\u3001\u4ed3\u50a8\u7aef\u7b49\u591a\u7aef\u6307\u4ee4\u7684\u534f\u540c\u8c03\u5ea6&#xff0c;\u4fdd\u969c\u6307\u4ee4\u7cbe\u51c6\u89e6\u8fbe&#xff1b;<\/li>\n<li>\u4e8b\u9879\u5206\u7c7b\u7ba1\u63a7&#xff1a;\u6309\u5f85\u529e \/ \u5728\u529e \/ \u5df2\u529e \/ \u9884\u8b66 \/ \u5f02\u5e38\u5206\u7c7b\u7ba1\u7406\u7269\u6599\u4e8b\u9879&#xff0c;\u9ad8\u4f18\u5148\u7ea7 \/ \u8d85\u671f\u4e8b\u9879\u9192\u76ee\u5c55\u793a&#xff0c;\u63d0\u5347\u5f02\u5e38\u54cd\u5e94\u6548\u7387&#xff1b;<\/li>\n<li>\u6838\u5fc3\u4ef7\u503c&#xff1a;\u89e3\u51b3 ERP\/MES \u7269\u6599\u534f\u540c\u4e2d\u4fe1\u606f\u5206\u6563\u3001\u591a\u7aef\u534f\u540c\u6548\u7387\u4f4e\u3001\u5f02\u5e38\u54cd\u5e94\u6162\u7684\u6838\u5fc3\u75db\u70b9&#xff0c;\u5b9e\u73b0\u7269\u6599\u8ba1\u5212 &#8211; \u6392\u7a0b &#8211; \u8c03\u62e8\u7684\u5168\u6d41\u7a0b\u95ed\u73af\u7ba1\u63a7\u3002<\/li>\n<p>\u8be5\u7ec4\u4ef6\u53ef\u76f4\u63a5\u4f5c\u4e3a ERP\/MES \u7269\u6599\u8ba1\u5212\u6392\u7a0b\u8c03\u62e8\u534f\u540c\u7684\u6838\u5fc3 WinForm \u4e2d\u95f4\u4ef6&#xff0c;\u9002\u914d\u591a\u6307\u4ee4\u7aef \/ \u4e1a\u52a1\u4e3b\u9898\u6c47\u603b\u7684\u5de5\u4f5c\u53f0\u6a21\u5f0f&#xff0c;\u652f\u6491\u7269\u6599\u534f\u540c\u5168\u6d41\u7a0b\u7684\u4e00\u7ad9\u5f0f\u7ba1\u63a7\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ERP\/MES \u7cfb\u7edf\u5728\u7269\u6599\u8ba1\u5212\u3001\u6392\u7a0b\u3001\u8c03\u62e8\u534f\u540c\u573a\u666f\u4e0b&#xff0c;\u5f00\u53d1\u9762\u5411 \u201c\u591a\u7aef\u6307\u4ee4 \/ \u4e1a\u52a1\u4e3b\u9898\u6c47\u603b\u201d \u7684\u5de5\u4f5c\u53f0&#xff08;\u7aef\u53f0&#xff09;WinForm \u4e2d\u95f4\u4ef6\u754c\u9762\u7ec4\u4ef6&#xff0c;\u6838\u5fc3\u89e3\u51b3\u7269\u6599\u9886\u57df\u591a\u4e1a\u52a1\u4e3b\u9898&#xff08;\u8ba1\u5212\u3001\u6392\u7a0b\u3001\u8c03\u62e8&#xff09;\u3001\u591a\u6307\u4ee4\u7aef&#xff08;ERP \u8ba1\u5212\u7aef\u3001MES \u6267\u884c\u7aef\u3001\u4ed3\u50a8\u7aef\u3001\u4ea7\u7ebf\u7aef\u3001\u91c7\u8d2d\u7aef&#xff09;\u7684\u4e8b\u9879\u96c6\u4e2d\u5c55\u793a\u3001\u6307\u4ee4\u534f\u540c\u3001\u72b6\u6001\u8ffd\u8e2a\u95ee\u9898&#xff0c;\u5b9e\u73b0\u7269\u6599\u5168\u6d41\u7a0b\u7684\u4e00\u7ad9\u5f0f\u7ba1\u63a7\u3002\u4ee5\u4e0b\u662f\u5b8c\u6574\u7684\u8bbe\u8ba1\u4e0e\u5b9e\u73b0\u65b9\u6848&amp;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[6609,6610],"topic":[],"class_list":["post-62476","post","type-post","status-publish","format-standard","hentry","category-server","tag-erp-mes","tag-6610"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ERP\/MES\u8ba1\u5212\u6392\u7a0b\u5de5\u4f5c\u53f0\u754c\u9762\u7ec4\u4ef6 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/62476.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ERP\/MES\u8ba1\u5212\u6392\u7a0b\u5de5\u4f5c\u53f0\u754c\u9762\u7ec4\u4ef6 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"ERP\/MES \u7cfb\u7edf\u5728\u7269\u6599\u8ba1\u5212\u3001\u6392\u7a0b\u3001\u8c03\u62e8\u534f\u540c\u573a\u666f\u4e0b&#xff0c;\u5f00\u53d1\u9762\u5411 \u201c\u591a\u7aef\u6307\u4ee4 \/ \u4e1a\u52a1\u4e3b\u9898\u6c47\u603b\u201d \u7684\u5de5\u4f5c\u53f0&#xff08;\u7aef\u53f0&#xff09;WinForm \u4e2d\u95f4\u4ef6\u754c\u9762\u7ec4\u4ef6&#xff0c;\u6838\u5fc3\u89e3\u51b3\u7269\u6599\u9886\u57df\u591a\u4e1a\u52a1\u4e3b\u9898&#xff08;\u8ba1\u5212\u3001\u6392\u7a0b\u3001\u8c03\u62e8&#xff09;\u3001\u591a\u6307\u4ee4\u7aef&#xff08;ERP \u8ba1\u5212\u7aef\u3001MES \u6267\u884c\u7aef\u3001\u4ed3\u50a8\u7aef\u3001\u4ea7\u7ebf\u7aef\u3001\u91c7\u8d2d\u7aef&#xff09;\u7684\u4e8b\u9879\u96c6\u4e2d\u5c55\u793a\u3001\u6307\u4ee4\u534f\u540c\u3001\u72b6\u6001\u8ffd\u8e2a\u95ee\u9898&#xff0c;\u5b9e\u73b0\u7269\u6599\u5168\u6d41\u7a0b\u7684\u4e00\u7ad9\u5f0f\u7ba1\u63a7\u3002\u4ee5\u4e0b\u662f\u5b8c\u6574\u7684\u8bbe\u8ba1\u4e0e\u5b9e\u73b0\u65b9\u6848&amp;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/62476.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-19T16:58:36+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/62476.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/62476.html\",\"name\":\"ERP\/MES\u8ba1\u5212\u6392\u7a0b\u5de5\u4f5c\u53f0\u754c\u9762\u7ec4\u4ef6 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-01-19T16:58:36+00:00\",\"dateModified\":\"2026-01-19T16:58:36+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/62476.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/62476.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/62476.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ERP\/MES\u8ba1\u5212\u6392\u7a0b\u5de5\u4f5c\u53f0\u754c\u9762\u7ec4\u4ef6\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ERP\/MES\u8ba1\u5212\u6392\u7a0b\u5de5\u4f5c\u53f0\u754c\u9762\u7ec4\u4ef6 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/62476.html","og_locale":"zh_CN","og_type":"article","og_title":"ERP\/MES\u8ba1\u5212\u6392\u7a0b\u5de5\u4f5c\u53f0\u754c\u9762\u7ec4\u4ef6 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"ERP\/MES \u7cfb\u7edf\u5728\u7269\u6599\u8ba1\u5212\u3001\u6392\u7a0b\u3001\u8c03\u62e8\u534f\u540c\u573a\u666f\u4e0b&#xff0c;\u5f00\u53d1\u9762\u5411 \u201c\u591a\u7aef\u6307\u4ee4 \/ \u4e1a\u52a1\u4e3b\u9898\u6c47\u603b\u201d \u7684\u5de5\u4f5c\u53f0&#xff08;\u7aef\u53f0&#xff09;WinForm \u4e2d\u95f4\u4ef6\u754c\u9762\u7ec4\u4ef6&#xff0c;\u6838\u5fc3\u89e3\u51b3\u7269\u6599\u9886\u57df\u591a\u4e1a\u52a1\u4e3b\u9898&#xff08;\u8ba1\u5212\u3001\u6392\u7a0b\u3001\u8c03\u62e8&#xff09;\u3001\u591a\u6307\u4ee4\u7aef&#xff08;ERP \u8ba1\u5212\u7aef\u3001MES \u6267\u884c\u7aef\u3001\u4ed3\u50a8\u7aef\u3001\u4ea7\u7ebf\u7aef\u3001\u91c7\u8d2d\u7aef&#xff09;\u7684\u4e8b\u9879\u96c6\u4e2d\u5c55\u793a\u3001\u6307\u4ee4\u534f\u540c\u3001\u72b6\u6001\u8ffd\u8e2a\u95ee\u9898&#xff0c;\u5b9e\u73b0\u7269\u6599\u5168\u6d41\u7a0b\u7684\u4e00\u7ad9\u5f0f\u7ba1\u63a7\u3002\u4ee5\u4e0b\u662f\u5b8c\u6574\u7684\u8bbe\u8ba1\u4e0e\u5b9e\u73b0\u65b9\u6848&amp;","og_url":"https:\/\/www.wsisp.com\/helps\/62476.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-01-19T16:58:36+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"22 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/62476.html","url":"https:\/\/www.wsisp.com\/helps\/62476.html","name":"ERP\/MES\u8ba1\u5212\u6392\u7a0b\u5de5\u4f5c\u53f0\u754c\u9762\u7ec4\u4ef6 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-01-19T16:58:36+00:00","dateModified":"2026-01-19T16:58:36+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/62476.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/62476.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/62476.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"ERP\/MES\u8ba1\u5212\u6392\u7a0b\u5de5\u4f5c\u53f0\u754c\u9762\u7ec4\u4ef6"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/62476","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=62476"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/62476\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=62476"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=62476"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=62476"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=62476"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}