瀏覽代碼

半成品卡控

qinqi 6 天之前
父節點
當前提交
5459746a46
共有 33 個文件被更改,包括 8682 次插入30 次删除
  1. 132 30
      wwwroot/api/sap/matnr/index.ashx
  2. 101 0
      wwwroot/mes/semifinished/deliverplan/deliver_history.html
  3. 982 0
      wwwroot/mes/semifinished/deliverplan/deliverplan.ashx
  4. 177 0
      wwwroot/mes/semifinished/deliverplan/deliverplan_adddetail.html
  5. 74 0
      wwwroot/mes/semifinished/deliverplan/deliverplan_detail.html
  6. 56 0
      wwwroot/mes/semifinished/deliverplan/deliverplan_import.html
  7. 415 0
      wwwroot/mes/semifinished/deliverplan/deliverplan_index.html
  8. 二進制
      wwwroot/mes/semifinished/deliverplan/交坯计划导入模板.xlsx
  9. 101 0
      wwwroot/mes/semifinished/groutplan/grout_history.html
  10. 983 0
      wwwroot/mes/semifinished/groutplan/groutplan.ashx
  11. 177 0
      wwwroot/mes/semifinished/groutplan/groutplan_adddetail.html
  12. 75 0
      wwwroot/mes/semifinished/groutplan/groutplan_detail.html
  13. 56 0
      wwwroot/mes/semifinished/groutplan/groutplan_import.html
  14. 415 0
      wwwroot/mes/semifinished/groutplan/groutplan_index.html
  15. 二進制
      wwwroot/mes/semifinished/groutplan/注浆计划导入模板.xlsx
  16. 148 0
      wwwroot/mes/semifinished/groutwarn/groutwarn.ashx
  17. 108 0
      wwwroot/mes/semifinished/groutwarn/groutwarn_index.html
  18. 368 0
      wwwroot/mes/semifinished/materiallink/materiallink.ashx
  19. 71 0
      wwwroot/mes/semifinished/materiallink/materiallink_add.html
  20. 74 0
      wwwroot/mes/semifinished/materiallink/materiallink_edit.html
  21. 162 0
      wwwroot/mes/semifinished/materiallink/materiallink_index.html
  22. 2360 0
      wwwroot/mes/semifinished/plan/plan.ashx
  23. 142 0
      wwwroot/mes/semifinished/plan/plan_add.html
  24. 177 0
      wwwroot/mes/semifinished/plan/plan_adddetail.html
  25. 75 0
      wwwroot/mes/semifinished/plan/plan_edit.html
  26. 107 0
      wwwroot/mes/semifinished/plan/plan_history.html
  27. 56 0
      wwwroot/mes/semifinished/plan/plan_import.html
  28. 549 0
      wwwroot/mes/semifinished/plan/plan_index.html
  29. 二進制
      wwwroot/mes/semifinished/plan/生产计划导入模板.xlsx
  30. 285 0
      wwwroot/mes/semifinished/qualitypoint/qualitypoint.ashx
  31. 59 0
      wwwroot/mes/semifinished/qualitypoint/qualitypoint_add.html
  32. 62 0
      wwwroot/mes/semifinished/qualitypoint/qualitypoint_edit.html
  33. 135 0
      wwwroot/mes/semifinished/qualitypoint/qualitypoint_index.html

+ 132 - 30
wwwroot/api/sap/matnr/index.ashx

@@ -90,6 +90,9 @@ public class sap_matnr_index : IHttpHandler, IReadOnlySessionState
                 if (result > 0)
                 {
                     insertPacking(conn);
+
+                    //成功时执行更新物料关系对照表 add by qq 20251118
+                    InsertMaterialCode(conn);
                 }
 
                 //提交数据
@@ -427,11 +430,8 @@ public class sap_matnr_index : IHttpHandler, IReadOnlySessionState
         {
             string remarks = "SAP同步";
             int result = 0;
-            conn.ExecuteNonQuery(
-                "DELETE FROM TP_MST_PACKINGBOMDETAIL WHERE PACKINGBOMID = @PACKINGBOMID@",
-                new CDAParameter("PACKINGBOMID", packingBomId)
-            );
-
+            string idnrks = "";
+            
             //写明细数据
             for (int i = 0; i < ((JArray)json["IDNRKS"]).Count; i++)
             {
@@ -444,35 +444,70 @@ public class sap_matnr_index : IHttpHandler, IReadOnlySessionState
                 catch (Exception)
                 {
                 }
-
-                result += conn.ExecuteNonQuery(@"
-				INSERT INTO TP_MST_PACKINGBOMDETAIL (
-					PACKINGBOMID,NAME,
-					POSNR,POSTP,IDNRK,MENGE,MEINS,AUSCH,AVOAU,
-					REMARKS,ACCOUNTID,CREATEUSERID,UPDATEUSERID,XCHAR
-				) VALUES (
-					@PACKINGBOMID@,@NAME@,
-					@POSNR@,@POSTP@,@IDNRK@,@MENGE@,@MEINS@,@AUSCH@,@AVOAU@,
-					@REMARKS@,@ACCOUNTID@,@CREATEUSERID@,@UPDATEUSERID@,@XCHAR@
-				)
-				",
+                idnrks += "'" +json["IDNRKS"][i]["IDNRK"].ToStringEx() + "',";
+                //查找是否有该组件
+                DataTable plandts = conn.ExecuteDatatable(@"SELECT IDNRK FROM TP_MST_PACKINGBOMDETAIL  WHERE  PACKINGBOMID = @PACKINGBOMID@ AND IDNRK = @IDNRK@ ",
                     new CDAParameter("PACKINGBOMID", packingBomId),
-                    new CDAParameter("NAME", json["IDNRKS"][i]["NAME"].ToStringEx()),
-                    new CDAParameter("POSNR", json["IDNRKS"][i]["POSNR"].ToStringEx()),
-                    new CDAParameter("POSTP", json["IDNRKS"][i]["POSTP"].ToStringEx()),
-                    new CDAParameter("IDNRK", json["IDNRKS"][i]["IDNRK"].ToStringEx()),
-                    new CDAParameter("MENGE", json["IDNRKS"][i]["MENGE"].ToStringEx()),
-                    new CDAParameter("MEINS", json["IDNRKS"][i]["MEINS"].ToStringEx()),
-                    new CDAParameter("AUSCH", json["IDNRKS"][i]["AUSCH"].ToStringEx()),
-                    new CDAParameter("AVOAU", json["IDNRKS"][i]["AVOAU"].ToStringEx()),
-                    new CDAParameter("REMARKS", remarks),
-                    new CDAParameter("ACCOUNTID", 1),
-                    new CDAParameter("CREATEUSERID", 1),
-                    new CDAParameter("UPDATEUSERID", 1),
-                    new CDAParameter("XCHAR", xchar)
+                    new CDAParameter("IDNRK", json["IDNRKS"][i]["IDNRK"].ToStringEx())
                 );
+ 
+                if (plandts != null && plandts.Rows.Count > 0)
+                {
+                    //编辑 
+                    result += conn.ExecuteNonQuery(@"
+				    UPDATE TP_MST_PACKINGBOMDETAIL SET NAME = @NAME@, POSNR = @POSNR@,POSTP = @POSTP@,MENGE = @MENGE@,MEINS = @MEINS@,AUSCH = @AUSCH@,AVOAU = @AVOAU@, REMARKS = @REMARKS@,XCHAR = @XCHAR@
+				    WHERE  PACKINGBOMID = @PACKINGBOMID@ AND IDNRK = @IDNRK@  
+				    ",
+                        new CDAParameter("PACKINGBOMID", packingBomId),
+                        new CDAParameter("NAME", json["IDNRKS"][i]["NAME"].ToStringEx()),
+                        new CDAParameter("POSNR", json["IDNRKS"][i]["POSNR"].ToStringEx()),
+                        new CDAParameter("POSTP", json["IDNRKS"][i]["POSTP"].ToStringEx()),
+                        new CDAParameter("IDNRK", json["IDNRKS"][i]["IDNRK"].ToStringEx()),
+                        new CDAParameter("MENGE", json["IDNRKS"][i]["MENGE"].ToStringEx()),
+                        new CDAParameter("MEINS", json["IDNRKS"][i]["MEINS"].ToStringEx()),
+                        new CDAParameter("AUSCH", json["IDNRKS"][i]["AUSCH"].ToStringEx()),
+                        new CDAParameter("AVOAU", json["IDNRKS"][i]["AVOAU"].ToStringEx()),
+                        new CDAParameter("REMARKS", remarks),
+                        new CDAParameter("XCHAR", xchar)
+                    );
+                }
+                else
+                {
+                    //新建
+                    result += conn.ExecuteNonQuery(@"
+				    INSERT INTO TP_MST_PACKINGBOMDETAIL (
+					    PACKINGBOMID,NAME,
+					    POSNR,POSTP,IDNRK,MENGE,MEINS,AUSCH,AVOAU,
+					    REMARKS,ACCOUNTID,CREATEUSERID,UPDATEUSERID,XCHAR
+				    ) VALUES (
+					    @PACKINGBOMID@,@NAME@,
+					    @POSNR@,@POSTP@,@IDNRK@,@MENGE@,@MEINS@,@AUSCH@,@AVOAU@,
+					    @REMARKS@,@ACCOUNTID@,@CREATEUSERID@,@UPDATEUSERID@,@XCHAR@
+				    )
+				    ",
+                        new CDAParameter("PACKINGBOMID", packingBomId),
+                        new CDAParameter("NAME", json["IDNRKS"][i]["NAME"].ToStringEx()),
+                        new CDAParameter("POSNR", json["IDNRKS"][i]["POSNR"].ToStringEx()),
+                        new CDAParameter("POSTP", json["IDNRKS"][i]["POSTP"].ToStringEx()),
+                        new CDAParameter("IDNRK", json["IDNRKS"][i]["IDNRK"].ToStringEx()),
+                        new CDAParameter("MENGE", json["IDNRKS"][i]["MENGE"].ToStringEx()),
+                        new CDAParameter("MEINS", json["IDNRKS"][i]["MEINS"].ToStringEx()),
+                        new CDAParameter("AUSCH", json["IDNRKS"][i]["AUSCH"].ToStringEx()),
+                        new CDAParameter("AVOAU", json["IDNRKS"][i]["AVOAU"].ToStringEx()),
+                        new CDAParameter("REMARKS", remarks),
+                        new CDAParameter("ACCOUNTID", 1),
+                        new CDAParameter("CREATEUSERID", 1),
+                        new CDAParameter("UPDATEUSERID", 1),
+                        new CDAParameter("XCHAR", xchar)
+                    );
+                } 
             }
 
+            conn.ExecuteNonQuery(
+                "DELETE FROM TP_MST_PACKINGBOMDETAIL WHERE PACKINGBOMID = @PACKINGBOMID@ AND IDNRK NOT IN ("+idnrks.Substring(0,idnrks.Length-1)+")",
+                new CDAParameter("PACKINGBOMID", packingBomId)
+            );
+                 
             //执行成功返回1
             if (result == ((JArray)json["IDNRKS"]).Count)
             {
@@ -521,6 +556,73 @@ public class sap_matnr_index : IHttpHandler, IReadOnlySessionState
         return result;
     }
 
+    /// <summary>
+    /// 写物料编码对照表
+    /// </summary>
+    /// <param name="conn"></param>
+    /// <param name="json"></param>
+    /// <param name="packingBomId"></param>
+    /// <returns></returns>
+    private int InsertMaterialCode(IDataAccess conn)
+    {
+        try
+        {
+            int result = 0;
+            conn.ExecuteNonQuery(
+                " DELETE FROM TP_SEMIFINISHED_MATERIALLINK "
+            );
+
+            result = conn.ExecuteNonQuery(@" INSERT INTO TP_SEMIFINISHED_MATERIALLINK(MATERIALCODE,MAT55,MAT50,MAT40,MAT30,MAT20)
+            WITH BOM_LEVEL (LEVEL_NO, TOP_CODE, MAT_CODE) AS (
+                -- 锚点成员:根节点
+                SELECT 1 AS LEVEL_NO
+                        , B.MATNR AS TOP_CODE
+                        , B.MATNR AS MAT_CODE 
+                FROM TP_MST_PACKINGBOM B 
+                INNER JOIN TP_PC_SAPBOMDETAIL T ON T.MATNR = B.MATNR AND B.WERKS = T.WERKS 
+                WHERE B.WERKS = @WERKS@
+                      AND T.PRDHA LIKE '10%' 
+                      AND T.WERKS = @WERKS@ 
+                UNION ALL 
+                -- 递归成员:子节点
+                SELECT P.LEVEL_NO + 1 AS LEVEL_NO
+                        , P.TOP_CODE AS TOP_CODE
+                        , D.IDNRK AS MAT_CODE
+                FROM BOM_LEVEL P 
+                INNER JOIN TP_MST_PACKINGBOM B ON P.MAT_CODE = B.MATNR
+                INNER JOIN TP_MST_PACKINGBOMDETAIL D ON D.PACKINGBOMID = B.PACKINGBOMID
+                WHERE B.WERKS = @WERKS@
+                )
+            SELECT BL.TOP_CODE 
+                , MAX(CASE WHEN T.MATKL = '211005' THEN BL.MAT_CODE ELSE NULL END) MAT55 -- 简装半成品
+                , MAX(CASE WHEN T.MATKL = '211010' THEN BL.MAT_CODE ELSE NULL END) MAT50 -- 烧成半成品
+                , MAX(CASE WHEN T.MATKL = '211020' THEN BL.MAT_CODE ELSE NULL END) MAT40 -- 釉坯半成品
+                , MAX(CASE WHEN T.MATKL = '211030' THEN BL.MAT_CODE ELSE NULL END) MAT30 -- 精坯半成品
+                , MAX(CASE WHEN T.MATKL = '211040' THEN BL.MAT_CODE ELSE NULL END) MAT20 -- 湿坯半成品 
+            FROM BOM_LEVEL BL
+            INNER JOIN TP_PC_SAPBOMDETAIL T ON T.MATNR = BL.MAT_CODE
+            WHERE T.WERKS = @WERKS@ 
+            AND (T.MATKL IN ('211005', '211010','211020','211030','211040','211810','211820','211830'))
+            GROUP BY BL.TOP_CODE
+            ORDER BY BL.TOP_CODE
+			", new CDAParameter("WERKS", "5000")
+            );
+
+            //执行成功返回1
+            if (result > 0)
+            {
+                return 1;
+            }
+            else
+            {
+                return -1;
+            }
+        }
+        catch (Exception ex)
+        {
+            throw ex;
+        }
+    }
     public bool IsReusable
     {
         get

+ 101 - 0
wwwroot/mes/semifinished/deliverplan/deliver_history.html

@@ -0,0 +1,101 @@
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body class="easyui-layout" style="width:100%;height:100%">
+
+    <div data-options="border:false,region:'north',split:true,title:'',iconCls:'icon-grid'" title="West" style="width: 100%; height: 15% ">
+        <!--工具条-->
+        <div data-options="region:'center',plain:true,border:false">
+            <form id="planForm" method="post" class="w-form" style="padding-bottom:0px;"> 
+                <div class="w-div" style="padding-top:15px;"> 
+                    <div style="padding-top: 10px; padding-bottom: 10px;">
+                        计划名称:
+                        <input class="easyui-textbox" id="PLANNAME" name="PLANNAME" data-options="required:true,disabled:true,tipPosition:'top'"">
+                        物料编码:
+                        <input class="easyui-textbox" id="MATERIALCODE" name="MATERIALCODE" data-options="required:false,prompt:'',tipPosition:'top'" >
+                        <a href="javascript:void(0)" id="glineplanmoldButtonSearchSubmit" title="搜索" class="easyui-linkbutton" plain="false" onclick="glineplanmoldButtonSearchSubmit_Click()">搜索</a>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+
+    <div data-options="region:'south',split:true,plain:true ,iconCls:'icon-grid',border:false" style="height:85%">
+        <!--表格-->
+        <table id="planDatagrid" data-options="toolbar: '#planToolbar',showFooter:false">
+            <thead>
+                <tr>
+                    <th data-options="field:'SID',title:'SID',align:'left',checkbox:true,hidden:true">SID</th>
+                    <th data-options="field:'MATERIALCODE',title:'物料编码',align:'left',sortable:true"></th>
+                    <th data-options="field:'EDITFLAG',title:'类型',align:'left',sortable:true"></th>
+                    <th data-options="field:'PLANCOUNT',title:'计划数量',align:'center'"></th> 
+                    <th data-options="field:'CREATETIME',title:'创建时间',align:'center',sortable:false,"></th>
+                    <th data-options="field:'CREATEUSERCODE',title:'创建者',align:'center',sortable:false,"></th> 
+                    <th data-options="field:'CHANGEREMARKS',title:'备注',align:'center',sortable:false,"></th>
+
+                </tr>
+            </thead>
+        </table>
+    </div>
+     
+    <script type="text/javascript">
+        //var itemsid = $('#ITEMSID').val();
+        function GetQueryValue1(queryName) {
+            var reg = new RegExp("(^|&)" + queryName + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg);
+            if (r != null) {
+                return decodeURI(r[2]);
+            } else {
+                return null;
+            }
+        }
+
+        var url = window.location.search;
+        var itemsID = GetQueryValue1('id');
+
+
+        //加载完成
+        $(function () {
+            $('#planForm').formLoad({
+                url: 'deliverplan.ashx?m=t'
+            }); 
+            //加载按钮
+            $('#planToolbar').buttonLoad({
+                url: 'deliverplan.ashx?m=b'
+            });
+            //加载表格数据 
+            glineplanmoldButtonSearchSubmit_Click();
+        });
+          
+        //搜索提交
+        function glineplanmoldButtonSearchSubmit_Click() {
+            $('#planDatagrid').datagridLoad({
+                title: '计划明细履历',
+                idField: 'SID',
+                queryParams: $('#planForm').serializeJson(),
+                url: 'deliverplan.ashx?m=h&PLANID=' + itemsID,
+                pagination: false,
+                columnMoving: false
+            });
+
+        } 
+    </script>
+
+</body>
+</html>

+ 982 - 0
wwwroot/mes/semifinished/deliverplan/deliverplan.ashx

@@ -0,0 +1,982 @@
+<%@ WebHandler Language="C#" Class="glineplanmold" %>
+
+using System;
+using System.Web;
+using System.Web.SessionState;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.Data;
+using Curtain.DataAccess;
+using DK.XuWei.WebMes;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+public class glineplanmold : IHttpHandler, IReadOnlySessionState
+{
+    string detailplanID = null;
+    public void ProcessRequest(HttpContext context)
+    {
+        context.Response.ContentType = "text/plain";
+        if (mes.LoginCheck() && context.Request["m"] is object)
+        {
+            Button b = new Button();
+            if (mes.RightCheck(""))
+            {
+                b.MateriaPlanautoButtonIndex = true;
+                b.MateriaPlanautoButtonInsert = true;
+                b.MateriaPlanautoButtonInsertBatch = true;
+                b.MateriaPlanautoButtonCopy = true;
+                b.MateriaPlanautoButtonUpdate = true;
+                b.MateriaPlanautoButtonDelete = true;
+                b.MateriaPlanautoButtonCancel = true;
+                b.MateriaPlanautoButtonSearch = true;
+                b.MateriaPlanautoButtonDetail = true;
+                b.MateriaPlanautoButtonCheckbox = true;
+                b.MateriaPlanautoButtonExport = true;
+                b.MateriaPlanautoButtonReload = true;
+            };
+            switch (context.Request["m"].ToString().ToLower())
+            {
+                case "b":
+                    {
+                        //按钮
+                        context.Response.Write(new JsonResult(b).ToJson());
+                        break;
+                    }
+                case "z":
+                    {
+                        detailplanID = context.Request["PLANID"];
+                        //搜索明细
+                        if (b.MateriaPlanautoButtonIndex)
+                            context.Response.Write(search(context.Request.Form));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "ss":
+                    {
+                        //搜索主表
+                        if (b.MateriaPlanautoButtonIndex)
+                        {
+                            context.Response.Write(searchs(context.Request.Form));
+                        }
+                        else
+                        {
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        }
+                        break;
+                    }
+                case "dr":
+                    {
+                        //导入
+                        context.Response.Write(import(context));
+                        break;
+
+                    }
+                case "t":
+                    {
+                        //搜索主表编辑明细
+                        context.Response.Write(searchdetail(context));
+                        break;
+
+                    }
+                case "d":
+                    {
+                        //删除
+                        if (b.MateriaPlanautoButtonDelete)
+                            context.Response.Write(delete(context.Request["id"]));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "dd":
+                    {
+                        context.Response.Write(searchdetail());
+                        break;
+                    }
+                case "adddetail":
+                    {
+                        context.Response.Write(insertdetail(context.Request["data"], context.Request["PLANID"]));
+                        break;
+                    }
+                case "i":
+                    {
+                        //保存
+                        context.Response.Write(insertall(context.Request["data"]));
+                        break;
+                    }
+                case "h":
+                    {
+                        //履历查询
+                        detailplanID = context.Request["PLANID"];
+                        context.Response.Write(searchHistory(context.Request.Form));
+                        break;
+                    }
+                case "bardetail":
+                    {
+                        //查看交坯明细条码
+                        int proplanID = Convert.ToInt32(context.Request["PROPLANID"]);
+                        context.Response.Write(searchBardetail(proplanID));
+                        break;
+                    }
+            }
+        }
+    }
+
+    private string import(HttpContext context)
+    {
+        //上传文件
+        string filePath = "/upload/dailyplan/" + DateTime.Now.ToString("yyyy-MM-dd");
+        System.IO.Directory.CreateDirectory(context.Server.MapPath(filePath));
+        string fileName = filePath + "/交坯计划" + DateTime.Now.ToString("yyyy-MM-dd");
+        fileName += System.IO.Path.GetExtension(context.Request.Files[0].FileName);
+        string diskFileName = context.Server.MapPath(fileName);
+        if (System.IO.File.Exists(diskFileName)) System.IO.File.Delete(diskFileName);
+        context.Request.Files[0].SaveAs(diskFileName);
+
+        //读excel
+        DataTable dt = Import.ExcelToDataTable(diskFileName);
+        if (dt.Rows.Count == 0)
+        {
+            return new JsonResult(JsonStatus.otherError) { message = "Excel中无数据" }.ToJson();
+        }
+
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            int result = 0;
+            conn.BeginTransaction();
+            try
+            {
+                int row = 1;
+                int planID = Convert.ToInt32(HttpContext.Current.Request["id"]);
+
+                foreach (DataRow item in dt.Rows)
+                {
+                    // 物料编码
+                    if (string.IsNullOrEmpty(item["物料编码"] + ""))
+                    {
+                        conn.Rollback();
+                        return new JsonResult(JsonStatus.otherError) { message = "第" + row + "行,物料编码不能为空" }.ToJson();
+                    }
+                    string materialCode = item["物料编码"].ToString();
+
+                    // 计划数量
+                    if (string.IsNullOrEmpty(item["计划数量"] + ""))
+                    {
+                        conn.Rollback();
+                        return new JsonResult(JsonStatus.otherError) { message = "第" + row + "行,计划数量不能为空" }.ToJson();
+                    }
+                    string plancount = item["计划数量"].ToString();
+
+                    // 备注
+                    string detailRemarks = item["备注"].ToString();
+                    //物料描述
+                    string meterialRemark = getMeterialRemark(materialCode);
+
+                    string sqlStr = @" SELECT PP.PRODPLANID,PP.PLANMONTH,PP.PLANCOUNT
+                                   FROM TP_SEMIFINISHED_PRODPLAN PP
+                                  WHERE PP.PLANID = @PLANID@ AND PP.VALUEFLAG =1 AND PP.PLANTYPE = 2
+                                    AND PP.MATERIALCODE  =  @MATERIALCODE@";
+                    List<CDAParameter> sqlPara = new List<CDAParameter>();
+                    sqlPara.Add(new CDAParameter("PLANID", planID));
+                    sqlPara.Add(new CDAParameter("MATERIALCODE", materialCode));
+
+                    DataTable plandt = conn.ExecuteDatatable(sqlStr, sqlPara.ToArray());
+
+                    //查找该月是否有计划
+                    DataTable plandts = conn.ExecuteDatatable(@"SELECT PLANMONTH FROM TP_SEMIFINISHED_PLAN  WHERE  PLANID = @PLANID@ AND VALUEFLAG = 1 ",
+                        new CDAParameter("PLANID", planID)
+                    );
+                    if (plandt != null && plandt.Rows.Count > 0)
+                    {
+                        //编辑
+                        result += conn.ExecuteNonQuery(@"UPDATE TP_SEMIFINISHED_PRODPLAN  SET   
+                                    PLANCOUNT = PLANCOUNT + @PLANCOUNT@, REMARKS = @REMARKS@  ,UPDATEUSERID = @UPDATEUSERID@ ,UPDATETIME= SYSDATE 
+                                    WHERE PRODPLANID = @PRODPLANID@ AND MATERIALCODE = @MATERIALCODE@ AND VALUEFLAG =1
+                            ",
+                            new CDAParameter("PLANCOUNT", Convert.ToInt32( plancount)),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS", detailRemarks),
+                            new CDAParameter("MATERIALCODE", materialCode),
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(plandt.Rows[0]["PRODPLANID"]))
+                        );
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                    (PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,EDITFLAG
+                                    ,PLANTYPE
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,CHANGEREMARKS 
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    )
+                             SELECT PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,2 EDITFLAG
+                                    ,PLANTYPE
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,@PLANCOUNT@ AS  PLANCOUNT
+                                    ,@CHANGEREMARKS@
+                                    ,ACCOUNTID
+                                    ,UPDATEUSERID AS CREATEUSERID
+                             FROM TP_SEMIFINISHED_PRODPLAN  WHERE PRODPLANID = @PRODPLANID@ AND MATERIALCODE = @MATERIALCODE@  AND VALUEFLAG = 1
+                            ",
+                            new CDAParameter("PLANCOUNT", plancount),
+                            new CDAParameter("CHANGEREMARKS", "【导入-物料增加计划】-"+detailRemarks)
+                        );
+                    }
+                    else
+                    {
+                        //新建
+                        object proPlanid = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PRODPLAN_ID");
+
+                        result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLAN  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,PLANTYPE
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CREATEUSERID
+                                            ,UPDATEUSERID
+                                            ,REMARKS
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,2
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CREATEUSERID@
+                                            ,@UPDATEUSERID@
+                                            ,@REMARKS@)
+                            ",
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(proPlanid)),
+                            new CDAParameter("PLANID", Convert.ToInt32(planID)),
+                            new CDAParameter("PLANMONTH", Convert.ToDateTime(plandts.Rows[0]["PLANMONTH"])),
+                            new CDAParameter("MATERIALCODE", materialCode),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT",  plancount),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  detailRemarks)
+                        );
+
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                    (PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,EDITFLAG
+                                    ,PLANTYPE 
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT  
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    ,REMARKS 
+                                    )
+                                VALUES
+                                    (@PRODPLANID@
+                                    ,@PLANID@
+                                    ,@PLANMONTH@
+                                    ,1
+                                    ,2 
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@ 
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@
+                                    ,@REMARKS@ )
+                            ",
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(proPlanid)),
+                            new CDAParameter("PLANID", Convert.ToInt32(planID)),
+                            new CDAParameter("PLANMONTH", Convert.ToDateTime(plandts.Rows[0]["PLANMONTH"])),
+                            new CDAParameter("MATERIALCODE", materialCode),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT",  plancount),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  detailRemarks)
+
+                        );
+
+                    }
+                    row++;
+                }
+                if (result > 0)
+                {
+                    conn.Commit();
+                    return new JsonResult(JsonStatus.success).ToJson();
+                }
+                else
+                {
+                    conn.Rollback();
+                    return new JsonResult(JsonStatus.error).ToJson();
+                }
+
+            }
+            catch (Exception ex)
+            {
+                conn.Rollback();
+                return new JsonResult(JsonStatus.otherError) { message = ex.Message }.ToJson();
+            }
+        }
+    }
+
+    private string delete(string id)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            conn.BeginTransaction();
+            if (id is object)
+            {
+                try
+                {
+                    //插入删除履历 
+                    int result = conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                    (PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,EDITFLAG
+                                    ,PLANTYPE
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,CHANGEREMARKS 
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    ,VALUEFLAG 
+                                    )
+                             SELECT PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,2 EDITFLAG
+                                    ,PLANTYPE
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT
+                                    ,@CHANGEREMARKS@ CHANGEREMARKS
+                                    ,ACCOUNTID
+                                    ,@CREATEUSERID@ AS CREATEUSERID 
+                                    ,0 VALUEFLAG
+                             FROM TP_SEMIFINISHED_PRODPLAN  WHERE instr(',' || @PRODPLANID@ || ',', ',' || PRODPLANID || ',') > 0 
+                            ",
+                            new CDAParameter("PRODPLANID", id),
+                            new CDAParameter("CHANGEREMARKS", "被删除"),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"])
+                        );
+
+                    //删除总单
+                    result += conn.ExecuteNonQuery(@"DELETE FROM TP_SEMIFINISHED_PRODPLAN WHERE instr(',' || @PRODPLANID@ || ',', ',' || PRODPLANID || ',') > 0 ",
+                        new CDAParameter("PRODPLANID", id)
+                    );
+
+                    if (result > 0)
+                    {
+                        conn.Commit();
+                        return new JsonResult(JsonStatus.success).ToJson();
+                    }
+                    else
+                    {
+                        conn.Rollback();
+                        return new JsonResult(JsonStatus.otherError).ToJson();
+                    }
+
+                }
+                catch (Exception ex)
+                {
+
+                    throw ex;
+                }
+            }
+            else
+            {
+                return new JsonResult(JsonStatus.otherError).ToJson();
+            }
+        }
+    }
+
+    /// <summary>
+    /// 修改
+    /// </summary>
+    /// <returns></returns>
+    private string insertdetail(string jsondata,string planid)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            try
+            {   conn.BeginTransaction();
+                //明细 
+                DataTable detailTable = JsonConvert.DeserializeObject<DataTable>(jsondata);
+                for (int i = 0; i < detailTable.Rows.Count; i++)
+                {
+                    string sqlStr = @" SELECT SP.PRODPLANID,SP.PLANMONTH,SP.PLANCOUNT
+                                   FROM TP_SEMIFINISHED_PRODPLAN SP
+                                  WHERE SP.PLANID = @PLANID@ AND SP.VALUEFLAG =1 AND SP.PLANTYPE = 2
+                                    AND SP.MATERIALCODE  =  @MATERIALCODE@";
+                    List<CDAParameter> sqlPara = new List<CDAParameter>();
+                    sqlPara.Add(new CDAParameter("PLANID", Convert.ToInt32(planid)));
+                    sqlPara.Add(new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]));
+
+                    DataTable plandt = conn.ExecuteDatatable(sqlStr, sqlPara.ToArray());
+
+                    DataTable plandts = conn.ExecuteDatatable(@"SELECT PLANMONTH FROM TP_SEMIFINISHED_PLAN  WHERE  PLANID = @PLANID@ AND VALUEFLAG = 1 ",
+                        new CDAParameter("PLANID", planid)
+                    );
+                    int result = 0;
+                    //物料描述
+                    string meterialRemark = getMeterialRemark(detailTable.Rows[i]["MATERIALCODE"].ToString());
+                    if (plandt != null && plandt.Rows.Count > 0)
+                    {
+                        //编辑
+                        result += conn.ExecuteNonQuery(@"UPDATE TP_SEMIFINISHED_PRODPLAN  SET   
+                                    PLANCOUNT = PLANCOUNT + @PLANCOUNT@, REMARKS = @REMARKS@  ,UPDATEUSERID = @UPDATEUSERID@ ,UPDATETIME= SYSDATE
+                                    WHERE PRODPLANID = @PRODPLANID@ AND MATERIALCODE = @MATERIALCODE@
+                            ",
+                            new CDAParameter("PLANCOUNT", detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS", detailTable.Rows[i]["REMARKS"]),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(plandt.Rows[0]["PRODPLANID"]))
+                        );
+                        
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                    (PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,EDITFLAG
+                                    ,PLANTYPE 
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT  
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    ,CHANGEREMARKS 
+                                    )
+                                VALUES
+                                    (@PRODPLANID@
+                                    ,@PLANID@
+                                    ,@PLANMONTH@
+                                    ,2
+                                    ,2
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@ 
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@
+                                    ,@CHANGEREMARKS@ )
+                            ",
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(plandt.Rows[0]["PRODPLANID"])),
+                            new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                            new CDAParameter("PLANMONTH", Convert.ToDateTime(plandt.Rows[0]["PLANMONTH"])),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT",  detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  "【物料增加计划】-"+ detailTable.Rows[i]["REMARKS"]) 
+                        ); 
+                    }
+                    else
+                    {
+                            //新建
+                        object proPlanid = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PRODPLAN_ID");
+
+                        result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLAN  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,PLANTYPE
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CREATEUSERID
+                                            ,UPDATEUSERID
+                                            ,REMARKS
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,2
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CREATEUSERID@
+                                            ,@UPDATEUSERID@
+                                            ,@REMARKS@)
+                            ",
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(proPlanid)),
+                            new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                            new CDAParameter("PLANMONTH", Convert.ToDateTime(plandts.Rows[0]["PLANMONTH"])),
+                            new CDAParameter("MATERIALCODE",detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT",  detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  detailTable.Rows[i]["REMARKS"]) 
+                        );
+
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                    (PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,EDITFLAG
+                                    ,PLANTYPE 
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT  
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    ,REMARKS 
+                                    )
+                                VALUES
+                                    (@PRODPLANID@
+                                    ,@PLANID@
+                                    ,@PLANMONTH@
+                                    ,1
+                                    ,2 
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@ 
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@
+                                    ,@REMARKS@ )
+                            ",
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(proPlanid)),
+                            new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                            new CDAParameter("PLANMONTH", Convert.ToDateTime(plandts.Rows[0]["PLANMONTH"])),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT",  detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  detailTable.Rows[i]["REMARKS"]) 
+
+                        ); 
+                    }
+                } 
+            }
+            catch (Exception ex)
+            {
+
+                throw ex;
+            }
+            conn.Commit();
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    } 
+
+    /// <summary>
+    /// 查询物料描述
+    /// </summary>
+    /// <returns></returns>
+    private string getMeterialRemark(string materialCode)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            string sqlStr = @" SELECT s.MAKTX
+                                   FROM TP_PC_SAPBOMDETAIL s
+                                  WHERE s.MATNR = @materialCode@ ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("materialCode", materialCode));
+            try
+            {
+                DataTable dt = conn.ExecuteDatatable(sqlStr, sqlPara.ToArray());
+                string meterialRemark = "";
+                if (dt != null && dt.Rows.Count >0)
+                {
+                    meterialRemark = dt.Rows[0]["MAKTX"].ToString();
+                }
+                return meterialRemark;
+            }
+            catch (Exception ex)
+            {
+                throw ex ;
+            }
+        }
+    }
+
+    private class Button
+    {
+        public bool MateriaPlanautoButtonIndex = false;
+        public bool MateriaPlanautoButtonInsert = false;
+        public bool MateriaPlanautoButtonInsertBatch = false;
+        public bool MateriaPlanautoButtonCopy = false;
+        public bool MateriaPlanautoButtonUpdate = false;
+        public bool MateriaPlanautoButtonDelete = false;
+        public bool MateriaPlanautoButtonCancel = false;
+        public bool MateriaPlanautoButtonSearch = false;
+        public bool MateriaPlanautoButtonDetail = false;
+        public bool MateriaPlanautoButtonCheckbox = false;
+        public bool MateriaPlanautoButtonExport = false;
+        public bool MateriaPlanautoButtonReload = false;
+    }
+
+    /// <summary>
+    /// 搜索主表
+    /// </summary>
+    /// <returns></returns>
+    private string searchs(NameValueCollection form)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            int page = HttpContext.Current.Request["page"] is object ? Convert.ToInt32(HttpContext.Current.Request["page"]) : 1;
+            int rows = HttpContext.Current.Request["rows"] is object ? Convert.ToInt32(HttpContext.Current.Request["rows"]) : 10;
+            string sort = HttpContext.Current.Request["sort"] is object ? HttpContext.Current.Request["sort"] : "";
+            string order = HttpContext.Current.Request["order"] is object ? HttpContext.Current.Request["order"] : "";
+
+            string sqlStr = @"
+                SELECT  
+                    p.PLANID SID, 
+                    p.PLANID, 
+                    p.PLANCODE,
+                    p.PLANNAME,
+                    p.REMARKS,
+                    TO_CHAR(p.PLANMONTH, 'YYYY-MM') PLANMONTH
+                FROM
+                    TP_SEMIFINISHED_PLAN p 
+                WHERE 
+                    p.valueflag = 1
+            ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+
+            if(!string.IsNullOrEmpty(form["PLANNAME"]))
+            {
+                sqlStr += " AND INSTR(  P.PLANNAME, @PLANNAME@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("PLANNAME", form["PLANNAME"]));
+            }
+            if(!string.IsNullOrEmpty(form["PLANMONTH"]))
+            {
+                sqlStr += " AND P.PLANMONTH =  @PLANMONTH@";
+                sqlPara.Add(new CDAParameter("PLANMONTH", form["PLANMONTH"], DataType.DateTime));
+            }
+            if (Convert.ToInt32(HttpContext.Current.Request["id"]) > 0)
+            {
+                sqlStr += " AND P.PLANID =  @PLANID@";
+                sqlPara.Add(new CDAParameter("PLANID",Convert.ToInt32(HttpContext.Current.Request["id"]), DataType.DateTime));
+
+            }
+            if(sort != "")
+            {
+                sqlStr += " ORDER BY " + sort + " " + order;
+            }
+            int total = 0;
+            DataTable dt = conn.SelectPages(page, rows,out total, sqlStr, sqlPara.ToArray());
+            return new JsonResult(dt) { total = total}.ToJson();
+
+        }
+    }
+
+    /// <summary>
+    /// 搜索编辑信息
+    /// </summary>
+    /// <returns></returns>
+    private string searchdetail(HttpContext contest)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            string sqlStr = @"
+                SELECT  
+                    p.PLANID SID, 
+                    p.PLANID, 
+                    p.PLANCODE,
+                    p.PLANNAME,
+                    p.REMARKS,
+                    TO_CHAR(p.PLANMONTH, 'YYYY-MM') PLANMONTH
+                FROM
+                    TP_SEMIFINISHED_PLAN p 
+                WHERE 
+                    1 = 1
+            ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+
+            if (Convert.ToInt32(contest.Request["id"]) > 0)
+            {
+                sqlStr += " AND P.PLANID =  @PLANID@";
+                sqlPara.Add(new CDAParameter("PLANID",Convert.ToInt32(contest.Request["id"])));
+
+            }
+            int total = 0;
+            DataTable dt = conn.ExecuteDatatable( sqlStr, sqlPara.ToArray());
+            return new JsonResult(dt) { total = total}.ToJson();
+
+        }
+    }
+    /// <summary>
+    /// 搜索明细
+    /// </summary>
+    /// <returns></returns>
+    private string search(NameValueCollection form)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            int page = HttpContext.Current.Request["page"] is object ? Convert.ToInt32(HttpContext.Current.Request["page"]) : 1;
+            int rows = HttpContext.Current.Request["rows"] is object ? Convert.ToInt32(HttpContext.Current.Request["rows"]) : 10;
+            string sort = HttpContext.Current.Request["sort"] is object ? HttpContext.Current.Request["sort"] : "";
+            string order = HttpContext.Current.Request["order"] is object ? HttpContext.Current.Request["order"] : "";
+
+            //物料编码
+            string materialCode = form["MATERIALCODE"];
+
+            string sqlStr = @"SELECT SP.PLANID,
+                                SP.PRODPLANID,
+                                SP.PRODPLANID SID,
+                                SP.MATERIALCODE,
+                                SP.MATERIALREMARK,
+                                SP.PLANCOUNT, 
+                                NVL(SP.COMPLETEDCOUNT,0) AS COMPLETEDCOUNT, 
+                                CASE 
+                                     WHEN SP.COMPLETEDCOUNT > 0 THEN 
+                                       TO_CHAR((NVL(SP.COMPLETEDCOUNT, 0)/SP.PLANCOUNT) * 100, '9990.99') || '%'
+                                     ELSE '0.00%'
+                               END as COMPLETEDCOUNTPOINT,
+                                SP.CREATETIME,
+                                U.USERNAME AS CREATEUSERCODE,
+                                SP.UPDATETIME,
+                                U1.USERNAME AS UPDATEUSERCODE,
+                                SP.REMARKS
+                              FROM TP_SEMIFINISHED_PRODPLAN SP  
+                                LEFT JOIN TP_MST_USER U ON U.USERID = SP.CREATEUSERID
+                                LEFT JOIN TP_MST_USER U1 ON U1.USERID = SP.UPDATEUSERID 
+                             WHERE SP.VALUEFLAG = 1 AND SP.PLANTYPE =2
+                                   AND SP.ACCOUNTID = @accountid@";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("accountid", HttpContext.Current.Session["accountId"]));
+            //主表计划ID
+            if (!string.IsNullOrEmpty(detailplanID))
+            {
+                sqlStr += " AND SP.PLANID = " + detailplanID ;
+
+            }
+            if (!string.IsNullOrEmpty(materialCode))
+            {
+                sqlStr += " and SP.MATERIALCODE like '%" + materialCode + "%' ";
+            }
+            try
+            {
+                JsonResult data = Easyui.ExecuteJsonResult(conn, sqlStr, sqlPara);
+                return data.ToJson();
+            }
+            catch (Exception ex)
+            {
+                throw ex ;
+            }
+        }
+    }
+
+    /// <summary>
+    /// 搜索明细
+    /// </summary>
+    /// <returns></returns>
+    private string searchdetail()
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            string sqlStr = @"SELECT SP.PLANID, 
+                                SP.MATERIALCODE,
+                                SP.MATERIALREMARK,
+                                SP.PLANCOUNT,
+                                SP.REMARKS
+                              FROM TP_SEMIFINISHED_PRODPLAN SP 
+                             WHERE SP.PLANTYPE =2 AND  1=0 ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("accountid", HttpContext.Current.Session["accountId"]));
+
+            try
+            {
+                JsonResult data = Easyui.ExecuteJsonResult(conn, sqlStr, sqlPara);
+                return data.ToJson();
+            }
+            catch (Exception ex)
+            {
+                throw ex ;
+            }
+        }
+    }
+
+    /// <summary>
+    /// 保存
+    /// </summary>
+    /// <returns></returns>
+    private string insertall(string jsondata)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            try
+            {   conn.BeginTransaction();
+                //明细 
+                DataTable detailTable = JsonConvert.DeserializeObject<DataTable>(jsondata);
+                int result = 0; 
+                int planid = 0;
+                string planmonth = "";
+                if (detailTable != null && detailTable.Rows.Count > 0)
+                {
+                    planid = Convert.ToInt32(detailTable.Rows[0]["PLANID"].ToString());
+                    DataTable plandts = conn.ExecuteDatatable(@"SELECT PLANMONTH FROM TP_SEMIFINISHED_PLAN  WHERE  PLANID = @PLANID@ AND VALUEFLAG = 1 ",
+                        new CDAParameter("PLANID", planid)
+                    );
+                    planmonth = plandts.Rows[0]["PLANMONTH"].ToString();
+                    //保存调整后的总计划,更新标识为已生成
+                    //保存总计划履历表,编辑类型
+
+                    for (int i = 0; i < detailTable.Rows.Count; i++)
+                    {
+                        //编辑
+                        result += conn.ExecuteNonQuery(@"UPDATE TP_SEMIFINISHED_PRODPLAN  SET   
+                                    PLANCOUNT = @PLANCOUNT@ , UPDATEUSERID = @UPDATEUSERID@ ,UPDATETIME= SYSDATE
+                                    WHERE PRODPLANID = @PRODPLANID@ AND MATERIALCODE = @MATERIALCODE@
+                        ",
+                        new CDAParameter("PLANCOUNT",  detailTable.Rows[i]["PLANCOUNT"]),
+                        new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                        new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                        new CDAParameter("PRODPLANID", Convert.ToInt32(detailTable.Rows[i]["PRODPLANID"]))
+                        );
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                            (PLANID ,PRODPLANID ,PLANMONTH,EDITFLAG ,PLANTYPE,MATERIALCODE ,MATERIALREMARK  ,PLANCOUNT ,CHANGEREMARKS  ,ACCOUNTID ,CREATEUSERID  )
+                        VALUES
+                            (@PLANID@,@PRODPLANID@,@PLANMONTH@,2,2,@MATERIALCODE@,@MATERIALREMARK@ ,@PLANCOUNT@,@CHANGEREMARKS@,@ACCOUNTID@,@CREATEUSERID@ )",
+                        new CDAParameter("PLANID", Convert.ToInt32(detailTable.Rows[i]["PLANID"])),
+                        new CDAParameter("PRODPLANID", Convert.ToInt32(detailTable.Rows[i]["PRODPLANID"])),
+                        new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                        new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                        new CDAParameter("MATERIALREMARK", detailTable.Rows[i]["MATERIALREMARK"]),
+                        new CDAParameter("PLANCOUNT",detailTable.Rows[i]["PLANCOUNT"]), 
+                        new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                        new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                        new CDAParameter("CHANGEREMARKS", "【修改交坯计划】-"+ detailTable.Rows[i]["REMARKS"])
+                        );
+                       
+                    }
+                }
+                else
+                {
+                    conn.Rollback();
+                    return new JsonResult(JsonStatus.otherError) { message = "--无勾选数据" }.ToJson();
+                } 
+            }
+            catch (Exception ex)
+            {
+                conn.Rollback();
+                throw ex;
+            }
+            conn.Commit();
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 搜索明细履历
+    /// </summary>
+    /// <returns></returns>
+    private string searchHistory(NameValueCollection form)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            //物料编码
+            string materialCode = form["MATERIALCODE"];
+
+            string sqlStr = @"SELECT SP.PLANID,
+                                SP.PRODPLANID,  
+                                SP.HISID SID,  
+                                CASE WHEN SP.EDITFLAG = 1 THEN '新建' WHEN SP.EDITFLAG = 2 THEN '编辑'  END AS EDITFLAG, 
+                                SP.MATERIALCODE,
+                                SP.MATERIALREMARK,
+                                SP.PLANCOUNT, 
+                                SP.CREATETIME,
+                                U.USERNAME AS CREATEUSERCODE, 
+                                SP.CHANGEREMARKS
+                              FROM TP_SEMIFINISHED_PRODPLANHIS SP 
+                                LEFT JOIN TP_MST_USER U ON U.USERID = SP.CREATEUSERID 
+                             WHERE  SP.ACCOUNTID = @accountid@ AND SP.PLANTYPE = 2 ";
+
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("accountid", HttpContext.Current.Session["accountId"]));
+            //主表计划ID
+            if (!string.IsNullOrEmpty(detailplanID))
+            {
+                sqlStr += " AND SP.PLANID = " + detailplanID ;
+
+            }
+            if (!string.IsNullOrEmpty(materialCode))
+            {
+                sqlStr += " and SP.MATERIALCODE like '%" + materialCode + "%' ";
+            }
+            sqlStr += " ORDER BY SP.CREATETIME ";
+            try
+            {
+                int total = 0;
+                DataTable data = conn.ExecuteDatatable( sqlStr, sqlPara.ToArray());
+                return new JsonResult(data) { total = total}.ToJson();
+            }
+            catch (Exception ex)
+            {
+                throw ex ;
+            }
+        }
+    }
+        
+    /// <summary>
+    /// 搜索交坯对应明细
+    /// </summary>
+    /// <returns></returns>
+    private string searchBardetail(int proPlanid)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+
+            string sqlStr = @" SELECT  GDD.BARCODE, GDD.DELIVERTIME,GDD.DELIVERUSERCODE
+                        FROM TP_SEMIFINISHED_PRODPLANBAR PRB
+                        LEFT JOIN TP_PM_GROUTINGDAILYDETAIL GDD ON PRB.GROUTINGDAILYDETAILID = GDD.GROUTINGDAILYDETAILID   
+                        WHERE  PRB.ACCOUNTID = @accountid@  ";
+
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("accountid", HttpContext.Current.Session["accountId"]));
+            //主表计划ID
+            if (proPlanid > 0)
+            {
+                sqlStr += " AND PRB.PRODPLANID = " + proPlanid ;
+
+            }
+            sqlStr += " ORDER BY GDD.DELIVERTIME";
+                 
+            int total = 0;
+            DataTable dt = conn.ExecuteDatatable( sqlStr, sqlPara.ToArray());
+            return new JsonResult(dt) { total = total}.ToJson();
+        }
+    }
+    public bool IsReusable
+    {
+        get
+        {
+            return false;
+        }
+    }
+
+}

