diff --git a/DataBase/版本日志/SGGLDB_WH_2023-08-29.sql b/DataBase/版本日志/SGGLDB_WH_2023-08-29.sql
new file mode 100644
index 00000000..549a4d24
--- /dev/null
+++ b/DataBase/版本日志/SGGLDB_WH_2023-08-29.sql
@@ -0,0 +1,40 @@
+
+--ֶγ
+ALTER TABLE PreRun_TechnologySysPiping ALTER Column NameSpecifications varchar(max) null;
+ALTER TABLE PreRun_TechnologySysPiping ALTER Column Materials varchar(max) null;
+GO
+--ɾеı
+ALTER TABLE PreRun_WorkPackage DROP COLUMN WorkPackCode
+GO
+--ϵͳ
+truncate table PreRun_SubSysWorkPackage
+--ϵͳϵͳ
+alter table PreRun_SubSysWorkPackage add SystemId varchar(50) NULL
+GO
+
+IF object_id(N'PreRun_TechnologySysPiping',N'U') is not null
+drop table dbo.PreRun_TechnologySysPiping
+CREATE TABLE [dbo].[PreRun_TechnologySysPiping](
+	[TechnologyId] [varchar](50) NOT NULL,
+	[SystemId] [varchar](50) NULL,
+	[ProjectId] [varchar](50) NULL,
+	[TagNumber] [varchar](50) NULL,
+	[NameSpecifications] [varchar](max) NULL,
+	[DrawingNo] [varchar](50) NULL,
+	[Materials] [varchar](max) NULL,
+	[NumOperate] [varchar](50) NULL,
+	[NumStandby] [varchar](50) NULL,
+	[WeightSingle] [varchar](50) NULL,
+	[WeightTotal] [varchar](50) NULL,
+	[Remark] [nvarchar](150) NULL,
+	[AddUser] [varchar](50) NULL,
+	[AddTime] [datetime] NULL,
+	[Sort] [int] NULL,
+ CONSTRAINT [PK_PreRun_TechnologySysPiping] PRIMARY KEY CLUSTERED 
+(
+	[TechnologyId] ASC
+)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+
diff --git a/SGGL/FineUIPro.Web/CQMS/Solution/EditConstructSolution.aspx.cs b/SGGL/FineUIPro.Web/CQMS/Solution/EditConstructSolution.aspx.cs
index 44d331e3..f551f717 100644
--- a/SGGL/FineUIPro.Web/CQMS/Solution/EditConstructSolution.aspx.cs
+++ b/SGGL/FineUIPro.Web/CQMS/Solution/EditConstructSolution.aspx.cs
@@ -173,7 +173,7 @@ namespace FineUIPro.Web.CQMS.Solution
                         txtSolutionName.Enabled = false;
                         txtCNProfessional.Enabled = false;
                         txtUnitWork.Enabled = false;
-                        ContactImg = -1;
+                        ContactImg = 0;
                         Panel2.Enabled = false;
                     }
                     //提交版本人多次修改
diff --git a/SGGL/FineUIPro.Web/CQMS/WBS/ProjectControlPoint.aspx b/SGGL/FineUIPro.Web/CQMS/WBS/ProjectControlPoint.aspx
index 926bd886..74109dcf 100644
--- a/SGGL/FineUIPro.Web/CQMS/WBS/ProjectControlPoint.aspx
+++ b/SGGL/FineUIPro.Web/CQMS/WBS/ProjectControlPoint.aspx
@@ -150,10 +150,10 @@
             
                       
+            
-            <%--        --%>
             
diff --git a/SGGL/FineUIPro.Web/CQMS/WBS/ProjectControlPoint.aspx.cs b/SGGL/FineUIPro.Web/CQMS/WBS/ProjectControlPoint.aspx.cs
index dd8aa1e6..8129f893 100644
--- a/SGGL/FineUIPro.Web/CQMS/WBS/ProjectControlPoint.aspx.cs
+++ b/SGGL/FineUIPro.Web/CQMS/WBS/ProjectControlPoint.aspx.cs
@@ -1374,5 +1374,86 @@ namespace FineUIPro.Web.CQMS.WBS
             }
         }
         #endregion