+ 177 - 0
wwwroot/mes/semifinished/deliverplan/deliverplan_adddetail.html

@@ -0,0 +1,177 @@
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body class="easyui-layout" style="width:100%;height:100%">
+
+    <div data-options="border:false,region:'north',split:true,title:'',iconCls:'icon-grid'" title="West" style="width: 100%; height: 13% ">
+        <!--工具条-->
+        <div data-options="region:'center',plain:true,border:false">
+            <form id="planForm" method="post" class="w-form" style="padding-bottom:0px;"> 
+                <div id="planMore2" style="display:block;">  
+                    <div class="w-div" style="padding-top:15px;">
+                        <div class="w-fieldname">计划名称:</div>
+                        <div class="w-field"><input class="easyui-textbox" id="PLANNAME" name="PLANNAME" data-options="required:true,prompt:'请填写计划名称',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+
+    <div data-options="region:'south',split:true,plain:true ,iconCls:'icon-grid',border:false" style="height:87%">
+        <!--工具条-->
+        <div id="planToolbar" class="i-toolbar"> 
+            <a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-add',plain:true" onclick="append()">添加行</a>
+            <a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-remove',plain:true" onclick="removeit()">移除行</a>
+            <span>|</span>
+            <a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-search',plain:true" onclick="getChanges()">保存</a> 
+        </div>
+        <!--表格-->
+        <table id="planDatagrid" data-options="toolbar: '#planToolbar',showFooter:false,
+               singleSelect: true, onClickCell: onClickCell">
+            <thead>
+                <tr>
+                    <th data-options="field:'SID',title:'SID',width:220,align:'left',checkbox:true,hidden:true">SID</th>  
+                    <th data-options="field:'MATERIALCODE',width:300,title:'物料编码',align:'left',sortable:true,editor:{type:'textbox'}"></th>
+                    <th data-options="field:'PLANCOUNT',width:300,title:'计划数量',align:'left',sortable:true,editor:{type:'numberbox'}"></th> 
+                    <th data-options="field:'REMARKS',width:400,title:'备注',align:'left',sortable:true,editor:{type:'textbox'}"></th> 
+
+                </tr>
+            </thead>
+        </table>
+    </div>
+     
+    <script type="text/javascript">
+        //var itemsid = $('#ITEMSID').val();
+        function GetQueryValue1(queryName) {
+            var reg = new RegExp("(^|&)" + queryName + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg);
+            if (r != null) {
+                return decodeURI(r[2]);
+            } else {
+                return null;
+            }
+        }
+
+        var url = window.location.search;
+        var itemsID = GetQueryValue1('id');
+
+
+        //加载完成
+        $(function () {
+            $('#planForm').formLoad({
+                url: 'deliverplan.ashx?m=t'
+            }); 
+            //加载按钮
+            $('#planToolbar').buttonLoad({
+                url: 'deliverplan.ashx?m=b'
+            });
+            //加载表格数据 
+            planButtonSearchSubmit_Click();
+        });
+          
+        //搜索提交
+        function planButtonSearchSubmit_Click() {
+            $('#planDatagrid').datagridLoad({
+                title: '计划明细',
+                idField: 'SID',
+                queryParams: $('#planForm').serializeJson(),
+                url: 'deliverplan.ashx?m=dd',
+                columnMoving: false
+            });
+
+        } 
+    </script>
+
+    <script type="text/javascript">
+        var editIndex = undefined;
+        function endEditing() {
+            if (editIndex == undefined) { return true }
+            if ($('#planDatagrid').datagrid('validateRow', editIndex)) {
+                $('#planDatagrid').datagrid('endEdit', editIndex);
+                editIndex = undefined;
+                return true;
+            } else {
+                return false;
+            }
+        }
+        function onClickCell(index, field) {
+            if (editIndex != index) {
+                if (endEditing()) {
+                    $('#planDatagrid').datagrid('selectRow', index)
+                        .datagrid('beginEdit', index);
+                    var ed = $('#planDatagrid').datagrid('getEditor', { index: index, field: field });
+                    if (ed) {
+                        ($(ed.target).data('textbox') ? $(ed.target).textbox('textbox') : $(ed.target)).focus();
+                    }
+                    editIndex = index;
+                } else {
+                    setTimeout(function () {
+                        $('#planDatagrid').datagrid('selectRow', editIndex);
+                    }, 0);
+                }
+            }
+        }
+        
+        function append() {
+            if (endEditing()) {
+                $('#planDatagrid').datagrid('appendRow', {
+                     'SID': 0
+                });
+                editIndex = $('#planDatagrid').datagrid('getRows').length - 1;
+                $('#planDatagrid').datagrid('selectRow', editIndex)
+                    .datagrid('beginEdit', editIndex);
+            }
+        }
+        function removeit() {
+            if (editIndex == undefined) { return }
+            $('#planDatagrid').datagrid('cancelEdit', editIndex)
+                .datagrid('deleteRow', editIndex);
+            editIndex = undefined;
+        }  
+        function getChanges() {
+             
+            var rows = $('#planDatagrid').datagrid('getRows');
+
+            rows.forEach(function (row1, index1) {
+                $('#planDatagrid').datagrid('endEdit', index1);
+            });
+            var data = $('#planDatagrid').datagrid('getData');
+            console.log('data', data["rows"])
+            //alert(JSON.stringify(data));
+            //提交更改到后端处理
+            $.post('deliverplan.ashx?m=adddetail', {
+                data: JSON.stringify(data["rows"]),
+                'PLANID': request('id')
+            }, function (data) {
+                var json = JSON.parse(data);
+                if (json['success'] == true) {
+                    $.messager.alert("保存", "保存成功");
+                }
+                else {
+                    $.messager.alert("保存", "保存失败");
+                }
+            });
+
+
+        }
+    </script>
+
+
+</body>
+</html>

+ 74 - 0
wwwroot/mes/semifinished/deliverplan/deliverplan_detail.html

@@ -0,0 +1,74 @@
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body class="easyui-layout" style="width:100%;height:100%">
+      
+    <div data-options="region:'north',split:true,plain:true ,iconCls:'icon-grid',border:false" style="width:100%;height:100%">
+        <!--表格-->
+        <table id="planDatagrid" data-options="toolbar: '#planToolbar',showFooter:false">
+            <thead>
+                <tr>
+                    <th data-options="field:'SID',title:'SID',align:'left',checkbox:true,hidden:true">SID</th>
+                    <th data-options="field:'BARCODE',width:100,title:'产品条码',align:'left',sortable:true"></th> 
+                    <th data-options="field:'DELIVERUSERCODE',width:100,title:'交坯工号',align:'left',sortable:true"></th>
+                    <th data-options="field:'DELIVERTIME',width:200,title:'操作时间',align:'left',sortable:true"></th>
+
+                </tr>
+            </thead>
+        </table>
+    </div>
+     
+    <script type="text/javascript">
+         
+        function GetQueryValue1(queryName) {
+            var reg = new RegExp("(^|&)" + queryName + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg);
+            if (r != null) {
+                return decodeURI(r[2]);
+            } else {
+                return null;
+            }
+        }
+
+        var url = window.location.search;
+        var itemsID = GetQueryValue1('SID');
+
+        //加载完成
+        $(function () {
+            //加载表格数据 
+            console.log('itemsID', itemsID)
+            glineplanmoldButtonSearchSubmit_Click();
+        });
+          
+        //搜索提交
+        function glineplanmoldButtonSearchSubmit_Click() {
+            if (itemsID > 0) {
+                $('#planDatagrid').datagridLoad({
+                    title: '交坯计划明细',
+                    idField: 'SID',
+                    url: 'deliverplan.ashx?m=bardetail&PROPLANID=' + itemsID,
+                    pagination: false,
+                    columnMoving: false
+                });
+            } 
+        } 
+    </script>
+
+</body>
+</html>

+ 56 - 0
wwwroot/mes/semifinished/deliverplan/deliverplan_import.html

@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <script src="/plugins/xeasyui/xeasyui.min.js"></script>
+</head>
+<body class="easyui-layout">
+
+    <div data-options="region:'center',plain:true,border:false">
+        <form id="ff" method="post" class="w-form" enctype="multipart/form-data">
+            <div class="w-div">
+                <div class="w-fieldbar" onclick="$('#more1').toggle()" style="cursor:pointer;"></div>
+            </div>
+            <div id="more1" style="display:block;">
+                
+                <div class="w-div">
+                    <div class="w-fieldname">Excel数据文件:</div>
+                    <div class="w-field"><input class="easyui-filebox w-input" id="文件" name="文件" data-options="required:true,prompt:'请选择Excel文件...',tipPosition:'bottom',buttonText:'选择文件',buttonAlign:'right',accept:'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">说明:</div>
+                    <div class="w-field"><div class="w-fieldvalue">导入数据,请准确核对! <a href="交坯计划导入模板.xlsx" target="_blank">下载模板</a> </div></div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <div data-options="region:'south',border:false" class="w-bar">
+        <a href="javascript:void(0)" id="toolbarSave" class="easyui-linkbutton" data-options="iconCls:'icon-save'" onclick="submitForm()">数据导入</a>
+        <a href="javascript:void(0)" id="toolbarClose" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" onclick="cancelForm()">取消</a>
+    </div>
+
+    <script type="text/javascript">
+        $(document).ready(function () {
+            //var ctime = new Date();
+            //$("#ACCOUNTDATE").datebox("setValue", ctime.getFullYear() + "-" + (ctime.getMonth() + 1) + "-" + (ctime.getDate() + 1));
+        });
+
+        function submitForm() {
+            $.dialog.save({
+                formid: 'ff',
+                datagridid: 'mouldcodewarningDatagrid2',
+                url: 'deliverplan.ashx?m=dr&id=' + request('id') 
+            });
+        }
+
+        function cancelForm() {
+            $.dialog.close();
+        }
+    </script>
+
+</body>
+</html>

+ 415 - 0
wwwroot/mes/semifinished/deliverplan/deliverplan_index.html

@@ -0,0 +1,415 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body class="easyui-layout">
+    <div data-options="border:false,region:'north',title:'',iconCls:'icon-grid'">
+        <!--工具条-->
+        <div id="glineplanmoldToolbar" class="i-toolbar">
+
+            <a href="javascript:void(0)" id="glineplanmoldButtonReload" title="刷新" class="easyui-linkbutton" iconcls="icon-reload" plain="true" onclick="glineplanmoldButtonReload_Click()">刷新</a>
+            <a href="javascript:void(0)" id="glineplanmoldButtonSearch" title="搜索" class="easyui-linkbutton" iconcls="icon-search" plain="true" toggle="true" onclick="glineplanmoldButtonSearch_Click()">搜索</a>
+            <a href="javascript:void(0)" id="fqcitemsButtonHelp" title="帮助" class="easyui-linkbutton" iconcls="icon-help" plain="true" onclick="glineplanmoldButtonHelp_Click()">帮助</a>
+
+        </div>
+    </div>
+    <!--表格左面-->
+    <div data-options="region:'west',title:'',split:true" style="width:20%; height: 100%">
+
+        <div id="tableTabs" class="easyui-tabs" data-options="border:false,region:'east',split:true" style="width:100%; height: 100%">
+            <div title="生产计划">
+                <div id="glineplanmoldSearchDiv" style="display:block; padding-left: 10px;" data-options="border:false,region:'north',title:'',iconCls:'icon-grid'">
+                    <form id="glineplanmoldForm">
+                        <div style="padding-top:10px;">
+                            计划月份:
+                            <input class="easyui-datebox" id="PLANMONTH" name="PLANMONTH" data-options="required:true,editable:false ,prompt:'',tipPosition:'top'" style="width:165px; height:32px;">
+                        </div>
+                        <div style="padding-top: 10px; padding-bottom: 10px;">
+                            计划名称:
+                            <input class="easyui-textbox" id="PLANNAME" name="PLANNAME" data-options="required:false,prompt:'',tipPosition:'top'" style="width: 120px; height: 32px;">
+
+                            <a href="javascript:void(0)" id="glineplanmoldButtonSearchSubmit" title="搜索" class="easyui-linkbutton" plain="false" onclick="glineplanmoldButtonSearchSubmit_Click()">搜索</a>
+
+                        </div>
+                    </form>
+                </div>
+
+                <table class="easyui-datagrid" id="mouldcodewarningDatagrid2" data-options="method:'get',singleSelect:true,border:false,fit:true,fitColumns:true,checkOnSelect:false,selectOnCheck:false" style="width:100%; height: 100%">
+                    <thead>
+                        <tr>
+                            <th data-options="field:'SID',title:'SID',width:220,align:'left',checkbox:true,hidden:true">SID</th>
+                            <th data-options="field:'PLANCODE',title:'计划单号',align:'center',sortable:false,"></th>
+                            <th data-options="field:'PLANNAME',title:'计划名称',align:'center',sortable:false"></th>
+                            <th data-options="field:'PLANMONTH',title:'计划月份',align:'center',sortable:false"></th>
+                            <th data-options="field:'REMARKS',title:'备注',align:'center',sortable:false"></th>
+                        </tr>
+                    </thead>
+                </table>
+
+            </div>
+        </div>
+    </div>
+    <!--表格右面-->
+    <div data-options="region:'center',title:''" style="width:80%; height: 100%">
+        <div id="tableTabs1" class="easyui-tabs" data-options="border:false,region:'center'" style="width:100%; height: 100%">
+            <div title="计划明细">
+                <div style="height: 13%; display: block; padding-left: 10px;" data-options="border:false,region:'north',title:'',iconCls:'icon-grid'">
+                    <form id="glineplanmoldForm2">
+                        <div style="padding-bottom:9px; height:32px;width:100%;">
+                            <a href="javascript:void(0)" id="glineplanmoldButtonReload" title="刷新" class="easyui-linkbutton" iconcls="icon-reload" plain="true" onclick="glineplanmoldButtonReload2_Click()">刷新</a>
+                            <span>|</span>
+                            <a href="javascript:void(0)" id="glineplanmoldButtonUpdate" title="编辑" class="easyui-linkbutton" iconcls="icon-edit" plain="true" onclick="update_Click()">添加物料明细</a>
+                            <a href="javascript:void(0)" id="glineplanmoldButtonDelete" title="删除" class="easyui-linkbutton" iconcls="icon-remove" plain="true" onclick="glineplanmoldButtonDelete_Click()">删除</a>
+                            <a href="javascript:void(0)" id="dailyplanButtonImport" title="导入" class="easyui-linkbutton" iconcls="icon-excel" plain="true" onclick="glineplanmoldButtonImport_Click()">导入</a>
+                            <a href="javascript:void(0)" id="glineplanmoldButtonExport" title="导出" class="easyui-linkbutton" iconcls="icon-excel" plain="true" onclick="glineplanmoldButtonExport_Click()">导出</a> 
+                            <a href="javascript:void(0)" id="planHistorySearchSubmit" title="履历" class="easyui-linkbutton" iconcls="icon-search" plain="true" onclick="planHistorySearchSubmit_Click()">查看履历</a>
+                            <span>|</span>
+                            <a href="javascript:void(0)" id="glineplanmoldButtonSave" title="提交" class="easyui-linkbutton" iconcls="icon-edit" plain="true" onclick="glineplanmoldButtonSave_Click()">保存</a>
+
+                        </div>
+                        <div id="glineplanmoldSearchDiv2" style="padding-top:10px;">
+                            物料编码:
+                            <input class="easyui-textbox" id="MATERIALCODE" name="MATERIALCODE" data-options="required:false,prompt:'',tipPosition:'top'" style="width: 120px; height: 32px;">
+
+                            <a href="javascript:void(0)" id="glineplanmoldButtonSearchSubmit" title="搜索" class="easyui-linkbutton" plain="false" onclick="glineplanmoldButtonSearchSubmit2_Click()">搜索</a>
+
+                        </div>
+                    </form>
+                </div>
+                <div style="height: 87%; overflow: auto;">
+                    <table id="glineplanmoldDatagrid" data-options="toolbar: '#mouldcodewarningToolbar',method:'get',border:false,singleSelect:false,checkOnSelect:false,fit:false,fitColumns:false">
+                        <thead>
+                            <tr>
+                                <th data-options="field:'SID',title:'SID',width:220,align:'left',checkbox:true"></th>
+                                <th data-options="field:'MATERIALCODE',title:'物料编码',align:'center',sortable:false"></th>
+                                <th data-options="field:'MATERIALREMARK',title:'物料描述',align:'center',sortable:false"></th>
+                                <th data-options="field:'PLANCOUNT',title:'计划数量',align:'center',editor:'numberbox'"></th>
+                                <th data-options="field:'COMPLETEDCOUNT',title:'已完成数量',align:'center',sortable:false,formatter:formatterDetail"></th>
+                                <th data-options="field:'COMPLETEDCOUNTPOINT',title:'已完成率',align:'center',sortable:false"></th>
+                                <th data-options="field:'CREATETIME',title:'创建时间',align:'center',sortable:false"></th>
+                                <th data-options="field:'CREATEUSERCODE',title:'创建者',align:'center',sortable:false"></th>
+                                <th data-options="field:'UPDATETIME',title:'更新时间',align:'center',sortable:false"></th>
+                                <th data-options="field:'UPDATEUSERCODE',title:'更新者',align:'center',sortable:false"></th>
+                                <th data-options="field:'REMARKS',title:'备注',align:'center',sortable:false"></th>
+                            </tr>
+                        </thead>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+
+
+    <script type="text/javascript">
+        var id = null;
+
+        $(document).ready(function () {
+
+            setDateToMonth("PLANMONTH");
+            $('#PLANMONTH').datebox('setValue', request('startDate'));
+
+            $('#glineplanmoldDatagrid').datagrid({
+                toolbar: '#mouldcodewarningToolbar',
+                method: 'get',
+                border: false,
+                singleSelect: false,
+                checkOnSelect: false,
+                fit: true,
+                fitColumns: true,
+                // 添加编辑相关配置
+                edit: true,  // 启用编辑功能
+                editMode: 'cell', // 单元格编辑模式
+                onDblClickCell: function (index, field, value) {
+                    // 双击单元格开始编辑
+                    $(this).datagrid('beginEdit', index);
+                },
+                // 点击其他地方自动结束编辑
+                onClickCell: function (index, field, value) {
+                    var editing = $(this).datagrid('getEditors', index);
+                    if (editing.length > 0) {
+                        $(this).datagrid('endEdit', index);
+                    }
+                },
+                // 编辑结束后的事件
+                onAfterEdit: function (index, row, changes) {
+                    console.log('第 ' + index + ' 行编辑完成');
+                    console.log('修改的字段:', changes);
+                }
+            });
+
+        });
+
+        //加载完成
+        $(function () {
+            //加载按钮
+            $('#glineplanmoldToolbar').buttonLoad({
+                url: 'deliverplan.ashx?m=b'
+            });
+        });
+
+        function setDateToMonth(id) {
+
+            $("#" + id).datebox({
+                onShowPanel: function () {//显示日趋选择对象后再触发弹出月份层的事件,初始化时没有生成月份层
+                    span.trigger('click'); //触发click事件弹出月份层
+                    //fix 1.3.x不选择日期点击其他地方隐藏在弹出日期框显示日期面板
+                    if (p.find('div.calendar-menu').is(':hidden')) p.find('div.calendar-menu').show();
+                    if (!tds) setTimeout(function () {//延时触发获取月份对象,因为上面的事件触发和对象生成有时间间隔
+                        tds = p.find('div.calendar-menu-month-inner td');
+                        tds.click(function (e) {
+                            e.stopPropagation(); //禁止冒泡执行easyui给月份绑定的事件
+                            var year = /\d{4}/.exec(span.html())[0];//得到年份
+                            var month = parseInt($(this).attr('abbr'), 10); //月份,这里不需要+1
+                            month = month < 10 ? '0' + month : month;
+                            $("#" + id).datebox('hidePanel')//隐藏日期对象
+                                .datebox('setValue', year + '-' + month); //设置日期的值
+                        });
+                    }, 0);
+                    yearIpt.unbind();//解绑年份输入框中任何事件
+                },
+                parser: function (s) {
+                    if (!s) return new Date();
+                    var arr = s.split('-');
+                    return new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, 1);
+                },
+                formatter: function (d) {
+                    return d.getFullYear() + '-' + (d.getMonth() + 1);/*getMonth返回的是0开始的,忘记了。。已修正*/
+                }
+            });
+            var p = $("#" + id).datebox('panel'), //日期选择对象
+                tds = false, //日期选择对象中月份
+                aToday = p.find('a.datebox-current'),
+                yearIpt = p.find('input.calendar-menu-year'),//年份输入框
+                //显示月份层的触发控件
+                span = aToday.length ? p.find('div.calendar-title span') ://1.3.x版本
+                    p.find('span.calendar-text'); //1.4.x版本
+            if (aToday.length) {//1.3.x版本,取消Today按钮的click事件,重新绑定新事件设置日期框为今天,防止弹出日期选择面板
+                aToday.unbind('click').click(function () {
+                    var now = new Date();
+                    now = now < 10 ? '0' + now : now;
+                    $("#" + id).datebox('hidePanel').datebox('setValue', now.getFullYear() + '-' + (now.toString() + 1));
+                });
+            }
+        };
+
+        //导入
+        function glineplanmoldButtonImport_Click() {
+            $('#mouldcodewarningDatagrid2').datagridDialog({
+                title: '导入注浆计划数据',
+                width: 640,
+                height: 420,
+                url: 'deliverplan_import.html',
+                requireSelect: true
+            });
+        }
+
+        //添加物料明细按钮
+        function update_Click() {
+            var widths = window.screen.width;
+            var heights = window.screen.height;
+
+            $('#mouldcodewarningDatagrid2').datagridDialog({
+                title: '修改数据',
+                width: 1000,
+                height: heights - 400,
+                url: 'deliverplan_adddetail.html',
+                requireSelect: true
+            });
+        }
+
+        ////删除按钮
+        function glineplanmoldButtonDelete_Click() {
+
+            var rows = $('#glineplanmoldDatagrid').datagrid("getChecked");
+            var ids = '';
+            if (rows != null && rows != "") {
+                $.messager.confirm('删除操作', '您确定删除选中的' + rows.length + '条数据吗?', function (r) {
+                    if (r) {
+                        $.each(rows, function (index, item) {
+                            ids += item["SID"] + ',';
+                        })
+                        ids = ids.substring(0, ids.length - 1);
+                        $.post("deliverplan.ashx?m=d",
+                            { 'id': ids },
+                            function (data) {
+                                var json = JSON.parse(data);
+                                if (json["success"] == true) {
+                                    glineplanmoldButtonSearchSubmit2_Click();
+                                }
+                                else {
+                                    $.messager.alert("数据错误", json['message'], 'error');
+
+                                }
+                            });
+                    }
+                });
+
+            }
+            else {
+                $.messager.alert("数据错误", '至少勾选一条数据', 'error');
+            }
+        }
+
+        //搜索按钮
+        function glineplanmoldButtonSearch_Click() {
+            $('#glineplanmoldSearchDiv').toggle();
+            $('#glineplanmoldSearchDiv2').toggle();
+            $('#glineplanmoldDatagrid').datagrid('resize');
+        }
+
+        //加载子表数据
+        function glineplanmoldButtonSearchSubmit2_Click(index, row) {
+            if (index > -1) {
+                id = row["SID"];
+            }
+
+            //加载子表数据
+            $('#glineplanmoldDatagrid').datagridLoad({
+                title: '',
+                idField: 'SID',
+                queryParams: $('#glineplanmoldForm2').serializeJson(),
+                url: 'deliverplan.ashx?m=z&PLANID=' + id,
+                pagination: true,
+                columnMoving: false,
+                onLoadSuccess: function (data) {
+                    $(this).datagrid("checkAll");
+                }
+            });
+
+        }
+
+        //主表查询提交
+        function glineplanmoldButtonSearchSubmit_Click() {
+            $('#mouldcodewarningDatagrid2').datagridLoad({
+                title: '',
+                idField: 'SID',
+                queryParams: $('#glineplanmoldForm').serializeJson(),
+                url: 'deliverplan.ashx?m=ss',
+                pagination: true,
+                columnMoving: false,
+                onSelect: glineplanmoldButtonSearchSubmit2_Click
+            });
+        }
+
+        //导出
+        function glineplanmoldButtonExport_Click() {
+            //加载表头
+            var fields = $('#glineplanmoldDatagrid').datagrid('getColumnFields');
+            var headers = [];
+            for (var i = 0; i < fields.length; i++) {
+                headers.push($('#glineplanmoldDatagrid').datagrid('getColumnOption', fields[i])['title']);
+            }
+            $('#glineplanmoldDatagrid').datagridExport({
+                headers: headers,
+                fileName: '导出数据(注浆计划表).xls',
+                workSheet: '导出数据(注浆计划表)'
+            });
+        }
+
+        //刷新
+        function glineplanmoldButtonReload_Click() {
+            glineplanmoldButtonSearchSubmit_Click();
+        }
+
+        //刷新
+        function glineplanmoldButtonReload2_Click() {
+            glineplanmoldButtonSearchSubmit2_Click();
+        }
+
+        //帮助
+        function glineplanmoldButtonHelp_Click() {
+            $('#glineplanmoldDatagrid').datagridDialog({
+                title: '帮助',
+                width: 640,
+                height: 480,
+                url: 'deliverplan_help.html'
+            });
+        }
+
+        //结束编辑
+        function endAllEdit() {
+            var rows = $('#glineplanmoldDatagrid').datagrid('getRows');
+            for (var i = 0; i < rows.length; i++) {
+                // 检查该行是否在编辑状态
+                var editors = $('#glineplanmoldDatagrid').datagrid('getEditors', i);
+                if (editors.length > 0) {
+                    $('#glineplanmoldDatagrid').datagrid('endEdit', i);
+                }
+            }
+        }
+
+        //保存
+        function glineplanmoldButtonSave_Click() {
+            endAllEdit();
+            var rows = $('#glineplanmoldDatagrid').datagrid("getChecked");
+            if (rows != null && rows != "") {
+                $.messager.confirm('生成计划操作', '您确定对选中的' + rows.length + '条数据进行保存修改?', function (r) {
+                    if (r) {
+                        //提交更改到后端处理
+                        $.post('deliverplan.ashx?m=i', {
+                            data: JSON.stringify(rows)
+                        }, function (data) {
+                            var json = JSON.parse(data);
+                            if (json['success'] == true) {
+                                $.messager.alert("保存", "保存成功" + json['message']);
+                            }
+                            else {
+                                $.messager.alert("保存", "保存失败" + json['message']);
+                            }
+                        });
+                    }
+                });
+
+            }
+            else {
+                $.messager.alert("数据错误", '至少勾选一条数据', 'error');
+            }
+        }
+
+        //查看履历
+        function planHistorySearchSubmit_Click() {
+            var widths = window.screen.width;
+            var heights = window.screen.height;
+
+            $('#mouldcodewarningDatagrid2').datagridDialog({
+                title: '查看履历',
+                width: widths - 600,
+                height: heights - 400,
+                url: 'deliver_history.html',
+                requireSelect: true
+            });
+        }
+        function formatterDetail(value, row, index) {
+            return '<a href="###" onclick=tabOpen(' + row["SID"] + ')>' + row["COMPLETEDCOUNT"] + '</a>';
+
+        }
+        function tabOpen(val) {
+
+            var heights = window.screen.height;
+
+            $('#glineplanmoldDatagrid').datagridDialog({
+                title: '查看交坯计划明细',
+                width: 700,
+                height: heights - 400,
+                url: 'deliverplan_detail.html?SID=' + val
+            });
+        }
+
+    </script>
+</body>
+</html>

二進制
wwwroot/mes/semifinished/deliverplan/交坯计划导入模板.xlsx


+ 101 - 0
wwwroot/mes/semifinished/groutplan/grout_history.html

@@ -0,0 +1,101 @@
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body class="easyui-layout" style="width:100%;height:100%">
+
+    <div data-options="border:false,region:'north',split:true,title:'',iconCls:'icon-grid'" title="West" style="width: 100%; height: 15% ">
+        <!--工具条-->
+        <div data-options="region:'center',plain:true,border:false">
+            <form id="planForm" method="post" class="w-form" style="padding-bottom:0px;"> 
+                <div class="w-div" style="padding-top:15px;"> 
+                    <div style="padding-top: 10px; padding-bottom: 10px;">
+                        计划名称:
+                        <input class="easyui-textbox" id="PLANNAME" name="PLANNAME" data-options="required:true,disabled:true,tipPosition:'top'"">
+                        物料编码:
+                        <input class="easyui-textbox" id="MATERIALCODE" name="MATERIALCODE" data-options="required:false,prompt:'',tipPosition:'top'" >
+                        <a href="javascript:void(0)" id="glineplanmoldButtonSearchSubmit" title="搜索" class="easyui-linkbutton" plain="false" onclick="glineplanmoldButtonSearchSubmit_Click()">搜索</a>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+
+    <div data-options="region:'south',split:true,plain:true ,iconCls:'icon-grid',border:false" style="height:85%">
+        <!--表格-->
+        <table id="planDatagrid" data-options="toolbar: '#planToolbar',showFooter:false">
+            <thead>
+                <tr>
+                    <th data-options="field:'SID',title:'SID',align:'left',checkbox:true,hidden:true">SID</th>
+                    <th data-options="field:'MATERIALCODE',title:'物料编码',align:'left',sortable:true"></th>
+                    <th data-options="field:'EDITFLAG',title:'类型',align:'left',sortable:true"></th>
+                    <th data-options="field:'PLANCOUNT',title:'计划数量',align:'center'"></th> 
+                    <th data-options="field:'CREATETIME',title:'创建时间',align:'center',sortable:false,"></th>
+                    <th data-options="field:'CREATEUSERCODE',title:'创建者',align:'center',sortable:false,"></th> 
+                    <th data-options="field:'CHANGEREMARKS',title:'备注',align:'center',sortable:false,"></th>
+
+                </tr>
+            </thead>
+        </table>
+    </div>
+     
+    <script type="text/javascript">
+        //var itemsid = $('#ITEMSID').val();
+        function GetQueryValue1(queryName) {
+            var reg = new RegExp("(^|&)" + queryName + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg);
+            if (r != null) {
+                return decodeURI(r[2]);
+            } else {
+                return null;
+            }
+        }
+
+        var url = window.location.search;
+        var itemsID = GetQueryValue1('id');
+
+
+        //加载完成
+        $(function () {
+            $('#planForm').formLoad({
+                url: 'groutplan.ashx?m=t'
+            }); 
+            //加载按钮
+            $('#planToolbar').buttonLoad({
+                url: 'groutplan.ashx?m=b'
+            });
+            //加载表格数据 
+            glineplanmoldButtonSearchSubmit_Click();
+        });
+          
+        //搜索提交
+        function glineplanmoldButtonSearchSubmit_Click() {
+            $('#planDatagrid').datagridLoad({
+                title: '计划明细履历',
+                idField: 'SID',
+                queryParams: $('#planForm').serializeJson(),
+                url: 'groutplan.ashx?m=h&PLANID=' + itemsID,
+                pagination: false,
+                columnMoving: false
+            });
+
+        } 
+    </script>
+
+</body>
+</html>

+ 983 - 0
wwwroot/mes/semifinished/groutplan/groutplan.ashx

@@ -0,0 +1,983 @@
+<%@ WebHandler Language="C#" Class="glineplanmold" %>
+
+using System;
+using System.Web;
+using System.Web.SessionState;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.Data;
+using Curtain.DataAccess;
+using DK.XuWei.WebMes;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+public class glineplanmold : IHttpHandler, IReadOnlySessionState
+{
+    string detailplanID = null;
+    public void ProcessRequest(HttpContext context)
+    {
+        context.Response.ContentType = "text/plain";
+        if (mes.LoginCheck() && context.Request["m"] is object)
+        {
+            Button b = new Button();
+            if (mes.RightCheck(""))
+            {
+                b.MateriaPlanautoButtonIndex = true;
+                b.MateriaPlanautoButtonInsert = true;
+                b.MateriaPlanautoButtonInsertBatch = true;
+                b.MateriaPlanautoButtonCopy = true;
+                b.MateriaPlanautoButtonUpdate = true;
+                b.MateriaPlanautoButtonDelete = true;
+                b.MateriaPlanautoButtonCancel = true;
+                b.MateriaPlanautoButtonSearch = true;
+                b.MateriaPlanautoButtonDetail = true;
+                b.MateriaPlanautoButtonCheckbox = true;
+                b.MateriaPlanautoButtonExport = true;
+                b.MateriaPlanautoButtonReload = true;
+            };
+            switch (context.Request["m"].ToString().ToLower())
+            {
+                case "b":
+                    {
+                        //按钮
+                        context.Response.Write(new JsonResult(b).ToJson());
+                        break;
+                    }
+                case "z":
+                    {
+                        detailplanID = context.Request["PLANID"];
+                        //搜索明细
+                        if (b.MateriaPlanautoButtonIndex)
+                            context.Response.Write(search(context.Request.Form));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "ss":
+                    {
+                        //搜索主表
+                        if (b.MateriaPlanautoButtonIndex)
+                        {
+                            context.Response.Write(searchs(context.Request.Form));
+                        }
+                        else
+                        {
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        }
+                        break;
+                    }
+                case "dr":
+                    {
+                        //导入
+                        context.Response.Write(import(context));
+                        break;
+
+                    }
+                case "t":
+                    {
+                        //搜索主表编辑明细
+                        context.Response.Write(searchdetail(context));
+                        break;
+
+                    }
+                case "d":
+                    {
+                        //删除
+                        if (b.MateriaPlanautoButtonDelete)
+                            context.Response.Write(delete(context.Request["id"]));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "dd":
+                    {
+                        context.Response.Write(searchdetail());
+                        break;
+                    }
+                case "adddetail":
+                    {
+                        context.Response.Write(insertdetail(context.Request["data"], context.Request["PLANID"]));
+                        break;
+                    }
+                case "i":
+                    {
+                        //保存
+                        context.Response.Write(insertall(context.Request["data"]));
+                        break;
+                    }
+                case "h":
+                    {
+                        //履历查询
+                        detailplanID = context.Request["PLANID"];
+                        context.Response.Write(searchHistory(context.Request.Form));
+                        break;
+                    }
+                case "bardetail":
+                    {
+                        //查看注浆明细条码
+                        int proplanID = Convert.ToInt32(context.Request["PROPLANID"]);
+                        context.Response.Write(searchBardetail(proplanID));
+                        break;
+                    }
+            }
+        }
+    }
+
+    private string import(HttpContext context)
+    {
+        //上传文件
+        string filePath = "/upload/dailyplan/" + DateTime.Now.ToString("yyyy-MM-dd");
+        System.IO.Directory.CreateDirectory(context.Server.MapPath(filePath));
+        string fileName = filePath + "/注浆计划" + DateTime.Now.ToString("yyyy-MM-dd");
+        fileName += System.IO.Path.GetExtension(context.Request.Files[0].FileName);
+        string diskFileName = context.Server.MapPath(fileName);
+        if (System.IO.File.Exists(diskFileName)) System.IO.File.Delete(diskFileName);
+        context.Request.Files[0].SaveAs(diskFileName);
+
+        //读excel
+        DataTable dt = Import.ExcelToDataTable(diskFileName);
+        if (dt.Rows.Count == 0)
+        {
+            return new JsonResult(JsonStatus.otherError) { message = "Excel中无数据" }.ToJson();
+        }
+
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            int result = 0;
+            conn.BeginTransaction();
+            try
+            {
+                int row = 1;
+                int planID = Convert.ToInt32(HttpContext.Current.Request["id"]);
+
+                foreach (DataRow item in dt.Rows)
+                {
+                    // 物料编码
+                    if (string.IsNullOrEmpty(item["物料编码"] + ""))
+                    {
+                        conn.Rollback();
+                        return new JsonResult(JsonStatus.otherError) { message = "第" + row + "行,物料编码不能为空" }.ToJson();
+                    }
+                    string materialCode = item["物料编码"].ToString();
+
+                    // 计划数量
+                    if (string.IsNullOrEmpty(item["计划数量"] + ""))
+                    {
+                        conn.Rollback();
+                        return new JsonResult(JsonStatus.otherError) { message = "第" + row + "行,计划数量不能为空" }.ToJson();
+                    }
+                    string plancount = item["计划数量"].ToString();
+
+                    // 备注
+                    string detailRemarks = item["备注"].ToString();
+                    //物料描述
+                    string meterialRemark = getMeterialRemark(materialCode);
+
+                    string sqlStr = @" SELECT PP.PRODPLANID,PP.PLANMONTH,PP.PLANCOUNT
+                                   FROM TP_SEMIFINISHED_PRODPLAN PP
+                                  WHERE PP.PLANID = @PLANID@ AND PP.VALUEFLAG =1 AND PP.PLANTYPE = 1
+                                    AND PP.MATERIALCODE  =  @MATERIALCODE@";
+                    List<CDAParameter> sqlPara = new List<CDAParameter>();
+                    sqlPara.Add(new CDAParameter("PLANID", planID));
+                    sqlPara.Add(new CDAParameter("MATERIALCODE", materialCode));
+
+                    DataTable plandt = conn.ExecuteDatatable(sqlStr, sqlPara.ToArray());
+
+                    //查找该月是否有计划
+                    DataTable plandts = conn.ExecuteDatatable(@"SELECT PLANMONTH FROM TP_SEMIFINISHED_PLAN  WHERE  PLANID = @PLANID@ AND VALUEFLAG = 1 ",
+                        new CDAParameter("PLANID", planID)
+                    );
+                    if (plandt != null && plandt.Rows.Count > 0)
+                    {
+                        //编辑
+                        result += conn.ExecuteNonQuery(@"UPDATE TP_SEMIFINISHED_PRODPLAN  SET   
+                                    PLANCOUNT = PLANCOUNT + @PLANCOUNT@, REMARKS = @REMARKS@  ,UPDATEUSERID = @UPDATEUSERID@ ,UPDATETIME= SYSDATE 
+                                    WHERE PRODPLANID = @PRODPLANID@ AND MATERIALCODE = @MATERIALCODE@ AND VALUEFLAG =1
+                            ",
+                            new CDAParameter("PLANCOUNT", Convert.ToInt32( plancount)),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS", detailRemarks),
+                            new CDAParameter("MATERIALCODE", materialCode),
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(plandt.Rows[0]["PRODPLANID"]))
+                        );
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                    (PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,EDITFLAG
+                                    ,PLANTYPE
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,CHANGEREMARKS 
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    )
+                             SELECT PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,2 EDITFLAG
+                                    ,PLANTYPE
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,@PLANCOUNT@ AS  PLANCOUNT
+                                    ,@CHANGEREMARKS@
+                                    ,ACCOUNTID
+                                    ,UPDATEUSERID AS CREATEUSERID
+                             FROM TP_SEMIFINISHED_PRODPLAN  WHERE PRODPLANID = @PRODPLANID@ AND MATERIALCODE = @MATERIALCODE@  AND VALUEFLAG = 1
+                            ",
+                            new CDAParameter("PLANCOUNT", plancount),
+                            new CDAParameter("CHANGEREMARKS", "【导入-物料增加计划】-"+detailRemarks)
+                        );
+                    }
+                    else
+                    {
+                        //新建
+                        object proPlanid = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PRODPLAN_ID");
+
+                        result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLAN  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,PLANTYPE
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CREATEUSERID
+                                            ,UPDATEUSERID
+                                            ,REMARKS
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,1
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CREATEUSERID@
+                                            ,@UPDATEUSERID@
+                                            ,@REMARKS@)
+                            ",
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(proPlanid)),
+                            new CDAParameter("PLANID", Convert.ToInt32(planID)),
+                            new CDAParameter("PLANMONTH", Convert.ToDateTime(plandts.Rows[0]["PLANMONTH"])),
+                            new CDAParameter("MATERIALCODE", materialCode),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT",  plancount),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  detailRemarks)
+                        );
+
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                    (PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,EDITFLAG
+                                    ,PLANTYPE 
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT  
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    ,REMARKS 
+                                    )
+                                VALUES
+                                    (@PRODPLANID@
+                                    ,@PLANID@
+                                    ,@PLANMONTH@
+                                    ,1
+                                    ,1 
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@ 
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@
+                                    ,@REMARKS@ )
+                            ",
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(proPlanid)),
+                            new CDAParameter("PLANID", Convert.ToInt32(planID)),
+                            new CDAParameter("PLANMONTH", Convert.ToDateTime(plandts.Rows[0]["PLANMONTH"])),
+                            new CDAParameter("MATERIALCODE", materialCode),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT",  plancount),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  detailRemarks)
+
+                        );
+
+                    }
+                    row++;
+                }
+                if (result > 0)
+                {
+                    conn.Commit();
+                    return new JsonResult(JsonStatus.success).ToJson();
+                }
+                else
+                {
+                    conn.Rollback();
+                    return new JsonResult(JsonStatus.error).ToJson();
+                }
+
+            }
+            catch (Exception ex)
+            {
+                conn.Rollback();
+                return new JsonResult(JsonStatus.otherError) { message = ex.Message }.ToJson();
+            }
+        }
+    }
+
+    private string delete(string id)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            conn.BeginTransaction();
+            if (id is object)
+            {
+                try
+                {
+                    //插入删除履历 
+                    int result = conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                    (PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,EDITFLAG
+                                    ,PLANTYPE
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,CHANGEREMARKS 
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    ,VALUEFLAG 
+                                    )
+                             SELECT PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,2 EDITFLAG
+                                    ,PLANTYPE
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT
+                                    ,@CHANGEREMARKS@ CHANGEREMARKS
+                                    ,ACCOUNTID
+                                    ,@CREATEUSERID@ AS CREATEUSERID 
+                                    ,0 VALUEFLAG
+                             FROM TP_SEMIFINISHED_PRODPLAN  WHERE instr(',' || @PRODPLANID@ || ',', ',' || PRODPLANID || ',') > 0 
+                            ",
+                            new CDAParameter("PRODPLANID", id),
+                            new CDAParameter("CHANGEREMARKS", "被删除"),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"])
+                        );
+
+                    //删除总单
+                    result += conn.ExecuteNonQuery(@"DELETE FROM TP_SEMIFINISHED_PRODPLAN WHERE instr(',' || @PRODPLANID@ || ',', ',' || PRODPLANID || ',') > 0 ",
+                        new CDAParameter("PRODPLANID", id)
+                    );
+
+                    if (result > 0)
+                    {
+                        conn.Commit();
+                        return new JsonResult(JsonStatus.success).ToJson();
+                    }
+                    else
+                    {
+                        conn.Rollback();
+                        return new JsonResult(JsonStatus.otherError).ToJson();
+                    }
+
+                }
+                catch (Exception ex)
+                {
+
+                    throw ex;
+                }
+            }
+            else
+            {
+                return new JsonResult(JsonStatus.otherError).ToJson();
+            }
+        }
+    }
+
+    /// <summary>
+    /// 修改
+    /// </summary>
+    /// <returns></returns>
+    private string insertdetail(string jsondata,string planid)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            try
+            {   conn.BeginTransaction();
+                //明细 
+                DataTable detailTable = JsonConvert.DeserializeObject<DataTable>(jsondata);
+                for (int i = 0; i < detailTable.Rows.Count; i++)
+                {
+                    string sqlStr = @" SELECT SP.PRODPLANID,SP.PLANMONTH,SP.PLANCOUNT
+                                   FROM TP_SEMIFINISHED_PRODPLAN SP
+                                  WHERE SP.PLANID = @PLANID@ AND SP.VALUEFLAG =1 AND SP.PLANTYPE = 1
+                                    AND SP.MATERIALCODE  =  @MATERIALCODE@";
+                    List<CDAParameter> sqlPara = new List<CDAParameter>();
+                    sqlPara.Add(new CDAParameter("PLANID", Convert.ToInt32(planid)));
+                    sqlPara.Add(new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]));
+
+                    DataTable plandt = conn.ExecuteDatatable(sqlStr, sqlPara.ToArray());
+
+                    DataTable plandts = conn.ExecuteDatatable(@"SELECT PLANMONTH FROM TP_SEMIFINISHED_PLAN  WHERE  PLANID = @PLANID@ AND VALUEFLAG = 1 ",
+                        new CDAParameter("PLANID", planid)
+                    );
+                    int result = 0;
+                    //物料描述
+                    string meterialRemark = getMeterialRemark(detailTable.Rows[i]["MATERIALCODE"].ToString());
+                    if (plandt != null && plandt.Rows.Count > 0)
+                    {
+                        //编辑
+                        result += conn.ExecuteNonQuery(@"UPDATE TP_SEMIFINISHED_PRODPLAN  SET   
+                                    PLANCOUNT = PLANCOUNT + @PLANCOUNT@, REMARKS = @REMARKS@  ,UPDATEUSERID = @UPDATEUSERID@ ,UPDATETIME= SYSDATE
+                                    WHERE PRODPLANID = @PRODPLANID@ AND MATERIALCODE = @MATERIALCODE@
+                            ",
+                            new CDAParameter("PLANCOUNT", detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS", detailTable.Rows[i]["REMARKS"]),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(plandt.Rows[0]["PRODPLANID"]))
+                        );
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                    (PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,EDITFLAG
+                                    ,PLANTYPE 
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT  
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    ,CHANGEREMARKS 
+                                    )
+                                VALUES
+                                    (@PRODPLANID@
+                                    ,@PLANID@
+                                    ,@PLANMONTH@
+                                    ,2
+                                    ,1 
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@ 
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@
+                                    ,@CHANGEREMARKS@ )
+                            ",
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(plandt.Rows[0]["PRODPLANID"])),
+                            new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                            new CDAParameter("PLANMONTH", Convert.ToDateTime(plandt.Rows[0]["PLANMONTH"])),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT",  detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  "【物料增加计划】-"+ detailTable.Rows[i]["REMARKS"])
+                        );
+                    }
+                    else
+                    {
+                        //新建
+                        object proPlanid = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PRODPLAN_ID");
+
+                        result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLAN  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,PLANTYPE
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CREATEUSERID
+                                            ,UPDATEUSERID
+                                            ,REMARKS
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,1
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CREATEUSERID@
+                                            ,@UPDATEUSERID@
+                                            ,@REMARKS@)
+                            ",
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(proPlanid)),
+                            new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                            new CDAParameter("PLANMONTH", Convert.ToDateTime(plandts.Rows[0]["PLANMONTH"])),
+                            new CDAParameter("MATERIALCODE",detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT",  detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  detailTable.Rows[i]["REMARKS"])
+                        );
+
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                    (PRODPLANID
+                                    ,PLANID
+                                    ,PLANMONTH
+                                    ,EDITFLAG
+                                    ,PLANTYPE 
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT  
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    ,REMARKS 
+                                    )
+                                VALUES
+                                    (@PRODPLANID@
+                                    ,@PLANID@
+                                    ,@PLANMONTH@
+                                    ,1
+                                    ,1 
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@ 
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@
+                                    ,@REMARKS@ )
+                            ",
+                            new CDAParameter("PRODPLANID", Convert.ToInt32(proPlanid)),
+                            new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                            new CDAParameter("PLANMONTH", Convert.ToDateTime(plandts.Rows[0]["PLANMONTH"])),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT",  detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  detailTable.Rows[i]["REMARKS"])
+
+                        );
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+
+                throw ex;
+            }
+            conn.Commit();
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 查询物料描述
+    /// </summary>
+    /// <returns></returns>
+    private string getMeterialRemark(string materialCode)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            string sqlStr = @" SELECT s.MAKTX
+                                   FROM TP_PC_SAPBOMDETAIL s
+                                  WHERE s.MATNR = @materialCode@ ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("materialCode", materialCode));
+            try
+            {
+                DataTable dt = conn.ExecuteDatatable(sqlStr, sqlPara.ToArray());
+                string meterialRemark = "";
+                if (dt != null && dt.Rows.Count >0)
+                {
+                    meterialRemark = dt.Rows[0]["MAKTX"].ToString();
+                }
+                return meterialRemark;
+            }
+            catch (Exception ex)
+            {
+                throw ex ;
+            }
+        }
+    }
+
+    private class Button
+    {
+        public bool MateriaPlanautoButtonIndex = false;
+        public bool MateriaPlanautoButtonInsert = false;
+        public bool MateriaPlanautoButtonInsertBatch = false;
+        public bool MateriaPlanautoButtonCopy = false;
+        public bool MateriaPlanautoButtonUpdate = false;
+        public bool MateriaPlanautoButtonDelete = false;
+        public bool MateriaPlanautoButtonCancel = false;
+        public bool MateriaPlanautoButtonSearch = false;
+        public bool MateriaPlanautoButtonDetail = false;
+        public bool MateriaPlanautoButtonCheckbox = false;
+        public bool MateriaPlanautoButtonExport = false;
+        public bool MateriaPlanautoButtonReload = false;
+    }
+
+    /// <summary>
+    /// 搜索主表
+    /// </summary>
+    /// <returns></returns>
+    private string searchs(NameValueCollection form)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            int page = HttpContext.Current.Request["page"] is object ? Convert.ToInt32(HttpContext.Current.Request["page"]) : 1;
+            int rows = HttpContext.Current.Request["rows"] is object ? Convert.ToInt32(HttpContext.Current.Request["rows"]) : 10;
+            string sort = HttpContext.Current.Request["sort"] is object ? HttpContext.Current.Request["sort"] : "";
+            string order = HttpContext.Current.Request["order"] is object ? HttpContext.Current.Request["order"] : "";
+
+            string sqlStr = @"
+                SELECT  
+                    p.PLANID SID, 
+                    p.PLANID, 
+                    p.PLANCODE,
+                    p.PLANNAME,
+                    p.REMARKS,
+                    TO_CHAR(p.PLANMONTH, 'YYYY-MM') PLANMONTH
+                FROM
+                    TP_SEMIFINISHED_PLAN p 
+                WHERE 
+                    p.valueflag = 1
+            ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+
+            if(!string.IsNullOrEmpty(form["PLANNAME"]))
+            {
+                sqlStr += " AND INSTR(  P.PLANNAME, @PLANNAME@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("PLANNAME", form["PLANNAME"]));
+            }
+            if(!string.IsNullOrEmpty(form["PLANMONTH"]))
+            {
+                sqlStr += " AND P.PLANMONTH =  @PLANMONTH@";
+                sqlPara.Add(new CDAParameter("PLANMONTH", form["PLANMONTH"], DataType.DateTime));
+            }
+            if (Convert.ToInt32(HttpContext.Current.Request["id"]) > 0)
+            {
+                sqlStr += " AND P.PLANID =  @PLANID@";
+                sqlPara.Add(new CDAParameter("PLANID",Convert.ToInt32(HttpContext.Current.Request["id"]), DataType.DateTime));
+
+            }
+            if(sort != "")
+            {
+                sqlStr += " ORDER BY " + sort + " " + order;
+            }
+            int total = 0;
+            DataTable dt = conn.SelectPages(page, rows,out total, sqlStr, sqlPara.ToArray());
+            return new JsonResult(dt) { total = total}.ToJson();
+
+        }
+    }
+
+    /// <summary>
+    /// 搜索编辑信息
+    /// </summary>
+    /// <returns></returns>
+    private string searchdetail(HttpContext contest)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            string sqlStr = @"
+                SELECT  
+                    p.PLANID SID, 
+                    p.PLANID, 
+                    p.PLANCODE,
+                    p.PLANNAME,
+                    p.REMARKS,
+                    TO_CHAR(p.PLANMONTH, 'YYYY-MM') PLANMONTH
+                FROM
+                    TP_SEMIFINISHED_PLAN p 
+                WHERE 
+                    1 = 1
+            ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+
+            if (Convert.ToInt32(contest.Request["id"]) > 0)
+            {
+                sqlStr += " AND P.PLANID =  @PLANID@";
+                sqlPara.Add(new CDAParameter("PLANID",Convert.ToInt32(contest.Request["id"])));
+
+            }
+            int total = 0;
+            DataTable dt = conn.ExecuteDatatable( sqlStr, sqlPara.ToArray());
+            return new JsonResult(dt) { total = total}.ToJson();
+
+        }
+    }
+    /// <summary>
+    /// 搜索明细
+    /// </summary>
+    /// <returns></returns>
+    private string search(NameValueCollection form)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            int page = HttpContext.Current.Request["page"] is object ? Convert.ToInt32(HttpContext.Current.Request["page"]) : 1;
+            int rows = HttpContext.Current.Request["rows"] is object ? Convert.ToInt32(HttpContext.Current.Request["rows"]) : 10;
+            string sort = HttpContext.Current.Request["sort"] is object ? HttpContext.Current.Request["sort"] : "";
+            string order = HttpContext.Current.Request["order"] is object ? HttpContext.Current.Request["order"] : "";
+
+            //物料编码
+            string materialCode = form["MATERIALCODE"];
+
+            string sqlStr = @"SELECT SP.PLANID,
+                                SP.PRODPLANID,
+                                SP.PRODPLANID SID,
+                                SP.MATERIALCODE,
+                                SP.MATERIALREMARK,
+                                SP.PLANCOUNT, 
+                                NVL(SP.COMPLETEDCOUNT,0) AS COMPLETEDCOUNT, 
+                                CASE 
+                                     WHEN SP.COMPLETEDCOUNT > 0 THEN 
+                                       TO_CHAR((NVL(SP.COMPLETEDCOUNT, 0)/SP.PLANCOUNT) * 100, '9990.99') || '%'
+                                     ELSE '0.00%'
+                               END as COMPLETEDCOUNTPOINT,
+                                SP.CREATETIME,
+                                U.USERNAME AS CREATEUSERCODE,
+                                SP.UPDATETIME,
+                                U1.USERNAME AS UPDATEUSERCODE,
+                                SP.REMARKS
+                              FROM TP_SEMIFINISHED_PRODPLAN SP  
+                                LEFT JOIN TP_MST_USER U ON U.USERID = SP.CREATEUSERID
+                                LEFT JOIN TP_MST_USER U1 ON U1.USERID = SP.UPDATEUSERID 
+                             WHERE SP.VALUEFLAG = 1 AND SP.PLANTYPE =1
+                                   AND SP.ACCOUNTID = @accountid@";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("accountid", HttpContext.Current.Session["accountId"]));
+            //主表计划ID
+            if (!string.IsNullOrEmpty(detailplanID))
+            {
+                sqlStr += " AND SP.PLANID = " + detailplanID ;
+
+            }
+            if (!string.IsNullOrEmpty(materialCode))
+            {
+                sqlStr += " and SP.MATERIALCODE like '%" + materialCode + "%' ";
+            }
+            try
+            {
+                JsonResult data = Easyui.ExecuteJsonResult(conn, sqlStr, sqlPara);
+                return data.ToJson();
+            }
+            catch (Exception ex)
+            {
+                throw ex ;
+            }
+        }
+    }
+
+    /// <summary>
+    /// 搜索明细
+    /// </summary>
+    /// <returns></returns>
+    private string searchdetail()
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            string sqlStr = @"SELECT SP.PLANID, 
+                                SP.MATERIALCODE,
+                                SP.MATERIALREMARK,
+                                SP.PLANCOUNT,
+                                SP.REMARKS
+                              FROM TP_SEMIFINISHED_PRODPLAN SP 
+                             WHERE SP.PLANTYPE =1 AND  1=0 ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("accountid", HttpContext.Current.Session["accountId"]));
+
+            try
+            {
+                JsonResult data = Easyui.ExecuteJsonResult(conn, sqlStr, sqlPara);
+                return data.ToJson();
+            }
+            catch (Exception ex)
+            {
+                throw ex ;
+            }
+        }
+    }
+
+    /// <summary>
+    /// 保存
+    /// </summary>
+    /// <returns></returns>
+    private string insertall(string jsondata)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            try
+            {   conn.BeginTransaction();
+                //明细 
+                DataTable detailTable = JsonConvert.DeserializeObject<DataTable>(jsondata);
+                int result = 0;
+                int planid = 0;
+                string planmonth = "";
+                if (detailTable != null && detailTable.Rows.Count > 0)
+                {
+                    planid = Convert.ToInt32(detailTable.Rows[0]["PLANID"].ToString());
+                    DataTable plandts = conn.ExecuteDatatable(@"SELECT PLANMONTH FROM TP_SEMIFINISHED_PLAN  WHERE  PLANID = @PLANID@ AND VALUEFLAG = 1 ",
+                        new CDAParameter("PLANID", planid)
+                    );
+                    planmonth = plandts.Rows[0]["PLANMONTH"].ToString();
+                    //保存调整后的总计划,更新标识为已生成
+                    //保存总计划履历表,编辑类型
+
+                    for (int i = 0; i < detailTable.Rows.Count; i++)
+                    {
+                        //编辑
+                        result += conn.ExecuteNonQuery(@"UPDATE TP_SEMIFINISHED_PRODPLAN  SET   
+                                    PLANCOUNT = @PLANCOUNT@ , UPDATEUSERID = @UPDATEUSERID@ ,UPDATETIME= SYSDATE
+                                    WHERE PRODPLANID = @PRODPLANID@ AND MATERIALCODE = @MATERIALCODE@
+                        ",
+                        new CDAParameter("PLANCOUNT",  detailTable.Rows[i]["PLANCOUNT"]),
+                        new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                        new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                        new CDAParameter("PRODPLANID", Convert.ToInt32(detailTable.Rows[i]["PRODPLANID"]))
+                        );
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                            (PLANID ,PRODPLANID ,PLANMONTH,EDITFLAG ,PLANTYPE,MATERIALCODE ,MATERIALREMARK  ,PLANCOUNT ,CHANGEREMARKS  ,ACCOUNTID ,CREATEUSERID  )
+                        VALUES
+                            (@PLANID@,@PRODPLANID@,@PLANMONTH@,2,1,@MATERIALCODE@,@MATERIALREMARK@ ,@PLANCOUNT@,@CHANGEREMARKS@,@ACCOUNTID@,@CREATEUSERID@ )",
+                        new CDAParameter("PLANID", Convert.ToInt32(detailTable.Rows[i]["PLANID"])),
+                        new CDAParameter("PRODPLANID", Convert.ToInt32(detailTable.Rows[i]["PRODPLANID"])),
+                        new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                        new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                        new CDAParameter("MATERIALREMARK", detailTable.Rows[i]["MATERIALREMARK"]),
+                        new CDAParameter("PLANCOUNT",detailTable.Rows[i]["PLANCOUNT"]),
+                        new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                        new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                        new CDAParameter("CHANGEREMARKS", "【修改注浆计划】-"+ detailTable.Rows[i]["REMARKS"])
+                        );
+
+                    }
+                }
+                else
+                {
+                    conn.Rollback();
+                    return new JsonResult(JsonStatus.otherError) { message = "--无勾选数据" }.ToJson();
+                }
+            }
+            catch (Exception ex)
+            {
+                conn.Rollback();
+                throw ex;
+            }
+            conn.Commit();
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 搜索明细履历
+    /// </summary>
+    /// <returns></returns>
+    private string searchHistory(NameValueCollection form)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            //物料编码
+            string materialCode = form["MATERIALCODE"];
+
+            string sqlStr = @"SELECT SP.PLANID,
+                                SP.PRODPLANID,  
+                                SP.HISID SID,  
+                                CASE WHEN SP.EDITFLAG = 1 THEN '新建' WHEN SP.EDITFLAG = 2 THEN '编辑'  END AS EDITFLAG, 
+                                SP.MATERIALCODE,
+                                SP.MATERIALREMARK,
+                                SP.PLANCOUNT, 
+                                SP.CREATETIME,
+                                U.USERNAME AS CREATEUSERCODE, 
+                                SP.CHANGEREMARKS
+                              FROM TP_SEMIFINISHED_PRODPLANHIS SP 
+                                LEFT JOIN TP_MST_USER U ON U.USERID = SP.CREATEUSERID 
+                             WHERE  SP.ACCOUNTID = @accountid@ AND SP.PLANTYPE = 1 ";
+
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("accountid", HttpContext.Current.Session["accountId"]));
+            //主表计划ID
+            if (!string.IsNullOrEmpty(detailplanID))
+            {
+                sqlStr += " AND SP.PLANID = " + detailplanID ;
+
+            }
+            if (!string.IsNullOrEmpty(materialCode))
+            {
+                sqlStr += " and SP.MATERIALCODE like '%" + materialCode + "%' ";
+            }
+            sqlStr += " ORDER BY SP.CREATETIME ";
+            try
+            {
+                int total = 0;
+                DataTable data = conn.ExecuteDatatable( sqlStr, sqlPara.ToArray());
+                return new JsonResult(data) { total = total}.ToJson();
+            }
+            catch (Exception ex)
+            {
+                throw ex ;
+            }
+        }
+    }
+
+    /// <summary>
+    /// 搜索注浆对应明细
+    /// </summary>
+    /// <returns></returns>
+    private string searchBardetail(int proPlanid)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+
+            string sqlStr = @" SELECT GDD.BARCODE,TO_CHAR(GDD.GROUTINGDATE, 'YYYY-MM-DD') GROUTINGDATE,GDD.GROUTINGLINECODE,GDD.USERCODE GROUTINGUSERCODE
+                        FROM TP_SEMIFINISHED_PRODPLANBAR PRB
+                        LEFT JOIN TP_PM_GROUTINGDAILYDETAIL GDD ON PRB.GROUTINGDAILYDETAILID = GDD.GROUTINGDAILYDETAILID
+                        WHERE  PRB.ACCOUNTID = @accountid@  ";
+
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("accountid", HttpContext.Current.Session["accountId"]));
+            //主表计划ID
+            if (proPlanid > 0)
+            {
+                sqlStr += " AND PRB.PRODPLANID = " + proPlanid ;
+
+            }
+            sqlStr += " ORDER BY TO_CHAR(GDD.GROUTINGDATE, 'YYYY-MM-DD')";
+                 
+            int total = 0;
+            DataTable dt = conn.ExecuteDatatable( sqlStr, sqlPara.ToArray());
+            return new JsonResult(dt) { total = total}.ToJson();
+        }
+    }
+
+    public bool IsReusable
+    {
+        get
+        {
+            return false;
+        }
+    }
+
+}

+ 177 - 0
wwwroot/mes/semifinished/groutplan/groutplan_adddetail.html

@@ -0,0 +1,177 @@
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body class="easyui-layout" style="width:100%;height:100%">
+
+    <div data-options="border:false,region:'north',split:true,title:'',iconCls:'icon-grid'" title="West" style="width: 100%; height: 13% ">
+        <!--工具条-->
+        <div data-options="region:'center',plain:true,border:false">
+            <form id="planForm" method="post" class="w-form" style="padding-bottom:0px;"> 
+                <div id="planMore2" style="display:block;">  
+                    <div class="w-div" style="padding-top:15px;">
+                        <div class="w-fieldname">计划名称:</div>
+                        <div class="w-field"><input class="easyui-textbox" id="PLANNAME" name="PLANNAME" data-options="required:true,prompt:'请填写计划名称',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+
+    <div data-options="region:'south',split:true,plain:true ,iconCls:'icon-grid',border:false" style="height:87%">
+        <!--工具条-->
+        <div id="planToolbar" class="i-toolbar"> 
+            <a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-add',plain:true" onclick="append()">添加行</a>
+            <a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-remove',plain:true" onclick="removeit()">移除行</a>
+            <span>|</span>
+            <a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-search',plain:true" onclick="getChanges()">保存</a> 
+        </div>
+        <!--表格-->
+        <table id="planDatagrid" data-options="toolbar: '#planToolbar',showFooter:false,
+               singleSelect: true, onClickCell: onClickCell">
+            <thead>
+                <tr>
+                    <th data-options="field:'SID',title:'SID',width:220,align:'left',checkbox:true,hidden:true">SID</th>  
+                    <th data-options="field:'MATERIALCODE',width:300,title:'物料编码',align:'left',sortable:true,editor:{type:'textbox'}"></th>
+                    <th data-options="field:'PLANCOUNT',width:300,title:'计划数量',align:'left',sortable:true,editor:{type:'numberbox'}"></th> 
+                    <th data-options="field:'REMARKS',width:400,title:'备注',align:'left',sortable:true,editor:{type:'textbox'}"></th> 
+
+                </tr>
+            </thead>
+        </table>
+    </div>
+     
+    <script type="text/javascript">
+        //var itemsid = $('#ITEMSID').val();
+        function GetQueryValue1(queryName) {
+            var reg = new RegExp("(^|&)" + queryName + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg);
+            if (r != null) {
+                return decodeURI(r[2]);
+            } else {
+                return null;
+            }
+        }
+
+        var url = window.location.search;
+        var itemsID = GetQueryValue1('id');
+
+
+        //加载完成
+        $(function () {
+            $('#planForm').formLoad({
+                url: 'groutplan.ashx?m=t'
+            }); 
+            //加载按钮
+            $('#planToolbar').buttonLoad({
+                url: 'groutplan.ashx?m=b'
+            });
+            //加载表格数据 
+            planButtonSearchSubmit_Click();
+        });
+          
+        //搜索提交
+        function planButtonSearchSubmit_Click() {
+            $('#planDatagrid').datagridLoad({
+                title: '计划明细',
+                idField: 'SID',
+                queryParams: $('#planForm').serializeJson(),
+                url: 'groutplan.ashx?m=dd',
+                columnMoving: false
+            });
+
+        } 
+    </script>
+
+    <script type="text/javascript">
+        var editIndex = undefined;
+        function endEditing() {
+            if (editIndex == undefined) { return true }
+            if ($('#planDatagrid').datagrid('validateRow', editIndex)) {
+                $('#planDatagrid').datagrid('endEdit', editIndex);
+                editIndex = undefined;
+                return true;
+            } else {
+                return false;
+            }
+        }
+        function onClickCell(index, field) {
+            if (editIndex != index) {
+                if (endEditing()) {
+                    $('#planDatagrid').datagrid('selectRow', index)
+                        .datagrid('beginEdit', index);
+                    var ed = $('#planDatagrid').datagrid('getEditor', { index: index, field: field });
+                    if (ed) {
+                        ($(ed.target).data('textbox') ? $(ed.target).textbox('textbox') : $(ed.target)).focus();
+                    }
+                    editIndex = index;
+                } else {
+                    setTimeout(function () {
+                        $('#planDatagrid').datagrid('selectRow', editIndex);
+                    }, 0);
+                }
+            }
+        }
+        
+        function append() {
+            if (endEditing()) {
+                $('#planDatagrid').datagrid('appendRow', {
+                     'SID': 0
+                });
+                editIndex = $('#planDatagrid').datagrid('getRows').length - 1;
+                $('#planDatagrid').datagrid('selectRow', editIndex)
+                    .datagrid('beginEdit', editIndex);
+            }
+        }
+        function removeit() {
+            if (editIndex == undefined) { return }
+            $('#planDatagrid').datagrid('cancelEdit', editIndex)
+                .datagrid('deleteRow', editIndex);
+            editIndex = undefined;
+        }  
+        function getChanges() {
+             
+            var rows = $('#planDatagrid').datagrid('getRows');
+
+            rows.forEach(function (row1, index1) {
+                $('#planDatagrid').datagrid('endEdit', index1);
+            });
+            var data = $('#planDatagrid').datagrid('getData');
+            console.log('data', data["rows"])
+            //alert(JSON.stringify(data));
+            //提交更改到后端处理
+            $.post('groutplan.ashx?m=adddetail', {
+                data: JSON.stringify(data["rows"]),
+                'PLANID': request('id')
+            }, function (data) {
+                var json = JSON.parse(data);
+                if (json['success'] == true) {
+                    $.messager.alert("保存", "保存成功");
+                }
+                else {
+                    $.messager.alert("保存", "保存失败");
+                }
+            });
+
+
+        }
+    </script>
+
+
+</body>
+</html>