+
+        #region 拷贝单位工程下勾选状态
+        /// 
+        /// 拷贝单位工程下勾选状态
+        /// 
+        /// 
+        /// 
+        protected void btnMenuCopy_Click(object sender, EventArgs e)
+        {
+            if (this.trWBS.SelectedNode != null)
+            {
+                string unitWorkId = string.Empty;
+                var newUnitWork = BLL.UnitWorkService.GetUnitWorkByUnitWorkId(this.trWBS.SelectedNode.NodeID);
+                if (newUnitWork != null)
+                {
+                    unitWorkId = newUnitWork.UnitWorkId;
+                }
+                else
+                {
+                    var div = BLL.DivisionProjectService.GetDivisionProjectById(this.trWBS.SelectedNode.NodeID);
+                    if (div != null)
+                    {
+                        if (!string.IsNullOrEmpty(div.UnitWorkId))
+                        {
+                            unitWorkId = div.UnitWorkId;
+                        }
+                    }
+                    else
+                    {
+                        var div2 = (from x in Funs.DB.WBS_DivisionProject where x.CNProfessionalId != null && x.CNProfessionalId == this.trWBS.SelectedNodeID select x).FirstOrDefault();
+                        if (div2 != null)
+                        {
+                            if (!string.IsNullOrEmpty(div2.UnitWorkId))
+                            {
+                                unitWorkId = div2.UnitWorkId;
+                            }
+                        }
+                        else
+                        {
+                            var nodeId = this.trWBS.SelectedNodeID.Split('|')[0];
+                            var uw = BLL.UnitWorkService.GetUnitWorkByUnitWorkId(nodeId);
+                            if (uw != null)
+                            {
+                                unitWorkId = uw.UnitWorkId;
+                            }
+                        }
+                    }
+                }
+                var unitWork = (from x in Funs.DB.WBS_UnitWork
+                                where x.ProjectId == this.CurrUser.LoginProjectId
+                                    && x.UnitWorkId != unitWorkId
+                                select x).FirstOrDefault();
+
+                var oldDivsionProject = (from x in Funs.DB.WBS_DivisionProject
+                                         where x.ProjectId == this.CurrUser.LoginProjectId && x.IsSelected == true
+                                         && x.UnitWorkId == unitWork.UnitWorkId
+                                         select x).ToList();
+                foreach (var item in oldDivsionProject)
+                {
+                    var div = Funs.DB.WBS_DivisionProject.FirstOrDefault(x => x.ProjectId == this.CurrUser.LoginProjectId && x.UnitWorkId == unitWorkId && x.DivisionCode == item.DivisionCode);
+                    if (div != null)
+                    {
+                        div.IsSelected = true;
+                        Funs.DB.SubmitChanges();
+
+                        var breakdownProjects = (from x in Funs.DB.WBS_BreakdownProject
+                                                 where x.ProjectId == this.CurrUser.LoginProjectId
+                                                 && x.UnitWorkId == unitWorkId
+                                                 && x.DivisionProjectId == div.DivisionProjectId
+                                                 select x).ToList();
+                        foreach (var b in breakdownProjects)
+                        {
+                            b.IsSelected = true;
+                            Funs.DB.SubmitChanges();
+                        }
+                    }
+                }
+                ShowNotify("拷贝成功", MessageBoxIcon.Success);
+            }
+        }
+        #endregion
     }
 }