+ 75 - 0
wwwroot/mes/semifinished/groutplan/groutplan_detail.html

@@ -0,0 +1,75 @@
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body class="easyui-layout" style="width:100%;height:100%">
+      
+    <div data-options="region:'north',split:true,plain:true ,iconCls:'icon-grid',border:false" style="width:100%;height:100%">
+        <!--表格-->
+        <table id="planDatagrid" data-options="toolbar: '#planToolbar',showFooter:false">
+            <thead>
+                <tr>
+                    <th data-options="field:'SID',title:'SID',align:'left',checkbox:true,hidden:true">SID</th>
+                    <th data-options="field:'BARCODE',width:100,title:'产品条码',align:'left',sortable:true"></th>
+                    <th data-options="field:'GROUTINGLINECODE',width:100,title:'成型线',align:'left',sortable:true"></th>
+                    <th data-options="field:'GROUTINGUSERCODE',width:100,title:'成型工号',align:'left',sortable:true"></th>
+                    <th data-options="field:'GROUTINGDATE',width:100,title:'注浆日期',align:'left',sortable:true"></th>
+
+                </tr>
+            </thead>
+        </table>
+    </div>
+     
+    <script type="text/javascript">
+         
+        function GetQueryValue1(queryName) {
+            var reg = new RegExp("(^|&)" + queryName + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg);
+            if (r != null) {
+                return decodeURI(r[2]);
+            } else {
+                return null;
+            }
+        }
+
+        var url = window.location.search;
+        var itemsID = GetQueryValue1('SID');
+
+        //加载完成
+        $(function () {
+            //加载表格数据 
+            console.log('itemsID', itemsID)
+            glineplanmoldButtonSearchSubmit_Click();
+        });
+          
+        //搜索提交
+        function glineplanmoldButtonSearchSubmit_Click() {
+            if (itemsID > 0) {
+                $('#planDatagrid').datagridLoad({
+                    title: '注浆计划明细',
+                    idField: 'SID',
+                    url: 'groutplan.ashx?m=bardetail&PROPLANID=' + itemsID,
+                    pagination: false,
+                    columnMoving: false
+                });
+            } 
+        } 
+    </script>
+
+</body>
+</html>

+ 56 - 0
wwwroot/mes/semifinished/groutplan/groutplan_import.html

@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <script src="/plugins/xeasyui/xeasyui.min.js"></script>
+</head>
+<body class="easyui-layout">
+
+    <div data-options="region:'center',plain:true,border:false">
+        <form id="ff" method="post" class="w-form" enctype="multipart/form-data">
+            <div class="w-div">
+                <div class="w-fieldbar" onclick="$('#more1').toggle()" style="cursor:pointer;"></div>
+            </div>
+            <div id="more1" style="display:block;">
+                
+                <div class="w-div">
+                    <div class="w-fieldname">Excel数据文件:</div>
+                    <div class="w-field"><input class="easyui-filebox w-input" id="文件" name="文件" data-options="required:true,prompt:'请选择Excel文件...',tipPosition:'bottom',buttonText:'选择文件',buttonAlign:'right',accept:'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">说明:</div>
+                    <div class="w-field"><div class="w-fieldvalue">导入数据,请准确核对! <a href="注浆计划导入模板.xlsx" target="_blank">下载模板</a> </div></div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <div data-options="region:'south',border:false" class="w-bar">
+        <a href="javascript:void(0)" id="toolbarSave" class="easyui-linkbutton" data-options="iconCls:'icon-save'" onclick="submitForm()">数据导入</a>
+        <a href="javascript:void(0)" id="toolbarClose" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" onclick="cancelForm()">取消</a>
+    </div>
+
+    <script type="text/javascript">
+        $(document).ready(function () {
+            //var ctime = new Date();
+            //$("#ACCOUNTDATE").datebox("setValue", ctime.getFullYear() + "-" + (ctime.getMonth() + 1) + "-" + (ctime.getDate() + 1));
+        });
+
+        function submitForm() {
+            $.dialog.save({
+                formid: 'ff',
+                datagridid: 'mouldcodewarningDatagrid2',
+                url: 'groutplan.ashx?m=dr&id=' + request('id') 
+            });
+        }
+
+        function cancelForm() {
+            $.dialog.close();
+        }
+    </script>
+
+</body>
+</html>

+ 415 - 0
wwwroot/mes/semifinished/groutplan/groutplan_index.html

@@ -0,0 +1,415 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body class="easyui-layout">
+    <div data-options="border:false,region:'north',title:'',iconCls:'icon-grid'">
+        <!--工具条-->
+        <div id="glineplanmoldToolbar" class="i-toolbar">
+
+            <a href="javascript:void(0)" id="glineplanmoldButtonReload" title="刷新" class="easyui-linkbutton" iconcls="icon-reload" plain="true" onclick="glineplanmoldButtonReload_Click()">刷新</a>
+            <a href="javascript:void(0)" id="glineplanmoldButtonSearch" title="搜索" class="easyui-linkbutton" iconcls="icon-search" plain="true" toggle="true" onclick="glineplanmoldButtonSearch_Click()">搜索</a>
+            <a href="javascript:void(0)" id="fqcitemsButtonHelp" title="帮助" class="easyui-linkbutton" iconcls="icon-help" plain="true" onclick="glineplanmoldButtonHelp_Click()">帮助</a>
+
+        </div>
+    </div>
+    <!--表格左面-->
+    <div data-options="region:'west',title:'',split:true" style="width:20%; height: 100%">
+
+        <div id="tableTabs" class="easyui-tabs" data-options="border:false,region:'east',split:true" style="width:100%; height: 100%">
+            <div title="生产计划">
+                <div id="glineplanmoldSearchDiv" style="display:block; padding-left: 10px;" data-options="border:false,region:'north',title:'',iconCls:'icon-grid'">
+                    <form id="glineplanmoldForm">
+                        <div style="padding-top:10px;">
+                            计划月份:
+                            <input class="easyui-datebox" id="PLANMONTH" name="PLANMONTH" data-options="required:true,editable:false ,prompt:'',tipPosition:'top'" style="width:165px; height:32px;">
+                        </div>
+                        <div style="padding-top: 10px; padding-bottom: 10px;">
+                            计划名称:
+                            <input class="easyui-textbox" id="PLANNAME" name="PLANNAME" data-options="required:false,prompt:'',tipPosition:'top'" style="width: 120px; height: 32px;">
+
+                            <a href="javascript:void(0)" id="glineplanmoldButtonSearchSubmit" title="搜索" class="easyui-linkbutton" plain="false" onclick="glineplanmoldButtonSearchSubmit_Click()">搜索</a>
+
+                        </div>
+                    </form>
+                </div>
+
+                <table class="easyui-datagrid" id="mouldcodewarningDatagrid2" data-options="method:'get',singleSelect:true,border:false,fit:true,fitColumns:true,checkOnSelect:false,selectOnCheck:false" style="width:100%; height: 100%">
+                    <thead>
+                        <tr>
+                            <th data-options="field:'SID',title:'SID',width:220,align:'left',checkbox:true,hidden:true">SID</th>
+                            <th data-options="field:'PLANCODE',title:'计划单号',align:'center',sortable:false,"></th>
+                            <th data-options="field:'PLANNAME',title:'计划名称',align:'center',sortable:false"></th>
+                            <th data-options="field:'PLANMONTH',title:'计划月份',align:'center',sortable:false"></th>
+                            <th data-options="field:'REMARKS',title:'备注',align:'center',sortable:false"></th>
+                        </tr>
+                    </thead>
+                </table>
+
+            </div>
+        </div>
+    </div>
+    <!--表格右面-->
+    <div data-options="region:'center',title:''" style="width:80%; height: 100%">
+        <div id="tableTabs1" class="easyui-tabs" data-options="border:false,region:'center'" style="width:100%; height: 100%">
+            <div title="计划明细">
+                <div style="height: 13%; display: block; padding-left: 10px;" data-options="border:false,region:'north',title:'',iconCls:'icon-grid'">
+                    <form id="glineplanmoldForm2">
+                        <div style="padding-bottom:9px; height:32px;width:100%;">
+                            <a href="javascript:void(0)" id="glineplanmoldButtonReload" title="刷新" class="easyui-linkbutton" iconcls="icon-reload" plain="true" onclick="glineplanmoldButtonReload2_Click()">刷新</a>
+                            <span>|</span>
+                            <a href="javascript:void(0)" id="glineplanmoldButtonUpdate" title="编辑" class="easyui-linkbutton" iconcls="icon-edit" plain="true" onclick="update_Click()">添加物料明细</a>
+                            <a href="javascript:void(0)" id="glineplanmoldButtonDelete" title="删除" class="easyui-linkbutton" iconcls="icon-remove" plain="true" onclick="glineplanmoldButtonDelete_Click()">删除</a>
+                            <a href="javascript:void(0)" id="dailyplanButtonImport" title="导入" class="easyui-linkbutton" iconcls="icon-excel" plain="true" onclick="glineplanmoldButtonImport_Click()">导入</a>
+                            <a href="javascript:void(0)" id="glineplanmoldButtonExport" title="导出" class="easyui-linkbutton" iconcls="icon-excel" plain="true" onclick="glineplanmoldButtonExport_Click()">导出</a>
+                            <a href="javascript:void(0)" id="planHistorySearchSubmit" title="履历" class="easyui-linkbutton" iconcls="icon-search" plain="true" onclick="planHistorySearchSubmit_Click()">查看履历</a>
+                            <span>|</span>
+                            <a href="javascript:void(0)" id="glineplanmoldButtonSave" title="提交" class="easyui-linkbutton" iconcls="icon-edit" plain="true" onclick="glineplanmoldButtonSave_Click()">保存</a>
+
+                        </div>
+                        <div id="glineplanmoldSearchDiv2" style="padding-top:10px;">
+                            物料编码:
+                            <input class="easyui-textbox" id="MATERIALCODE" name="MATERIALCODE" data-options="required:false,prompt:'',tipPosition:'top'" style="width: 120px; height: 32px;">
+
+                            <a href="javascript:void(0)" id="glineplanmoldButtonSearchSubmit" title="搜索" class="easyui-linkbutton" plain="false" onclick="glineplanmoldButtonSearchSubmit2_Click()">搜索</a>
+
+                        </div>
+                    </form>
+                </div>
+                <div style="height: 87%; overflow: auto;">
+                    <table id="glineplanmoldDatagrid" data-options="toolbar: '#mouldcodewarningToolbar',method:'get',border:false,singleSelect:false,checkOnSelect:false,fit:false,fitColumns:false">
+                        <thead>
+                            <tr>
+                                <th data-options="field:'SID',title:'SID',width:220,align:'left',checkbox:true"></th>
+                                <th data-options="field:'MATERIALCODE',title:'物料编码',align:'center',sortable:false"></th>
+                                <th data-options="field:'MATERIALREMARK',title:'物料描述',align:'center',sortable:false"></th>
+                                <th data-options="field:'PLANCOUNT',title:'计划数量',align:'center',editor:'numberbox'"></th>
+                                <th data-options="field:'COMPLETEDCOUNT',title:'已完成数量',align:'center',sortable:false,formatter:formatterDetail"></th>
+                                <th data-options="field:'COMPLETEDCOUNTPOINT',title:'已完成率',align:'center',sortable:false"></th>
+                                <th data-options="field:'CREATETIME',title:'创建时间',align:'center',sortable:false"></th>
+                                <th data-options="field:'CREATEUSERCODE',title:'创建者',align:'center',sortable:false"></th>
+                                <th data-options="field:'UPDATETIME',title:'更新时间',align:'center',sortable:false"></th>
+                                <th data-options="field:'UPDATEUSERCODE',title:'更新者',align:'center',sortable:false"></th>
+                                <th data-options="field:'REMARKS',title:'备注',align:'center',sortable:false"></th>
+                            </tr>
+                        </thead>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+
+
+    <script type="text/javascript">
+        var id = null;
+
+        $(document).ready(function () {
+
+            setDateToMonth("PLANMONTH");
+            $('#PLANMONTH').datebox('setValue', request('startDate'));
+
+            $('#glineplanmoldDatagrid').datagrid({
+                toolbar: '#mouldcodewarningToolbar',
+                method: 'get',
+                border: false,
+                singleSelect: false,
+                checkOnSelect: false,
+                fit: true,
+                fitColumns: true,
+                // 添加编辑相关配置
+                edit: true,  // 启用编辑功能
+                editMode: 'cell', // 单元格编辑模式
+                onDblClickCell: function (index, field, value) {
+                    // 双击单元格开始编辑
+                    $(this).datagrid('beginEdit', index);
+                },
+                // 点击其他地方自动结束编辑
+                onClickCell: function (index, field, value) {
+                    var editing = $(this).datagrid('getEditors', index);
+                    if (editing.length > 0) {
+                        $(this).datagrid('endEdit', index);
+                    }
+                },
+                // 编辑结束后的事件
+                onAfterEdit: function (index, row, changes) {
+                    console.log('第 ' + index + ' 行编辑完成');
+                    console.log('修改的字段:', changes);
+                }
+            });
+
+        });
+
+        //加载完成
+        $(function () {
+            //加载按钮
+            $('#glineplanmoldToolbar').buttonLoad({
+                url: 'groutplan.ashx?m=b'
+            });
+        });
+
+        function setDateToMonth(id) {
+
+            $("#" + id).datebox({
+                onShowPanel: function () {//显示日趋选择对象后再触发弹出月份层的事件,初始化时没有生成月份层
+                    span.trigger('click'); //触发click事件弹出月份层
+                    //fix 1.3.x不选择日期点击其他地方隐藏在弹出日期框显示日期面板
+                    if (p.find('div.calendar-menu').is(':hidden')) p.find('div.calendar-menu').show();
+                    if (!tds) setTimeout(function () {//延时触发获取月份对象,因为上面的事件触发和对象生成有时间间隔
+                        tds = p.find('div.calendar-menu-month-inner td');
+                        tds.click(function (e) {
+                            e.stopPropagation(); //禁止冒泡执行easyui给月份绑定的事件
+                            var year = /\d{4}/.exec(span.html())[0];//得到年份
+                            var month = parseInt($(this).attr('abbr'), 10); //月份,这里不需要+1
+                            month = month < 10 ? '0' + month : month;
+                            $("#" + id).datebox('hidePanel')//隐藏日期对象
+                                .datebox('setValue', year + '-' + month); //设置日期的值
+                        });
+                    }, 0);
+                    yearIpt.unbind();//解绑年份输入框中任何事件
+                },
+                parser: function (s) {
+                    if (!s) return new Date();
+                    var arr = s.split('-');
+                    return new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, 1);
+                },
+                formatter: function (d) {
+                    return d.getFullYear() + '-' + (d.getMonth() + 1);/*getMonth返回的是0开始的,忘记了。。已修正*/
+                }
+            });
+            var p = $("#" + id).datebox('panel'), //日期选择对象
+                tds = false, //日期选择对象中月份
+                aToday = p.find('a.datebox-current'),
+                yearIpt = p.find('input.calendar-menu-year'),//年份输入框
+                //显示月份层的触发控件
+                span = aToday.length ? p.find('div.calendar-title span') ://1.3.x版本
+                    p.find('span.calendar-text'); //1.4.x版本
+            if (aToday.length) {//1.3.x版本,取消Today按钮的click事件,重新绑定新事件设置日期框为今天,防止弹出日期选择面板
+                aToday.unbind('click').click(function () {
+                    var now = new Date();
+                    now = now < 10 ? '0' + now : now;
+                    $("#" + id).datebox('hidePanel').datebox('setValue', now.getFullYear() + '-' + (now.toString() + 1));
+                });
+            }
+        };
+
+        //导入
+        function glineplanmoldButtonImport_Click() {
+            $('#mouldcodewarningDatagrid2').datagridDialog({
+                title: '导入注浆计划数据',
+                width: 640,
+                height: 420,
+                url: 'groutplan_import.html',
+                requireSelect: true
+            });
+        }
+
+        //添加物料明细按钮
+        function update_Click() {
+            var widths = window.screen.width;
+            var heights = window.screen.height;
+
+            $('#mouldcodewarningDatagrid2').datagridDialog({
+                title: '修改数据',
+                width: 1000,
+                height: heights - 400,
+                url: 'groutplan_adddetail.html',
+                requireSelect: true
+            });
+        }
+
+        ////删除按钮
+        function glineplanmoldButtonDelete_Click() {
+
+            var rows = $('#glineplanmoldDatagrid').datagrid("getChecked");
+            var ids = '';
+            if (rows != null && rows != "") {
+                $.messager.confirm('删除操作', '您确定删除选中的' + rows.length + '条数据吗?', function (r) {
+                    if (r) {
+                        $.each(rows, function (index, item) {
+                            ids += item["SID"] + ',';
+                        })
+                        ids = ids.substring(0, ids.length - 1);
+                        $.post("groutplan.ashx?m=d",
+                            { 'id': ids },
+                            function (data) {
+                                var json = JSON.parse(data);
+                                if (json["success"] == true) {
+                                    glineplanmoldButtonSearchSubmit2_Click();
+                                }
+                                else {
+                                    $.messager.alert("数据错误", json['message'], 'error');
+
+                                }
+                            });
+                    }
+                });
+
+            }
+            else {
+                $.messager.alert("数据错误", '至少勾选一条数据', 'error');
+            }
+        }
+
+        //搜索按钮
+        function glineplanmoldButtonSearch_Click() {
+            $('#glineplanmoldSearchDiv').toggle();
+            $('#glineplanmoldSearchDiv2').toggle();
+            $('#glineplanmoldDatagrid').datagrid('resize');
+        }
+
+        //加载子表数据
+        function glineplanmoldButtonSearchSubmit2_Click(index, row) {
+            if (index > -1) {
+                id = row["SID"];
+            }
+
+            //加载子表数据
+            $('#glineplanmoldDatagrid').datagridLoad({
+                title: '',
+                idField: 'SID',
+                queryParams: $('#glineplanmoldForm2').serializeJson(),
+                url: 'groutplan.ashx?m=z&PLANID=' + id,
+                pagination: true,
+                columnMoving: false,
+                onLoadSuccess: function (data) {
+                    $(this).datagrid("checkAll");
+                }
+            });
+
+        }
+
+        //主表查询提交
+        function glineplanmoldButtonSearchSubmit_Click() {
+            $('#mouldcodewarningDatagrid2').datagridLoad({
+                title: '',
+                idField: 'SID',
+                queryParams: $('#glineplanmoldForm').serializeJson(),
+                url: 'groutplan.ashx?m=ss',
+                pagination: true,
+                columnMoving: false,
+                onSelect: glineplanmoldButtonSearchSubmit2_Click
+            });
+        }
+
+        //导出
+        function glineplanmoldButtonExport_Click() {
+            //加载表头
+            var fields = $('#glineplanmoldDatagrid').datagrid('getColumnFields');
+            var headers = [];
+            for (var i = 0; i < fields.length; i++) {
+                headers.push($('#glineplanmoldDatagrid').datagrid('getColumnOption', fields[i])['title']);
+            }
+            $('#glineplanmoldDatagrid').datagridExport({
+                headers: headers,
+                fileName: '导出数据(注浆计划表).xls',
+                workSheet: '导出数据(注浆计划表)'
+            });
+        }
+
+        //刷新
+        function glineplanmoldButtonReload_Click() {
+            glineplanmoldButtonSearchSubmit_Click();
+        }
+
+        //刷新
+        function glineplanmoldButtonReload2_Click() {
+            glineplanmoldButtonSearchSubmit2_Click();
+        }
+
+        //帮助
+        function glineplanmoldButtonHelp_Click() {
+            $('#glineplanmoldDatagrid').datagridDialog({
+                title: '帮助',
+                width: 640,
+                height: 480,
+                url: 'groutplan_help.html'
+            });
+        }
+
+        //结束编辑
+        function endAllEdit() {
+            var rows = $('#glineplanmoldDatagrid').datagrid('getRows');
+            for (var i = 0; i < rows.length; i++) {
+                // 检查该行是否在编辑状态
+                var editors = $('#glineplanmoldDatagrid').datagrid('getEditors', i);
+                if (editors.length > 0) {
+                    $('#glineplanmoldDatagrid').datagrid('endEdit', i);
+                }
+            }
+        }
+
+        //保存
+        function glineplanmoldButtonSave_Click() {
+            endAllEdit();
+            var rows = $('#glineplanmoldDatagrid').datagrid("getChecked");
+            if (rows != null && rows != "") {
+                $.messager.confirm('生成计划操作', '您确定对选中的' + rows.length + '条数据进行保存修改?', function (r) {
+                    if (r) {
+                        //提交更改到后端处理
+                        $.post('groutplan.ashx?m=i', {
+                            data: JSON.stringify(rows)
+                        }, function (data) {
+                            var json = JSON.parse(data);
+                            if (json['success'] == true) {
+                                $.messager.alert("保存", "保存成功" + json['message']);
+                            }
+                            else {
+                                $.messager.alert("保存", "保存失败" + json['message']);
+                            }
+                        });
+                    }
+                });
+
+            }
+            else {
+                $.messager.alert("数据错误", '至少勾选一条数据', 'error');
+            }
+        }
+
+        //查看履历
+        function planHistorySearchSubmit_Click() {
+            var widths = window.screen.width;
+            var heights = window.screen.height;
+
+            $('#mouldcodewarningDatagrid2').datagridDialog({
+                title: '查看履历',
+                width: widths - 600,
+                height: heights - 400,
+                url: 'grout_history.html',
+                requireSelect: true
+            });
+        }
+
+        function formatterDetail(value, row, index) {
+            return '<a href="###" onclick=tabOpen(' + row["SID"] + ')>' + row["COMPLETEDCOUNT"] + '</a>';
+
+        }
+        function tabOpen(val) {
+
+            var heights = window.screen.height;
+
+            $('#glineplanmoldDatagrid').datagridDialog({
+                title: '查看注浆计划明细',
+                width: 700,
+                height: heights - 400,
+                url: 'groutplan_detail.html?SID='+val
+            }); 
+        }
+    </script>
+</body>
+</html>

二進制
wwwroot/mes/semifinished/groutplan/注浆计划导入模板.xlsx


+ 148 - 0
wwwroot/mes/semifinished/groutwarn/groutwarn.ashx

@@ -0,0 +1,148 @@
+<%@ WebHandler Language="C#" Class="goodslogosap" %>
+
+using System;
+using System.Web;
+using System.Web.SessionState;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.Data;
+using Curtain.DataAccess;
+using DK.XuWei.WebMes;
+
+/// <summary>
+/// TP_SEMIFINISHED_MATERIALLINK
+/// qq create 2025-11-18
+/// </summary>
+public class goodslogosap : IHttpHandler, IReadOnlySessionState
+{
+    public void ProcessRequest(HttpContext context)
+    {
+        context.Response.ContentType = "text/plain";
+
+        if (mes.LoginCheck() && context.Request["m"] is object)
+        {
+            Button b = new Button();
+            if(mes.RightCheck(""))
+            {
+                b.btnIndex = true; 
+                b.btnCancel = false;
+                b.btnSearch = true; 
+                b.btnReload = true;
+            }
+
+            switch (context.Request["m"].ToString().ToLower())
+            {
+                case "b":
+                    {
+                        //按钮
+                        context.Response.Write(new JsonResult(b).ToJson());
+                        break;
+                    } 
+                case "s":
+                    {
+                        //搜索
+                        if (b.btnIndex)
+                            context.Response.Write(search(context.Request.Form));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }   
+                default:
+                    {
+                        break;
+                    }
+            }
+        }
+        else
+        {
+            context.Response.Write(new JsonResult(JsonStatus.loginError).ToJson());
+        }
+    }
+
+    /// <summary>
+    /// TP_SEMIFINISHED_MATERIALLINK 查询
+    /// </summary>
+    /// <returns>json</returns>
+    private string search(NameValueCollection form)
+    {
+        using(IDataAccess conn=DataAccess.Create())
+        { 
+            string sqlStr = @"   SELECT  t.groutinglinecode, t.goodscode,
+                                    t.mat20, 
+                                    t.groutcount,
+                                    pp.plancount,
+                                    pp.COMPLETEDCOUNT,
+                                   (pp.plancount - pp.COMPLETEDCOUNT) AS remaincount,
+                                    CASE 
+                                        WHEN (pp.plancount - pp.COMPLETEDCOUNT) / t.groutcount < 7 THEN 1 
+                                        ELSE 0 
+                                    END AS warnflag,
+                                    TRUNC((pp.plancount - pp.COMPLETEDCOUNT) / t.groutcount) AS groutday   
+                                FROM (
+                                    SELECT 
+                                        LISTAGG(distinct gdd.groutinglinecode, ', ') WITHIN GROUP (ORDER BY  m.mat20) groutinglinecode, 
+                                        LISTAGG(distinct gdd.goodscode, ', ') WITHIN GROUP (ORDER BY  m.mat20) goodscode, 
+                                        m.mat20, 
+                                        COUNT(*) AS groutcount
+                                    FROM tp_pm_groutingdailydetail gdd
+                                    LEFT JOIN TP_SEMIFINISHED_MATERIALLINK m 
+                                        ON gdd.materialcode = m.materialcode 
+                                    WHERE gdd.groutingdate >= TRUNC(SYSDATE - 1)
+                                        AND gdd.groutingflag = 1 
+                                        AND gdd.valueflag = 1 
+                                    GROUP BY  
+                                        m.mat20
+                                ) t
+                                LEFT JOIN TP_SEMIFINISHED_PRODPLAN pp 
+                                        ON pp.materialcode = t.mat20 
+                                        AND pp.PLANMONTH = TRUNC(SYSDATE, 'MM') 
+                                        AND pp.PLANTYPE = 1
+                                WHERE  1 = 1 ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+                  
+            if(!string.IsNullOrEmpty(form["GROUTINGLINECODE"]))
+            {
+                sqlStr += " AND INSTR( T.GROUTINGLINECODE, @GROUTINGLINECODE@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("GROUTINGLINECODE", form["GROUTINGLINECODE"]));
+            }
+            if(!string.IsNullOrEmpty(form["MAT20"]))
+            {
+                sqlStr += " AND INSTR( T.MAT20, @MAT20@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("MAT20", form["MAT20"]));
+            } 
+            int total = 0;
+            DataTable dt = conn.ExecuteDatatable( sqlStr, sqlPara.ToArray());
+            return new JsonResult(dt) { total = total}.ToJson();
+        }
+    }
+ 
+    private class Button
+    {
+        public bool btnIndex = false;  
+        public bool btnCancel = false;
+        public bool btnSearch = false; 
+        public bool btnReload = false;
+    }
+
+    private class xRecord
+    {
+        public string SID { get; set; } 
+        public string GROUTINGLINECODE { get; set; }
+        public string GOODSCODE { get; set; }
+        public string MAT20 { get; set; }
+        public string GROUTCOUNT { get; set; }
+        public string PLANCOUNT { get; set; }
+        public string COMPLETEDCOUNT { get; set; }
+        public string REMAINCOUNT { get; set; }
+        public string GROUTDAY { get; set; } 
+    }
+
+    public bool IsReusable
+    {
+        get
+        {
+            return false;
+        }
+    }
+
+}

+ 108 - 0
wwwroot/mes/semifinished/groutwarn/groutwarn_index.html

@@ -0,0 +1,108 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <script src="/plugins/xeasyui/xeasyui.min.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body>
+    <!--工具条-->
+    <div id="tb" class="i-toolbar">
+        <a href="javascript:void(0)" style="display:none" id="btnSearch" title="搜索" class="easyui-linkbutton" iconcls="icon-search" plain="true" toggle="true" onclick="tbSearch()">搜索</a>
+        <a href="javascript:void(0)" style="display:none" id="btnExport" title="导出" class="easyui-linkbutton" iconcls="icon-excel" plain="true" onclick="tbExport()">导出</a>
+        <a href="javascript:void(0)" id="btnReload" title="刷新" class="easyui-linkbutton" iconcls="icon-reload" plain="true" onclick="tbReload()">刷新</a>
+        <div id="tbSearchDiv" style="display:none;padding:10px;">
+            <form id="ff">
+                <div>
+                    湿坯半成品物料:
+                    <input class="easyui-textbox" id="MAT20" name="MAT20" data-options="required:false,prompt:'',tipPosition:'top'" style="width:160px;height:32px;">
+                    成型线:
+                    <input class="easyui-textbox" id="GROUTINGLINECODE" name="GROUTINGLINECODE" data-options="required:false,prompt:'',tipPosition:'top'" style="width:160px;height:32px;">
+
+                    <a href="javascript:void(0)" id="btnSearchSubmit" title="清空" class="easyui-linkbutton" plain="false" onclick="$('#ff').form('clear')">清空</a>
+                    <a href="javascript:void(0)" id="btnSearchSubmit" title="搜索" class="easyui-linkbutton" plain="false" onclick="tbSearchSubmit()">搜索</a>
+                </div>
+            </form>
+        </div>
+    </div>
+    <!--表格-->
+    <table id="dg" data-options="toolbar: '#tb',showFooter:false">
+        <thead>
+            <tr>
+                <th data-options="field:'SID',title:'SID',width:220,align:'left',checkbox:true,hidden:true">SID</th>
+                <th data-options="field:'GROUTINGLINECODE',title:'成型线',align:'left',sortable:true"></th>
+                <th data-options="field:'GOODSCODE',title:'产品',align:'left',sortable:true"></th>
+                <th data-options="field:'MAT20',title:'湿坯半成品',align:'left',sortable:true"></th>
+                <th data-options="field:'GROUTCOUNT',title:'昨日注浆数量',align:'left',sortable:true"></th>
+                <th data-options="field:'PLANCOUNT',title:'当月计划数量',align:'left',sortable:true"></th>
+                <th data-options="field:'COMPLETEDCOUNT',title:'已完成数量',align:'left',sortable:true"></th>
+                <th data-options="field:'REMAINCOUNT',title:'计划剩余数量',align:'left',sortable:true"></th>
+                <th data-options="field:'GROUTDAY',title:'剩余可注浆天数',align:'left',sortable:true,styler:deliverFlagStyler"></th>
+            </tr>
+        </thead>
+    </table>
+    <script type="text/javascript">
+
+        //加载完成
+        $(function () {
+            $('#tbSearchDiv').toggle(); 
+            //加载按钮
+            $('#tb').buttonLoad({
+                url: 'groutwarn.ashx?m=b'
+            });
+            //加载表格数据
+            tbSearchSubmit();
+             
+        });
+
+        //搜索按钮
+        function tbSearch() {
+            $('#tbSearchDiv').toggle();
+            $('#dg').datagrid('resize');
+        }
+
+        //搜索提交
+        function tbSearchSubmit() {
+            $('#dg').datagridLoad({
+                title: '注浆预警',
+                idField: 'SID',
+                queryParams: $('#ff').serializeJson(),
+                url: 'groutwarn.ashx?m=s',
+                columnMenu: '#btnColumnMenu',
+                pagination: false,
+                columnMoving: false
+            });
+        }
+
+        //刷新
+        function tbReload() {
+            tbSearchSubmit();
+        }
+
+        // 定义样式函数
+        function deliverFlagStyler(value, row, index) {
+            // 尝试将剩余注浆天数转换为数字
+            var days = parseInt(value);
+            if (days < 3) {
+                // 小于3天:深橙色背景,白色文字
+                return 'background-color: #E65100; color: #FFFFFF; font-weight: bold;';
+            } else if (days < 7) {
+                // 3-6天:琥珀色背景,黑色文字
+                return 'background-color: #FFB300; color: #000000; font-weight: bold;';
+            } else if (days === 7) {
+                // 正好7天:浅黄色提醒
+                return 'background-color: #FFF9C4; color: #000000;';
+            }
+            return '';
+        }
+
+        function formatterTrueFalse(value, row, index) { return value == 'True' ? '是' : '否'; }
+        function stylerTrueFalse(value, row, index) { return value == 'True' ? 'color:black' : 'color:red'; }
+
+    </script> 
+</body>
+</html>

+ 368 - 0
wwwroot/mes/semifinished/materiallink/materiallink.ashx

@@ -0,0 +1,368 @@
+<%@ WebHandler Language="C#" Class="goodslogosap" %>
+
+using System;
+using System.Web;
+using System.Web.SessionState;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.Data;
+using Curtain.DataAccess;
+using DK.XuWei.WebMes;
+
+/// <summary>
+/// TP_SEMIFINISHED_MATERIALLINK
+/// qq create 2025-11-18
+/// </summary>
+public class goodslogosap : IHttpHandler, IReadOnlySessionState
+{
+    public void ProcessRequest(HttpContext context)
+    {
+        context.Response.ContentType = "text/plain";
+
+        if (mes.LoginCheck() && context.Request["m"] is object)
+        {
+            Button b = new Button();
+            if(mes.RightCheck(""))
+            {
+                b.btnIndex = true;
+                b.btnInsert = true;
+                b.btnInsertBatch = false;
+                b.btnCopy = true;
+                b.btnUpdate = true;
+                b.btnDelete = true;
+                b.btnCancel = false;
+                b.btnSearch = true;
+                b.btnDetail = true;
+                b.btnCheckbox = true;
+                b.btnExport = true;
+                b.btnReload = true;
+            }
+
+            switch (context.Request["m"].ToString().ToLower())
+            {
+                case "b":
+                    {
+                        //按钮
+                        context.Response.Write(new JsonResult(b).ToJson());
+                        break;
+                    }
+                case "a":
+                    {
+                        //添加
+                        if (b.btnDetail && context.Request["id"] is object)
+                            context.Response.Write(detail());
+                        else
+                        {
+                            xRecord r = new xRecord();
+                            context.Response.Write(new JsonResult(r).ToJson());
+                        }
+                        break;
+                    }
+                case "s":
+                    {
+                        //搜索
+                        if (b.btnIndex)
+                            context.Response.Write(search(context.Request.Form));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "t":
+                    {
+                        //详细
+                        if (b.btnDetail)
+                            context.Response.Write(detail());
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "i":
+                    {
+                        //插入
+                        if (b.btnInsert)
+                            context.Response.Write(insert(context.Request.Form));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "u":
+                    {
+                        //修改
+                        if (b.btnUpdate)
+                            context.Response.Write(update(context.Request.Form));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "d":
+                    {
+                        //删除
+                        if (b.btnDelete)
+                            context.Response.Write(delete());
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "e":
+                    {
+                        //导出
+                        if (b.btnExport)
+                        {
+                            context.Response.Write(export());
+                        }
+                        else
+                        {
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        }
+                        break;
+                    }
+                default:
+                    {
+                        break;
+                    }
+            }
+        }
+        else
+        {
+            context.Response.Write(new JsonResult(JsonStatus.loginError).ToJson());
+        }
+    }
+
+    /// <summary>
+    /// TP_SEMIFINISHED_MATERIALLINK 查询
+    /// </summary>
+    /// <returns>json</returns>
+    private string search(NameValueCollection form)
+    {
+        using(IDataAccess conn=DataAccess.Create())
+        { 
+            string sqlStr = @"
+                SELECT  
+                    m.MATERIALCODE,
+                    SBD.MAKTX MATERIALREMARK,
+                    m.MAT20,
+                    m.MAT30,
+                    m.MAT40,
+                    m.MAT50,
+                    m.MAT55,
+                    m.MATERIALCODE AS SID
+                FROM
+                    TP_SEMIFINISHED_MATERIALLINK m
+                LEFT JOIN TP_PC_SAPBOMDETAIL SBD ON SBD.MATNR = m.MATERIALCODE
+                WHERE 
+                    1 = 1
+            ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+                 
+            if(!string.IsNullOrEmpty(form["MATERIALCODE"]))
+            {
+                sqlStr += " AND INSTR( m.MATERIALCODE, @MATERIALCODE@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("MATERIALCODE", form["MATERIALCODE"]));
+            }
+            if(!string.IsNullOrEmpty(form["MATERIALREMARK"]))
+            {
+                sqlStr += " AND INSTR( SBD.MAKTX, @MATERIALREMARK@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("MATERIALREMARK", form["MATERIALREMARK"]));
+            }
+            if(!string.IsNullOrEmpty(form["MAT20"]))
+            {
+                sqlStr += " AND INSTR( m.MAT20, @MAT20@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("MAT20", form["MAT20"]));
+            }
+            if(!string.IsNullOrEmpty(form["MAT30"]))
+            {
+                sqlStr += " AND INSTR( m.MAT30, @MAT30@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("MAT30", form["MAT30"]));
+            }
+            if(!string.IsNullOrEmpty(form["MAT40"]))
+            {
+                sqlStr += " AND INSTR( m.MAT40, @MAT40@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("MAT40", form["MAT40"]));
+            }
+            if(!string.IsNullOrEmpty(form["MAT50"]))
+            {
+                sqlStr += " AND INSTR( m.MAT50, @MAT50@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("MAT50", form["MAT50"]));
+            }
+            if(!string.IsNullOrEmpty(form["MAT55"]))
+            {
+                sqlStr += " AND INSTR( m.MAT55, @MAT55@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("MAT55", form["MAT55"]));
+            } 
+            int total = 0;
+            DataTable dt = conn.ExecuteDatatable( sqlStr, sqlPara.ToArray());
+            return new JsonResult(dt) { total = total}.ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 详细 TP_SEMIFINISHED_MATERIALLINK
+    /// </summary>
+    /// <returns>json</returns>
+    private string detail()
+    {
+        using(IDataAccess conn= DataAccess.Create())
+        {
+            DataTable dt = conn.ExecuteDatatable(@"
+                SELECT  
+                    m.MATERIALCODE,
+                    SBD.MAKTX MATERIALREMARK,
+                    m.MAT20,
+                    m.MAT30,
+                    m.MAT40,
+                    m.MAT50,
+                    m.MAT55,
+                    m.MATERIALCODE AS SID
+                FROM
+                    TP_SEMIFINISHED_MATERIALLINK m
+                LEFT JOIN TP_PC_SAPBOMDETAIL SBD ON SBD.MATNR = m.MATERIALCODE
+                WHERE  
+                    m.MATERIALCODE = @GUID@
+                ",
+                new CDAParameter("GUID",HttpContext.Current.Request["id"])
+            );
+            return new JsonResult(dt).ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 插入 TP_SEMIFINISHED_MATERIALLINK
+    /// </summary>
+    /// <returns>json</returns>
+    private string insert(NameValueCollection form)
+    {
+        using(IDataAccess conn= DataAccess.Create())
+        { 
+            int result = conn.ExecuteNonQuery(@"
+                INSERT INTO TP_SEMIFINISHED_MATERIALLINK (
+                    MATERIALCODE,
+                    MAT20,
+                    MAT30,
+                    MAT40,
+                    MAT50,
+                    MAT55
+                ) VALUES (
+                    @MATERIALCODE@,
+                    @MAT20@,
+                    @MAT30@,
+                    @MAT40@,
+                    @MAT50@,
+                    @MAT55@
+                )
+                ",
+                new CDAParameter("MATERIALCODE",form["MATERIALCODE"]),
+                new CDAParameter("MAT20",form["MAT20"]),
+                new CDAParameter("MAT30",form["MAT30"]),
+                new CDAParameter("MAT40",form["MAT40"]),
+                new CDAParameter("MAT50",form["MAT50"]),
+                new CDAParameter("MAT55",form["MAT55"])
+            );
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 更新 TP_SEMIFINISHED_MATERIALLINK
+    /// </summary>
+    /// <returns>json</returns>
+    private string update(NameValueCollection form)
+    {
+        using(IDataAccess conn=DataAccess.Create())
+        {
+            int result = conn.ExecuteNonQuery(@"
+                UPDATE TP_SEMIFINISHED_MATERIALLINK 
+                SET
+                    MATERIALCODE = @MATERIALCODE@,
+                    MAT20 = @MAT20@,
+                    MAT30 = @MAT30@,
+                    MAT40 = @MAT40@,
+                    MAT50 = @MAT50@,
+                    MAT55 = @MAT55@
+                WHERE 
+                    MATERIALCODE = @GUID@
+                ",
+                new CDAParameter("MATERIALCODE",form["MATERIALCODE"]),
+                new CDAParameter("MAT20",form["MAT20"]),
+                new CDAParameter("MAT30",form["MAT30"]),
+                new CDAParameter("MAT40",form["MAT40"]),
+                new CDAParameter("MAT50",form["MAT50"]),
+                new CDAParameter("MAT55",form["MAT55"]),
+                new CDAParameter("GUID",HttpContext.Current.Request["id"])
+            );
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 删除 TP_SEMIFINISHED_MATERIALLINK
+    /// </summary>
+    /// <returns>json</returns>
+    private string delete()
+    {
+        using(IDataAccess conn= DataAccess.Create())
+        {
+            if (HttpContext.Current.Request["id"] is object)
+            {
+                int result = conn.ExecuteNonQuery(@"
+                    DELETE 
+                        TP_SEMIFINISHED_MATERIALLINK 
+                    WHERE 
+                        INSTR(',' || @GUID@ || ',' , ',' || MATERIALCODE || ',') > 0 
+                    ",
+                    new CDAParameter("GUID", HttpContext.Current.Request["id"])
+                );
+                return new JsonResult(JsonStatus.success).ToJson();
+            }
+            else
+            {
+                return new JsonResult(JsonStatus.otherError).ToJson();
+            }
+        }
+    }
+
+    /// <summary>
+    /// 导出 TP_MST_GOODSLOGOSAP
+    /// </summary>
+    /// <returns>json</returns>
+    private string export()
+    {
+        return search(new NameValueCollection());
+    }
+
+    private class Button
+    {
+        public bool btnIndex = false;
+        public bool btnInsert = false;
+        public bool btnInsertBatch = false;
+        public bool btnCopy = false;
+        public bool btnUpdate = false;
+        public bool btnDelete = false;
+        public bool btnCancel = false;
+        public bool btnSearch = false;
+        public bool btnDetail = false;
+        public bool btnCheckbox = false;
+        public bool btnExport = false;
+        public bool btnReload = false;
+    }
+
+    private class xRecord
+    {
+        public string sid { get; set; } 
+        public string MATERIALCODE { get; set; }
+        public string MATERIALREMARK { get; set; }
+        public string MAT20 { get; set; }
+        public string MAT30 { get; set; }
+        public string MAT40 { get; set; }
+        public string MAT50 { get; set; }
+        public string MAT55 { get; set; } 
+    }
+
+    public bool IsReusable
+    {
+        get
+        {
+            return false;
+        }
+    }
+
+}

+ 71 - 0
wwwroot/mes/semifinished/materiallink/materiallink_add.html

@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <script src="/plugins/xeasyui/xeasyui.min.js"></script>
+</head>
+<body class="easyui-layout">
+    <div data-options="region:'center',plain:true,border:false">
+        <form id="ff" method="post" class="w-form">
+            <div class="w-div">
+                <div class="w-fieldbar" onclick="$('#more2').toggle()" style="cursor:pointer;"></div>
+            </div>
+            <div id="more2" style="display:block;">
+                <div class="w-div">
+                    <div class="w-fieldname">物料编码:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MATERIALCODE" name="MATERIALCODE" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">湿坯半成品:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MAT20" name="MAT20" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">精坯半成品:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MAT30" name="MAT30" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">釉坯半成品:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MAT40" name="MAT40" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">烧成半成品:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MAT50" name="MAT50" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">简装半成品:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MAT55" name="MAT55" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <div data-options="region:'south',border:false" class="w-bar">
+        <a href="javascript:void(0)" id="tbSave" class="easyui-linkbutton" data-options="iconCls:'icon-save'" onclick="submitForm()">保存</a>
+        <a href="javascript:void(0)" id="tbClose" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" onclick="cancelForm()">关闭</a>
+    </div>
+
+    <script type="text/javascript">
+
+        $(function () {
+            $('#ff').formLoad({
+                url: 'materiallink.ashx?m=a'
+            }); 
+        });
+
+        function submitForm() {
+            $.dialog.save({
+                formid: 'ff',
+                url: 'materiallink.ashx?m=i'
+            });
+        }
+
+        function cancelForm() {
+            $.dialog.close();
+        }
+
+    </script>
+</body>
+</html>

+ 74 - 0
wwwroot/mes/semifinished/materiallink/materiallink_edit.html

@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <script src="/plugins/xeasyui/xeasyui.min.js"></script>
+</head>
+<body class="easyui-layout">
+    <!--
+        <input class="easyui-combobox w-input" id="叶子" name="叶子" data-options="prompt:'',tipPosition:'top',url:'/mes/list.ashx?m=truefalse',method:'get',valueField:'text',textField:'text',panelHeight:'200px',editable:'true'" style="width:100%;height:32px;">
+        <input class="easyui-filebox" id="图片" name="图片" data-options="prompt:'',tipPosition:'top',buttonText:'选择图片',buttonAlign:'right',accept:'image/*',onChange:$.imagePreview" style="width:100%;height:32px;" >
+    -->
+    <div data-options="region:'center',plain:true,border:false">
+        <form id="ff" method="post" class="w-form">
+            <div class="w-div">
+                <div class="w-fieldbar" onclick="$('#more2').toggle()" style="cursor:pointer;"></div>
+            </div>
+            <div id="more2" style="display:block;">
+                <div class="w-div">
+                    <div class="w-fieldname">物料编码:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MATERIALCODE" name="MATERIALCODE" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">湿坯半成品:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MAT20" name="MAT20" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">精坯半成品:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MAT30" name="MAT30" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">釉坯半成品:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MAT40" name="MAT40" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">烧成半成品:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MAT50" name="MAT50" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">简装半成品:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MAT55" name="MAT55" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <div data-options="region:'south',border:false" class="w-bar">
+        <a href="javascript:void(0)" id="tbSave" class="easyui-linkbutton" data-options="iconCls:'icon-save'" onclick="submitForm()">保存</a>
+        <a href="javascript:void(0)" id="tbClose" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" onclick="cancelForm()">关闭</a>
+    </div>
+    <script type="text/javascript">
+
+        $(function () {
+            $('#ff').formLoad({
+                url: 'materiallink.ashx?m=t'
+            }); 
+        });
+
+        function submitForm() {
+            $.dialog.save({
+                formid: 'ff',
+                url: 'materiallink.ashx?m=u&id=' + request('id')
+            });
+        }
+
+        function cancelForm() {
+            $.dialog.close();
+        }
+
+    </script>
+</body>
+</html>

+ 162 - 0
wwwroot/mes/semifinished/materiallink/materiallink_index.html

@@ -0,0 +1,162 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <script src="/plugins/xeasyui/xeasyui.min.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body>
+    <!--工具条-->
+    <div id="tb" class="i-toolbar">
+        <a href="javascript:void(0)" style="display:none" id="btnInsert" title="添加" class="easyui-linkbutton" iconcls="icon-add" plain="true" onclick="tbAdd()">添加</a>
+        <a href="javascript:void(0)" style="display:none" id="btnUpdate" title="编辑" class="easyui-linkbutton" iconcls="icon-edit" plain="true" onclick="tbEdit()">修改</a>
+        <a href="javascript:void(0)" style="display:none" id="btnDelete" title="删除" class="easyui-linkbutton" iconcls="icon-remove" plain="true" onclick="tbDelete()">删除</a>
+        <a href="javascript:void(0)" style="display:none" id="btnCheckbox" title="显示复选框" class="easyui-linkbutton" iconcls="icon-ok" plain="true" toggle="true" onclick="tbCheck()">复选</a>
+        <a href="javascript:void(0)" style="display:none" id="btnSearch" title="搜索" class="easyui-linkbutton" iconcls="icon-search" plain="true" toggle="true" onclick="tbSearch()">搜索</a>
+        <a href="javascript:void(0)" style="display:none" id="btnExport" title="导出" class="easyui-linkbutton" iconcls="icon-excel" plain="true" onclick="tbExport()">导出</a>
+        <a href="javascript:void(0)" id="btnReload" title="刷新" class="easyui-linkbutton" iconcls="icon-reload" plain="true" onclick="tbReload()">刷新</a>
+        <div id="tbSearchDiv" style="display:none;padding:10px;">
+            <form id="ff">
+                <div style="padding-left:14px;padding-bottom:10px">
+                    物料编码:
+                    <input class="easyui-textbox" id="MATERIALCODE" name="MATERIALCODE" data-options="required:false,prompt:'',tipPosition:'top'" style="width:160px;height:32px;">
+                    湿坯半成品:
+                    <input class="easyui-textbox" id="MAT20" name="MAT20" data-options="required:false,prompt:'',tipPosition:'top'" style="width:160px;height:32px;">
+                    釉坯半成品:
+                    <input class="easyui-textbox" id="MAT40" name="MAT40" data-options="required:false,prompt:'',tipPosition:'top'" style="width:160px;height:32px;">
+                    简装半成品:
+                    <input class="easyui-textbox" id="MAT55" name="MAT55" data-options="required:false,prompt:'',tipPosition:'top'" style="width:160px;height:32px;">
+                </div>
+                <div  style="padding-left:14px;">
+                    物料描述:
+                    <input class="easyui-textbox" id="MATERIALREMARK" name="MATERIALREMARK" data-options="required:false,prompt:'',tipPosition:'top'" style="width:160px; height: 32px;"> 
+                    精坯半成品:
+                    <input class="easyui-textbox" id="MAT30" name="MAT30" data-options="required:false,prompt:'',tipPosition:'top'" style="width:160px;height:32px;"> 
+                    烧成半成品:
+                    <input class="easyui-textbox" id="MAT50" name="MAT50" data-options="required:false,prompt:'',tipPosition:'top'" style="width:160px;height:32px;">
+                     
+                    <a href="javascript:void(0)" id="btnSearchSubmit" title="清空" class="easyui-linkbutton" plain="false" onclick="$('#ff').form('clear')">清空</a>
+                    <a href="javascript:void(0)" id="btnSearchSubmit" title="搜索" class="easyui-linkbutton" plain="false" onclick="tbSearchSubmit()">搜索</a>
+                </div>
+            </form>
+        </div>
+    </div>
+    <!--表格-->
+    <table id="dg" data-options="toolbar: '#tb',showFooter:false">
+        <thead>
+            <tr>
+                <th data-options="field:'SID',title:'SID',width:220,align:'left',checkbox:true,hidden:true">SID</th>
+                <th data-options="field:'MATERIALCODE',title:'物料编码',align:'left',sortable:true"></th>
+                <th data-options="field:'MATERIALREMARK',title:'物料描述',align:'left',sortable:true"></th>
+                <th data-options="field:'MAT20',title:'湿坯半成品',align:'left',sortable:true"></th>
+                <th data-options="field:'MAT30',title:'精坯半成品',align:'left',sortable:true"></th>
+                <th data-options="field:'MAT40',title:'釉坯半成品',align:'left',sortable:true"></th>
+                <th data-options="field:'MAT50',title:'烧成半成品',align:'left',sortable:true"></th>
+                <th data-options="field:'MAT55',title:'简装半成品',align:'left',sortable:true"></th>
+            </tr>
+        </thead>
+    </table>
+    <script type="text/javascript">
+
+        //加载完成
+        $(function () {
+            //加载按钮
+            $('#tb').buttonLoad({
+                url:'materiallink.ashx?m=b'
+            });
+            //加载表格数据
+            tbSearchSubmit();
+
+            $('#MATERIALCODE').textbox('textbox').bind('keyup', function (e) {
+                this.value = this.value.toUpperCase();
+            });
+        });
+
+        //添加按钮
+        function tbAdd() {
+            $('#dg').datagridDialog({
+                title: '添加数据',
+                width: 640,
+                height: 480,
+                url: 'materiallink_add.html'
+            });
+        }
+
+        //修改按钮
+        function tbEdit() {
+            $('#dg').datagridDialog({
+                title: '修改数据',
+                width: 640,
+                height: 480,
+                url: 'materiallink_edit.html',
+                requireSelect: true
+            });
+        }
+
+        //删除按钮
+        function tbDelete() {
+            $('#dg').datagridPost({
+                title:'删除操作',
+                url: 'materiallink.ashx?m=d',
+                onValidate: function (r) { return true; }
+            });
+        } 
+
+        //复选按钮
+        function tbCheck() {
+            $('#dg').datagridCheckbox({
+                buttonid: 'btnCheckbox',
+                valuefield: 'SID'
+            });
+        }
+
+        //搜索按钮
+        function tbSearch() {
+            $('#tbSearchDiv').toggle();
+            $('#dg').datagrid('resize');
+        }
+
+        //搜索提交
+        function tbSearchSubmit() {
+            $('#dg').datagridLoad({
+                title: '产品物料',
+                idField: 'SID',
+                queryParams: $('#ff').serializeJson(),
+                url: 'materiallink.ashx?m=s',
+                columnMenu: '#btnColumnMenu',
+                columnMoving: false,
+                pagination: false
+            });
+        }
+
+        //导出
+        function tbExport() {
+            //加载表头
+            var fields = $('#dg').datagrid('getColumnFields');
+            var headers = [];
+            for (var i = 0; i < fields.length; i++) {
+                headers.push($('#dg').datagrid('getColumnOption', fields[i])['title']);
+                //headers.push(fields[i]);
+            }
+            $('#dg').datagridExport({
+                headers: headers,
+                fileName: '导出数据(产品物料).xls',
+                workSheet: '导出数据(产品物料)'
+            });
+        }
+
+        //刷新
+        function tbReload() {
+            tbSearchSubmit();
+        }
+
+        function formatterTrueFalse(value, row, index) { return value == 'True' ? '是' : '否'; }
+        function stylerTrueFalse(value, row, index) { return value == 'True' ? 'color:black' : 'color:red'; }
+
+    </script>
+</body>
+</html>

+ 2360 - 0
wwwroot/mes/semifinished/plan/plan.ashx

@@ -0,0 +1,2360 @@
+<%@ WebHandler Language="C#" Class="glineplanmold" %>
+
+using System;
+using System.Web;
+using System.Web.SessionState;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.Data;
+using Curtain.DataAccess;
+using DK.XuWei.WebMes;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+public class glineplanmold : IHttpHandler, IReadOnlySessionState
+{
+    string detailplanID = null;
+    public void ProcessRequest(HttpContext context)
+    {
+        context.Response.ContentType = "text/plain";
+        if (mes.LoginCheck() && context.Request["m"] is object)
+        {
+            Button b = new Button();
+            if (mes.RightCheck(""))
+            {
+                b.MateriaPlanautoButtonIndex = true;
+                b.MateriaPlanautoButtonInsert = true;
+                b.MateriaPlanautoButtonInsertBatch = true;
+                b.MateriaPlanautoButtonCopy = true;
+                b.MateriaPlanautoButtonUpdate = true;
+                b.MateriaPlanautoButtonDelete = true;
+                b.MateriaPlanautoButtonCancel = true;
+                b.MateriaPlanautoButtonSearch = true;
+                b.MateriaPlanautoButtonDetail = true;
+                b.MateriaPlanautoButtonCheckbox = true;
+                b.MateriaPlanautoButtonExport = true;
+                b.MateriaPlanautoButtonReload = true;
+            };
+            switch (context.Request["m"].ToString().ToLower())
+            {
+                case "b":
+                    {
+                        //按钮
+                        context.Response.Write(new JsonResult(b).ToJson());
+                        break;
+                    }
+                case "z":
+                    {
+                        detailplanID = context.Request["PLANID"];
+                        //搜索明细
+                        if (b.MateriaPlanautoButtonIndex)
+                            context.Response.Write(search(context.Request.Form));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "ss":
+                    {
+                        //搜索主表
+                        if (b.MateriaPlanautoButtonIndex)
+                        {
+                            context.Response.Write(searchs(context.Request.Form));
+                        }
+                        else
+                        {
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        }
+                        break;
+                    }
+                case "dr":
+                    {
+                        //导入
+                        context.Response.Write(import(context));
+                        break;
+
+                    }
+                case "t":
+                    {
+                        //搜索主表编辑明细
+                        context.Response.Write(searchdetail(context));
+                        break;
+
+                    }
+                case "i":
+                    {
+                        //插入
+                        if (b.MateriaPlanautoButtonInsert)
+                            if (context.Request.Files.Count > 0 && !string.IsNullOrWhiteSpace(context.Request.Files[0].FileName.ToString()))
+                            {
+                                context.Response.Write(insertImport(context));
+                            }
+                            else
+                            {
+                                context.Response.Write(insert(context.Request.Form));
+                            }
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "u":
+                    {
+                        //修改
+                        if (b.MateriaPlanautoButtonUpdate)
+                            context.Response.Write(update(context.Request.Form));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "d":
+                    {
+                        //删除
+                        if (b.MateriaPlanautoButtonDelete)
+                            context.Response.Write(delete(context.Request["id"]));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "pd":
+                    {
+                        //删除总单
+                        if (b.MateriaPlanautoButtonDelete)
+                            context.Response.Write(plandelete(context.Request["id"]));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "dd":
+                    {
+                        context.Response.Write(searchdetail());
+                        break;
+                    }
+                case "adddetail":
+                    {
+                        context.Response.Write(insertdetail(context.Request["data"], context.Request["PLANID"]));
+                        break;
+                    }
+                case "ig":
+                    {
+                        //生成注浆计划
+                        context.Response.Write(insertgrout(context.Request["data"]));
+                        break;
+                    }
+                case "id":
+                    {
+                        //生成交坯计划
+                        context.Response.Write(insertdeliver(context.Request["data"]));
+                        break;
+                    }
+                case "ia":
+                    {
+                        //同时生成注浆及交坯计划
+                        context.Response.Write(insertall(context.Request["data"]));
+                        break;
+                    }
+                case "h":
+                    {
+                        //履历查询
+                        detailplanID = context.Request["PLANID"];
+                        context.Response.Write(searchHistory(context.Request.Form));
+                        break;
+                    }
+            }
+        }
+    }
+
+    private string import(HttpContext context)
+    {
+        //上传文件
+        string filePath = "/upload/dailyplan/" + DateTime.Now.ToString("yyyy-MM-dd");
+        System.IO.Directory.CreateDirectory(context.Server.MapPath(filePath));
+        string fileName = filePath + "/生产计划" + DateTime.Now.ToString("yyyy-MM-dd");
+        fileName += System.IO.Path.GetExtension(context.Request.Files[0].FileName);
+        string diskFileName = context.Server.MapPath(fileName);
+        if (System.IO.File.Exists(diskFileName)) System.IO.File.Delete(diskFileName);
+        context.Request.Files[0].SaveAs(diskFileName);
+
+        //读excel
+        DataTable dt = Import.ExcelToDataTable(diskFileName);
+        if (dt.Rows.Count == 0)
+        {
+            return new JsonResult(JsonStatus.otherError) { message = "Excel中无数据" }.ToJson();
+        }
+
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            int result = 0;
+            conn.BeginTransaction();
+            try
+            {
+                int row = 1;
+                int planID = Convert.ToInt32(HttpContext.Current.Request["id"]);
+
+                foreach (DataRow item in dt.Rows)
+                {
+                    // 物料编码
+                    if (string.IsNullOrEmpty(item["物料编码"] + ""))
+                    {
+                        conn.Rollback();
+                        return new JsonResult(JsonStatus.otherError) { message = "第" + row + "行,物料编码不能为空" }.ToJson();
+                    }
+                    string materialCode = item["物料编码"].ToString();
+
+                    // 计划数量
+                    if (string.IsNullOrEmpty(item["计划数量"] + ""))
+                    {
+                        conn.Rollback();
+                        return new JsonResult(JsonStatus.otherError) { message = "第" + row + "行,计划数量不能为空" }.ToJson();
+                    }
+                    string plancount = item["计划数量"].ToString();
+
+                    // 备注
+                    string detailRemarks = item["备注"].ToString();
+                    //物料描述
+                    string meterialRemark = getMeterialRemark(materialCode);
+
+                    string sqlStr = @" SELECT SP.DETAILID,SP.PLANCOUNT
+                                   FROM TP_SEMIFINISHED_PLANDETAIL SP
+                                  WHERE SP.PLANID = @PLANID@ AND SP.VALUEFLAG =1
+                                    AND SP.MATERIALCODE  =  @MATERIALCODE@";
+                    List<CDAParameter> sqlPara = new List<CDAParameter>();
+                    sqlPara.Add(new CDAParameter("PLANID", planID));
+                    sqlPara.Add(new CDAParameter("MATERIALCODE", materialCode));
+
+                    DataTable plandt = conn.ExecuteDatatable(sqlStr, sqlPara.ToArray());
+
+                    if (plandt != null && plandt.Rows.Count > 0)
+                    {
+                        ////编辑
+                        //result += conn.ExecuteNonQuery(@"UPDATE TP_SEMIFINISHED_PLANDETAIL  SET   
+                        //            PLANCOUNT = PLANCOUNT + @PLANCOUNT@, REMARKS = @REMARKS@  ,UPDATEUSERID = @UPDATEUSERID@ ,UPDATETIME= SYSDATE,GROUTINGFLAG = 0,DELIVERFLAG = 0 
+                        //            WHERE DETAILID = @DETAILID@ AND MATERIALCODE = @MATERIALCODE@
+                        //    ",
+                        //    new CDAParameter("PLANCOUNT", Convert.ToInt32( plancount)),
+                        //    new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                        //    new CDAParameter("REMARKS", detailRemarks),
+                        //    new CDAParameter("MATERIALCODE", materialCode),
+                        //    new CDAParameter("DETAILID", Convert.ToInt32(plandt.Rows[0]["DETAILID"]))
+                        //);
+                        //新建
+                        object detailID = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PLANDETAIL_ID");
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PLANDETAIL  
+                                    (DETAILID
+                                    ,PLANID
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,REMARKS 
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID
+                                    ,UPDATEUSERID
+                                    )
+                                VALUES
+                                    (@DETAILID@
+                                    ,@PLANID@
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@
+                                    ,@REMARKS@
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@
+                                    ,@UPDATEUSERID@)
+                            ",
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailID)),
+                            new CDAParameter("PLANID", Convert.ToInt32(planID)),
+                            new CDAParameter("MATERIALCODE", materialCode),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT", Convert.ToInt32( plancount)),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  "【物料增加计划】-")
+                        );
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PLANHISTORY  
+                                    (PLANID
+                                    ,DETAILID
+                                    ,EDITFLAG
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,REMARKS 
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    )
+                                VALUES
+                                    (@PLANID@
+                                    ,@DETAILID@
+                                    ,3
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@
+                                    ,@REMARKS@
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@ )
+                            ",
+                            new CDAParameter("PLANID", Convert.ToInt32(planID)),
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailID)),
+                            new CDAParameter("MATERIALCODE", materialCode),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT", plancount),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS", "【物料增加计划】-"+detailRemarks)
+                        );
+                    }
+                    else
+                    {
+                        //新建
+                        object detailID = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PLANDETAIL_ID");
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PLANDETAIL  
+                                    (DETAILID
+                                    ,PLANID
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,REMARKS 
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID
+                                    ,UPDATEUSERID
+                                    )
+                                VALUES
+                                    (@DETAILID@
+                                    ,@PLANID@
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@
+                                    ,@REMARKS@
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@
+                                    ,@UPDATEUSERID@)
+                            ",
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailID)),
+                            new CDAParameter("PLANID", Convert.ToInt32(planID)),
+                            new CDAParameter("MATERIALCODE", materialCode),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT", plancount),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS", detailRemarks)
+                        );
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PLANHISTORY  
+                                    (PLANID
+                                    ,DETAILID
+                                    ,EDITFLAG
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,REMARKS 
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    )
+                                VALUES
+                                    (@PLANID@
+                                    ,@DETAILID@
+                                    ,1
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@
+                                    ,@REMARKS@
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@ )
+                            ",
+                            new CDAParameter("PLANID", Convert.ToInt32(planID)),
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailID)),
+                            new CDAParameter("MATERIALCODE", materialCode),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT", plancount),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS", detailRemarks)
+                        );
+                    }
+                    row++;
+                }
+                if (result > 0)
+                {
+                    conn.Commit();
+                    return new JsonResult(JsonStatus.success).ToJson();
+                }
+                else
+                {
+                    conn.Rollback();
+                    return new JsonResult(JsonStatus.error).ToJson();
+                }
+
+            }
+            catch (Exception ex)
+            {
+                conn.Rollback();
+                return new JsonResult(JsonStatus.otherError) { message = ex.Message }.ToJson();
+            }
+        }
+    }
+
+    private string delete(string id)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            conn.BeginTransaction();
+            if (id is object)
+            {
+                try
+                {
+                    //插入删除履历
+                    int result = conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PLANHISTORY  
+                                    (PLANID
+                                    ,DETAILID
+                                    ,EDITFLAG
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,REMARKS 
+                                    ,ACCOUNTID
+                                    ,VALUEFLAG
+                                    ,CREATEUSERID 
+                                    )
+                                SELECT PLANID
+                                    ,DETAILID
+                                    ,3 as EDITFLAG
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT
+                                    ,@REMARKS@ as REMARKS
+                                    ,ACCOUNTID
+                                    ,0 AS VALUEFLAG
+                                    ,@CREATEUSERID@ as CREATEUSERID
+                                    FROM TP_SEMIFINISHED_PLANDETAIL WHERE instr(',' || @detailID@ || ',', ',' || DETAILID || ',') > 0 
+                            ",
+                            new CDAParameter("detailID", id),
+                            new CDAParameter("REMARKS", "被删除"),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"])
+                        );
+
+                    //删除总单
+                    result += conn.ExecuteNonQuery(@"DELETE FROM TP_SEMIFINISHED_PLANDETAIL WHERE instr(',' || @detailID@ || ',', ',' || DETAILID || ',') > 0 ",
+                        new CDAParameter("detailID", id)
+                    );
+
+                    if (result > 0)
+                    {
+                        conn.Commit();
+                        return new JsonResult(JsonStatus.success).ToJson();
+                    }
+                    else
+                    {
+                        conn.Rollback();
+                        return new JsonResult(JsonStatus.otherError).ToJson();
+                    }
+
+                }
+                catch (Exception ex)
+                {
+
+                    throw;
+                }
+
+
+            }
+            else
+            {
+                return new JsonResult(JsonStatus.otherError).ToJson();
+            }
+        }
+    }
+
+    /// <summary>
+    /// 删除总单
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+    private string plandelete(string id)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            conn.BeginTransaction();
+            if (id is object)
+            {
+                try
+                {
+                    //删除总单
+                    int result = conn.ExecuteNonQuery(@"update TP_SEMIFINISHED_PLAN set valueflag = 0 WHERE PLANID  = @PLANID@",
+                        new CDAParameter("PLANID", id)
+                    );
+
+                    if (result > 0)
+                    {
+                        conn.Commit();
+                        return new JsonResult(JsonStatus.success).ToJson();
+                    }
+                    else
+                    {
+                        conn.Rollback();
+                        return new JsonResult(JsonStatus.otherError).ToJson();
+                    }
+
+                }
+                catch (Exception ex)
+                {
+
+                    throw;
+                }
+
+
+            }
+            else
+            {
+                return new JsonResult(JsonStatus.otherError).ToJson();
+            }
+        }
+    }
+
+    /// <summary>
+    /// 修改
+    /// </summary>
+    /// <returns></returns>
+    private string update(NameValueCollection form)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            try
+            {
+                // 计划名称
+                string PLANNAME = form["PLANNAME"];
+                // 备注
+                string REMARKS = form["REMARKS"];
+
+                string sqlStr = @"UPDATE TP_SEMIFINISHED_PLAN SET ";
+
+                if (!string.IsNullOrEmpty(REMARKS + ""))
+                {
+                    sqlStr += " REMARKS = '" + REMARKS + "',";
+                }
+                if (!string.IsNullOrEmpty(PLANNAME + ""))
+                {
+                    sqlStr += " PLANNAME = '" + PLANNAME + "',";
+                }
+                sqlStr += @"updateuserid  = @UpdateUserID@ ,updatetime = SYSDATE   WHERE PLANID = @PLANID@";
+
+                int result = conn.ExecuteNonQuery(sqlStr,
+                new CDAParameter("UpdateUserID", HttpContext.Current.Session["userId"]),
+                new CDAParameter("PLANID", HttpContext.Current.Request["id"])
+                );
+            }
+            catch (Exception ex)
+            {
+
+                throw ex;
+            }
+
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 修改
+    /// </summary>
+    /// <returns></returns>
+    private string insertdetail(string jsondata,string planid)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            try
+            {   conn.BeginTransaction();
+                //明细 
+                DataTable detailTable = JsonConvert.DeserializeObject<DataTable>(jsondata);
+                for (int i = 0; i < detailTable.Rows.Count; i++)
+                {
+                    string sqlStr = @" SELECT SP.DETAILID,SP.PLANCOUNT
+                                   FROM TP_SEMIFINISHED_PLANDETAIL SP
+                                  WHERE SP.PLANID = @PLANID@ AND SP.VALUEFLAG =1
+                                    AND SP.MATERIALCODE  =  @MATERIALCODE@";
+                    List<CDAParameter> sqlPara = new List<CDAParameter>();
+                    sqlPara.Add(new CDAParameter("PLANID", Convert.ToInt32(planid)));
+                    sqlPara.Add(new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]));
+
+                    DataTable plandt = conn.ExecuteDatatable(sqlStr, sqlPara.ToArray());
+                    int result = 0;
+                    //物料描述
+                    string meterialRemark = getMeterialRemark(detailTable.Rows[i]["MATERIALCODE"].ToString());
+                    if (plandt != null && plandt.Rows.Count > 0)
+                    {
+                        ////编辑
+                        //result += conn.ExecuteNonQuery(@"UPDATE TP_SEMIFINISHED_PLANDETAIL  SET   
+                        //            PLANCOUNT = PLANCOUNT + @PLANCOUNT@, REMARKS = @REMARKS@  ,UPDATEUSERID = @UPDATEUSERID@ ,UPDATETIME= SYSDATE,GROUTINGFLAG = 0,DELIVERFLAG = 0 
+                        //            WHERE DETAILID = @DETAILID@ AND MATERIALCODE = @MATERIALCODE@
+                        //    ",
+                        //    new CDAParameter("PLANCOUNT", Convert.ToInt32( detailTable.Rows[i]["PLANCOUNT"])),
+                        //    new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                        //    new CDAParameter("REMARKS", detailTable.Rows[i]["REMARKS"]),
+                        //    new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                        //    new CDAParameter("DETAILID", Convert.ToInt32(plandt.Rows[0]["DETAILID"]))
+                        //);
+                        //新建
+                        object detailID = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PLANDETAIL_ID");
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PLANDETAIL  
+                                    (DETAILID
+                                    ,PLANID
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,REMARKS 
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID
+                                    ,UPDATEUSERID
+                                    )
+                                VALUES
+                                    (@DETAILID@
+                                    ,@PLANID@
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@
+                                    ,@REMARKS@
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@
+                                    ,@UPDATEUSERID@)
+                            ",
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailID)),
+                            new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT", Convert.ToInt32( detailTable.Rows[i]["PLANCOUNT"])),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  "【物料增加计划】-"+ detailTable.Rows[i]["REMARKS"])
+                        );
+
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PLANHISTORY  
+                                    (PLANID
+                                    ,DETAILID
+                                    ,EDITFLAG
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,REMARKS 
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    )
+                                VALUES
+                                    (@PLANID@
+                                    ,@DETAILID@
+                                    ,3
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@
+                                    ,@REMARKS@
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@ )
+                            ",
+                            new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailID)),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT",Convert.ToInt32( detailTable.Rows[i]["PLANCOUNT"])),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS", "【物料增加计划】-"+ detailTable.Rows[i]["REMARKS"])
+                        );
+                    }
+                    else
+                    {
+                        //新建
+                        object detailID = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PLANDETAIL_ID");
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PLANDETAIL  
+                                    (DETAILID
+                                    ,PLANID
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,REMARKS 
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID
+                                    ,UPDATEUSERID
+                                    )
+                                VALUES
+                                    (@DETAILID@
+                                    ,@PLANID@
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@
+                                    ,@REMARKS@
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@
+                                    ,@UPDATEUSERID@)
+                            ",
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailID)),
+                            new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT", Convert.ToInt32( detailTable.Rows[i]["PLANCOUNT"])),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS",  detailTable.Rows[i]["REMARKS"])
+                        );
+
+                        result += conn.ExecuteNonQuery(@"
+                        INSERT INTO TP_SEMIFINISHED_PLANHISTORY  
+                                    (PLANID
+                                    ,DETAILID
+                                    ,EDITFLAG
+                                    ,MATERIALCODE
+                                    ,MATERIALREMARK
+                                    ,PLANCOUNT 
+                                    ,REMARKS 
+                                    ,ACCOUNTID
+                                    ,CREATEUSERID 
+                                    )
+                                VALUES
+                                    (@PLANID@
+                                    ,@DETAILID@
+                                    ,2
+                                    ,@MATERIALCODE@
+                                    ,@MATERIALREMARK@ 
+                                    ,@PLANCOUNT@
+                                    ,@REMARKS@
+                                    ,@ACCOUNTID@
+                                    ,@CREATEUSERID@ )
+                            ",
+                            new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailID)),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", meterialRemark),
+                            new CDAParameter("PLANCOUNT", Convert.ToInt32( detailTable.Rows[i]["PLANCOUNT"])),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS", detailTable.Rows[i]["REMARKS"])
+                        );
+                    }
+                }
+
+            }
+            catch (Exception ex)
+            {
+
+                throw ex;
+            }
+            conn.Commit();
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    }
+    /// <summary>
+    /// 编辑查询
+    /// </summary>
+    /// <returns></returns>
+    private string detail()
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            try
+            {
+                DataTable dt = conn.ExecuteDatatable(@"
+               SELECT gpm.mold_begindate
+                      ,gpm.mold_enddate
+                      ,gpm.groutinglineid as LINEID
+                      ,gpm.groutinglinedetailid
+                      ,gpm.groutinglinecode
+                      ,gpm.groutingmouldcode
+                      ,gpm.workshop
+                      ,gpm.goodsid
+                      ,gpm.sap_sku
+                      ,gpm.std_count
+                      ,day_grouting_num
+                      ,gpm.remarks
+                      ,gpm.MOLD_STATUS
+                  FROM t_gline_plan_mold gpm
+                  where gpm.moldid = @moldID@
+                ",
+                    new CDAParameter("moldID", HttpContext.Current.Request["id"])
+                );
+                return new JsonResult(dt).ToJson();
+
+            }
+            catch (Exception ex)
+            {
+
+                throw;
+            }
+
+        }
+    }
+
+    /// <summary>
+    /// 添加
+    /// </summary>
+    /// <returns></returns>
+    private string insert(NameValueCollection form)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            try
+            {
+                // 计划月份
+                DateTime planMonth = Convert.ToDateTime(form["PLANMONTH"]);
+                // 计划名称
+                string planName = form["PLANNAME"];
+
+                // 备注
+                string REMARKS = form["REMARKS"];
+
+                //查找该月是否有计划
+                DataTable plandts = conn.ExecuteDatatable(@"SELECT PLANNAME FROM TP_SEMIFINISHED_PLAN  WHERE  PLANMONTH = @PLANMONTH@ AND VALUEFLAG = 1 ",
+                    new CDAParameter("PLANMONTH", planMonth, DataType.DateTime)
+                );
+                if (plandts != null && plandts.Rows.Count > 0)
+                {
+                    return new JsonResult(JsonStatus.otherError) { message = "该月已存在计划单,请重新选择月份或者编辑当月计划单" }.ToJson();
+                }
+
+
+                //查找该月是否有计划
+                DataTable plandt = conn.ExecuteDatatable(@"SELECT PLANNAME FROM TP_SEMIFINISHED_PLAN  WHERE  PLANMONTH = @PLANMONTH@ AND VALUEFLAG = 1 ",
+                    new CDAParameter("PLANMONTH", planMonth, DataType.DateTime)
+                );
+                if (plandt != null && plandt.Rows.Count > 0)
+                {
+                    return new JsonResult(JsonStatus.otherError) { message = "该月已存在计划单,请重新选择月份或者编辑当月计划单" }.ToJson();
+                }
+                object planID = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PLAN_ID");
+                //计划单号
+                string planCode = "P" + DateTime.Now.Date.ToString("yyyyMMdd") + planID.ToString();
+
+                int result = conn.ExecuteNonQuery(@"
+                   INSERT INTO TP_SEMIFINISHED_PLAN
+                                (PLANID
+                                ,PLANCODE
+                                ,PLANNAME
+                                ,PLANMONTH
+                                ,REMARKS
+                                ,ACCOUNTID
+                                ,CREATEUSERID
+                                ,UPDATEUSERID
+                                )
+                            VALUES
+                                (@PLANID@
+                                ,@PLANCODE@
+                                ,@PLANNAME@
+                                ,TRUNC(@PLANMONTH@, 'MM')
+                                ,@REMARKS@
+                                ,@ACCOUNTID@
+                                ,@CREATEUSERID@
+                                ,@UPDATEUSERID@)
+                    ",
+                    new CDAParameter("PLANMONTH", planMonth, DataType.DateTime),
+                    new CDAParameter("PLANID", Convert.ToInt32(planID)),
+                    new CDAParameter("PLANCODE", planCode),
+                    new CDAParameter("PLANNAME", planName),
+                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                    new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                    new CDAParameter("REMARKS", REMARKS)
+                );
+
+                return new JsonResult(JsonStatus.success).ToJson();
+            }
+            catch (Exception ex)
+            {
+                throw ex;
+            }
+
+        }
+    }
+
+    /// <summary>
+    /// 添加导入
+    /// </summary>
+    /// <returns></returns>
+    private string insertImport(HttpContext context)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            try
+            {
+                conn.BeginTransaction();
+
+                NameValueCollection form = context.Request.Form;
+                // 计划月份
+                DateTime planMonth = Convert.ToDateTime(form["PLANMONTH"]);
+                // 计划名称
+                string planName = form["PLANNAME"];
+
+                // 备注
+                string REMARKS = form["REMARKS"];
+
+                //查找该月是否有计划
+                DataTable plandts = conn.ExecuteDatatable(@"SELECT PLANNAME FROM TP_SEMIFINISHED_PLAN  WHERE  PLANMONTH = @PLANMONTH@ AND VALUEFLAG = 1 ",
+                    new CDAParameter("PLANMONTH", planMonth, DataType.DateTime)
+                );
+                if (plandts != null && plandts.Rows.Count > 0)
+                {
+                    return new JsonResult(JsonStatus.otherError) { message = "该月已存在计划单,请重新选择月份或者编辑当月计划单" }.ToJson();
+                }
+
+                object planID = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PLAN_ID");
+                //计划单号
+                string planCode = "P" + DateTime.Now.Date.ToString("yyyyMMdd") + planID.ToString();
+
+                int result = conn.ExecuteNonQuery(@"
+                   INSERT INTO TP_SEMIFINISHED_PLAN
+                                (PLANID
+                                ,PLANCODE
+                                ,PLANNAME
+                                ,PLANMONTH
+                                ,REMARKS
+                                ,ACCOUNTID
+                                ,CREATEUSERID
+                                ,UPDATEUSERID
+                                )
+                            VALUES
+                                (@PLANID@
+                                ,@PLANCODE@
+                                ,@PLANNAME@ 
+                                ,TRUNC(@PLANMONTH@, 'MM')
+                                ,@REMARKS@
+                                ,@ACCOUNTID@
+                                ,@CREATEUSERID@
+                                ,@UPDATEUSERID@)
+                    ",
+                    new CDAParameter("PLANMONTH", planMonth, DataType.DateTime),
+                    new CDAParameter("PLANID", Convert.ToInt32(planID)),
+                    new CDAParameter("PLANCODE", planCode),
+                    new CDAParameter("PLANNAME", planName),
+                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                    new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                    new CDAParameter("REMARKS", REMARKS)
+                );
+
+                //上传文件
+                string filePath = "/upload/plan/" + DateTime.Now.ToString("yyyy-MM-dd");
+                System.IO.Directory.CreateDirectory(context.Server.MapPath(filePath));
+                string fileName = filePath + "/生产计划" + DateTime.Now.ToString("yyyy-MM-dd");
+                fileName += System.IO.Path.GetExtension(context.Request.Files[0].FileName);
+                string diskFileName = context.Server.MapPath(fileName);
+                if (System.IO.File.Exists(diskFileName)) System.IO.File.Delete(diskFileName);
+                context.Request.Files[0].SaveAs(diskFileName);
+
+                //读excel
+                DataTable dt = Import.ExcelToDataTable(diskFileName);
+                if (dt.Rows.Count == 0)
+                {
+                    return new JsonResult(JsonStatus.otherError) { message = "Excel中无数据" }.ToJson();
+                }
+
+                int row = 1;
+
+                foreach (DataRow item in dt.Rows)
+                {
+                    // 物料编码
+                    if (string.IsNullOrEmpty(item["物料编码"] + ""))
+                    {
+                        conn.Rollback();
+                        return new JsonResult(JsonStatus.otherError) { message = "第" + row + "行,物料编码不能为空" }.ToJson();
+                    }
+                    string materialCode = item["物料编码"].ToString();
+
+                    // 计划数量
+                    if (string.IsNullOrEmpty(item["计划数量"] + ""))
+                    {
+                        conn.Rollback();
+                        return new JsonResult(JsonStatus.otherError) { message = "第" + row + "行,计划数量不能为空" }.ToJson();
+                    }
+                    string plancount = item["计划数量"].ToString();
+
+                    // 备注
+                    string detailRemarks = item["备注"].ToString();
+                    string meterialRemark = getMeterialRemark(materialCode);
+
+                    object detailID = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PLANDETAIL_ID");
+
+                    result += conn.ExecuteNonQuery(@"
+                    INSERT INTO TP_SEMIFINISHED_PLANDETAIL  
+                                (DETAILID
+                                ,PLANID
+                                ,MATERIALCODE
+                                ,MATERIALREMARK
+                                ,PLANCOUNT 
+                                ,REMARKS 
+                                ,ACCOUNTID
+                                ,CREATEUSERID
+                                ,UPDATEUSERID
+                                )
+                            VALUES
+                                (@DETAILID@
+                                ,@PLANID@
+                                ,@MATERIALCODE@
+                                ,@MATERIALREMARK@ 
+                                ,@PLANCOUNT@
+                                ,@REMARKS@
+                                ,@ACCOUNTID@
+                                ,@CREATEUSERID@
+                                ,@UPDATEUSERID@)
+                        ",
+                        new CDAParameter("DETAILID", Convert.ToInt32(detailID)),
+                        new CDAParameter("PLANID", Convert.ToInt32(planID)),
+                        new CDAParameter("MATERIALCODE", materialCode),
+                        new CDAParameter("MATERIALREMARK", meterialRemark),
+                        new CDAParameter("PLANCOUNT", plancount),
+                        new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                        new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                        new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                        new CDAParameter("REMARKS", detailRemarks)
+                    );
+
+                    result += conn.ExecuteNonQuery(@"
+                    INSERT INTO TP_SEMIFINISHED_PLANHISTORY  
+                                (PLANID
+                                ,DETAILID
+                                ,EDITFLAG
+                                ,MATERIALCODE
+                                ,MATERIALREMARK
+                                ,PLANCOUNT 
+                                ,REMARKS 
+                                ,ACCOUNTID
+                                ,CREATEUSERID 
+                                )
+                            VALUES
+                                (@PLANID@
+                                ,@DETAILID@
+                                ,1
+                                ,@MATERIALCODE@
+                                ,@MATERIALREMARK@ 
+                                ,@PLANCOUNT@
+                                ,@REMARKS@
+                                ,@ACCOUNTID@
+                                ,@CREATEUSERID@ )
+                        ",
+                        new CDAParameter("PLANID", Convert.ToInt32(planID)),
+                        new CDAParameter("DETAILID", Convert.ToInt32(detailID)),
+                        new CDAParameter("MATERIALCODE", materialCode),
+                        new CDAParameter("MATERIALREMARK", meterialRemark),
+                        new CDAParameter("PLANCOUNT", plancount),
+                        new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                        new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                        new CDAParameter("REMARKS", detailRemarks)
+                    );
+
+                    row++;
+                }
+
+                if (result > 0)
+                {
+                    conn.Commit();
+                    return new JsonResult(JsonStatus.success).ToJson();
+                }
+                else
+                {
+                    conn.Rollback();
+                    return new JsonResult(JsonStatus.error).ToJson();
+                }
+            }
+            catch (Exception ex)
+            {
+                conn.Rollback();
+                return new JsonResult(JsonStatus.otherError) { message = ex.Message }.ToJson();
+            }
+
+        }
+    }
+
+    /// <summary>
+    /// 查询物料描述
+    /// </summary>
+    /// <returns></returns>
+    private string getMeterialRemark(string materialCode)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            string sqlStr = @" SELECT s.MAKTX
+                                   FROM TP_PC_SAPBOMDETAIL s
+                                  WHERE s.MATNR = @materialCode@ ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("materialCode", materialCode));
+            try
+            {
+                DataTable dt = conn.ExecuteDatatable(sqlStr, sqlPara.ToArray());
+                string meterialRemark = "";
+                if (dt != null && dt.Rows.Count >0)
+                {
+                    meterialRemark = dt.Rows[0]["MAKTX"].ToString();
+                }
+                return meterialRemark;
+            }
+            catch (Exception ex)
+            {
+                throw ex ;
+            }
+        }
+    }
+
+    private class Button
+    {
+        public bool MateriaPlanautoButtonIndex = false;
+        public bool MateriaPlanautoButtonInsert = false;
+        public bool MateriaPlanautoButtonInsertBatch = false;
+        public bool MateriaPlanautoButtonCopy = false;
+        public bool MateriaPlanautoButtonUpdate = false;
+        public bool MateriaPlanautoButtonDelete = false;
+        public bool MateriaPlanautoButtonCancel = false;
+        public bool MateriaPlanautoButtonSearch = false;
+        public bool MateriaPlanautoButtonDetail = false;
+        public bool MateriaPlanautoButtonCheckbox = false;
+        public bool MateriaPlanautoButtonExport = false;
+        public bool MateriaPlanautoButtonReload = false;
+    }
+
+    /// <summary>
+    /// 搜索主表
+    /// </summary>
+    /// <returns></returns>
+    private string searchs(NameValueCollection form)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            int page = HttpContext.Current.Request["page"] is object ? Convert.ToInt32(HttpContext.Current.Request["page"]) : 1;
+            int rows = HttpContext.Current.Request["rows"] is object ? Convert.ToInt32(HttpContext.Current.Request["rows"]) : 10;
+            string sort = HttpContext.Current.Request["sort"] is object ? HttpContext.Current.Request["sort"] : "";
+            string order = HttpContext.Current.Request["order"] is object ? HttpContext.Current.Request["order"] : "";
+
+            string sqlStr = @"
+                SELECT  
+                    p.PLANID SID, 
+                    p.PLANID, 
+                    p.PLANCODE,
+                    p.PLANNAME,
+                    p.REMARKS,
+                    TO_CHAR(p.PLANMONTH, 'YYYY-MM') PLANMONTH
+                FROM
+                    TP_SEMIFINISHED_PLAN p 
+                WHERE 
+                    p.valueflag = 1
+            ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+
+            if(!string.IsNullOrEmpty(form["PLANNAME"]))
+            {
+                sqlStr += " AND INSTR(  P.PLANNAME, @PLANNAME@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("PLANNAME", form["PLANNAME"]));
+            }
+            if(!string.IsNullOrEmpty(form["PLANMONTH"]))
+            {
+                sqlStr += " AND P.PLANMONTH =  @PLANMONTH@";
+                sqlPara.Add(new CDAParameter("PLANMONTH", form["PLANMONTH"], DataType.DateTime));
+            }
+            if (Convert.ToInt32(HttpContext.Current.Request["id"]) > 0)
+            {
+                sqlStr += " AND P.PLANID =  @PLANID@";
+                sqlPara.Add(new CDAParameter("PLANID",Convert.ToInt32(HttpContext.Current.Request["id"]), DataType.DateTime));
+
+            }
+            if(sort != "")
+            {
+                sqlStr += " ORDER BY " + sort + " " + order;
+            }
+            int total = 0;
+            DataTable dt = conn.SelectPages(page, rows,out total, sqlStr, sqlPara.ToArray());
+            return new JsonResult(dt) { total = total}.ToJson();
+
+        }
+    }
+
+    /// <summary>
+    /// 搜索编辑信息
+    /// </summary>
+    /// <returns></returns>
+    private string searchdetail(HttpContext contest)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            string sqlStr = @"
+                SELECT  
+                    p.PLANID SID, 
+                    p.PLANID, 
+                    p.PLANCODE,
+                    p.PLANNAME,
+                    p.REMARKS,
+                    TO_CHAR(p.PLANMONTH, 'YYYY-MM') PLANMONTH
+                FROM
+                    TP_SEMIFINISHED_PLAN p 
+                WHERE 
+                    1 = 1
+            ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+
+            if (Convert.ToInt32(contest.Request["id"]) > 0)
+            {
+                sqlStr += " AND P.PLANID =  @PLANID@";
+                sqlPara.Add(new CDAParameter("PLANID",Convert.ToInt32(contest.Request["id"])));
+
+            }
+            int total = 0;
+            DataTable dt = conn.ExecuteDatatable( sqlStr, sqlPara.ToArray());
+            return new JsonResult(dt) { total = total}.ToJson();
+
+        }
+    }
+    /// <summary>
+    /// 搜索明细
+    /// </summary>
+    /// <returns></returns>
+    private string search(NameValueCollection form)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            int page = HttpContext.Current.Request["page"] is object ? Convert.ToInt32(HttpContext.Current.Request["page"]) : 1;
+            int rows = HttpContext.Current.Request["rows"] is object ? Convert.ToInt32(HttpContext.Current.Request["rows"]) : 10;
+            string sort = HttpContext.Current.Request["sort"] is object ? HttpContext.Current.Request["sort"] : "";
+            string order = HttpContext.Current.Request["order"] is object ? HttpContext.Current.Request["order"] : "";
+
+            //物料编码
+            string materialCode = form["MATERIALCODE"];
+
+            string sqlStr = @"SELECT SP.PLANID,
+                                SP.DETAILID,
+                                SP.DETAILID SID,
+                                SP.MATERIALCODE,
+                                SP.MATERIALREMARK,
+                                SP.PLANCOUNT,
+                                CASE WHEN SP.GROUTINGFLAG = 1 THEN SP.GROUTINGQUALITY WHEN SP.GROUTINGFLAG = 0 THEN NVL(SQ.FIXEDGROUTINGQUALITY,SQ.GROUTINGQUALITY) END AS GROUTINGQUALITY,
+                                CASE WHEN SP.GROUTINGFLAG = 1 THEN SP.GROUTINGPLANCOUNT WHEN SP.GROUTINGFLAG = 0 THEN ROUND(SP.PLANCOUNT / NULLIF(NVL(SQ.FIXEDGROUTINGQUALITY, SQ.GROUTINGQUALITY), 0)) END AS GROUTINGPLANCOUNT,
+                                CASE WHEN SP.GROUTINGFLAG = 1 THEN '已生成' WHEN SP.GROUTINGFLAG = 0 THEN '未生成' END AS GROUTINGFLAG, 
+                                CASE WHEN SP.DELIVERFLAG = 1 THEN SP.DELIVERQUALITY WHEN SP.DELIVERFLAG = 0 THEN NVL(SQ.FIXEDDELIVERQUALITY,SQ.DELIVERQUALITY) END AS DELIVERQUALITY, 
+                                CASE WHEN SP.DELIVERFLAG = 1 THEN SP.DELIVERPLANCOUNT WHEN SP.DELIVERFLAG = 0 THEN ROUND(SP.PLANCOUNT / NULLIF(NVL(SQ.FIXEDDELIVERQUALITY, SQ.DELIVERQUALITY), 0)) END AS DELIVERPLANCOUNT,
+                                CASE WHEN SP.DELIVERFLAG = 1 THEN '已生成' WHEN SP.DELIVERFLAG = 0 THEN '未生成' END AS DELIVERFLAG, 
+                                SP.CREATETIME,
+                                U.USERNAME AS CREATEUSERCODE,
+                                SP.UPDATETIME,
+                                U1.USERNAME AS UPDATEUSERCODE,
+                                SP.REMARKS,
+                                P.PLANMONTH
+                              FROM TP_SEMIFINISHED_PLANDETAIL SP 
+                                LEFT JOIN TP_SEMIFINISHED_PLAN P ON P.PLANID = SP.PLANID
+                                LEFT JOIN TP_MST_USER U ON U.USERID = SP.CREATEUSERID
+                                LEFT JOIN TP_MST_USER U1 ON U1.USERID = SP.UPDATEUSERID
+                                LEFT JOIN TP_SEMIFINISHED_QUALITYPOINT SQ ON SQ.MATERIALCODE = SP.MATERIALCODE
+                             WHERE SP.VALUEFLAG = 1
+                                   AND SP.ACCOUNTID = @accountid@";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("accountid", HttpContext.Current.Session["accountId"]));
+            //主表计划ID
+            if (!string.IsNullOrEmpty(detailplanID))
+            {
+                sqlStr += " AND SP.PLANID = " + detailplanID ;
+
+            }
+            if (!string.IsNullOrEmpty(materialCode))
+            {
+                sqlStr += " and SP.MATERIALCODE like '%" + materialCode + "%' ";
+            }
+            try
+            {
+                JsonResult data = Easyui.ExecuteJsonResult(conn, sqlStr, sqlPara);
+                return data.ToJson();
+            }
+            catch (Exception ex)
+            {
+                throw ex ;
+            }
+        }
+    }
+
+    /// <summary>
+    /// 搜索明细
+    /// </summary>
+    /// <returns></returns>
+    private string searchdetail()
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            string sqlStr = @"SELECT SP.PLANID, 
+                                SP.MATERIALCODE,
+                                SP.MATERIALREMARK,
+                                SP.PLANCOUNT,
+                                SP.REMARKS
+                              FROM TP_SEMIFINISHED_PLANDETAIL SP 
+                             WHERE 1=0 ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("accountid", HttpContext.Current.Session["accountId"]));
+
+            try
+            {
+                JsonResult data = Easyui.ExecuteJsonResult(conn, sqlStr, sqlPara);
+                return data.ToJson();
+            }
+            catch (Exception ex)
+            {
+                throw ex ;
+            }
+        }
+    }
+
+    /// <summary>
+    /// 生成注浆计划
+    /// </summary>
+    /// <returns></returns>
+    private string insertgrout(string jsondata)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            try
+            {   conn.BeginTransaction();
+                //明细 
+                DataTable detailTable = JsonConvert.DeserializeObject<DataTable>(jsondata);
+                int result = 0;
+                string materialcodes = "";
+                int planid = 0;
+                string planmonth = "";
+                if (detailTable != null && detailTable.Rows.Count > 0)
+                {
+                    planid = Convert.ToInt32(detailTable.Rows[0]["PLANID"].ToString());
+                    planmonth = detailTable.Rows[0]["PLANMONTH"].ToString();
+                    //保存调整后的总计划,更新标识为已生成
+                    //保存总计划履历表,编辑类型
+                    DataColumn dataColumn = new DataColumn("MAT20", typeof(string));
+                    detailTable.Columns.Add(dataColumn);
+                    for (int i = 0; i < detailTable.Rows.Count; i++)
+                    {
+                        //根据物料查找物料关系对照表,找到对应湿坯半成品
+                        DataTable dt = conn.ExecuteDatatable(@"SELECT MAT20 FROM TP_SEMIFINISHED_MATERIALLINK  WHERE  MATERIALCODE = @MATERIALCODE@ ",
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"])
+                        );
+
+
+
+                        if (dt != null && dt.Rows.Count > 0 && !string.IsNullOrWhiteSpace(dt.Rows[0]["MAT20"].ToString()))
+                        {
+                            //找到对应湿坯半成品 
+                            detailTable.Rows[i]["MAT20"] = dt.Rows[0]["MAT20"].ToString();
+
+                            //编辑
+                            result += conn.ExecuteNonQuery(@"UPDATE TP_SEMIFINISHED_PLANDETAIL  SET   
+                                        PLANCOUNT = @PLANCOUNT@  ,GROUTINGQUALITY = @GROUTINGQUALITY@, GROUTINGPLANCOUNT = @GROUTINGPLANCOUNT@, UPDATEUSERID = @UPDATEUSERID@ ,UPDATETIME= SYSDATE,GROUTINGFLAG = 1
+                                        WHERE DETAILID = @DETAILID@ AND MATERIALCODE = @MATERIALCODE@
+                            ",
+                            new CDAParameter("PLANCOUNT",  detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("GROUTINGQUALITY", detailTable.Rows[i]["GROUTINGQUALITY"]),
+                            new CDAParameter("GROUTINGPLANCOUNT", detailTable.Rows[i]["GROUTINGPLANCOUNT"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailTable.Rows[i]["DETAILID"]))
+                            );
+
+                            result += conn.ExecuteNonQuery(@"
+                            INSERT INTO TP_SEMIFINISHED_PLANHISTORY  
+                                (PLANID ,DETAILID ,EDITFLAG ,MATERIALCODE ,MATERIALREMARK  ,PLANCOUNT  ,GROUTINGQUALITY  ,GROUTINGPLANCOUNT  ,GROUTINGFLAG  ,REMARKS  ,ACCOUNTID ,CREATEUSERID  )
+                            VALUES
+                                (@PLANID@,@DETAILID@,3,@MATERIALCODE@,@MATERIALREMARK@ ,@PLANCOUNT@,@GROUTINGQUALITY@,@GROUTINGPLANCOUNT@,1,@REMARKS@,@ACCOUNTID@,@CREATEUSERID@ )",
+                            new CDAParameter("PLANID", Convert.ToInt32(detailTable.Rows[i]["PLANID"])),
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailTable.Rows[i]["DETAILID"])),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", detailTable.Rows[i]["MATERIALREMARK"]),
+                            new CDAParameter("PLANCOUNT",detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("GROUTINGQUALITY",detailTable.Rows[i]["GROUTINGQUALITY"]),
+                            new CDAParameter("GROUTINGPLANCOUNT",detailTable.Rows[i]["GROUTINGPLANCOUNT"]),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS", "【生成注浆计划】")
+                            );
+                        }
+                        else
+                        {
+                            //未找到对应湿坯半成品,无法生成注浆计划
+                            materialcodes += detailTable.Rows[i]["MATERIALCODE"] + ",";
+                        }
+                    }
+
+                    //过滤掉没有找到湿坯半成品的物料 过滤 null 和空字符串
+                    DataTable syncTable = detailTable.Copy();
+                    syncTable.DefaultView.RowFilter = "MAT20 IS NOT NULL AND MAT20 <> ''";
+                    syncTable = syncTable.DefaultView.ToTable();
+
+                    //根据湿坯半成品进行汇总计划量
+                    DataTable summaryTable = new DataTable();
+                    summaryTable.Columns.Add("MAT20", typeof(string));
+                    summaryTable.Columns.Add("GROUTINGPLANCOUNT", typeof(decimal));
+
+                    Dictionary<string, List<DataRow>> groups = new Dictionary<string, List<DataRow>>();
+
+                    foreach (DataRow row in syncTable.Rows)
+                    {
+                        string mat20 = row["MAT20"].ToString();
+                        if (!groups.ContainsKey(mat20))
+                        {
+                            groups[mat20] = new List<DataRow>();
+                        }
+                        groups[mat20].Add(row);
+                    }
+
+                    // 计算汇总
+                    foreach (var group in groups)
+                    {
+                        decimal totalAmount = 0;
+                        foreach (DataRow row in group.Value)
+                        {
+                            if (row["GROUTINGPLANCOUNT"] != DBNull.Value)
+                                totalAmount += Convert.ToDecimal(row["GROUTINGPLANCOUNT"]);
+                        }
+
+                        DataRow newRow = summaryTable.NewRow();
+                        newRow["MAT20"] = group.Key;
+                        newRow["GROUTINGPLANCOUNT"] = totalAmount;
+                        summaryTable.Rows.Add(newRow);
+                    }
+
+                    //插入注浆计划表(新建?编辑?)
+                    //插入注浆计划履历表 
+                    if (summaryTable != null && summaryTable.Rows.Count > 0)
+                    {
+                        for (int i = 0; i < summaryTable.Rows.Count; i++)
+                        {
+
+                            string meterialRemark = getMeterialRemark(summaryTable.Rows[i]["MAT20"].ToString());
+                            //根据物料查找当月是否已经有计划
+                            DataTable proplan = conn.ExecuteDatatable(@"SELECT PRODPLANID FROM TP_SEMIFINISHED_PRODPLAN  WHERE  MATERIALCODE = @MATERIALCODE@ AND PLANMONTH = @PLANMONTH@ AND PLANID = @PLANID@ AND VALUEFLAG = 1 AND PLANTYPE = 1",
+                                new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                new CDAParameter("PLANMONTH", planmonth, DataType.DateTime),
+                                new CDAParameter("PLANID", planid)
+                            );
+
+                            if (proplan != null && proplan.Rows.Count > 0)
+                            {
+                                //编辑
+                                result += conn.ExecuteNonQuery(@"
+                                UPDATE TP_SEMIFINISHED_PRODPLAN SET PLANCOUNT =  PLANCOUNT + @PLANCOUNT@  ,UPDATEUSERID = @UPDATEUSERID@ WHERE PRODPLANID = @PRODPLANID@ AND MATERIALCODE = @MATERIALCODE@",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplan.Rows[0]["PRODPLANID"])),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["GROUTINGPLANCOUNT"]),
+                                    new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+
+
+                                result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,EDITFLAG
+                                            ,PLANTYPE 
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CHANGEREMARKS
+                                            ,CREATEUSERID 
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,2
+                                            ,1 
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CHANGEREMARKS@
+                                            ,@CREATEUSERID@ )
+                                    ",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplan.Rows[0]["PRODPLANID"])),
+                                    new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                                    new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("MATERIALREMARK", meterialRemark),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["GROUTINGPLANCOUNT"]),
+                                    new CDAParameter("CHANGEREMARKS",  "增加或减少数量-生成注浆计划"),
+                                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+
+                            }
+                            else
+                            {
+                                //新建
+                                object proplanid = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PRODPLAN_ID");
+
+                                result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLAN  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,PLANTYPE
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CREATEUSERID
+                                            ,UPDATEUSERID
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,1
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CREATEUSERID@
+                                            ,@UPDATEUSERID@)
+                                    ",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplanid)),
+                                    new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                                    new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("MATERIALREMARK", meterialRemark),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["GROUTINGPLANCOUNT"]),
+                                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                                    new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+
+
+                                result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,EDITFLAG
+                                            ,PLANTYPE 
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CREATEUSERID 
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,1
+                                            ,1 
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CREATEUSERID@ )
+                                    ",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplanid)),
+                                    new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                                    new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("MATERIALREMARK", meterialRemark),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["GROUTINGPLANCOUNT"]),
+                                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+                            }
+                        }
+                    }
+
+                }
+                else
+                {
+                    conn.Rollback();
+                    return new JsonResult(JsonStatus.otherError) { message = "--无勾选数据" }.ToJson();
+                }
+                if (!string.IsNullOrWhiteSpace(materialcodes))
+                {
+                    conn.Commit();
+                    return new JsonResult(JsonStatus.success){ message = "--以下物料未生成注浆计划,未找到对应湿坯半成品【" +materialcodes+"】"}.ToJson();
+                }
+            }
+            catch (Exception ex)
+            {
+                conn.Rollback();
+                throw ex;
+            }
+            conn.Commit();
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 生成交坯计划
+    /// </summary>
+    /// <returns></returns>
+    private string insertdeliver(string jsondata)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            try
+            {   conn.BeginTransaction();
+                //明细 
+                DataTable detailTable = JsonConvert.DeserializeObject<DataTable>(jsondata);
+                int result = 0;
+                string materialcodes = "";
+                int planid = 0;
+                string planmonth = "";
+                if (detailTable != null && detailTable.Rows.Count > 0)
+                {
+                    planid = Convert.ToInt32(detailTable.Rows[0]["PLANID"].ToString());
+                    planmonth = detailTable.Rows[0]["PLANMONTH"].ToString();
+                    //保存调整后的总计划,更新标识为已生成
+                    //保存总计划履历表,编辑类型
+                    DataColumn dataColumn = new DataColumn("MAT20", typeof(string));
+                    detailTable.Columns.Add(dataColumn);
+                    for (int i = 0; i < detailTable.Rows.Count; i++)
+                    {
+                        //根据物料查找物料关系对照表,找到对应湿坯半成品
+                        DataTable dt = conn.ExecuteDatatable(@"SELECT MAT20 FROM TP_SEMIFINISHED_MATERIALLINK  WHERE  MATERIALCODE = @MATERIALCODE@ ",
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"])
+                        );
+
+                        if (dt != null && dt.Rows.Count > 0 && !string.IsNullOrWhiteSpace(dt.Rows[0]["MAT20"].ToString()))
+                        {
+                            //找到对应湿坯半成品 
+                            detailTable.Rows[i]["MAT20"] = dt.Rows[0]["MAT20"].ToString();
+
+                            //编辑
+                            result += conn.ExecuteNonQuery(@"UPDATE TP_SEMIFINISHED_PLANDETAIL  SET   
+                                        PLANCOUNT = @PLANCOUNT@  ,DELIVERQUALITY = @DELIVERQUALITY@, DELIVERPLANCOUNT = @DELIVERPLANCOUNT@, UPDATEUSERID = @UPDATEUSERID@ ,UPDATETIME= SYSDATE,DELIVERFLAG = 1
+                                        WHERE DETAILID = @DETAILID@ AND MATERIALCODE = @MATERIALCODE@
+                            ",
+                            new CDAParameter("PLANCOUNT",  detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("DELIVERQUALITY", detailTable.Rows[i]["DELIVERQUALITY"]),
+                            new CDAParameter("DELIVERPLANCOUNT", detailTable.Rows[i]["DELIVERPLANCOUNT"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailTable.Rows[i]["DETAILID"]))
+                            );
+
+                            result += conn.ExecuteNonQuery(@"
+                            INSERT INTO TP_SEMIFINISHED_PLANHISTORY  
+                                (PLANID ,DETAILID ,EDITFLAG ,MATERIALCODE ,MATERIALREMARK  ,PLANCOUNT  ,DELIVERQUALITY  ,DELIVERPLANCOUNT  ,DELIVERFLAG  ,REMARKS  ,ACCOUNTID ,CREATEUSERID  )
+                            VALUES
+                                (@PLANID@,@DETAILID@,3,@MATERIALCODE@,@MATERIALREMARK@ ,@PLANCOUNT@,@DELIVERQUALITY@,@DELIVERPLANCOUNT@,1,@REMARKS@,@ACCOUNTID@,@CREATEUSERID@ )",
+                            new CDAParameter("PLANID", Convert.ToInt32(detailTable.Rows[i]["PLANID"])),
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailTable.Rows[i]["DETAILID"])),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", detailTable.Rows[i]["MATERIALREMARK"]),
+                            new CDAParameter("PLANCOUNT",detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("DELIVERQUALITY",detailTable.Rows[i]["DELIVERQUALITY"]),
+                            new CDAParameter("DELIVERPLANCOUNT",detailTable.Rows[i]["DELIVERPLANCOUNT"]),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS", "【生成交坯计划】")
+                            );
+                        }
+                        else
+                        {
+                            //未找到对应湿坯半成品,无法生成注浆计划
+                            materialcodes += detailTable.Rows[i]["MATERIALCODE"] + ",";
+                        }
+                    }
+
+                    //过滤掉没有找到湿坯半成品的物料 过滤 null 和空字符串
+                    DataTable syncTable = detailTable.Copy();
+                    syncTable.DefaultView.RowFilter = "MAT20 IS NOT NULL AND MAT20 <> ''";
+                    syncTable = syncTable.DefaultView.ToTable();
+
+                    //根据湿坯半成品进行汇总计划量
+                    DataTable summaryTable = new DataTable();
+                    summaryTable.Columns.Add("MAT20", typeof(string));
+                    summaryTable.Columns.Add("DELIVERPLANCOUNT", typeof(decimal));
+
+                    Dictionary<string, List<DataRow>> groups = new Dictionary<string, List<DataRow>>();
+
+                    foreach (DataRow row in syncTable.Rows)
+                    {
+                        string mat20 = row["MAT20"].ToString();
+                        if (!groups.ContainsKey(mat20))
+                        {
+                            groups[mat20] = new List<DataRow>();
+                        }
+                        groups[mat20].Add(row);
+                    }
+
+                    // 计算汇总
+                    foreach (var group in groups)
+                    {
+                        decimal totalAmount = 0;
+                        foreach (DataRow row in group.Value)
+                        {
+                            if (row["DELIVERPLANCOUNT"] != DBNull.Value)
+                                totalAmount += Convert.ToDecimal(row["DELIVERPLANCOUNT"]);
+                        }
+
+                        DataRow newRow = summaryTable.NewRow();
+                        newRow["MAT20"] = group.Key;
+                        newRow["DELIVERPLANCOUNT"] = totalAmount;
+                        summaryTable.Rows.Add(newRow);
+                    }
+
+                    //插入注浆计划表(新建?编辑?)
+                    //插入注浆计划履历表 
+                    if (summaryTable != null && summaryTable.Rows.Count > 0)
+                    {
+                        for (int i = 0; i < summaryTable.Rows.Count; i++)
+                        {
+
+                            string meterialRemark = getMeterialRemark(summaryTable.Rows[i]["MAT20"].ToString());
+                            //根据物料查找当月是否已经有计划
+                            DataTable proplan = conn.ExecuteDatatable(@"SELECT PRODPLANID FROM TP_SEMIFINISHED_PRODPLAN  WHERE  MATERIALCODE = @MATERIALCODE@ AND PLANMONTH = @PLANMONTH@ AND PLANID = @PLANID@ AND VALUEFLAG = 1 AND PLANTYPE = 2",
+                                new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                new CDAParameter("PLANMONTH", planmonth, DataType.DateTime),
+                                new CDAParameter("PLANID", planid)
+                            );
+
+                            if (proplan != null && proplan.Rows.Count > 0)
+                            {
+                                //编辑
+                                result += conn.ExecuteNonQuery(@"
+                                UPDATE TP_SEMIFINISHED_PRODPLAN SET PLANCOUNT =  PLANCOUNT + @PLANCOUNT@  ,UPDATEUSERID = @UPDATEUSERID@ WHERE PRODPLANID = @PRODPLANID@ AND MATERIALCODE = @MATERIALCODE@",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplan.Rows[0]["PRODPLANID"])),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["DELIVERPLANCOUNT"]),
+                                    new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+
+
+                                result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,EDITFLAG
+                                            ,PLANTYPE 
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CHANGEREMARKS
+                                            ,CREATEUSERID 
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,2
+                                            ,2 
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CHANGEREMARKS@
+                                            ,@CREATEUSERID@ )
+                                    ",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplan.Rows[0]["PRODPLANID"])),
+                                    new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                                    new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("MATERIALREMARK", meterialRemark),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["DELIVERPLANCOUNT"]),
+                                    new CDAParameter("CHANGEREMARKS",  "增加或减少数量-生成交坯计划"),
+                                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+
+                            }
+                            else
+                            {
+                                //新建
+                                object proplanid = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PRODPLAN_ID");
+
+                                result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLAN  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,PLANTYPE
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CREATEUSERID
+                                            ,UPDATEUSERID
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,2
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CREATEUSERID@
+                                            ,@UPDATEUSERID@)
+                                    ",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplanid)),
+                                    new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                                    new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("MATERIALREMARK", meterialRemark),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["DELIVERPLANCOUNT"]),
+                                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                                    new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+
+
+                                result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,EDITFLAG
+                                            ,PLANTYPE 
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CREATEUSERID 
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,1
+                                            ,2
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CREATEUSERID@ )
+                                    ",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplanid)),
+                                    new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                                    new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("MATERIALREMARK", meterialRemark),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["DELIVERPLANCOUNT"]),
+                                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+                            }
+                        }
+                    }
+
+                }
+                else
+                {
+                    conn.Rollback();
+                    return new JsonResult(JsonStatus.otherError) { message = "--无勾选数据" }.ToJson();
+                }
+                if (!string.IsNullOrWhiteSpace(materialcodes))
+                {
+                    conn.Commit();
+                    return new JsonResult(JsonStatus.success){ message = "--以下物料未生成交坯计划,未找到对应湿坯半成品【" +materialcodes+"】"}.ToJson();
+                }
+            }
+            catch (Exception ex)
+            {
+                conn.Rollback();
+                throw ex;
+            }
+            conn.Commit();
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 生成注浆及交坯计划
+    /// </summary>
+    /// <returns></returns>
+    private string insertall(string jsondata)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            try
+            {   conn.BeginTransaction();
+                //明细 
+                DataTable detailTable = JsonConvert.DeserializeObject<DataTable>(jsondata);
+                int result = 0;
+                string materialcodes = "";
+                int planid = 0;
+                string planmonth = "";
+                if (detailTable != null && detailTable.Rows.Count > 0)
+                {
+                    planid = Convert.ToInt32(detailTable.Rows[0]["PLANID"].ToString());
+                    planmonth = detailTable.Rows[0]["PLANMONTH"].ToString();
+                    //保存调整后的总计划,更新标识为已生成
+                    //保存总计划履历表,编辑类型
+                    DataColumn dataColumn = new DataColumn("MAT20", typeof(string));
+                    detailTable.Columns.Add(dataColumn);
+                    for (int i = 0; i < detailTable.Rows.Count; i++)
+                    {
+                        //根据物料查找物料关系对照表,找到对应湿坯半成品
+                        DataTable dt = conn.ExecuteDatatable(@"SELECT MAT20 FROM TP_SEMIFINISHED_MATERIALLINK  WHERE  MATERIALCODE = @MATERIALCODE@ ",
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"])
+                        );
+
+
+
+                        if (dt != null && dt.Rows.Count > 0 && !string.IsNullOrWhiteSpace(dt.Rows[0]["MAT20"].ToString()))
+                        {
+                            //找到对应湿坯半成品 
+                            detailTable.Rows[i]["MAT20"] = dt.Rows[0]["MAT20"].ToString();
+
+                            //编辑
+                            result += conn.ExecuteNonQuery(@"UPDATE TP_SEMIFINISHED_PLANDETAIL  SET   
+                                        PLANCOUNT = @PLANCOUNT@  ,GROUTINGQUALITY = @GROUTINGQUALITY@, GROUTINGPLANCOUNT = @GROUTINGPLANCOUNT@,DELIVERQUALITY = @DELIVERQUALITY@, DELIVERPLANCOUNT = @DELIVERPLANCOUNT@, UPDATEUSERID = @UPDATEUSERID@ ,UPDATETIME= SYSDATE,GROUTINGFLAG = 1,DELIVERFLAG = 1
+                                        WHERE DETAILID = @DETAILID@ AND MATERIALCODE = @MATERIALCODE@
+                            ",
+                            new CDAParameter("PLANCOUNT",  detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("GROUTINGQUALITY", detailTable.Rows[i]["GROUTINGQUALITY"]),
+                            new CDAParameter("GROUTINGPLANCOUNT", detailTable.Rows[i]["GROUTINGPLANCOUNT"]),
+                            new CDAParameter("DELIVERQUALITY", detailTable.Rows[i]["DELIVERQUALITY"]),
+                            new CDAParameter("DELIVERPLANCOUNT", detailTable.Rows[i]["DELIVERPLANCOUNT"]),
+                            new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailTable.Rows[i]["DETAILID"]))
+                            );
+
+                            result += conn.ExecuteNonQuery(@"
+                            INSERT INTO TP_SEMIFINISHED_PLANHISTORY  
+                                (PLANID ,DETAILID ,EDITFLAG ,MATERIALCODE ,MATERIALREMARK  ,PLANCOUNT  ,GROUTINGQUALITY  ,GROUTINGPLANCOUNT  ,DELIVERQUALITY  ,DELIVERPLANCOUNT,GROUTINGFLAG  ,DELIVERFLAG,REMARKS  ,ACCOUNTID ,CREATEUSERID  )
+                            VALUES
+                                (@PLANID@,@DETAILID@,3,@MATERIALCODE@,@MATERIALREMARK@ ,@PLANCOUNT@,@GROUTINGQUALITY@,@GROUTINGPLANCOUNT@,@DELIVERQUALITY@,@DELIVERPLANCOUNT@,1,1,@REMARKS@,@ACCOUNTID@,@CREATEUSERID@ )",
+                            new CDAParameter("PLANID", Convert.ToInt32(detailTable.Rows[i]["PLANID"])),
+                            new CDAParameter("DETAILID", Convert.ToInt32(detailTable.Rows[i]["DETAILID"])),
+                            new CDAParameter("MATERIALCODE", detailTable.Rows[i]["MATERIALCODE"]),
+                            new CDAParameter("MATERIALREMARK", detailTable.Rows[i]["MATERIALREMARK"]),
+                            new CDAParameter("PLANCOUNT",detailTable.Rows[i]["PLANCOUNT"]),
+                            new CDAParameter("GROUTINGQUALITY",detailTable.Rows[i]["GROUTINGQUALITY"]),
+                            new CDAParameter("GROUTINGPLANCOUNT",detailTable.Rows[i]["GROUTINGPLANCOUNT"]),
+                            new CDAParameter("DELIVERQUALITY", detailTable.Rows[i]["DELIVERQUALITY"]),
+                            new CDAParameter("DELIVERPLANCOUNT", detailTable.Rows[i]["DELIVERPLANCOUNT"]),
+                            new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                            new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                            new CDAParameter("REMARKS", "【生成注浆及交坯计划】")
+                            );
+                        }
+                        else
+                        {
+                            //未找到对应湿坯半成品,无法生成注浆计划
+                            materialcodes += detailTable.Rows[i]["MATERIALCODE"] + ",";
+                        }
+                    }
+
+                    //过滤掉没有找到湿坯半成品的物料 过滤 null 和空字符串
+                    DataTable syncTable = detailTable.Copy();
+                    syncTable.DefaultView.RowFilter = "MAT20 IS NOT NULL AND MAT20 <> ''";
+                    syncTable = syncTable.DefaultView.ToTable();
+
+                    //根据湿坯半成品进行汇总计划量
+                    DataTable summaryTable = new DataTable();
+                    summaryTable.Columns.Add("MAT20", typeof(string));
+                    summaryTable.Columns.Add("GROUTINGPLANCOUNT", typeof(decimal));
+                    summaryTable.Columns.Add("DELIVERPLANCOUNT", typeof(decimal));
+
+                    Dictionary<string, List<DataRow>> groups = new Dictionary<string, List<DataRow>>();
+
+                    foreach (DataRow row in syncTable.Rows)
+                    {
+                        string mat20 = row["MAT20"].ToString();
+                        if (!groups.ContainsKey(mat20))
+                        {
+                            groups[mat20] = new List<DataRow>();
+                        }
+                        groups[mat20].Add(row);
+                    }
+
+                    // 计算汇总
+                    foreach (var group in groups)
+                    {
+                        decimal totalAmount = 0;
+                        decimal deliverAmount = 0;
+                        foreach (DataRow row in group.Value)
+                        {
+                            if (row["GROUTINGPLANCOUNT"] != DBNull.Value)
+                                totalAmount += Convert.ToDecimal(row["GROUTINGPLANCOUNT"]);
+                            if (row["DELIVERPLANCOUNT"] != DBNull.Value)
+                                deliverAmount += Convert.ToDecimal(row["DELIVERPLANCOUNT"]);
+                        }
+
+                        DataRow newRow = summaryTable.NewRow();
+                        newRow["MAT20"] = group.Key;
+                        newRow["GROUTINGPLANCOUNT"] = totalAmount;
+                        newRow["DELIVERPLANCOUNT"] = deliverAmount;
+                        summaryTable.Rows.Add(newRow);
+                    }
+
+                    //插入注浆计划表(新建?编辑?)
+                    //插入注浆计划履历表 
+                    if (summaryTable != null && summaryTable.Rows.Count > 0)
+                    {
+                        for (int i = 0; i < summaryTable.Rows.Count; i++)
+                        {
+
+                            string meterialRemark = getMeterialRemark(summaryTable.Rows[i]["MAT20"].ToString());
+                            //根据物料查找当月是否已经有注浆计划
+                            DataTable proplan = conn.ExecuteDatatable(@"SELECT PRODPLANID FROM TP_SEMIFINISHED_PRODPLAN  WHERE  MATERIALCODE = @MATERIALCODE@ AND PLANMONTH = @PLANMONTH@ AND PLANID = @PLANID@ AND VALUEFLAG = 1 AND PLANTYPE = 1 ",
+                                new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                new CDAParameter("PLANMONTH", planmonth, DataType.DateTime),
+                                new CDAParameter("PLANID", planid)
+                            );
+
+                            if (proplan != null && proplan.Rows.Count > 0)
+                            {
+                                //编辑
+                                result += conn.ExecuteNonQuery(@"
+                                UPDATE TP_SEMIFINISHED_PRODPLAN SET PLANCOUNT =  PLANCOUNT + @PLANCOUNT@  ,UPDATEUSERID = @UPDATEUSERID@ WHERE PRODPLANID = @PRODPLANID@ AND MATERIALCODE = @MATERIALCODE@",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplan.Rows[0]["PRODPLANID"])),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["GROUTINGPLANCOUNT"]),
+                                    new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+
+
+                                result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,EDITFLAG
+                                            ,PLANTYPE 
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CHANGEREMARKS
+                                            ,CREATEUSERID 
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,2
+                                            ,1 
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CHANGEREMARKS@
+                                            ,@CREATEUSERID@ )
+                                    ",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplan.Rows[0]["PRODPLANID"])),
+                                    new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                                    new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("MATERIALREMARK", meterialRemark),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["GROUTINGPLANCOUNT"]),
+                                    new CDAParameter("CHANGEREMARKS",  "增加或减少数量-生成注浆计划"),
+                                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+
+                            }
+                            else
+                            {
+                                //新建
+                                object proplanid = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PRODPLAN_ID");
+
+                                result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLAN  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,PLANTYPE
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CREATEUSERID
+                                            ,UPDATEUSERID
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,1
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CREATEUSERID@
+                                            ,@UPDATEUSERID@)
+                                    ",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplanid)),
+                                    new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                                    new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("MATERIALREMARK", meterialRemark),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["GROUTINGPLANCOUNT"]),
+                                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                                    new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+
+
+                                result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,EDITFLAG
+                                            ,PLANTYPE 
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CREATEUSERID 
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,1
+                                            ,1 
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CREATEUSERID@ )
+                                    ",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplanid)),
+                                    new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                                    new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("MATERIALREMARK", meterialRemark),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["GROUTINGPLANCOUNT"]),
+                                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+                            }
+                        }
+                        for (int i = 0; i < summaryTable.Rows.Count; i++)
+                        {
+
+                            string meterialRemark = getMeterialRemark(summaryTable.Rows[i]["MAT20"].ToString());
+                            //根据物料查找当月是否已经有交坯计划
+                            DataTable proplan = conn.ExecuteDatatable(@"SELECT PRODPLANID FROM TP_SEMIFINISHED_PRODPLAN  WHERE  MATERIALCODE = @MATERIALCODE@ AND PLANMONTH = @PLANMONTH@ AND PLANID = @PLANID@ AND VALUEFLAG = 1 AND PLANTYPE = 2",
+                                new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                new CDAParameter("PLANMONTH", planmonth, DataType.DateTime),
+                                new CDAParameter("PLANID", planid)
+                            );
+
+                            if (proplan != null && proplan.Rows.Count > 0)
+                            {
+                                //编辑
+                                result += conn.ExecuteNonQuery(@"
+                                UPDATE TP_SEMIFINISHED_PRODPLAN SET PLANCOUNT =  PLANCOUNT + @PLANCOUNT@  ,UPDATEUSERID = @UPDATEUSERID@ WHERE PRODPLANID = @PRODPLANID@ AND MATERIALCODE = @MATERIALCODE@",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplan.Rows[0]["PRODPLANID"])),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["DELIVERPLANCOUNT"]),
+                                    new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+
+
+                                result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,EDITFLAG
+                                            ,PLANTYPE 
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CHANGEREMARKS
+                                            ,CREATEUSERID 
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,2
+                                            ,2 
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CHANGEREMARKS@
+                                            ,@CREATEUSERID@ )
+                                    ",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplan.Rows[0]["PRODPLANID"])),
+                                    new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                                    new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("MATERIALREMARK", meterialRemark),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["DELIVERPLANCOUNT"]),
+                                    new CDAParameter("CHANGEREMARKS",  "增加或减少数量-生成交坯计划"),
+                                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+
+                            }
+                            else
+                            {
+                                //新建
+                                object proplanid = conn.GetSequenceNextval("SEQ_SEMIFINISHED_PRODPLAN_ID");
+
+                                result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLAN  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,PLANTYPE
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CREATEUSERID
+                                            ,UPDATEUSERID
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,2
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CREATEUSERID@
+                                            ,@UPDATEUSERID@)
+                                    ",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplanid)),
+                                    new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                                    new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("MATERIALREMARK", meterialRemark),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["DELIVERPLANCOUNT"]),
+                                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+                                    new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+
+
+                                result += conn.ExecuteNonQuery(@"
+                                INSERT INTO TP_SEMIFINISHED_PRODPLANHIS  
+                                            (PRODPLANID
+                                            ,PLANID
+                                            ,PLANMONTH
+                                            ,EDITFLAG
+                                            ,PLANTYPE 
+                                            ,MATERIALCODE
+                                            ,MATERIALREMARK
+                                            ,PLANCOUNT  
+                                            ,ACCOUNTID
+                                            ,CREATEUSERID 
+                                            )
+                                        VALUES
+                                            (@PRODPLANID@
+                                            ,@PLANID@
+                                            ,@PLANMONTH@
+                                            ,1
+                                            ,2
+                                            ,@MATERIALCODE@
+                                            ,@MATERIALREMARK@ 
+                                            ,@PLANCOUNT@ 
+                                            ,@ACCOUNTID@
+                                            ,@CREATEUSERID@ )
+                                    ",
+                                    new CDAParameter("PRODPLANID", Convert.ToInt32(proplanid)),
+                                    new CDAParameter("PLANID", Convert.ToInt32(planid)),
+                                    new CDAParameter("PLANMONTH", Convert.ToDateTime(planmonth)),
+                                    new CDAParameter("MATERIALCODE", summaryTable.Rows[i]["MAT20"]),
+                                    new CDAParameter("MATERIALREMARK", meterialRemark),
+                                    new CDAParameter("PLANCOUNT",  summaryTable.Rows[i]["DELIVERPLANCOUNT"]),
+                                    new CDAParameter("ACCOUNTID", Convert.ToInt32(HttpContext.Current.Session["accountId"])),
+                                    new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"])
+                                );
+                            }
+                        }
+                    }
+
+                }
+                else
+                {
+                    conn.Rollback();
+                    return new JsonResult(JsonStatus.otherError) { message = "--无勾选数据" }.ToJson();
+                }
+                if (!string.IsNullOrWhiteSpace(materialcodes))
+                {
+                    conn.Commit();
+                    return new JsonResult(JsonStatus.success){ message = "--以下物料未生成注浆及交坯计划,未找到对应湿坯半成品【" +materialcodes+"】"}.ToJson();
+                }
+            }
+            catch (Exception ex)
+            {
+                conn.Rollback();
+                throw ex;
+            }
+            conn.Commit();
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 搜索明细履历
+    /// </summary>
+    /// <returns></returns>
+    private string searchHistory(NameValueCollection form)
+    {
+        using (IDataAccess conn = DataAccess.Create())
+        {
+            //物料编码
+            string materialCode = form["MATERIALCODE"];
+
+            string sqlStr = @"SELECT SP.PLANID,
+                                SP.DETAILID,  
+                                SP.HISTORYID SID,  
+                                CASE WHEN SP.EDITFLAG = 1 THEN '新建(导入)' WHEN SP.EDITFLAG = 2 THEN '新建(手动)' WHEN SP.EDITFLAG = 3 THEN '编辑' END AS EDITFLAG, 
+                                SP.MATERIALCODE,
+                                SP.MATERIALREMARK,
+                                SP.PLANCOUNT,
+                                SP.GROUTINGQUALITY,
+                                SP.GROUTINGPLANCOUNT,
+                                CASE WHEN SP.GROUTINGFLAG = 1 THEN '已生成' WHEN SP.GROUTINGFLAG = 0 THEN '未生成' END AS GROUTINGFLAG, 
+                                SP.DELIVERQUALITY, 
+                                SP.DELIVERPLANCOUNT,
+                                CASE WHEN SP.DELIVERFLAG = 1 THEN '已生成' WHEN SP.DELIVERFLAG = 0 THEN '未生成' END AS DELIVERFLAG, 
+                                SP.CREATETIME,
+                                U.USERNAME AS CREATEUSERCODE, 
+                                SP.REMARKS
+                              FROM TP_SEMIFINISHED_PLANHISTORY SP 
+                                LEFT JOIN TP_MST_USER U ON U.USERID = SP.CREATEUSERID 
+                             WHERE  SP.ACCOUNTID = @accountid@";
+
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+            sqlPara.Add(new CDAParameter("accountid", HttpContext.Current.Session["accountId"]));
+            //主表计划ID
+            if (!string.IsNullOrEmpty(detailplanID))
+            {
+                sqlStr += " AND SP.PLANID = " + detailplanID ;
+
+            }
+            if (!string.IsNullOrEmpty(materialCode))
+            {
+                sqlStr += " and SP.MATERIALCODE like '%" + materialCode + "%' ";
+            }
+            sqlStr += " ORDER BY SP.CREATETIME ";
+            try
+            {
+                int total = 0;
+                DataTable data = conn.ExecuteDatatable( sqlStr, sqlPara.ToArray());
+                return new JsonResult(data) { total = total}.ToJson();
+            }
+            catch (Exception ex)
+            {
+                throw ex ;
+            }
+        }
+    }
+
+    public bool IsReusable
+    {
+        get
+        {
+            return false;
+        }
+    }
+
+}