\ No newline at end of file
diff --git a/SGGL/FineUIPro.Web/CQMS/WBS/ProjectControlPoint.aspx.designer.cs b/SGGL/FineUIPro.Web/CQMS/WBS/ProjectControlPoint.aspx.designer.cs
index cbed3b5f..7b718290 100644
--- a/SGGL/FineUIPro.Web/CQMS/WBS/ProjectControlPoint.aspx.designer.cs
+++ b/SGGL/FineUIPro.Web/CQMS/WBS/ProjectControlPoint.aspx.designer.cs
@@ -219,6 +219,15 @@ namespace FineUIPro.Web.CQMS.WBS {
         /// 
         protected global::FineUIPro.MenuButton btnMenuEdit;
         
+        /// 
+        /// btnMenuCopy 控件。
+        /// 
+        /// 
+        /// 自动生成的字段。
+        /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
+        /// 
+        protected global::FineUIPro.MenuButton btnMenuCopy;
+        
         /// 
         /// btnMenuDelete 控件。
         /// 
diff --git a/SGGL/FineUIPro.Web/TestRun/BeforeTestRun/SysPipingDeviceImport.aspx b/SGGL/FineUIPro.Web/TestRun/BeforeTestRun/SysPipingDeviceImport.aspx
index 8a061f51..e4b3418d 100644
--- a/SGGL/FineUIPro.Web/TestRun/BeforeTestRun/SysPipingDeviceImport.aspx
+++ b/SGGL/FineUIPro.Web/TestRun/BeforeTestRun/SysPipingDeviceImport.aspx
@@ -73,7 +73,7 @@
                                             
                                                 
                                                     
-                                                        
+                                                        
                                                             
                                                                 
                                                                     
@@ -262,7 +262,7 @@
                                                 
                                                 
                                                     
-                                                        
+                                                        
                                                             
                                                                 
                                                                     
@@ -374,7 +374,7 @@
                                             
                                                 
                                                     
-                                                        
+                                                        
                                                             
                                                                 
                                                                     
@@ -513,7 +513,7 @@
 
                                                 
                                                     
-                                                        
+                                                        
                                                             
                                                                 
                                                                     
diff --git a/SGGL/FineUIPro.Web/TestRun/BeforeTestRun/SysPipingDeviceImport.aspx.cs b/SGGL/FineUIPro.Web/TestRun/BeforeTestRun/SysPipingDeviceImport.aspx.cs
index d3ecedd1..5a290c54 100644
--- a/SGGL/FineUIPro.Web/TestRun/BeforeTestRun/SysPipingDeviceImport.aspx.cs
+++ b/SGGL/FineUIPro.Web/TestRun/BeforeTestRun/SysPipingDeviceImport.aspx.cs
@@ -48,7 +48,7 @@ namespace FineUIPro.Web.TestRun.BeforeTestRun
             rootNode.EnableClickEvent = true;
             this.tvControlItem.Nodes.Add(rootNode);
             var allPreRunLs = Funs.DB.PreRun_SysDevice.Where(p => p.ProjectId == this.CurrUser.LoginProjectId).ToList();
-            var onePreRunLs = allPreRunLs.Where(p => p.PreRunLevel == 1);
+            var onePreRunLs = allPreRunLs.Where(p => p.PreRunLevel == 1).OrderBy(x => x.Sort);
             foreach (var item in onePreRunLs)
             {
                 TreeNode rootUnitNode = new TreeNode();//定义根节点
@@ -71,7 +71,7 @@ namespace FineUIPro.Web.TestRun.BeforeTestRun
         private void BindNodes(TreeNode node, List list, string parentId)
         {
 
-            var itemList = list.Where(p => p.ParentId == parentId).ToList();
+            var itemList = list.Where(p => p.ParentId == parentId).OrderBy(x => x.Sort).ToList();
             if (itemList.Count > 0)
             {
                 foreach (var item in itemList)
@@ -305,8 +305,11 @@ namespace FineUIPro.Web.TestRun.BeforeTestRun
                     var existPropertys = Funs.DB.PreRun_PropertySysPiping.Where(a => pipingCodes.Contains(a.PipingCode) && a.SystemId == tvControlItem.SelectedNodeID && a.ProjectId == this.CurrUser.LoginProjectId).ToList();
                     if (existPropertys.Count > 0)
                     {
-                        ShowNotify($"管道号({string.Join(",", existPropertys.ConvertAll(s => s.PipingCode))})已存在!", MessageBoxIcon.Warning);
-                        return;
+                        //删除已经存在的信息
+                        Funs.DB.PreRun_PropertySysPiping.DeleteAllOnSubmit(existPropertys);
+                        Funs.DB.SubmitChanges();
+                        //ShowNotify($"管道号({string.Join(",", existPropertys.ConvertAll(s => s.PipingCode))})已存在!", MessageBoxIcon.Warning);
+                        //return;
                     }
                     List list = new List();
                     //数据导入
@@ -350,6 +353,7 @@ namespace FineUIPro.Web.TestRun.BeforeTestRun
                     ShowNotify("文件无数据!", MessageBoxIcon.Warning);
                 }
                 ZxtgdBrid();
+                ShowNotify("导入成功!", MessageBoxIcon.Success);
             }
             catch (Exception ex)
             {
@@ -533,8 +537,11 @@ namespace FineUIPro.Web.TestRun.BeforeTestRun
                     var existTechnologys = Funs.DB.PreRun_TechnologySysPiping.Where(a => tagNumbers.Contains(a.TagNumber) && a.SystemId == tvControlItem.SelectedNodeID && a.ProjectId == this.CurrUser.LoginProjectId).ToList();
                     if (existTechnologys.Count > 0)
                     {
-                        ShowNotify($"设备位号({string.Join(",", existTechnologys.ConvertAll(s => s.TagNumber))})已存在!", MessageBoxIcon.Warning);
-                        return;
+                        //删除已经存在的信息
+                        Funs.DB.PreRun_TechnologySysPiping.DeleteAllOnSubmit(existTechnologys);
+                        Funs.DB.SubmitChanges();
+                        //ShowNotify($"设备位号({string.Join(",", existTechnologys.ConvertAll(s => s.TagNumber))})已存在!", MessageBoxIcon.Warning);
+                        //return;
                     }
                     string nameSpecificationStr = string.Empty;
                     string materialStr = string.Empty;
@@ -621,6 +628,7 @@ namespace FineUIPro.Web.TestRun.BeforeTestRun
                     ShowNotify("文件无数据!", MessageBoxIcon.Warning);
                 }
                 ZxtgyBrid();
+                ShowNotify("导入成功!", MessageBoxIcon.Success);
             }
             catch (Exception ex)
             {
diff --git a/SGGL/FineUIPro.Web/common/mainProject2.aspx.cs b/SGGL/FineUIPro.Web/common/mainProject2.aspx.cs
index 16ec59c2..5eb994b6 100644
--- a/SGGL/FineUIPro.Web/common/mainProject2.aspx.cs
+++ b/SGGL/FineUIPro.Web/common/mainProject2.aspx.cs
@@ -45,9 +45,13 @@ namespace FineUIPro.Web.common
                 this.divSafeWorkTime.InnerHtml = wHours.ToString();
 
                 //本月安全人工时
-                int wHoursMonth = db.SitePerson_PersonInOutNumber.Where(x => x.InOutDate > DateTime.Now.AddDays(-Convert.ToInt32(DateTime.Now.Date.Day))
-                && x.ProjectId == ProjectId)
-                    .Max(x => x.WorkHours) ?? 0;
+                int wHoursMonth = 0;
+                DateTime? sDate = Funs.GetNewDateTime(DateTime.Now.Year.ToString()+"-"+ DateTime.Now.Month.ToString());
+                var dayReports = BLL.SitePerson_MonthReportService.getMonthReports(this.ProjectId, sDate);
+                if (dayReports.Count>0)
+                {
+                    wHoursMonth = Convert.ToInt32(dayReports[0].DayWorkTime);
+                }
                 this.divSafeWorkTimeMonth.InnerHtml = wHoursMonth.ToString();
 
                 //安全培训累计人员
diff --git a/SGGL/FineUIPro.Web/common/main_new.aspx.cs b/SGGL/FineUIPro.Web/common/main_new.aspx.cs
index b80aea12..ce922ece 100644
--- a/SGGL/FineUIPro.Web/common/main_new.aspx.cs
+++ b/SGGL/FineUIPro.Web/common/main_new.aspx.cs
@@ -34,10 +34,19 @@ namespace FineUIPro.Web.common
                 this.divSafeWorkTime.InnerHtml = wHours.ToString();
 
                 //本月安全人工时
-                int wHoursMonth = db.SitePerson_PersonInOutNumber.Where(x => x.InOutDate > DateTime.Now.AddDays(-Convert.ToInt32(DateTime.Now.Date.Day)))
-                    .Max(x => x.WorkHours) ?? 0;
+                int wHoursMonth = 0;
+                DateTime? sDate = Funs.GetNewDateTime(DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString());
+                var dayReports = getMonthReportsByCompany(sDate);
+                if (dayReports.Count > 0)
+                {
+                    wHoursMonth = Convert.ToInt32(dayReports[0].DayWorkTime);
+                }
                 this.divSafeWorkTimeMonth.InnerHtml = wHoursMonth.ToString();
 
+                //int wHoursMonth = db.SitePerson_PersonInOutNumber.Where(x => x.InOutDate > DateTime.Now.AddDays(-Convert.ToInt32(DateTime.Now.Date.Day)))
+                //    .Max(x => x.WorkHours) ?? 0;
+                //this.divSafeWorkTimeMonth.InnerHtml = wHoursMonth.ToString();
+
                 //安全培训累计人员
                 var getTrainRecord = db.EduTrain_TrainRecord.Max(x=>x.TrainPersonNum)??0;
                 this.divSafePersonNum.InnerHtml = getTrainRecord.ToString();
@@ -110,6 +119,50 @@ namespace FineUIPro.Web.common
             }
         }
 