+ 142 - 0
wwwroot/mes/semifinished/plan/plan_add.html

@@ -0,0 +1,142 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+</head>
+<body class="easyui-layout">
+    <div data-options="region:'center',plain:true,border:false">
+        <form id="MateriaPlanautoForm" method="post" class="w-form" enctype="multipart/form-data">
+            <div class="w-div">
+                <div class="w-fieldbar" onclick="$('#MateriaPlanautoMore1').toggle()" style="cursor:pointer;"></div>
+            </div>
+            <div id="MateriaPlanautoMore1" style="display:block;">
+                <div class="w-div">
+                    <div class="w-fieldname">SID:</div>
+                    <div class="w-field"><input disabled class="easyui-textbox" id="SID" name="SID" data-options="required:false,prompt:'请填写SID...',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+            </div>
+            <div class="w-div">
+                <div class="w-fieldbar" onclick="$('#MateriaPlanautoMore2').toggle()" style="cursor:pointer;"></div>
+            </div>
+            <div id="MateriaPlanautoMore2" style="display:block;">
+                <div class="w-div">
+                    <div class="w-fieldname">计划月份:</div>
+                    <div class="w-field">
+                        <input class="easyui-datebox" id="PLANMONTH" name="PLANMONTH" data-options="required:true,prompt:'请填写...',tipPosition:'top'" style="width:100%;height:32px;">
+                    </div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">计划名称:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="PLANNAME" name="PLANNAME" data-options="required:true,prompt:'请填写...',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">备注:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="REMARKS" name="REMARKS" data-options="required:false,prompt:'请填写...',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+            </div>
+            <div class="w-div">
+                <div class="w-fieldbar" onclick="$('#MateriaPlanautoMore3').toggle()" style="cursor:pointer;"></div>
+            </div>
+            <div id="MateriaPlanautoMore3" style="display:block;">
+                <div class="w-div">
+                    <div class="w-fieldname">计划明细Excel数据文件:</div>
+                    <div class="w-field"><input class="easyui-filebox w-input" id="文件" name="文件" data-options="required:false,prompt:'请选择Excel文件...',tipPosition:'bottom',buttonText:'选择文件',buttonAlign:'right',accept:'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">说明:</div>
+                    <div class="w-field"><div class="w-fieldvalue">导入数据,请准确核对! <a href="生产计划导入模板.xlsx" target="_blank">下载模板</a> </div></div>
+                </div>
+
+            </div>
+        </form>
+    </div>
+    <div data-options="region:'south',border:false" class="w-bar">
+        <a href="javascript:void(0)" id="MateriaPlanautoButtonSave" class="easyui-linkbutton" data-options="iconCls:'icon-save'" onclick="MateriaPlanautoButtonSubmit_Click()">保存</a>
+        <a href="javascript:void(0)" id="MateriaPlanautoButtonClose" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" onclick="MateriaPlanautoButtonCancel_Click()">关闭</a>
+    </div>
+    <script type="text/javascript">
+
+        $(document).ready(function () {
+
+            setDateToMonth("PLANMONTH");
+            $('#PLANMONTH').datebox('setValue', request('startDate'));
+             
+        });
+
+        function setDateToMonth(id) {
+
+            $("#" + id).datebox({
+                onShowPanel: function () {//显示日趋选择对象后再触发弹出月份层的事件,初始化时没有生成月份层
+                    span.trigger('click'); //触发click事件弹出月份层
+                    //fix 1.3.x不选择日期点击其他地方隐藏在弹出日期框显示日期面板
+                    if (p.find('div.calendar-menu').is(':hidden')) p.find('div.calendar-menu').show();
+                    if (!tds) setTimeout(function () {//延时触发获取月份对象,因为上面的事件触发和对象生成有时间间隔
+                        tds = p.find('div.calendar-menu-month-inner td');
+                        tds.click(function (e) {
+                            e.stopPropagation(); //禁止冒泡执行easyui给月份绑定的事件
+                            var year = /\d{4}/.exec(span.html())[0];//得到年份
+                            var month = parseInt($(this).attr('abbr'), 10); //月份,这里不需要+1
+                            month = month < 10 ? '0' + month : month;
+                            $("#" + id).datebox('hidePanel')//隐藏日期对象
+                                .datebox('setValue', year + '-' + month); //设置日期的值
+                        });
+                    }, 0);
+                    yearIpt.unbind();//解绑年份输入框中任何事件
+                },
+                parser: function (s) {
+                    if (!s) return new Date();
+                    var arr = s.split('-');
+                    return new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, 1);
+                },
+                formatter: function (d) {
+                    return d.getFullYear() + '-' + (d.getMonth() + 1);/*getMonth返回的是0开始的,忘记了。。已修正*/
+                }
+            });
+            var p = $("#" + id).datebox('panel'), //日期选择对象
+                tds = false, //日期选择对象中月份
+                aToday = p.find('a.datebox-current'),
+                yearIpt = p.find('input.calendar-menu-year'),//年份输入框
+                //显示月份层的触发控件
+                span = aToday.length ? p.find('div.calendar-title span') ://1.3.x版本
+                    p.find('span.calendar-text'); //1.4.x版本
+            if (aToday.length) {//1.3.x版本,取消Today按钮的click事件,重新绑定新事件设置日期框为今天,防止弹出日期选择面板
+                aToday.unbind('click').click(function () {
+                    var now = new Date();
+                    now = now < 10 ? '0' + now : now;
+                    $("#" + id).datebox('hidePanel').datebox('setValue', now.getFullYear() + '-' + (now.toString() + 1));
+                });
+            }
+        };
+
+        $(function () { 
+            $('#MateriaPlanautoMore1').toggle();
+        });
+
+        //保存
+        function MateriaPlanautoButtonSubmit_Click() {
+            $.dialog.save({
+                formid: 'MateriaPlanautoForm',
+                datagridid: 'mouldcodewarningDatagrid2',
+                url: 'plan.ashx?m=i'
+            });
+        }
+
+        function MateriaPlanautoButtonCancel_Click() {
+            $.dialog.close();
+        }      
+    </script>
+</body>
+</html>

+ 177 - 0
wwwroot/mes/semifinished/plan/plan_adddetail.html

@@ -0,0 +1,177 @@
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body class="easyui-layout" style="width:100%;height:100%">
+
+    <div data-options="border:false,region:'north',split:true,title:'',iconCls:'icon-grid'" title="West" style="width: 100%; height: 13% ">
+        <!--工具条-->
+        <div data-options="region:'center',plain:true,border:false">
+            <form id="planForm" method="post" class="w-form" style="padding-bottom:0px;"> 
+                <div id="planMore2" style="display:block;">  
+                    <div class="w-div" style="padding-top:15px;">
+                        <div class="w-fieldname">计划名称:</div>
+                        <div class="w-field"><input class="easyui-textbox" id="PLANNAME" name="PLANNAME" data-options="required:true,prompt:'请填写计划名称',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+
+    <div data-options="region:'south',split:true,plain:true ,iconCls:'icon-grid',border:false" style="height:87%">
+        <!--工具条-->
+        <div id="planToolbar" class="i-toolbar"> 
+            <a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-add',plain:true" onclick="append()">添加行</a>
+            <a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-remove',plain:true" onclick="removeit()">移除行</a>
+            <span>|</span>
+            <a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-search',plain:true" onclick="getChanges()">保存</a> 
+        </div>
+        <!--表格-->
+        <table id="planDatagrid" data-options="toolbar: '#planToolbar',showFooter:false,
+               singleSelect: true, onClickCell: onClickCell">
+            <thead>
+                <tr>
+                    <th data-options="field:'SID',title:'SID',width:220,align:'left',checkbox:true,hidden:true">SID</th>  
+                    <th data-options="field:'MATERIALCODE',width:300,title:'物料编码',align:'left',sortable:true,editor:{type:'textbox'}"></th>
+                    <th data-options="field:'PLANCOUNT',width:300,title:'计划数量',align:'left',sortable:true,editor:{type:'numberbox'}"></th> 
+                    <th data-options="field:'REMARKS',width:400,title:'备注',align:'left',sortable:true,editor:{type:'textbox'}"></th> 
+
+                </tr>
+            </thead>
+        </table>
+    </div>
+     
+    <script type="text/javascript">
+        //var itemsid = $('#ITEMSID').val();
+        function GetQueryValue1(queryName) {
+            var reg = new RegExp("(^|&)" + queryName + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg);
+            if (r != null) {
+                return decodeURI(r[2]);
+            } else {
+                return null;
+            }
+        }
+
+        var url = window.location.search;
+        var itemsID = GetQueryValue1('id');
+
+
+        //加载完成
+        $(function () {
+            $('#planForm').formLoad({
+                url: 'plan.ashx?m=t'
+            }); 
+            //加载按钮
+            $('#planToolbar').buttonLoad({
+                url: 'plan.ashx?m=b'
+            });
+            //加载表格数据 
+            planButtonSearchSubmit_Click();
+        });
+          
+        //搜索提交
+        function planButtonSearchSubmit_Click() {
+            $('#planDatagrid').datagridLoad({
+                title: '计划明细',
+                idField: 'SID',
+                queryParams: $('#planForm').serializeJson(),
+                url: 'plan.ashx?m=dd',
+                columnMoving: false
+            });
+
+        } 
+    </script>
+
+    <script type="text/javascript">
+        var editIndex = undefined;
+        function endEditing() {
+            if (editIndex == undefined) { return true }
+            if ($('#planDatagrid').datagrid('validateRow', editIndex)) {
+                $('#planDatagrid').datagrid('endEdit', editIndex);
+                editIndex = undefined;
+                return true;
+            } else {
+                return false;
+            }
+        }
+        function onClickCell(index, field) {
+            if (editIndex != index) {
+                if (endEditing()) {
+                    $('#planDatagrid').datagrid('selectRow', index)
+                        .datagrid('beginEdit', index);
+                    var ed = $('#planDatagrid').datagrid('getEditor', { index: index, field: field });
+                    if (ed) {
+                        ($(ed.target).data('textbox') ? $(ed.target).textbox('textbox') : $(ed.target)).focus();
+                    }
+                    editIndex = index;
+                } else {
+                    setTimeout(function () {
+                        $('#planDatagrid').datagrid('selectRow', editIndex);
+                    }, 0);
+                }
+            }
+        }
+        
+        function append() {
+            if (endEditing()) {
+                $('#planDatagrid').datagrid('appendRow', {
+                     'SID': 0
+                });
+                editIndex = $('#planDatagrid').datagrid('getRows').length - 1;
+                $('#planDatagrid').datagrid('selectRow', editIndex)
+                    .datagrid('beginEdit', editIndex);
+            }
+        }
+        function removeit() {
+            if (editIndex == undefined) { return }
+            $('#planDatagrid').datagrid('cancelEdit', editIndex)
+                .datagrid('deleteRow', editIndex);
+            editIndex = undefined;
+        }  
+        function getChanges() {
+             
+            var rows = $('#planDatagrid').datagrid('getRows');
+
+            rows.forEach(function (row1, index1) {
+                $('#planDatagrid').datagrid('endEdit', index1);
+            });
+            var data = $('#planDatagrid').datagrid('getData');
+            console.log('data', data["rows"])
+            //alert(JSON.stringify(data));
+            //提交更改到后端处理
+            $.post('plan.ashx?m=adddetail', {
+                data: JSON.stringify(data["rows"]),
+                'PLANID': request('id')
+            }, function (data) {
+                var json = JSON.parse(data);
+                if (json['success'] == true) {
+                    $.messager.alert("保存", "保存成功");
+                }
+                else {
+                    $.messager.alert("保存", "保存失败");
+                }
+            });
+
+
+        }
+    </script>
+
+
+</body>
+</html>

+ 75 - 0
wwwroot/mes/semifinished/plan/plan_edit.html

@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+</head>
+<body class="easyui-layout">
+    <div data-options="region:'center',plain:true,border:false" >
+        <form id="MateriaPlanautoForm" method="post" class="w-form">
+            <div class="w-div">
+                <div class="w-fieldbar" onclick="$('#MateriaPlanautoMore1').toggle()" style="cursor:pointer;"></div>
+            </div>
+            <div id="MateriaPlanautoMore1" style="display:block;">
+                <div class="w-div">
+                    <div class="w-fieldname">SID:</div>
+                    <div class="w-field"><input disabled class="easyui-textbox" id="SID" name="SID" data-options="required:false,prompt:'请填写SID...',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+            </div>
+            <div class="w-div">
+                <div class="w-fieldbar" onclick="$('#MateriaPlanautoMore2').toggle()" style="cursor:pointer;"></div>
+            </div>
+            <div id="MateriaPlanautoMore2" style="display:block;">
+                  
+                <div class="w-div">
+                    <div class="w-fieldname">计划名称</div>
+                    <div class="w-field"><input class="easyui-textbox" id="PLANNAME" name="PLANNAME" data-options="required:false,prompt:'请填写计划名称...',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">备注:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="REMARKS" name="REMARKS" data-options="required:false,prompt:'请填写备注...',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <div data-options="region:'south',border:false" class="w-bar">
+        <a href="javascript:void(0)" id="MateriaPlanautoButtonSave" class="easyui-linkbutton" data-options="iconCls:'icon-save'" onclick="MateriaPlanautoButtonSubmit_Click()">保存</a>
+        <a href="javascript:void(0)" id="MateriaPlanautoButtonClose" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" onclick="MateriaPlanautoButtonCancel_Click()">关闭</a>
+    </div>
+    <script type="text/javascript">
+        var first = 0; //页面第一次加载标识
+        $(function () {
+            $('#MateriaPlanautoForm').formLoad({
+                url: 'plan.ashx?m=t'
+            });
+            $('#MateriaPlanautoMore1').toggle();
+        });
+
+        //保存
+        function MateriaPlanautoButtonSubmit_Click() {
+            $.dialog.save({
+                formid: 'MateriaPlanautoForm',
+                datagridid: 'mouldcodewarningDatagrid2',
+                url: 'plan.ashx?m=u&id=' + request('id')
+            });
+        }
+
+        function MateriaPlanautoButtonCancel_Click() {
+            $.dialog.close();
+        }
+
+    </script>
+</body>
+</html>

+ 107 - 0
wwwroot/mes/semifinished/plan/plan_history.html

@@ -0,0 +1,107 @@
+
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body class="easyui-layout" style="width:100%;height:100%">
+
+    <div data-options="border:false,region:'north',split:true,title:'',iconCls:'icon-grid'" title="West" style="width: 100%; height: 15% ">
+        <!--工具条-->
+        <div data-options="region:'center',plain:true,border:false">
+            <form id="planForm" method="post" class="w-form" style="padding-bottom:0px;"> 
+                <div class="w-div" style="padding-top:15px;"> 
+                    <div style="padding-top: 10px; padding-bottom: 10px;">
+                        计划名称:
+                        <input class="easyui-textbox" id="PLANNAME" name="PLANNAME" data-options="required:true,disabled:true,tipPosition:'top'"">
+                        物料编码:
+                        <input class="easyui-textbox" id="MATERIALCODE" name="MATERIALCODE" data-options="required:false,prompt:'',tipPosition:'top'" >
+                        <a href="javascript:void(0)" id="glineplanmoldButtonSearchSubmit" title="搜索" class="easyui-linkbutton" plain="false" onclick="glineplanmoldButtonSearchSubmit_Click()">搜索</a>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+
+    <div data-options="region:'south',split:true,plain:true ,iconCls:'icon-grid',border:false" style="height:85%">
+        <!--表格-->
+        <table id="planDatagrid" data-options="toolbar: '#planToolbar',showFooter:false">
+            <thead>
+                <tr>
+                    <th data-options="field:'SID',title:'SID',align:'left',checkbox:true,hidden:true">SID</th>
+                    <th data-options="field:'MATERIALCODE',title:'物料编码',align:'left',sortable:true"></th>
+                    <th data-options="field:'EDITFLAG',title:'类型',align:'left',sortable:true"></th>
+                    <th data-options="field:'PLANCOUNT',title:'计划数量',align:'center'"></th>
+                    <th data-options="field:'GROUTINGQUALITY',title:'注浆质量点',align:'center',sortable:false"></th>
+                    <th data-options="field:'GROUTINGPLANCOUNT',title:'注浆计划数量',align:'center'"></th>
+                    <th data-options="field:'GROUTINGFLAG',title:'注浆计划是否生成',align:'center',sortable:false"></th>
+                    <th data-options="field:'DELIVERQUALITY',title:'交坯质量点',align:'center',sortable:false"></th>
+                    <th data-options="field:'DELIVERPLANCOUNT',title:'交坯计划数量',align:'center'"></th>
+                    <th data-options="field:'DELIVERFLAG',title:'交坯计划是否生成',align:'center',sortable:false"></th>
+                    <th data-options="field:'CREATETIME',title:'创建时间',align:'center',sortable:false,"></th>
+                    <th data-options="field:'CREATEUSERCODE',title:'创建者',align:'center',sortable:false,"></th> 
+                    <th data-options="field:'REMARKS',title:'备注',align:'center',sortable:false,"></th>
+
+                </tr>
+            </thead>
+        </table>
+    </div>
+     
+    <script type="text/javascript">
+        //var itemsid = $('#ITEMSID').val();
+        function GetQueryValue1(queryName) {
+            var reg = new RegExp("(^|&)" + queryName + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg);
+            if (r != null) {
+                return decodeURI(r[2]);
+            } else {
+                return null;
+            }
+        }
+
+        var url = window.location.search;
+        var itemsID = GetQueryValue1('id');
+
+
+        //加载完成
+        $(function () {
+            $('#planForm').formLoad({
+                url: 'plan.ashx?m=t'
+            }); 
+            //加载按钮
+            $('#planToolbar').buttonLoad({
+                url: 'plan.ashx?m=b'
+            });
+            //加载表格数据 
+            glineplanmoldButtonSearchSubmit_Click();
+        });
+          
+        //搜索提交
+        function glineplanmoldButtonSearchSubmit_Click() {
+            $('#planDatagrid').datagridLoad({
+                title: '计划明细履历',
+                idField: 'SID',
+                queryParams: $('#planForm').serializeJson(),
+                url: 'plan.ashx?m=h&PLANID=' + itemsID,
+                pagination: false,
+                columnMoving: false
+            });
+
+        } 
+    </script>
+
+</body>
+</html>

+ 56 - 0
wwwroot/mes/semifinished/plan/plan_import.html

@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <script src="/plugins/xeasyui/xeasyui.min.js"></script>
+</head>
+<body class="easyui-layout">
+
+    <div data-options="region:'center',plain:true,border:false">
+        <form id="ff" method="post" class="w-form" enctype="multipart/form-data">
+            <div class="w-div">
+                <div class="w-fieldbar" onclick="$('#more1').toggle()" style="cursor:pointer;"></div>
+            </div>
+            <div id="more1" style="display:block;">
+                
+                <div class="w-div">
+                    <div class="w-fieldname">Excel数据文件:</div>
+                    <div class="w-field"><input class="easyui-filebox w-input" id="文件" name="文件" data-options="required:true,prompt:'请选择Excel文件...',tipPosition:'bottom',buttonText:'选择文件',buttonAlign:'right',accept:'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">说明:</div>
+                    <div class="w-field"><div class="w-fieldvalue">导入数据,请准确核对! <a href="生产计划导入模板.xlsx" target="_blank">下载模板</a> </div></div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <div data-options="region:'south',border:false" class="w-bar">
+        <a href="javascript:void(0)" id="toolbarSave" class="easyui-linkbutton" data-options="iconCls:'icon-save'" onclick="submitForm()">数据导入</a>
+        <a href="javascript:void(0)" id="toolbarClose" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" onclick="cancelForm()">取消</a>
+    </div>
+
+    <script type="text/javascript">
+        $(document).ready(function () {
+            //var ctime = new Date();
+            //$("#ACCOUNTDATE").datebox("setValue", ctime.getFullYear() + "-" + (ctime.getMonth() + 1) + "-" + (ctime.getDate() + 1));
+        });
+
+        function submitForm() {
+            $.dialog.save({
+                formid: 'ff',
+                datagridid: 'mouldcodewarningDatagrid2',
+                url: 'plan.ashx?m=dr&id=' + request('id') 
+            });
+        }
+
+        function cancelForm() {
+            $.dialog.close();
+        }
+    </script>
+
+</body>
+</html>

+ 549 - 0
wwwroot/mes/semifinished/plan/plan_index.html