+        #region 当月人工时
+        /// 
+        ///  获取出入记录人工时-月报(项目级别)
+        /// 
+        /// 
+        public static List getMonthReportsByCompany(DateTime? sDate)
+        {
+            Model.SGGLDB db = Funs.DB;
+            List reports = new List();
+            var getAllPersonInOutList = from x in db.SitePerson_PersonInOutNumber
+                                       
+                                        select x;
+            if (getAllPersonInOutList.Count() > 0)
+            {
+                var getInMonths = (from x in getAllPersonInOutList select new { x.InOutDate.Year, x.InOutDate.Month }).Distinct();
+                if (sDate.HasValue)
+                {
+                    getInMonths = getInMonths.Where(x => x.Year == sDate.Value.Year && x.Month == sDate.Value.Month);
+                }
+                foreach (var item in getInMonths)
+                {
+                    DateTime compileDate = Funs.GetNewDateTimeOrNow(item.Year.ToString() + "-" + item.Month.ToString());
+                    var getNow = getAllPersonInOutList.Where(x => x.InOutDate.Year == compileDate.Year && x.InOutDate.Month == compileDate.Month).Max(x => x.WorkHours);
+                    if (getNow.HasValue)
+                    {
+                        Model.SitePerson_MonthReport reportItem = new Model.SitePerson_MonthReport
+                        {
+                            MonthReportId = SQLHelper.GetNewID(),
+                          
+                            CompileDate = Funs.GetNewDateTime(item.Year.ToString() + "-" + item.Month.ToString()),
+                            TotalPersonWorkTime = getNow,
+                        };
+                        DateTime upDate = compileDate.AddMonths(-1);
+                        var getMax = getAllPersonInOutList.Where(x => x.InOutDate.Year == upDate.Year && x.InOutDate.Month == upDate.Month).Max(x => x.WorkHours) ?? 0;
+                        reportItem.DayWorkTime = (getNow ?? 0) - getMax;
+                        reports.Add(reportItem);
+                    }
+
+                }
+            }
+            return reports;
+        }
+        #endregion
+
         #region  项目信息
         protected string Project
         {
diff --git a/SGGL/Model/Model.cs b/SGGL/Model/Model.cs
index 41cac1d2..51b60f25 100644
--- a/SGGL/Model/Model.cs
+++ b/SGGL/Model/Model.cs
@@ -90816,7 +90816,7 @@ namespace Model
 			}
 		}
 		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_InspectionMachineCode", DbType="NVarChar(50) NOT NULL", CanBeNull=false)]
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_InspectionMachineCode", DbType="NVarChar(100)")]
 		public string InspectionMachineCode
 		{
 			get
@@ -91747,7 +91747,7 @@ namespace Model
 			}
 		}
 		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_InspectionPersonCode", DbType="NVarChar(50) NOT NULL", CanBeNull=false)]
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_InspectionPersonCode", DbType="NVarChar(100)")]
 		public string InspectionPersonCode
 		{
 			get
@@ -320055,7 +320055,7 @@ namespace Model
 			}
 		}
 		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ConstValue", DbType="NVarChar(200)")]
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ConstValue", DbType="NVarChar(500)")]
 		public string ConstValue
 		{
 			get