@@ -0,0 +1,549 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body class="easyui-layout">
+    <div data-options="border:false,region:'north',title:'',iconCls:'icon-grid'">
+        <!--工具条-->
+        <div id="glineplanmoldToolbar" class="i-toolbar">
+
+            <a href="javascript:void(0)" id="glineplanmoldButtonInsert" title="添加" class="easyui-linkbutton" iconcls="icon-add" plain="true" onclick="glineplanmoldButtonInsert_Click()">添加</a>
+            <a href="javascript:void(0)" id="glineplanmoldButtonUpdate" title="编辑" class="easyui-linkbutton" iconcls="icon-edit" plain="true" onclick="glineplanmoldButtonUpdate_Click()">编辑</a>
+            <a href="javascript:void(0)" id="glineplanmoldButtonDelete" title="删除" class="easyui-linkbutton" iconcls="icon-remove" plain="true" onclick="planButtonDelete_Click()">删除</a>
+            <a href="javascript:void(0)" id="glineplanmoldButtonReload" title="刷新" class="easyui-linkbutton" iconcls="icon-reload" plain="true" onclick="glineplanmoldButtonReload_Click()">刷新</a>
+            <a href="javascript:void(0)" id="glineplanmoldButtonSearch" title="搜索" class="easyui-linkbutton" iconcls="icon-search" plain="true" toggle="true" onclick="glineplanmoldButtonSearch_Click()">搜索</a>
+            <a href="javascript:void(0)" id="fqcitemsButtonHelp" title="帮助" class="easyui-linkbutton" iconcls="icon-help" plain="true" onclick="glineplanmoldButtonHelp_Click()">帮助</a>
+
+        </div>
+    </div>
+    <!--表格左面-->
+    <div data-options="region:'west',title:'',split:true" style="width:20%; height: 100%">
+
+        <div id="tableTabs" class="easyui-tabs" data-options="border:false,region:'east',split:true" style="width:100%; height: 100%"> 
+            <div title="生产计划">
+                <div id="glineplanmoldSearchDiv" style="display:block; padding-left: 10px;" data-options="border:false,region:'north',title:'',iconCls:'icon-grid'">
+                    <form id="glineplanmoldForm">
+                        <div style="padding-top:10px;">
+                            计划月份:
+                            <input class="easyui-datebox" id="PLANMONTH" name="PLANMONTH" data-options="required:true,editable:false ,prompt:'',tipPosition:'top'" style="width:165px; height:32px;">
+                        </div>
+                        <div style="padding-top: 10px; padding-bottom: 10px;">
+                            计划名称:
+                            <input class="easyui-textbox" id="PLANNAME" name="PLANNAME" data-options="required:false,prompt:'',tipPosition:'top'" style="width: 120px; height: 32px;">
+
+                            <a href="javascript:void(0)" id="glineplanmoldButtonSearchSubmit" title="搜索" class="easyui-linkbutton" plain="false" onclick="glineplanmoldButtonSearchSubmit_Click()">搜索</a>
+
+                        </div>
+                    </form>
+                </div>
+                
+                <table class="easyui-datagrid" id="mouldcodewarningDatagrid2" data-options="method:'get',singleSelect:true,border:false,fit:true,fitColumns:true,checkOnSelect:false,selectOnCheck:false" style="width:100%; height: 100%">
+                    <thead>
+                        <tr>
+                            <th data-options="field:'SID',title:'SID',width:220,align:'left',checkbox:true,hidden:true">SID</th>
+                            <th data-options="field:'PLANCODE',title:'计划单号',align:'center',sortable:false,"></th>
+                            <th data-options="field:'PLANNAME',title:'计划名称',align:'center',sortable:false"></th>
+                            <th data-options="field:'PLANMONTH',title:'计划月份',align:'center',sortable:false"></th>
+                            <th data-options="field:'REMARKS',title:'备注',align:'center',sortable:false"></th>
+                        </tr>
+                    </thead>
+                </table>
+                
+             </div>
+        </div>
+    </div>
+    <!--表格右面-->
+    <div data-options="region:'center',title:''" style="width:80%; height: 100%">
+        <div id="tableTabs1" class="easyui-tabs" data-options="border:false,region:'center'" style="width:100%; height: 100%">
+            <div title="计划明细">
+                <div style="height: 13%; display: block; padding-left: 10px;" data-options="border:false,region:'north',title:'',iconCls:'icon-grid'">
+                    <form id="glineplanmoldForm2">
+                        <div style="padding-bottom:9px; height:32px;width:100%;">
+                            <a href="javascript:void(0)" id="glineplanmoldButtonReload" title="刷新" class="easyui-linkbutton" iconcls="icon-reload" plain="true" onclick="glineplanmoldButtonReload2_Click()">刷新</a>
+                            <span>|</span>
+                            <a href="javascript:void(0)" id="glineplanmoldButtonUpdate" title="编辑" class="easyui-linkbutton" iconcls="icon-edit" plain="true" onclick="update_Click()">添加物料明细</a>
+                            <a href="javascript:void(0)" id="glineplanmoldButtonDelete" title="删除" class="easyui-linkbutton" iconcls="icon-remove" plain="true" onclick="glineplanmoldButtonDelete_Click()">删除</a>
+                            <a href="javascript:void(0)" id="dailyplanButtonImport" title="导入" class="easyui-linkbutton" iconcls="icon-excel" plain="true" onclick="glineplanmoldButtonImport_Click()">导入</a>
+                            <a href="javascript:void(0)" id="glineplanmoldButtonExport" title="导出" class="easyui-linkbutton" iconcls="icon-excel" plain="true" onclick="glineplanmoldButtonExport_Click()">导出</a>
+                            <a href="javascript:void(0)" id="planHistorySearchSubmit" title="履历" class="easyui-linkbutton" iconcls="icon-search" plain="true" onclick="planHistorySearchSubmit_Click()">查看履历</a>
+                            <span>|</span>
+                            <a href="javascript:void(0)" id="mb" class="easyui-menubutton" data-options="menu:'#mm',iconCls:'icon-edit'">生成计划</a>
+                            <div id="mm" style="width:250px;">
+                                <div data-options="iconCls:'icon-redo'" onclick="insertGrout_Click()">保存并生成注浆计划</div>
+                                <div data-options="iconCls:'icon-redo'" onclick="insertDeliver_Click()">保存并生成交坯计划</div>
+                                <div class="menu-sep"></div>
+                                <div data-options="iconCls:'icon-redo'" onclick="insertAll_Click()">同时生成注浆及交坯计划</div>
+                            </div>
+
+                        </div>
+                        <div id="glineplanmoldSearchDiv2" style="padding-top:10px;">
+                            物料编码:
+                            <input class="easyui-textbox" id="MATERIALCODE" name="MATERIALCODE" data-options="required:false,prompt:'',tipPosition:'top'" style="width: 120px; height: 32px;">
+
+                            <a href="javascript:void(0)" id="glineplanmoldButtonSearchSubmit" title="搜索" class="easyui-linkbutton" plain="false" onclick="glineplanmoldButtonSearchSubmit2_Click()">搜索</a>
+
+                        </div>
+                    </form>
+                </div>
+                <div style="height: 87%; overflow: auto;">
+                    <table id="glineplanmoldDatagrid" data-options="toolbar: '#mouldcodewarningToolbar',method:'get',border:false,singleSelect:false,checkOnSelect:false,fit:false,fitColumns:false">
+                        <thead>
+                            <tr>
+                                <th data-options="field:'SID',title:'SID',width:220,align:'left',checkbox:true"></th>
+                                <th data-options="field:'MATERIALCODE',title:'物料编码',align:'center',sortable:false"></th>
+                                <th data-options="field:'MATERIALREMARK',title:'物料描述',align:'center',sortable:false"></th>
+                                <th data-options="field:'PLANCOUNT',title:'计划数量',align:'center',editor:'numberbox'"></th>
+                                <th data-options="field:'GROUTINGQUALITY',title:'注浆质量点',align:'center',sortable:false,editor:{type:'numberbox',options:{precision:2}}"></th>
+                                <th data-options="field:'GROUTINGPLANCOUNT',title:'注浆计划数量',align:'center',editor:'numberbox'"></th>
+                                <th data-options="field:'GROUTINGFLAG',title:'注浆计划是否生成',align:'center',sortable:false,styler:deliverFlagStyler"></th>
+                                <th data-options="field:'DELIVERQUALITY',title:'交坯质量点',align:'center',sortable:false,editor:{type:'numberbox',options:{precision:2}}"></th>
+                                <th data-options="field:'DELIVERPLANCOUNT',title:'交坯计划数量',align:'center',editor:'numberbox'"></th>
+                                <th data-options="field:'DELIVERFLAG',title:'交坯计划是否生成',align:'center',sortable:false,styler:deliverFlagStyler"></th>
+                                <th data-options="field:'CREATETIME',title:'创建时间',align:'center',sortable:false,"></th>
+                                <th data-options="field:'CREATEUSERCODE',title:'创建者',align:'center',sortable:false,"></th>
+                                <th data-options="field:'UPDATETIME',title:'更新时间',align:'center',sortable:false,"></th>
+                                <th data-options="field:'UPDATEUSERCODE',title:'更新者',align:'center',sortable:false,"></th>
+                                <th data-options="field:'REMARKS',title:'备注',align:'center',sortable:false,"></th>
+                            </tr>
+                        </thead>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+
+
+    <script type="text/javascript">
+        var id = null;
+        
+        $(document).ready(function () {
+
+            setDateToMonth("PLANMONTH");
+            $('#PLANMONTH').datebox('setValue', request('startDate'));
+
+            $('#glineplanmoldDatagrid').datagrid({
+                toolbar: '#mouldcodewarningToolbar',
+                method: 'get',
+                border: false,
+                singleSelect: false,
+                checkOnSelect: false,
+                fit: true,
+                fitColumns: true,
+                // 添加编辑相关配置
+                edit: true,  // 启用编辑功能
+                editMode: 'cell', // 单元格编辑模式
+                onDblClickCell: function (index, field, value) {
+                    // 双击单元格开始编辑
+                    $(this).datagrid('beginEdit', index);
+                },
+                // 点击其他地方自动结束编辑
+                onClickCell: function (index, field, value) {
+                    var editing = $(this).datagrid('getEditors', index);
+                    if (editing.length > 0) {
+                        $(this).datagrid('endEdit', index);
+                    }
+                },
+                // 编辑结束后的事件
+                onAfterEdit: function (index, row, changes) {
+                    console.log('第 ' + index + ' 行编辑完成');
+                    console.log('修改的字段:', changes);
+                    //row["GROUTINGPLANCOUNT"] = row["PLANCOUNT"] * row["GROUTINGQUALITY"];
+                    //row["DELIVERPLANCOUNT"] = row["PLANCOUNT"] * row["DELIVERQUALITY"];
+                    // 自动保存到后台
+                    // saveChanges(row);
+                }
+            });
+             
+        });
+
+        //加载完成
+        $(function () {
+            //加载按钮
+            $('#glineplanmoldToolbar').buttonLoad({
+                url: 'plan.ashx?m=b'
+            });  
+        });
+
+        // 定义样式函数
+        function deliverFlagStyler(value, row, index) {
+            if (value === '未生成' ) {
+                return 'background-color: #FFFF00; color: #000000;'; // 黄色背景,黑色文字
+            }
+            return '';
+        }
+
+        function setDateToMonth(id) {
+
+            $("#" + id).datebox({
+                onShowPanel: function () {//显示日趋选择对象后再触发弹出月份层的事件,初始化时没有生成月份层
+                    span.trigger('click'); //触发click事件弹出月份层
+                    //fix 1.3.x不选择日期点击其他地方隐藏在弹出日期框显示日期面板
+                    if (p.find('div.calendar-menu').is(':hidden')) p.find('div.calendar-menu').show();
+                    if (!tds) setTimeout(function () {//延时触发获取月份对象,因为上面的事件触发和对象生成有时间间隔
+                        tds = p.find('div.calendar-menu-month-inner td');
+                        tds.click(function (e) {
+                            e.stopPropagation(); //禁止冒泡执行easyui给月份绑定的事件
+                            var year = /\d{4}/.exec(span.html())[0];//得到年份
+                            var month = parseInt($(this).attr('abbr'), 10); //月份,这里不需要+1
+                            month = month < 10 ? '0' + month : month;
+                            $("#" + id).datebox('hidePanel')//隐藏日期对象
+                                .datebox('setValue', year + '-' + month); //设置日期的值
+                        });
+                    }, 0);
+                    yearIpt.unbind();//解绑年份输入框中任何事件
+                },
+                parser: function (s) {
+                    if (!s) return new Date();
+                    var arr = s.split('-');
+                    return new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, 1);
+                },
+                formatter: function (d) {
+                    return d.getFullYear() + '-' + (d.getMonth() + 1);/*getMonth返回的是0开始的,忘记了。。已修正*/
+                }
+            });
+            var p = $("#" + id).datebox('panel'), //日期选择对象
+                tds = false, //日期选择对象中月份
+                aToday = p.find('a.datebox-current'),
+                yearIpt = p.find('input.calendar-menu-year'),//年份输入框
+                //显示月份层的触发控件
+                span = aToday.length ? p.find('div.calendar-title span') ://1.3.x版本
+                    p.find('span.calendar-text'); //1.4.x版本
+            if (aToday.length) {//1.3.x版本,取消Today按钮的click事件,重新绑定新事件设置日期框为今天,防止弹出日期选择面板
+                aToday.unbind('click').click(function () {
+                    var now = new Date();
+                    now = now < 10 ? '0' + now : now;
+                    $("#" + id).datebox('hidePanel').datebox('setValue', now.getFullYear() + '-' + (now.toString() + 1));
+                });
+            }
+        };
+
+        //导入
+        function glineplanmoldButtonImport_Click() {
+            $('#mouldcodewarningDatagrid2').datagridDialog({
+                title: '导入生产计划数据',
+                width: 640,
+                height: 420,
+                url: 'plan_import.html',
+                requireSelect: true
+            });
+        }
+
+        //新建
+        function glineplanmoldButtonInsert_Click() {
+            $('#mouldcodewarningDatagrid2').datagridDialog({
+                title: '添加数据',
+                width: 640,
+                height: 680,
+                url: 'plan_add.html'
+            });
+        }
+
+        //修改按钮
+        function glineplanmoldButtonUpdate_Click() { 
+            $('#mouldcodewarningDatagrid2').datagridDialog({
+                title: '修改数据',
+                width: 640,
+                height: 400,
+                url: 'plan_edit.html',
+                requireSelect: true
+            });
+        }
+
+        //添加物料明细按钮
+        function update_Click() { 
+            var heights = window.screen.height;
+             
+            $('#mouldcodewarningDatagrid2').datagridDialog({
+                title: '修改数据',
+                width: 1000,
+                height: heights - 400,
+                url: 'plan_adddetail.html',
+                requireSelect: true
+            });  
+        }
+
+        ////删除按钮
+        function glineplanmoldButtonDelete_Click() {
+             
+            var rows = $('#glineplanmoldDatagrid').datagrid("getChecked");
+            var ids = '';
+            if (rows != null && rows != "") {
+                $.messager.confirm('删除操作', '您确定删除选中的' + rows.length + '条数据吗?(不会删除注浆或交坯计划)', function (r) {
+                    if (r) {
+                        $.each(rows, function (index, item) {
+                            ids += item["SID"] + ',';
+                        })
+                        ids = ids.substring(0, ids.length - 1);
+                        $.post("plan.ashx?m=d",
+                            { 'id': ids },
+                            function (data) {
+                                var json = JSON.parse(data);
+                                if (json["success"] == true) {
+                                    glineplanmoldButtonSearchSubmit2_Click();
+                                }
+                                else {
+                                    $.messager.alert("数据错误", json['message'], 'error');
+
+                                }
+                            });
+                    }
+                });
+
+            }
+            else {
+                $.messager.alert("数据错误", '至少勾选一条数据', 'error');
+            }
+        }
+
+        ////总单删除按钮
+        function planButtonDelete_Click() {
+
+            var rows = $('#mouldcodewarningDatagrid2').datagrid("getSelected"); 
+            if (rows != null && rows != "") {
+                $.messager.confirm('删除操作', '您确定删除选中的总单计划吗?', function (r) {
+                    if (r) {  
+                        $.post("plan.ashx?m=pd",
+                            { 'id': rows.SID },
+                            function (data) {
+                                var json = JSON.parse(data);
+                                if (json["success"] == true) {
+                                    glineplanmoldButtonSearchSubmit_Click();
+                                }
+                                else {
+                                    $.messager.alert("数据错误", json['message'], 'error');
+
+                                }
+                            });
+                    }
+                });
+
+            }
+            else {
+                $.messager.alert("数据错误", '至少勾选一条数据', 'error');
+            }
+        }
+         
+        //详细按钮
+        function glineplanmoldButtonDetail_Click() {
+            $('#glineplanmoldDatagrid').datagridDialog({
+                title: '详细数据',
+                width: 640,
+                height: 480,
+                url: 'plan_detail.html',
+                requireSelect: true
+            });
+        }
+
+        ////复选按钮
+        function glineplanmoldButtonCheck_Click() {
+            $('#glineplanmoldDatagrid').datagridCheckbox({
+                buttonid: 'glineplanmoldButtonCheckbox',
+                valuefield: 'SID'
+            });
+        }
+
+        //搜索按钮
+        function glineplanmoldButtonSearch_Click() {
+            $('#glineplanmoldSearchDiv').toggle();
+            $('#glineplanmoldSearchDiv2').toggle();
+            $('#glineplanmoldDatagrid').datagrid('resize');
+        }
+
+        //加载子表数据
+        function glineplanmoldButtonSearchSubmit2_Click(index, row) {
+            if (index > -1) {
+                id = row["SID"];
+            }
+             
+            //加载子表数据
+            $('#glineplanmoldDatagrid').datagridLoad({
+                title: '',
+                idField: 'SID',
+                queryParams: $('#glineplanmoldForm2').serializeJson(),
+                url: 'plan.ashx?m=z&PLANID=' + id,
+                pagination: true,
+                columnMoving: false,  
+                onLoadSuccess: function (data) {
+                    $(this).datagrid("checkAll");
+                }
+            }); 
+            
+        }
+
+        //主表查询提交
+        function glineplanmoldButtonSearchSubmit_Click() { 
+            $('#mouldcodewarningDatagrid2').datagridLoad({
+                title: '',
+                idField: 'SID',
+                queryParams: $('#glineplanmoldForm').serializeJson(),
+                url: 'plan.ashx?m=ss', 
+                pagination: true,
+                columnMoving: false,
+                onSelect: glineplanmoldButtonSearchSubmit2_Click
+            });
+        }
+
+        //导出
+        function glineplanmoldButtonExport_Click() {
+            //加载表头
+            var fields = $('#glineplanmoldDatagrid').datagrid('getColumnFields');
+            var headers = [];
+            for (var i = 0; i < fields.length; i++) {
+                headers.push($('#glineplanmoldDatagrid').datagrid('getColumnOption', fields[i])['title']);
+                //headers.push(fields[i]);
+            }
+            $('#glineplanmoldDatagrid').datagridExport({
+                headers: headers,
+                fileName: '导出数据(TP_SEMIFINISHED_PLAN).xls',
+                workSheet: '导出数据(TP_SEMIFINISHED_PLAN)'
+            });
+        }
+
+        //刷新
+        function glineplanmoldButtonReload_Click() {
+            glineplanmoldButtonSearchSubmit_Click();
+        }
+
+        //刷新
+        function glineplanmoldButtonReload2_Click() {
+            glineplanmoldButtonSearchSubmit2_Click();
+        }
+
+        //帮助
+        function glineplanmoldButtonHelp_Click() {
+            $('#glineplanmoldDatagrid').datagridDialog({
+                title: '帮助',
+                width: 640,
+                height: 480,
+                url: 'plan_help.html'
+            });
+        }
+
+        //结束编辑
+        function endAllEdit() {
+            var rows = $('#glineplanmoldDatagrid').datagrid('getRows');
+            for (var i = 0; i < rows.length; i++) {
+                // 检查该行是否在编辑状态
+                var editors = $('#glineplanmoldDatagrid').datagrid('getEditors', i);
+                if (editors.length > 0) {
+                    $('#glineplanmoldDatagrid').datagrid('endEdit', i);
+                }
+            }
+        }
+
+        //生成注浆计划
+        function insertGrout_Click() {
+            endAllEdit();
+            var rows = $('#glineplanmoldDatagrid').datagrid("getChecked");  
+            if (rows != null && rows != "") {
+                $.messager.confirm('生成注浆计划操作', '您确定对选中的' + rows.length + '条数据生成注浆计划?', function (r) {
+                    if (r) {  
+                        //提交更改到后端处理
+                        $.post('plan.ashx?m=ig', {
+                            data: JSON.stringify(rows)
+                        }, function (data) {
+                            var json = JSON.parse(data);
+                            if (json['success'] == true) {
+                                $.messager.alert("保存", "保存成功" + json['message']);
+                            }
+                            else {
+                                $.messager.alert("保存", "保存失败" + json['message']);
+                            }
+                        }); 
+                    }
+                });
+
+            }
+            else {
+                $.messager.alert("数据错误", '至少勾选一条数据', 'error');
+            }
+        }
+
+        //生成交坯计划
+        function insertDeliver_Click() {
+            endAllEdit();
+            var rows = $('#glineplanmoldDatagrid').datagrid("getChecked"); 
+            if (rows != null && rows != "") {
+                $.messager.confirm('生成交坯计划操作', '您确定对选中的' + rows.length + '条数据生成交坯计划?', function (r) {
+                    if (r) {
+                        //提交更改到后端处理
+                        $.post('plan.ashx?m=id', {
+                            data: JSON.stringify(rows)
+                        }, function (data) {
+                            var json = JSON.parse(data);
+                            if (json['success'] == true) {
+                                $.messager.alert("保存", "保存成功" + json['message']);
+                            }
+                            else {
+                                $.messager.alert("保存", "保存失败" + json['message']);
+                            }
+                        });
+                    }
+                });
+
+            }
+            else {
+                $.messager.alert("数据错误", '至少勾选一条数据', 'error');
+            }
+        }
+
+        //同时生成注浆及交坯计划
+        function insertAll_Click() {
+            endAllEdit();
+            var rows = $('#glineplanmoldDatagrid').datagrid("getChecked"); 
+            if (rows != null && rows != "") {
+                $.messager.confirm('生成计划操作', '您确定对选中的' + rows.length + '条数据同时生成注浆及交坯计划?', function (r) {
+                    if (r) {
+                        //提交更改到后端处理
+                        $.post('plan.ashx?m=ia', {
+                            data: JSON.stringify(rows)
+                        }, function (data) {
+                            var json = JSON.parse(data);
+                            if (json['success'] == true) {
+                                $.messager.alert("保存", "保存成功" + json['message']);
+                            }
+                            else {
+                                $.messager.alert("保存", "保存失败" + json['message']);
+                            }
+                        });
+                    }
+                });
+
+            }
+            else {
+                $.messager.alert("数据错误", '至少勾选一条数据', 'error');
+            }
+        }
+
+        //查看履历
+        function planHistorySearchSubmit_Click() {
+            var widths = window.screen.width;
+            var heights = window.screen.height;
+
+            $('#mouldcodewarningDatagrid2').datagridDialog({
+                title: '查看履历',
+                width: widths - 600,
+                height: heights - 400,
+                url: 'plan_history.html',
+                requireSelect: true
+            });
+        }
+
+    </script>
+</body>
+</html>

二進制
wwwroot/mes/semifinished/plan/生产计划导入模板.xlsx


+ 285 - 0
wwwroot/mes/semifinished/qualitypoint/qualitypoint.ashx

@@ -0,0 +1,285 @@
+<%@ WebHandler Language="C#" Class="goodslogosap" %>
+
+using System;
+using System.Web;
+using System.Web.SessionState;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.Data;
+using Curtain.DataAccess;
+using DK.XuWei.WebMes;
+
+/// <summary>
+/// TP_SEMIFINISHED_QUALITYPOINT
+/// qq create 2025-11-18
+/// </summary>
+public class goodslogosap : IHttpHandler, IReadOnlySessionState
+{
+    public void ProcessRequest(HttpContext context)
+    {
+        context.Response.ContentType = "text/plain";
+
+        if (mes.LoginCheck() && context.Request["m"] is object)
+        {
+            Button b = new Button();
+            if(mes.RightCheck(""))
+            {
+                b.btnIndex = true;
+                b.btnInsert = true;
+                b.btnInsertBatch = false;
+                b.btnCopy = true;
+                b.btnUpdate = true;
+                b.btnDelete = true;
+                b.btnCancel = false;
+                b.btnSearch = true;
+                b.btnDetail = true;
+                b.btnCheckbox = true;
+                b.btnExport = true;
+                b.btnReload = true;
+            }
+
+            switch (context.Request["m"].ToString().ToLower())
+            {
+                case "b":
+                    {
+                        //按钮
+                        context.Response.Write(new JsonResult(b).ToJson());
+                        break;
+                    }
+                case "a":
+                    {
+                        //添加
+                        if (b.btnDetail && context.Request["id"] is object)
+                            context.Response.Write(detail());
+                        else
+                        {
+                            xRecord r = new xRecord();
+                            context.Response.Write(new JsonResult(r).ToJson());
+                        }
+                        break;
+                    }
+                case "s":
+                    {
+                        //搜索
+                        if (b.btnIndex)
+                            context.Response.Write(search(context.Request.Form));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "t":
+                    {
+                        //详细
+                        if (b.btnDetail)
+                            context.Response.Write(detail());
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "i":
+                    {
+                        //插入
+                        if (b.btnInsert)
+                            context.Response.Write(insert(context.Request.Form));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                case "u":
+                    {
+                        //修改
+                        if (b.btnUpdate)
+                            context.Response.Write(update(context.Request.Form));
+                        else
+                            context.Response.Write(new JsonResult(JsonStatus.rightError).ToJson());
+                        break;
+                    }
+                 
+                default:
+                    {
+                        break;
+                    }
+            }
+        }
+        else
+        {
+            context.Response.Write(new JsonResult(JsonStatus.loginError).ToJson());
+        }
+    }
+
+    /// <summary>
+    /// TP_SEMIFINISHED_QUALITYPOINT 查询
+    /// </summary>
+    /// <returns>json</returns>
+    private string search(NameValueCollection form)
+    {
+        using(IDataAccess conn=DataAccess.Create())
+        { 
+            string sqlStr = @"
+                SELECT  
+                    m.MATERIALCODE,
+                    SBD.MAKTX MATERIALREMARK,
+                    m.GROUTCOUNT,
+                    m.DELIVERCOUNT,
+                    m.FHCOUNT,
+                    m.FIXEDGROUTINGQUALITY,
+                    m.FIXEDDELIVERQUALITY,
+                    m.GROUTINGQUALITY,
+                    m.DELIVERQUALITY,
+                    m.POINTID AS SID
+                FROM
+                    TP_SEMIFINISHED_QUALITYPOINT m
+                LEFT JOIN TP_PC_SAPBOMDETAIL SBD ON SBD.MATNR = m.MATERIALCODE
+                WHERE 
+                    1 = 1
+            ";
+            List<CDAParameter> sqlPara = new List<CDAParameter>();
+                 
+            if(!string.IsNullOrEmpty(form["MATERIALCODE"]))
+            {
+                sqlStr += " AND INSTR( m.MATERIALCODE, @MATERIALCODE@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("MATERIALCODE", form["MATERIALCODE"]));
+            }
+            if(!string.IsNullOrEmpty(form["MATERIALREMARK"]))
+            {
+                sqlStr += " AND INSTR( SBD.MAKTX, @MATERIALREMARK@ ) > 0 ";
+                sqlPara.Add(new CDAParameter("MATERIALREMARK", form["MATERIALREMARK"]));
+            }
+            int total = 0;
+            DataTable dt = conn.ExecuteDatatable( sqlStr, sqlPara.ToArray());
+            return new JsonResult(dt) { total = total}.ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 详细 TP_SEMIFINISHED_QUALITYPOINT
+    /// </summary>
+    /// <returns>json</returns>
+    private string detail()
+    {
+        using(IDataAccess conn= DataAccess.Create())
+        {
+            DataTable dt = conn.ExecuteDatatable(@"
+                SELECT  
+                    m.MATERIALCODE,
+                    SBD.MAKTX MATERIALREMARK,
+                    m.GROUTCOUNT,
+                    m.DELIVERCOUNT,
+                    m.FHCOUNT,
+                    m.FIXEDGROUTINGQUALITY,
+                    m.FIXEDDELIVERQUALITY,
+                    m.GROUTINGQUALITY,
+                    m.DELIVERQUALITY,
+                    m.POINTID AS SID
+                FROM
+                    TP_SEMIFINISHED_QUALITYPOINT m
+                LEFT JOIN TP_PC_SAPBOMDETAIL SBD ON SBD.MATNR = m.MATERIALCODE
+                WHERE  
+                    m.POINTID = @GUID@
+                ",
+                new CDAParameter("GUID",HttpContext.Current.Request["id"])
+            );
+            return new JsonResult(dt).ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 插入 TP_SEMIFINISHED_QUALITYPOINT
+    /// </summary>
+    /// <returns>json</returns>
+    private string insert(NameValueCollection form)
+    {
+        using(IDataAccess conn= DataAccess.Create())
+        { 
+            int result = conn.ExecuteNonQuery(@"
+                INSERT INTO TP_SEMIFINISHED_QUALITYPOINT (
+                    MATERIALCODE,
+                    FIXEDGROUTINGQUALITY,
+                    FIXEDDELIVERQUALITY,
+                    ACCOUNTID,
+                    CREATEUSERID,
+                    UPDATEUSERID
+                ) VALUES (
+                    @MATERIALCODE@,
+                    @FIXEDGROUTINGQUALITY@,
+                    @FIXEDDELIVERQUALITY@,
+                    @ACCOUNTID@,
+                    @CREATEUSERID@,
+                    @CREATEUSERID@
+                )
+                ",
+                new CDAParameter("MATERIALCODE",form["MATERIALCODE"]), 
+                new CDAParameter("FIXEDGROUTINGQUALITY",form["FIXEDGROUTINGQUALITY"]),
+                new CDAParameter("FIXEDDELIVERQUALITY",form["FIXEDDELIVERQUALITY"]),
+                new CDAParameter("ACCOUNTID",HttpContext.Current.Session["accountId"]),
+                new CDAParameter("CREATEUSERID",HttpContext.Current.Session["userId"])
+            );
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    }
+
+    /// <summary>
+    /// 更新 TP_SEMIFINISHED_QUALITYPOINT
+    /// </summary>
+    /// <returns>json</returns>
+    private string update(NameValueCollection form)
+    {
+        using(IDataAccess conn=DataAccess.Create())
+        {
+            int result = conn.ExecuteNonQuery(@"
+                UPDATE TP_SEMIFINISHED_QUALITYPOINT 
+                SET 
+                    FIXEDGROUTINGQUALITY = @FIXEDGROUTINGQUALITY@,
+                    FIXEDDELIVERQUALITY = @FIXEDDELIVERQUALITY@,
+                    UPDATEUSERID = @CREATEUSERID@
+                WHERE 
+                    POINTID = @GUID@
+                ",
+                new CDAParameter("FIXEDGROUTINGQUALITY",form["FIXEDGROUTINGQUALITY"]),
+                new CDAParameter("FIXEDDELIVERQUALITY",form["FIXEDDELIVERQUALITY"]),
+                new CDAParameter("CREATEUSERID",HttpContext.Current.Session["userId"]), 
+                new CDAParameter("GUID",HttpContext.Current.Request["id"])
+            );
+            return new JsonResult(JsonStatus.success).ToJson();
+        }
+    }
+          
+
+    private class Button
+    {
+        public bool btnIndex = false;
+        public bool btnInsert = false;
+        public bool btnInsertBatch = false;
+        public bool btnCopy = false;
+        public bool btnUpdate = false;
+        public bool btnDelete = false;
+        public bool btnCancel = false;
+        public bool btnSearch = false;
+        public bool btnDetail = false;
+        public bool btnCheckbox = false;
+        public bool btnExport = false;
+        public bool btnReload = false;
+    }
+
+    private class xRecord
+    {
+        public string sid { get; set; } 
+        public string MATERIALCODE { get; set; }
+        public string GROUTCOUNT { get; set; }
+        public string DELIVERCOUNT { get; set; }
+        public string FHCOUNT { get; set; }
+        public string FIXEDGROUTINGQUALITY { get; set; }
+        public string FIXEDDELIVERQUALITY { get; set; }
+        public string GROUTINGQUALITY { get; set; }
+        public string DELIVERQUALITY { get; set; }
+    }
+
+    public bool IsReusable
+    {
+        get
+        {
+            return false;
+        }
+    }
+
+}

+ 59 - 0
wwwroot/mes/semifinished/qualitypoint/qualitypoint_add.html

@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <script src="/plugins/xeasyui/xeasyui.min.js"></script>
+</head>
+<body class="easyui-layout">
+    <div data-options="region:'center',plain:true,border:false">
+        <form id="ff" method="post" class="w-form">
+            <div class="w-div">
+                <div class="w-fieldbar" onclick="$('#more2').toggle()" style="cursor:pointer;"></div>
+            </div>
+            <div id="more2" style="display:block;">
+                <div class="w-div">
+                    <div class="w-fieldname">物料编码:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MATERIALCODE" name="MATERIALCODE" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">固定注浆质量点:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="FIXEDGROUTINGQUALITY" name="FIXEDGROUTINGQUALITY" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">固定交坯质量点:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="FIXEDDELIVERQUALITY" name="FIXEDDELIVERQUALITY" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <div data-options="region:'south',border:false" class="w-bar">
+        <a href="javascript:void(0)" id="tbSave" class="easyui-linkbutton" data-options="iconCls:'icon-save'" onclick="submitForm()">保存</a>
+        <a href="javascript:void(0)" id="tbClose" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" onclick="cancelForm()">关闭</a>
+    </div>
+
+    <script type="text/javascript">
+
+        $(function () {
+            $('#ff').formLoad({
+                url: 'qualitypoint.ashx?m=a'
+            }); 
+        });
+
+        function submitForm() {
+            $.dialog.save({
+                formid: 'ff',
+                url: 'qualitypoint.ashx?m=i'
+            });
+        }
+
+        function cancelForm() {
+            $.dialog.close();
+        }
+
+    </script>
+</body>
+</html>

+ 62 - 0
wwwroot/mes/semifinished/qualitypoint/qualitypoint_edit.html

@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <script src="/plugins/xeasyui/xeasyui.min.js"></script>
+</head>
+<body class="easyui-layout">
+    <!--
+        <input class="easyui-combobox w-input" id="叶子" name="叶子" data-options="prompt:'',tipPosition:'top',url:'/mes/list.ashx?m=truefalse',method:'get',valueField:'text',textField:'text',panelHeight:'200px',editable:'true'" style="width:100%;height:32px;">
+        <input class="easyui-filebox" id="图片" name="图片" data-options="prompt:'',tipPosition:'top',buttonText:'选择图片',buttonAlign:'right',accept:'image/*',onChange:$.imagePreview" style="width:100%;height:32px;" >
+    -->
+    <div data-options="region:'center',plain:true,border:false">
+        <form id="ff" method="post" class="w-form">
+            <div class="w-div">
+                <div class="w-fieldbar" onclick="$('#more2').toggle()" style="cursor:pointer;"></div>
+            </div>
+            <div id="more2" style="display:block;">
+                <div class="w-div">
+                    <div class="w-fieldname">物料编码:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="MATERIALCODE" name="MATERIALCODE" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">固定注浆质量点:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="FIXEDGROUTINGQUALITY" name="FIXEDGROUTINGQUALITY" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+                <div class="w-div">
+                    <div class="w-fieldname">固定交坯质量点:</div>
+                    <div class="w-field"><input class="easyui-textbox" id="FIXEDDELIVERQUALITY" name="FIXEDDELIVERQUALITY" data-options="required:false,prompt:'',tipPosition:'top'" style="width:100%;height:32px;"></div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <div data-options="region:'south',border:false" class="w-bar">
+        <a href="javascript:void(0)" id="tbSave" class="easyui-linkbutton" data-options="iconCls:'icon-save'" onclick="submitForm()">保存</a>
+        <a href="javascript:void(0)" id="tbClose" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" onclick="cancelForm()">关闭</a>
+    </div>
+    <script type="text/javascript">
+
+        $(function () {
+            $('#ff').formLoad({
+                url: 'qualitypoint.ashx?m=t'
+            }); 
+        });
+
+        function submitForm() {
+            $.dialog.save({
+                formid: 'ff',
+                url: 'qualitypoint.ashx?m=u&id=' + request('id')
+            });
+        }
+
+        function cancelForm() {
+            $.dialog.close();
+        }
+
+    </script>
+</body>
+</html>

+ 135 - 0
wwwroot/mes/semifinished/qualitypoint/qualitypoint_index.html

@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <script src="/plugins/xeasyui/xeasyui.min.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
+</head>
+<body>
+    <!--工具条-->
+    <div id="tb" class="i-toolbar">
+        <a href="javascript:void(0)" style="display:none" id="btnInsert" title="添加" class="easyui-linkbutton" iconcls="icon-add" plain="true" onclick="tbAdd()">添加</a>
+        <a href="javascript:void(0)" style="display:none" id="btnUpdate" title="编辑" class="easyui-linkbutton" iconcls="icon-edit" plain="true" onclick="tbEdit()">修改</a> 
+        <a href="javascript:void(0)" style="display:none" id="btnCheckbox" title="显示复选框" class="easyui-linkbutton" iconcls="icon-ok" plain="true" toggle="true" onclick="tbCheck()">复选</a>
+        <a href="javascript:void(0)" style="display:none" id="btnSearch" title="搜索" class="easyui-linkbutton" iconcls="icon-search" plain="true" toggle="true" onclick="tbSearch()">搜索</a>
+        <a href="javascript:void(0)" id="btnReload" title="刷新" class="easyui-linkbutton" iconcls="icon-reload" plain="true" onclick="tbReload()">刷新</a>
+        <div id="tbSearchDiv" style="display:none;padding:10px;">
+            <form id="ff">
+                <div>
+                    物料编码:
+                    <input class="easyui-textbox" id="MATERIALCODE" name="MATERIALCODE" data-options="required:false,prompt:'',tipPosition:'top'" style="width:160px;height:32px;">
+                    物料描述:
+                    <input class="easyui-textbox" id="MATERIALREMARK" name="MATERIALREMARK" data-options="required:false,prompt:'',tipPosition:'top'" style="width:160px; height: 32px;">
+                
+                    <a href="javascript:void(0)" id="btnSearchSubmit" title="清空" class="easyui-linkbutton" plain="false" onclick="$('#ff').form('clear')">清空</a>
+                    <a href="javascript:void(0)" id="btnSearchSubmit" title="搜索" class="easyui-linkbutton" plain="false" onclick="tbSearchSubmit()">搜索</a>
+                </div>
+            </form>
+        </div>
+    </div>
+    <!--表格-->
+    <table id="dg" data-options="toolbar: '#tb',showFooter:false">
+        <thead>
+            <tr>
+                <th data-options="field:'SID',title:'SID',width:220,align:'left',checkbox:true,hidden:true">SID</th>
+                <th data-options="field:'MATERIALCODE',title:'物料编码',align:'left',sortable:true"></th>
+                <th data-options="field:'MATERIALREMARK',title:'物料描述',align:'left',sortable:true"></th>
+                <th data-options="field:'GROUTCOUNT',title:'注浆数量',align:'left',sortable:true"></th>
+                <th data-options="field:'DELIVERCOUNT',title:'交坯数量',align:'left',sortable:true"></th>
+                <th data-options="field:'FHCOUNT',title:'成品数量',align:'left',sortable:true"></th>
+                <th data-options="field:'FIXEDGROUTINGQUALITY',title:'固定注浆质量点',align:'left',sortable:true"></th>
+                <th data-options="field:'FIXEDDELIVERQUALITY',title:'固定交坯质量点',align:'left',sortable:true"></th>
+                <th data-options="field:'GROUTINGQUALITY',title:'注浆质量点',align:'left',sortable:true"></th>
+                <th data-options="field:'DELIVERQUALITY',title:'交坯质量点',align:'left',sortable:true"></th>
+            </tr>
+        </thead>
+    </table>
+    <script type="text/javascript">
+
+        //加载完成
+        $(function () {
+            //加载按钮
+            $('#tb').buttonLoad({
+                url:'qualitypoint.ashx?m=b'
+            });
+            //加载表格数据
+            tbSearchSubmit();
+
+            $('#MATERIALCODE').textbox('textbox').bind('keyup', function (e) {
+                this.value = this.value.toUpperCase();
+            });
+        });
+
+        //添加按钮
+        function tbAdd() {
+            $('#dg').datagridDialog({
+                title: '添加数据',
+                width: 640,
+                height: 480,
+                url: 'qualitypoint_add.html'
+            });
+        }
+
+        //修改按钮
+        function tbEdit() {
+            $('#dg').datagridDialog({
+                title: '修改数据',
+                width: 640,
+                height: 480,
+                url: 'qualitypoint_edit.html',
+                requireSelect: true
+            });
+        }
+
+        //删除按钮
+        function tbDelete() {
+            $('#dg').datagridPost({
+                title:'删除操作',
+                url: 'qualitypoint.ashx?m=d',
+                onValidate: function (r) { return true; }
+            });
+        } 
+
+        //复选按钮
+        function tbCheck() {
+            $('#dg').datagridCheckbox({
+                buttonid: 'btnCheckbox',
+                valuefield: 'SID'
+            });
+        }
+
+        //搜索按钮
+        function tbSearch() {
+            $('#tbSearchDiv').toggle();
+            $('#dg').datagrid('resize');
+        }
+
+        //搜索提交
+        function tbSearchSubmit() {
+            $('#dg').datagridLoad({
+                title: '产品物料',
+                idField: 'SID',
+                queryParams: $('#ff').serializeJson(),
+                url: 'qualitypoint.ashx?m=s',
+                columnMenu: '#btnColumnMenu',
+                pagination: false,
+                columnMoving: false
+            });
+        }
+
+
+        //刷新
+        function tbReload() {
+            tbSearchSubmit();
+        }
+
+        function formatterTrueFalse(value, row, index) { return value == 'True' ? '是' : '否'; }
+        function stylerTrueFalse(value, row, index) { return value == 'True' ? 'color:black' : 'color:red'; }
+
+    </script>
+</body>
+</html>