Browse Source

初始化新分支,清理历史大文件

zhangguo 1 week ago
commit
5431a2d661

BIN
FAQ/images/ScreenShot_2026-03-04_140332_295.png


BIN
FAQ/images/ScreenShot_2026-03-04_141049_805.png


BIN
FAQ/images/ScreenShot_2026-03-04_141445_630.png


BIN
FAQ/images/ScreenShot_2026-03-04_141810_725.png


BIN
FAQ/images/ScreenShot_2026-03-04_142035_870.png


BIN
FAQ/images/ScreenShot_2026-03-05_191545_459.png


BIN
FAQ/images/微信图片_20260303140609_774_623.png


+ 65 - 0
FAQ/index.md

@@ -0,0 +1,65 @@
+# MES项目常见问题解答
+
+## 尚未解答问题
+
+### 前端开发环境
+
+#### Q: NetAdvantage_WinForms_20092安装后,LC错误,怎么获得授权?
+
+![NetAdvantage_WinForms_20092 LC错误截图](./images/微信图片_20260303140609_774_623.png)
+
+A: 待解答
+
+#### Q: UI设计页面怎么设计页面,比如增加这套控件什么的?
+
+主要是这套自定义控件怎么使用,注意事项。冲突。
+
+![.](./images/ScreenShot_2026-03-04_141049_805.png)
+
+A: 待解答
+
+#### Q: 设计模式中的设计向导你们使用么?
+
+![](./images/ScreenShot_2026-03-04_141445_630.png)
+
+A: 待回答
+
+#### Q: VS2019打开设计页面后,为什么要在C盘写日志,为了避免这个我必须以管理员身份启动VS2019吗?
+
+![](./images/ScreenShot_2026-03-04_140332_295.png)
+
+A: 待解答
+
+#### Q: 前端似乎有实体对象, 表象是生成,能提供对应生成工具么?
+
+PS 后端也应该有套生成工具
+
+![](./images/ScreenShot_2026-03-04_142035_870.png)
+
+A: 待解答
+
+### 后端问题
+
+#### Q: 后端业务如何进行单元测试
+
+A: 待解答
+
+#### Q: 后端似乎和整个项目只能连一个库,如果我在业务中需要同时访问两个库该怎么办呢?
+
+A: 无法办到  
+
+### 接口问题
+
+### Q: 接口业务正在使用的入口接口有哪些
+
+A: 接口他们管,我们不管
+
+### Q: MES除了对产销输出业务,还对哪些系统输出了,能给个列表么?
+
+A: 待解答
+
+### Q: 能提供一个接口的POSTMAN的调试模板或者单元测试入口么?
+
+A: 待解答
+
+# 

+ 20 - 0
README.md

@@ -0,0 +1,20 @@
+# MES项目文档
+
+## 版本变更记录
+
+| 版本号  | 变更日期       | 变更内容             | 变更人    |
+| ---- | ---------- | ---------------- | ------ |
+| v1.1 | 2026-03-06 | 增加相关软件栏目和教学视频栏目  | 系统维护人员 |
+| v1.0 | 2026-03-06 | 创建项目文档结构,添加FAQ模块 | 系统维护人员 |
+
+## 常见问题
+
+[FAQ](./FAQ/index.md)
+
+## 相关软件
+
+## 教学视频
+
+- 内部教学
+
+![](http://172.54.10.21:3001/从合同到生产实绩.mp4)

+ 208 - 0
规划/内部讨论.md

@@ -0,0 +1,208 @@
+[TOC]
+
+# 1. 为什么要翻新
+
+## 1.1. 代码可维护性
+
+mes的代码,采用的java拼装sql,然后sql非常复杂,大量无效流程分支的情况
+
+例如下面:一个看似简单的查询
+
+```java
+    public CoreReturnObject doQueryData(ArrayList<String> list,String[] arr,String strPlanSql,String bathYear)
+    {
+        String sql = CoreXmlSqlParsersFactory.getSql("FrmReportOutput.doQueryData").replace("#COLUMNS#", list.get(0));
+        sql +=CoreConverter.toSqlConditionString("t.STORAGE_NO", arr);
+        sql = sql.replace("#CONDITIONS#", list.get(1));
+        sql = sql + list.get(2);
+        sql += " )F1)F";
+        sql += " LEFT JOIN (SELECT SUM(NVL(T1.CUT_WEIGHT,'0')*NVL(T1.REAL_INDOUBLE_NUM,'0')) CUT_WEIGHT,#JUDGE_STOVE_NO1# T1.HEAT_PLAN_NO,T1.PRO_PLAN_ID,T1.GX_PLAN_NO FROM PLN_ZY_ZG_C T1,MIL_PLAN S1 WHERE T1.HEAT_PLAN_NO = S1.ID AND S1.BACK_PLAN_FLAG = '0'" +
+                " AND S1.BACK_SLAB_FLAG = '0'  AND T1.CUT_TARGET = '返废' #BATH_YEAR# GROUP BY #JUDGE_STOVE_NO1# T1.HEAT_PLAN_NO,T1.PRO_PLAN_ID,T1.GX_PLAN_NO) D ON F.PRO_PLAN_ID_ZG = D.PRO_PLAN_ID AND F.GX_PLAN_NO_ZG = D.GX_PLAN_NO #DD# ";
+        sql += " AND F.OUTSTOCK_TYPE_CODE = '800801' AND F.RK =1";
+        if(!strPlanSql.equals(""))
+        {
+            sql = sql.replace("#DD#", strPlanSql).replace("#JUDGE_STOVE_NO#", "JUDGE_STOVE_NO,").replace("#JUDGE_STOVE_NO1#", "T1.JUDGE_STOVE_NO,");
+        }else
+        {
+            sql = sql.replace("#DD#", "").replace("#JUDGE_STOVE_NO#", "").replace("#JUDGE_STOVE_NO1#", "");
+        }
+        if(!bathYear.equals(""))
+        {
+            sql = sql.replace("#BATH_YEAR#", " AND S1.BAL_YEAR_MONTH = '"+bathYear+"'");
+        }else
+        {
+            sql = sql.replace("#BATH_YEAR#", "");
+        }
+        return this.getData(sql);
+    }
+```
+
+存在以下问题
+
+1. 参数全装list请求里。
+
+2. 部分sql由前端告知(存在严重的注入风险)
+
+3. 前端后端采用信任方式(不验证身份)
+
+4. 在xml里面另外又维护了大段sql,任何一个修改需要 从3个地方结合sql才能知道在干嘛
+
+5. \#号占位符,风险极高
+
+6. 很随意就星星分组查询
+
+例如下面:一个看似简单的查询对应的sql.xml部分
+
+```sql
+select 
+#columns#,
+DECODE(T1.IS_DEALER, '0', '自用', '1', '双经销', '2', '来料加工','3','定销订购') IS_DEALER,
+       DECODE(T1.BACK_FLAG, '0', '正常坯', '1', '回炉坯','2','套尺坯') BACK_FLAG,
+       MAX(S1.PLAN_TIME_B) PLAN_TIME_B,
+       T2.LOCATION_NAME,
+       T2.LARY_NO,
+       T2.STORAGE_NO,
+       (SELECT T3.STORAGE_NAME
+          FROM YDM_BS_STORAGE T3
+         WHERE T3.STORAGE_NO = T2.STORAGE_NO) STORAGE_NAME,
+       T1.PRODUCT_FLAG,
+       T1.MAT_STATUS,
+       T1.STOVE_NO,
+       T1.JUDGE_STOVE_NO,
+       T1.JUDGE_STOVE_NO_LG,
+       T1.SOURE_NAME,
+       T1.MATERIAL_NAME,
+       T1.GRADENAME,
+       S1.ORDER_NO || '/' || S1.ORDER_SEQ AS ORDER_NO,
+       T1.DIMATER,
+       T1.ACT_LEN,
+       T1.FIX_NUM,
+       T1.FIX_LEN,
+       DECODE(T1.QCM_STAUS, '00', '合格', '11', '待处理', '22', '废品') QCM_STAUS,
+       T1.PLINE_NAME,
+       T1.BELONG_NAME,
+       MAX(TO_CHAR(T1.INSTOCK_TIME, 'YYYY-MM-DD HH24:MI:SS')) INSTOCK_TIME,
+       T1.MEMO,
+       T1.MEMO MEMO2,
+       (SELECT T2.BASENAME
+          FROM COM_BASE_INFO T2
+         WHERE T2.BASECODE = T1.JUDGE_RESULT_CODE) JUDGE_RESULT_CODE,
+       MAX((SELECT S1.PLINE_NAME
+             FROM PLN_ORDER_ZG_S S1
+            WHERE S1.PRO_PLAN_ID = T1.PRO_PLAN_ID_ZG
+              AND S1.GX_PLAN_NO = T1.GX_PLAN_NO_ZG)) PLINE_NAME_NEXT,
+       sum(T1.ACT_COUNT) as ACT_COUNT,
+       sum(T1.ACT_WEIGHT) as ACT_WEIGHT,
+        T1.MNG_LOCK_FLAG
+  FROM MAT_GP_M T1
+  LEFT JOIN YDM_GP_BUTTRESS T2
+    on T1.MAT_NO = T2.MAT_NO
+  LEFT JOIN YDM_BS_STORAGE S
+    ON S.STORAGE_NO = T2.STORAGE_NO
+  LEFT JOIN PLN_ORDER_ZG_S S1
+    ON T1.PRO_PLAN_ID_ZG = S1.PRO_PLAN_ID
+   AND T1.GX_PLAN_NO_ZG = S1.GX_PLAN_NO
+ WHERE T1.MAT_NO = T2.MAT_NO
+    AND T1.IS_SETFOOT = '0'
+  #something#
+ group by T1.IS_DEALER,
+          T1.BACK_FLAG,
+          T2.LOCATION_NAME,
+          T2.LARY_NO,
+          T2.STORAGE_NO,
+          T1.PRODUCT_FLAG,
+          T1.MAT_STATUS,
+          T1.STOVE_NO,
+          T1.JUDGE_STOVE_NO,
+          T1.JUDGE_STOVE_NO_LG,
+          T1.SOURE_NAME,
+          T1.MATERIAL_NAME,
+          T1.GRADENAME,
+          S1.ORDER_NO,
+          S1.ORDER_SEQ,
+          T1.DIMATER,
+          T1.ACT_LEN,
+          T1.FIX_NUM,
+          T1.FIX_LEN,
+          T1.QCM_STAUS,
+          T1.PLINE_NAME,
+          T1.BELONG_NAME,
+          T1.MEMO,
+          T1.JUDGE_RESULT_CODE,
+          T1.MNG_LOCK_FLAG
+```
+
+存在以下问题
+
+1. 字段随意转码 (正确做法是在java中转换,索引之敌)
+
+2. 随意的子查询 (在开发中是大忌)
+
+3. 随意的分组查询(分组查询不允许用在业务模块上)
+
+4. 多张表查询,应该尽量采用主表查询,从表拼装,多次查询的方式,这里为了省事一锅炖。
+
+5. 存在大量魔法占位符 \#column#,#something# 之类,难以理解 (带来了天量的维护困难)
+
+## 1.2. 并发及带来的相关灾难
+
+#### 1.2.1 概念
+
+    事务
+
+        一件事情,不管多少步骤,要么做完,要么不做,不允许出现中间状态
+
+> 例如:
+> 
+> 小明给小方银行转账。步骤如下:
+> 1、小明,账上扣掉1块
+> 
+> 2、小明流水上增加一条支出信息
+> 
+> 3、小方,账上增加1块
+> 
+> 4、小方流水上增加一条收入信息
+
+    
+
+    如果不带事务,那么中间状态不能是每方都能接受的
+
+所以,我们在实际工作中带上事务
+
+> 1、先冻结小明那条数据(其他人不能写或者读(不包括脏读))
+> 
+> 2、小明zhangs
+> 
+> 2、流水表写入2条可回退事务插入
+> 
+> 3、冻结小方的那条数据(其他人不能读或者写)
+
+    事务死锁
+
+1. 暴力解锁
+
+2. 并发
+
+3. 串行
+
+4. 并发及带来的相关灾难
+
+5. 项目健壮的重要性
+
+6. 翻新发现问题并带来可靠维护文档
+
+7. 可扩展开发性
+
+8. 翻新步骤
+
+9. 怎么保证翻新是可靠的,而不是带来新问题翻新步骤
+
+10. 施工进度怎么控制
+
+11. 旧系统下线的时机
+
+12. 甲方操作人员需要配合做什么
+
+13. 旧系统产生的历史错误数据如何处理
+
+14. 告警中台推销

+ 31 - 0
规划/告警系统.md

@@ -0,0 +1,31 @@
+# 告警系统
+
+## 组成
+
+1. nacos注册器
+
+2. 若干告警规则服务器
+
+3. 告警后端
+
+4. 告警vue前端
+
+5. 告警观察员
+
+## 工作原理
+
+> 需要的告警,往nacos上注册
+> 
+> 告警后端轮询执行这些注册
+> 
+> 告警结果按照扫描批次写入数据库中
+> 
+> 告警vue来进行紧急扫描以及观察扫描结果
+
+## 未来
+
+> 1、发现一种不一致就往上面加一种
+> 
+> 2、每种错误类型,都尽量实现故障修复机制
+> 
+> 3、基于告警反向结合操作,去找故障真实出现原因。

+ 11 - 0
规划/数据健康.md

@@ -0,0 +1,11 @@
+# 数据健康
+
+## 数据扎帐
+
+> 1、在旧系统所有模块下线后。
+> 
+> 2、设定个下线后某天作为划断时间。
+> 
+> 3、将所有表的不平衡数据做一条无条件对冲数据。
+> 
+> 4、所有对冲都健康后,后面的数据质量我们公司完全兜底

+ 85 - 0
规划/概念.md

@@ -0,0 +1,85 @@
+# 概念
+
+## 事务
+
+        一件事情,不管多少步骤,要么做完,要么不做,不允许出现中间状态
+
+> 例如:
+> 
+> 小明给小方银行转账。步骤如下:
+> 1、小明,账上扣掉1块
+> 
+> 2、小明流水上增加一条支出信息
+> 
+> 3、小方,账上增加1块
+> 
+> 4、小方流水上增加一条收入信息
+
+所以,我们在实际工作中带上事务
+
+> 1、先冻结小明那条数据(其他人不能写或者读(不包括脏读))
+> 
+> 2、小明账上扣掉1块(冻结行数据)
+> 
+> 3、流水表写入2条可回退事务插入
+> 
+> 4、冻结小方的那条数据(其他人不能读或者写)
+> 
+> 5、提交,让上面4个步骤完成,并解冻
+
+#### 事务死锁
+
+转账并不是一个人在转,在大量操作情况下会发生这个现象
+
+同一时间,小明向小方转钱,同一时间小方向小明转钱
+
+> 1、小明冻结(小明转账给小方)
+> 
+> 2、小方冻结(小方转账给小明)
+> 
+> 3、打算冻结小方,发现冻不住,等待解冻后再冻住(小明转账给小方)
+> 
+> 4、打算冻结小明,发现冻不住,等待解冻后再冻住(小方转账给小明)
+> 
+> 5、双方等到天荒地老。或者到超时
+
+#### 暴力运维
+
+用户会反应,出不了库,或者入不了库,或者页面卡住了
+
+然后运维人员二话不说重启服务
+
+> 除了这个死锁业务错误提交
+> 
+> 另外的正常业务也会受这次暴力重启影响
+
+# 避免故障
+
+#### 串行(上策)
+
+如果解决事务死锁,项目能健康一半
+
+> 1、业务服务端不执行代码,只是把代码发队列
+> 
+> 2、队列服务器消费,串行消费
+> 
+> 3、消费完成后结果写入redis,由业务服务端轮询拉取
+> 
+> 用户无感知
+
+#### 缓存锁(中策)
+
+> 1、每次执行前,锁住主表对应行
+> 
+> 2、发现锁不住时,业务终止,并提示用户等下再试
+> 
+> 用户偶尔被打扰
+> 无法保证锁干净
+
+#### 完全由告警系统兜底(下策)
+
+> 1、让系统继续这样
+> 
+> 2、告警不停刷出问题所在
+> 
+> 3、将常见问题模式化

+ 45 - 0
规划/翻新原因.md

@@ -0,0 +1,45 @@
+# 翻新原因
+
+## 旧系统故障严重
+
+包含事务锁死在内,每月要集中处理的问题非常非常多
+
+## 旧系统不必要复杂度太高
+
+代码中应该实现的逻辑,全部放在sql
+
+> 1、性能极差
+> 
+> 2、所以修改都要基于sql一级的修改
+> 
+> 3、项目逻辑分散,几乎不可跟踪
+
+## 旧系统缺乏核心维护人员
+
+> 1、外包人员不可靠
+> 
+> 2、代码中魔法约定过多。
+> 
+> 3、外包人员的传承意愿不大
+
+## 旧系统缺乏代码
+
+> 1、大量代码在封装文件里
+> 
+> 2、暴露出的文件不是最新代码
+
+## 旧系统缺乏文档
+
+> 1、完全没有任何可读文档
+> 
+> 2、翻新后,我们可以留下基于逻辑关系的文档
+
+## 旧系统页面隔离
+
+> 1、我们可以一个页面一个页面替换
+> 
+> 2、我们可以一个功能一个功能比对翻新替换
+> 
+> 3、我们可以一个功能一个功能质量保证之后替换
+
+## 

+ 49 - 0
规划/翻新质量保证.md

@@ -0,0 +1,49 @@
+# 翻新质量保证
+
+## 翻新顺序
+
+> 1、调研,我们将调研所有用户,将完全没有使用的页面停掉。
+> 
+> 2、将不能作为功能,但是又常常在操作的业务做成功模块可调用,避免手动出错
+> 
+> 3、根据各部门成员使用情况,排出翻新顺序,并制作原型
+
+## 翻新页面交互一致性
+
+> 1、原型优先。
+> 
+> 2、找客户评审签字
+> 
+> 3、vue出效果,给客户展示
+> 
+> 4、客户对效果签字
+
+## 翻新功能一致性
+
+> 1、部署测试服
+> 
+> 2、依据用户使用情况,以及代码中存在的判定分支,对每一种子情况设计测试用例。
+> 
+> 3、编写测试用例执行完后的回收脚本,保证可以再次测试
+> 
+> 4、测试用例对新旧服务器进行同步比对测试
+
+## 交付
+
+> 1、公司提交的tag版本上会标明完成了什么
+> 
+> 2、前端运维人员做一次验收测试
+> 
+> 3、将旧系统对应功能停用,并且公告要大家这块业务用这个
+> 
+> 4、如果出现了确实的问题,撤销,并让旧功能顶上
+
+## 交付周期
+
+> 1、月初拟定计划
+> 
+> 2、公司按照计划开发,并且提供部署包
+> 
+> 3、月末邀请相关单位进行测试使用。
+> 
+> 4、月底上线该计划的功能模块

+ 78 - 0
规划/项目体量定性理解.md

@@ -0,0 +1,78 @@
+# 项目体量定性理解
+
+## 整体结构
+
+![](项目体量定性理解资源/整体结构.png)
+
+## 客户端
+
+#### Client
+
+C# 做的客户端,其中有部分框架未提供代码。
+
+![](项目体量定性理解资源/ScreenShot_2026-02-25_113812_518.png)
+
+总共cs文件有**<mark>9641</mark>**个。
+
+## 服务端
+
+#### CoreFS.Authentication
+
+java做的授权服务
+
+![](项目体量定性理解资源/ScreenShot_2026-02-25_114507_145.png)
+
+> 【授权服务】体量比较小,基本上不需要任何开发和修改。
+
+#### CoreUpLoadApp
+
+Java做的文件管理工具
+
+> 代码不多,主要目的是
+> 
+> 1、更新客户端用
+> 
+> 2、传输工艺文件等
+
+#### ServiceMesToJh
+
+java做的接口程序
+
+> 唯一可以用 IDEA + Tomcat7.5执行的项目
+
+#### 难搞的正式业务项目
+
+业务的.cs文件独立存在于项目中
+
+至于为什么这么划分,似乎很随意
+
+| 项目名称        |     |
+| ----------- | --- |
+| INTServer   |     |
+| JGMESServer |     |
+| LGMESServer |     |
+| LIMSServer  |     |
+| MESServer   |     |
+| PSSServer   |     |
+
+java文件合计 **<mark>3094</mark>** 个
+
+xml文件合计**<mark>**1763**</mark>**个
+
+## 
+
+## 数据库
+
+| 账号         | 表空间     | 表/视图 数量 | 存储过程 |
+| ---------- | ------- | ------- | ---- |
+| core       | CX_DB   | 49      | 0    |
+| CG_DLINK   | PMS_DB  | 0       | 0    |
+| cxmeter    | CX_DB   | 0       | 0    |
+| CXUSER     | CX_BIG  | 1337    | 257  |
+| LIMSUSER   | LIMS_DB | 100     | 4    |
+| cx_mes     |         | 1/70    | 13   |
+| CXREADONLY |         | 2       | 0    |
+
+表的数量很多,表列数非常大,建表随意
+
+其中存储过程当作定时任务在做

BIN
规划/项目体量定性理解资源/ScreenShot_2026-02-25_113812_518.png


BIN
规划/项目体量定性理解资源/ScreenShot_2026-02-25_114507_145.png


BIN
规划/项目体量定性理解资源/整体结构.png


+ 1401 - 0
规划/项目复杂度理解.md

@@ -0,0 +1,1401 @@
+# 项目复杂度理解
+
+#### 链路复杂度
+
+前端:
+
+<img title="" src="项目复杂度理解资源/ScreenShot_2026-02-25_151229_884.png" alt="ScreenShot_2026-02-25_151229_884.png" width="877">
+
+前端设计页面
+
+![ScreenShot_2026-02-25_152027_078.png](项目复杂度理解资源/ScreenShot_2026-02-25_152027_078.png)
+
+前端代码
+
+```csharp
+        protected override void DoAdd()
+        {
+            if (ActiveRow != null)
+            {
+                if (MessageUtil.ShowYesNoAndQuestion("是否上料?") == DialogResult.No)
+                    return;
+                var ccp = new CoreClientParam();
+                ccp.ServerName = "com.steering.mes.mcp.Mch.FrmMcpLoading";
+                ccp.MethodName = "DoAdd";
+                ccp.ServerParams = new object[]
+                {
+                    ActiveRow.HeatPlanNo,
+                    ActiveRow.HeatPlanSqe,
+                    JSONFormat.Format(Value), Gx,
+                    mchControlBase1.ScrappedList.Select(JSONFormat.Format).ToList(),
+                    mchControlBase1.SuspiciousList.Select(JSONFormat.Format).ToList()
+                };
+                ccp = ExecuteNonQuery(ccp, CoreInvokeType.Internal);
+                if (ccp.ReturnCode != -1)
+                {
+                    MessageUtil.ShowTips(ccp.ReturnInfo);
+                    if (ccp.ReturnInfo.Equals("上料成功!"))
+                    {
+                        Query();
+                        doOver();
+                    }
+                 }
+             }
+        }
+```
+
+> 可以看到
+> 
+> 1、前后端的参数是魔法约定。
+> 
+> 2、前端的主要工作是拼装sql。
+
+我们再来看一条复杂一点的前端代码
+
+```csharp
+       private void QueryData()
+        {
+            List<MatGpMEntity> listSource = null;
+
+            if (chkStoveNo.Checked && string.IsNullOrEmpty(this.txtStoveNo.Text))
+            {
+                MessageUtil.ShowTips("请输入熔炼炉号!");
+                this.txtStoveNo.Focus();
+                return;
+            }
+            if (chkJudgeNo.Checked && string.IsNullOrEmpty(this.txtJudgeNo.Text))
+            {
+                MessageUtil.ShowTips("请输入判定炉号!");
+                this.txtJudgeNo.Focus();
+                return;
+            }
+
+            string stoveNo = "";
+            string judgeNo = "";
+            string orderNo = "";
+            string grade = "";
+            string dimter = "";
+            string sourceName = "";
+            ArrayList list = new ArrayList();
+            string strSql = "";
+            string strGroup = "";
+            string strOut = "";
+
+
+            if (chkStoveNo.Checked)
+            {
+                stoveNo = this.txtStoveNo.Text.Trim();
+                strOut += " AND T1.STOVE_NO = '" + stoveNo + "'";
+            }
+            if(chkJudgeNo.Checked)
+            {
+                judgeNo = this.txtJudgeNo.Text.Trim();
+                strOut += " AND T1.JUDGE_STOVE_NO = '" + judgeNo + "'";
+            }
+            if (chkOrder.Checked)
+            {
+                orderNo = this.txtOrder.Text.Trim();
+                strOut += " AND S1.ORDER_NO||'/'||S1.ORDER_SEQ LIKE '%" + orderNo + "'";
+            }
+            if(chkSource.Checked)
+            {
+                sourceName = this.txtSource.Text.Trim();
+                strOut += " AND T1.SOURE_NAME LIKE '%" + sourceName + "'";
+            }
+            if(chkDimter.Checked)
+            {
+                dimter = this.txtDimter.Text.Trim();
+                strOut += " AND T1.DIMATER LIKE '%" + dimter + "'";
+            }
+            if(chkGrade.Checked)
+            {
+                grade = this.txtGrade.Text.Trim();
+                strOut += " AND T1.GRADENAME LIKE '%" + grade + "'";
+            }
+            string strKey = "";
+            CheckBox item;
+            for (int i = 0; i < this.myCheckedListBox1.Controls.Count; i++)
+            {
+                try
+                {
+                    item = this.myCheckedListBox1.Controls[i] as CheckBox;
+
+                    if (item != null && item.Checked)
+                    {
+                        strKey = item.Name;
+                        if (strKey.Equals("StoveNo"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.STOVE_NO";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.STOVE_NO";
+                        }
+                        else if (strKey.Equals("PlanMemo"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "MAX(T1.PLAN_MEMO) PLAN_MEMO";
+                           // strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "MAX(T1.PLAN_MEMO) PLAN_MEMO";
+                        }
+                        else if (strKey.Equals("JudgeStoveNoLg"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.JUDGE_STOVE_NO_LG";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.JUDGE_STOVE_NO_LG";
+                        }
+                        else if (strKey.Equals("JudgeStoveNo"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.JUDGE_STOVE_NO";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.JUDGE_STOVE_NO";
+                        }
+                        else if (strKey.Equals("MaterialName"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.MATERIAL_NAME";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.MATERIAL_NAME";
+                        }
+                        else if (strKey.Equals("Gradename"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.GRADENAME";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.GRADENAME";
+                        }
+                        else if (strKey.Equals("StdName"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.STD_NAME";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.STD_NAME";
+                        }
+                        else if (strKey.Equals("Dimater"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.DIMATER";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.DIMATER";
+                        }                       
+                        else if (strKey.Equals("FixNum"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.FIX_NUM";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.FIX_NUM";
+                        }
+                        else if (strKey.Equals("FixLen"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.FIX_LEN";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.FIX_LEN";
+                        }
+                        else if (strKey.Equals("ActLen"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.ACT_LEN";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.ACT_LEN";
+                        }
+                        else if (strKey.Equals("CutNum1"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "ROUND(T1.ACT_LEN/2,1)CUT_NUM1";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "ROUND(T1.ACT_LEN/2,1)";
+                        }
+                        else if (strKey.Equals("CutNum2"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "ROUND(T1.ACT_LEN/3,1)CUT_NUM2";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "ROUND(T1.ACT_LEN/3,1)";
+                        }
+                        else if (strKey.Equals("CutNum3"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "ROUND(T1.ACT_LEN/4,1)CUT_NUM3";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "ROUND(T1.ACT_LEN/4,1)";
+                        }
+                        else if (strKey.Equals("CutNum4"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "ROUND(T1.ACT_LEN/5,1)CUT_NUM4";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "ROUND(T1.ACT_LEN/5,1)";
+                        }
+                        else if (strKey.Equals("BelongName"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.BELONG_NAME";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.BELONG_NAME";
+                        }
+                        else if (strKey.Equals("JudgeResultCode"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "(SELECT T2.BASENAME FROM COM_BASE_INFO T2 WHERE T2.BASECODE = T1.JUDGE_RESULT_CODE )JUDGE_RESULT_CODE";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.JUDGE_RESULT_CODE";
+                        }
+                        else if (strKey.Equals("InstockTime"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "MAX(TO_CHAR(T1.INSTOCK_TIME,'YYYY-MM-DD HH24:MI:SS'))INSTOCK_TIME";
+                            //strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.JUDGE_RESULT_CODE";
+                        }
+                        else if (strKey.Equals("ProductFlag"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.PRODUCT_FLAG";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.PRODUCT_FLAG";
+                        }
+                        else if (strKey.Equals("MatStatus"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.MAT_STATUS";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.MAT_STATUS";
+                        }
+                        else if (strKey.Equals("PlineName"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.PLINE_NAME";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.PLINE_NAME";
+                        }
+                        else if (strKey.Equals("QcmStaus"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "DECODE(T1.QCM_STAUS,'00','合格','11','待处理','22','废品')QCM_STAUS";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.QCM_STAUS";
+                        }
+                        else if (strKey.Equals("StorageName"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "(SELECT T3.STORAGE_NAME FROM YDM_BS_STORAGE T3 WHERE T3.STORAGE_NO = T2.STORAGE_NO)STORAGE_NAME";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T2.STORAGE_NO";
+                        }
+                        else if (strKey.Equals("LocationName"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T2.LOCATION_NAME";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T2.LOCATION_NAME";
+                        }
+                        else if (strKey.Equals("LaryNo"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T2.LARY_NO";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T2.LARY_NO";
+                        }
+                        else if (strKey.Equals("OrderNo"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "S1.ORDER_NO||'/'||S1.ORDER_SEQ AS ORDER_NO";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "S1.ORDER_NO,S1.ORDER_SEQ";
+                        }
+                        //else if (strKey.Equals("QcmMemo"))
+                        //{
+                        //    strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "MAX((SELECT T.MEMO FROM QCM_GP_JUDGE_APPLY T WHERE T.JUGDE_APPLY_CODE || T.JUGDE_APPLY_SQE = T1.JUGDE_APPLY_CODE GROUP BY T.JUGDE_APPLY_CODE,T.JUGDE_APPLY_SQE,T.MEMO))QCM_MEMO";
+                        //    //strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "S1.ORDER_NO,S1.ORDER_SEQ";
+                        //}
+                        //else if (strKey.Equals("JudgeMemo"))
+                        //{
+                        //    strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "MAX((SELECT T.JUDGE_MEMO FROM QCM_GP_JUDGE_APPLY T WHERE T.JUGDE_APPLY_CODE || T.JUGDE_APPLY_SQE = T1.JUGDE_APPLY_CODE GROUP BY T.JUGDE_APPLY_CODE,T.JUGDE_APPLY_SQE,T.JUDGE_MEMO))JUDGE_MEMO";
+                        //    //strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "S1.ORDER_NO,S1.ORDER_SEQ";
+                        //}
+                        else if (strKey.Equals("PlineNameNext"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "MAX((SELECT S1.PLINE_NAME FROM PLN_ORDER_ZG_S S1 WHERE S1.PRO_PLAN_ID = T1.PRO_PLAN_ID_ZG AND S1.GX_PLAN_NO = T1.GX_PLAN_NO_ZG))PLINE_NAME_NEXT";
+                        }
+                        else if (strKey.Equals("PlanTimeB"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "MAX(S1.PLAN_TIME_B) PLAN_TIME_B";
+                        }else if(strKey.Equals("Memo"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.MEMO";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.MEMO";
+                        }else if(strKey.Equals("SoureName"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "T1.SOURE_NAME";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.SOURE_NAME";
+                        }
+                        else if (strKey.Equals("IsDealer"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + "DECODE(T1.IS_DEALER,'0','自用','1','双经销','2','来料加工','3','定销订购')IS_DEALER";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.IS_DEALER";
+                        }
+                        else if(strKey.Equals("BackFlag"))
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",") + " DECODE(T1.BACK_FLAG,'0','正常坯','1','回炉坯','2','套尺坯','3','掉队坯')BACK_FLAG";
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "" : ",") + "T1.BACK_FLAG";
+                        }
+
+                        else
+                        {
+                            strSql += (string.IsNullOrEmpty(strSql) ? "t." : ",t.") + strKey;
+                            strGroup += (string.IsNullOrEmpty(strGroup) ? "t." : ",t.") + strKey;
+                        }
+                    }
+
+                }
+                catch { }
+            }
+            strSql += (string.IsNullOrEmpty(strSql) ? "" : ",");
+            strGroup = (string.IsNullOrEmpty(strGroup) ? "" : "group by ") + strGroup;
+
+            string _sql = strOut + strGroup;
+            list.Add(strSql);
+            list.Add(strOut);
+            list.Add(strGroup);
+            switch (this.CustomInfo)
+            {
+                case "STORAGE_NO":
+                    listSource = EntityHelper.GetData<MatGpMEntity>(
+                    "Core.LgMes.Server.Stuffmanage.Report.FrmStoreSummary.queryData", new object[] { list, arr }, this.ob);
+                    break;
+                case "BELONG_CODE":
+                    listSource = EntityHelper.GetData<MatGpMEntity>(
+               "Core.LgMes.Server.Stuffmanage.Report.FrmStoreSummary.queryDataBelong", new object[] { list, belongArr }, this.ob);
+                    break;
+                case "120501":
+                    listSource = EntityHelper.GetData<MatGpMEntity>(
+                                   "Core.LgMes.Server.Stuffmanage.Report.FrmStoreSummary.queryDataAll", new object[] { list,this.CustomInfo}, this.ob);
+                    break;
+                case "120504":
+                    listSource = EntityHelper.GetData<MatGpMEntity>(
+                                   "Core.LgMes.Server.Stuffmanage.Report.FrmStoreSummary.queryDataAll", new object[] { list, this.CustomInfo }, this.ob);
+                    break;
+            }
+
+            MatGpMEntitybindingSource.DataSource = listSource;
+
+
+            bool bContains = false, bChecked = false;
+
+            for (int i = 0; i < this.ultraGrid1.DisplayLayout.Bands[0].Columns.Count; i++)
+            {
+                try
+                {
+                    bContains = false;
+                    strKey = this.ultraGrid1.DisplayLayout.Bands[0].Columns[i].Key;
+
+                    for (int j = 0; j < this.myCheckedListBox1.Controls.Count; j++)
+                    {
+                        try
+                        {
+                            item = this.myCheckedListBox1.Controls[j] as CheckBox;
+
+                            if (item.Name.Equals(strKey))
+                            {
+                                bContains = true;
+                                bChecked = item.Checked;
+                                break;
+                            }
+                        }
+                        catch { }
+                    }
+
+                    if (bContains)
+                    {
+                        this.ultraGrid1.DisplayLayout.Bands[0].Columns[i].Hidden = !bChecked;
+                    }
+                }
+                catch { }
+            }
+
+            this.SetStaticsInfo();
+            CommonMethod.SetGridSumArea(this.ultraGrid1);
+        }
+```
+
+前端不盘逻辑,全是拼装sql,难以理解,并且完全无法进行后端单元测试
+
+后端代码
+
+```java
+public CoreReturnObject DoAdd(String HeatPlanNo, String Sqe1, String load,
+            String gx, ArrayList<String> ScrappedList,
+            ArrayList<String> SuspiciousList) {
+        CoreReturnObject core = new CoreReturnObject();
+        Connection connection = this.getDao(CoreConstantData.sysbeanstr)
+                .getConnection();
+         //  TZH 24.4.24 注销物流接口
+//        Connection connection2 = this.getDao("TmsDao").getConnection();
+        PreparedStatement psta = null;
+        Date now = new Date();
+        SimpleDateFormat dateFormat = new SimpleDateFormat(
+                "yyyy-MM-dd HH:mm:ss", Locale.CHINA);
+        SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyyMMdd",
+                Locale.CHINA);
+        SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyyMM",
+                Locale.CHINA);
+        String systime = dateFormat.format(now);
+        String BalYearMothDay = dateFormat1.format(now);
+        String BalYearMoth = ""; //改25号结转
+
+        try {
+            connection.setAutoCommit(false); //
+             //  TZH 24.4.24 注销物流接口
+//            connection2.setAutoCommit(false); // 取消自动提交事务
+            String addport = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.AddPortNew");// 新增管号队列
+            PreparedStatement patsport = connection.prepareStatement(addport);
+
+            String addOut = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.AddOutList");// 新增出库记录
+            PreparedStatement patsAddOut = connection.prepareStatement(addOut);
+            String addOutlist = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.AddOutListQuan");// 新增产权出库
+            PreparedStatement patsAddOutlist = connection
+                    .prepareStatement(addOutlist);
+
+            String sqlAdd = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.AddLoadResult");// 新增上料实绩
+            PreparedStatement patAdd = connection.prepareStatement(sqlAdd);
+            String sqlupdate = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.updatePlnZyRclM");// 修改加工计划表从表的实际上料支吨
+            PreparedStatement patupdate = connection
+                    .prepareStatement(sqlupdate);
+
+            String sqlupdate2 = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.updatePlnZyRclM2");// 修改加工计划表从表的实际上料支吨
+            PreparedStatement patupdate2 = connection
+                    .prepareStatement(sqlupdate2);
+
+            String sqlupdatepln = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.updatePlnZyRclMpln");// 修改加工计划表
+            PreparedStatement patupdatepln = connection
+                    .prepareStatement(sqlupdatepln);
+            String addPlnInfo = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.AddComInfoResult");// 新增公共信息
+            PreparedStatement patsPlan = connection
+                    .prepareStatement(addPlnInfo);
+            String deleteButt = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.deleteButter");// 删除位置表
+            PreparedStatement patsButt = connection
+                    .prepareStatement(deleteButt);
+            String updateMat = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.updateMatZcPlan");// 修改库存状态
+            PreparedStatement patsUpMat = connection
+                    .prepareStatement(updateMat);
+
+            String updatePath = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.UpdatePath");// 修改队列表工艺路径
+            PreparedStatement pastupdatePath = connection
+                    .prepareStatement(updatePath);
+
+            String deleteMat = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.CopyBcMat");// 复制物料主表到MAT_BC_BACKUP表
+            PreparedStatement patsMat = connection.prepareStatement(deleteMat);
+            String deteleBcMat = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.DeteleBcMat");// 删除物料主表
+            PreparedStatement deteleBcMatPath = connection
+                    .prepareStatement(deteleBcMat);
+            String addPlnInfo1 = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.AddComInfoResult1");// 修改队列表材料,工序状态
+            PreparedStatement patsPlan1 = connection
+                    .prepareStatement(addPlnInfo1);
+
+            String InsertIntoOrderGroupNo = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.InsertIntoOrderGroupNo");// 修改队列表材料,工序状态
+            PreparedStatement patsInsertIntoOrderGroupNo = connection
+                    .prepareStatement(InsertIntoOrderGroupNo);
+
+            // 获取加工计划实体了
+            PlnZyJgxMEntity pln = PlanService.getSendHttPlanCInfo3(connection,
+                    HeatPlanNo);
+            BalYearMoth = com.steering.common.StringTool.GetBalYear(com.steering.common.StringTool.GetSupplyUnit(pln.getPlineCode())); //改25号结转
+
+            /*
+             * // 获取加工计划实体了 PlnZyJgxCEntity plnC =
+             * PlanService.getSendHttPlanCInfo3C(connection, HeatPlanNo,Sqe);
+             */
+
+            MchLoadingResultEntity Result = EntityTool.getEntityByJSONStr(load,
+                    MchLoadingResultEntity.class);
+
+            // region 检查
+            if (pln == null) {
+                core.setV_errMsg("找不到炉计划数据!");
+                return core;
+            }
+
+            // 计划关闭 或计划完成 继续上料 清除结炉状态
+            if (pln.getPlanstatus().equals("40")
+                    || pln.getPlanstatus().equals("30")) {
+
+                String sql = CoreXmlSqlParsersFactory
+                        .getSql("FrmMcpLoading.CancelNodeFlag");
+                sql = EntityTool.fillSqlByEntity(sql, Result);
+                psta = connection.prepareStatement(sql);
+                psta.executeUpdate();
+                psta.close();
+
+            } else if (!pln.getPlanstatus().equals("10")
+                    && !pln.getPlanstatus().equals("20")) {
+                core.setV_errMsg("炉计划不处于下发或生产中状态!");
+                return core;
+            }
+
+            String cutFalg = "";
+            String sql = CoreXmlSqlParsersFactory
+                    .getSql("MchComm.queryComInfo");// 查询 工序是否是结炉状态
+            psta = connection.prepareStatement(sql);
+            psta.setString(1, HeatPlanNo);
+            psta.setString(2, Result.getBatchNo());
+            psta.setString(3, gx);
+            ResultSet rs = psta.executeQuery();
+            if (rs.next()) {
+                cutFalg = rs.getString("STATION_STATUS");
+            }
+
+            if (cutFalg.equals("2")) {
+                core.setV_errMsg("已结炉,不允许此操作!");
+                return core;
+            }
+            rs.close();
+            psta.close();
+            // endregion
+
+            String resultNo = "";
+            int count = 0;
+            int detCount = 0;
+            double wt = 0d;
+
+            if (StringTool.isInteger(Result.getFailNum())) {
+                detCount = Integer.parseInt(Result.getFailNum());
+            }
+            if (StringTool.isInteger(Result.getProNum())) {
+                count = Integer.parseInt(Result.getProNum());
+            }
+            if (StringTool.isDouble(Result.getProWt())) {
+                wt = Double.parseDouble(Result.getProWt());
+            }
+
+            if (StringTool.isInteger(Result.getProWt())) {
+                wt = Double.parseDouble(Result.getProWt());
+            }
+
+            if (count <= 0) {
+                core.setV_errMsg("请输入正确的上料支!");
+                return core;
+            }
+
+            if (wt <= 0.000001) {
+                core.setV_errMsg("上料重量异常,,请重新查询再上料!");
+                return core;
+            }
+
+            if (count < detCount) {
+                core.setV_errMsg("废品支数不能大于上料支!");
+                return core;
+            }
+
+            // 获取最大实绩编号
+            sql = CoreXmlSqlParsersFactory
+                    .getSql("MchComm.queryLoadNewResultNo");
+            psta = connection.prepareStatement(sql);
+            psta.setObject(1, pln.getPlineCode() + gx);
+            psta.setObject(2, pln.getPlineCode() + gx);
+            ResultSet rs1 = psta.executeQuery();
+            if (rs1.next()) {
+                resultNo = rs1.getString("RESULT_NO");
+            }
+            rs1.close();
+            psta.close();
+
+            String StorageNo = PlanService.GetStorageIn(pln.getPlineCode(),
+                    connection);
+
+            String sqlMatNo = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.queryMatZc");// 查询新增物料信息
+            psta = connection.prepareStatement(sqlMatNo);
+            psta.setObject(1, pln.getHeatPlanNo());
+            psta.setObject(2, Result.getBatchNo());
+            psta.setObject(3, Result.getBatchGroudNo());
+            psta.setObject(4, StorageNo);
+            psta.setObject(5, count + 1);
+            rs = psta.executeQuery();
+            List<MatBcMEntity> listMat = EntityTool.getEntitysByRs(rs,
+                    MatBcMEntity.class);
+            rs.close();
+            psta.close();
+
+            if (listMat.size() != count) {
+                core.setV_errMsg("无足够的库存!");
+                return core;
+            }
+
+            String sendOut = querySendOut(connection, "800801", pln
+                    .getPlineCode());
+            // 获取出库流水号
+            String butessMatNo = querySendOutList(connection, sendOut);
+            int outNo = Integer.parseInt(butessMatNo.substring(butessMatNo
+                    .length() - 4, butessMatNo.length()));
+
+            String sendOutlist = querySendOut(connection, "800809", pln
+                    .getPlineCode());
+            // 获取出库流水号
+            String butessMatNolist = querySendOutList(connection, sendOutlist);
+            int outNolist = Integer.parseInt(butessMatNolist.substring(
+                    butessMatNolist.length() - 4, butessMatNolist.length()));
+
+            List<PlnZyJgxCEntity> plnCs = PlanService.getSendHttPlanCInfo3C(
+                    connection, HeatPlanNo, Result.getBatchNo(), Result
+                            .getBatchGroudNo());
+
+            if (pln.getSiglLen().equals("")
+                    || Double.parseDouble(pln.getSiglLen()) < 0.0001) {
+
+                String sqlGroup = CoreXmlSqlParsersFactory
+                        .getSql("FrmMcpLoading.queryOrderGroupNo");//
+                psta = connection.prepareStatement(sqlGroup);
+                psta.setObject(1, pln.getOrderNo() + "/" + pln.getOrderSeq());
+                rs = psta.executeQuery();
+                if (!rs.next()) {
+
+                    patsInsertIntoOrderGroupNo.setObject(1, pln.getOrderNo()
+                            + "/" + pln.getOrderSeq());
+                    patsInsertIntoOrderGroupNo.setObject(2, pln.getLengthmax());
+                    patsInsertIntoOrderGroupNo.setObject(3, pln.getLengthmin());
+                    patsInsertIntoOrderGroupNo.setObject(4, "001");
+                    patsInsertIntoOrderGroupNo.setObject(5, "<=");
+                    patsInsertIntoOrderGroupNo.setObject(6, ">=");
+                    patsInsertIntoOrderGroupNo.addBatch();
+
+                    if (pln.getLengthdisc().trim().equals("R1")) {
+                        patsInsertIntoOrderGroupNo.setObject(1, pln
+                                .getOrderNo()
+                                + "/" + pln.getOrderSeq());
+                        patsInsertIntoOrderGroupNo.setObject(2, pln
+                                .getLengthmin());
+                        patsInsertIntoOrderGroupNo.setObject(3, "4.88");
+                        patsInsertIntoOrderGroupNo.setObject(4, "002");
+                        patsInsertIntoOrderGroupNo.setObject(5, "<");
+                        patsInsertIntoOrderGroupNo.setObject(6, ">=");
+                        patsInsertIntoOrderGroupNo.addBatch();
+                    } else if (pln.getLengthdisc().trim().equals("R2")) {
+                        patsInsertIntoOrderGroupNo.setObject(1, pln
+                                .getOrderNo()
+                                + "/" + pln.getOrderSeq());
+                        patsInsertIntoOrderGroupNo.setObject(2, pln
+                                .getLengthmin());
+                        patsInsertIntoOrderGroupNo.setObject(3, "7.62");
+                        patsInsertIntoOrderGroupNo.setObject(4, "002");
+                        patsInsertIntoOrderGroupNo.setObject(5, "<");
+                        patsInsertIntoOrderGroupNo.setObject(6, ">=");
+                        patsInsertIntoOrderGroupNo.addBatch();
+                    } else if (pln.getLengthdisc().trim().equals("R3")) {
+                        patsInsertIntoOrderGroupNo.setObject(1, pln
+                                .getOrderNo()
+                                + "/" + pln.getOrderSeq());
+                        patsInsertIntoOrderGroupNo.setObject(2, pln
+                                .getLengthmin());
+                        patsInsertIntoOrderGroupNo.setObject(3, "10.36");
+                        patsInsertIntoOrderGroupNo.setObject(4, "002");
+                        patsInsertIntoOrderGroupNo.setObject(5, "<");
+                        patsInsertIntoOrderGroupNo.setObject(6, ">=");
+                        patsInsertIntoOrderGroupNo.addBatch();
+                    } else if (!pln.getShortest().equals("")) {
+                        patsInsertIntoOrderGroupNo.setObject(1, pln
+                                .getOrderNo()
+                                + "/" + pln.getOrderSeq());
+                        patsInsertIntoOrderGroupNo.setObject(2, pln
+                                .getLengthmin());
+                        patsInsertIntoOrderGroupNo.setObject(3, pln
+                                .getShortest());
+                        patsInsertIntoOrderGroupNo.setObject(4, "002");
+                        patsInsertIntoOrderGroupNo.setObject(5, "<");
+                        patsInsertIntoOrderGroupNo.setObject(6, ">=");
+                        patsInsertIntoOrderGroupNo.addBatch();
+                    }
+
+                    patsInsertIntoOrderGroupNo.executeBatch();
+                }
+                rs.close();
+                psta.close();
+
+            }
+
+            Integer UsedNum = 0;
+            Double UsedWt = 0d;
+            Double TWt = 0d;
+            Integer CurrentCount = 0;
+            PlnZyJgxCEntity CurrentJgxC = plnCs.get(CurrentCount);
+            Integer CanLoadNum = Integer.parseInt(CurrentJgxC
+                    .getPlanIndoubleNum().equals("") ? "0" : CurrentJgxC
+                    .getPlanIndoubleNum())
+                    - Integer.parseInt(CurrentJgxC.getRealIndoubleNum().equals(
+                            "") ? "0" : CurrentJgxC.getRealIndoubleNum());
+            Double CanLoadWt = Double.parseDouble(CurrentJgxC
+                    .getPlanIndoubleWt().equals("") ? "0" : CurrentJgxC
+                    .getPlanIndoubleWt())
+                    - Double
+                            .parseDouble(CurrentJgxC.getRealIndoubleWt()
+                                    .equals("") ? "0" : CurrentJgxC
+                                    .getRealIndoubleWt());
+
+            int CountInstorage = 0;
+
+            for (MatBcMEntity lvMat : listMat) {
+
+                /*if (!"002023005".equals(lvMat.getBelongCode())
+                        && "C092".equals(pln.getPlineCode())) {
+                    core.setV_errMsg("管所属权不属于天淮,不允许上料!清确认管是否倒运至天淮!");
+                    return core;
+                }*/
+
+                if (lvMat.getStorageNo().equals("")) {
+                    core.setV_errMsg("库存正在倒运中,无法上料!");
+                    return core;
+                }
+
+                if (!lvMat.getStorageNo().equals(StorageNo)) {
+                    if (pln.getIsLoadFlag().equals("1")) {
+
+                        String deleteYdmBack = CoreXmlSqlParsersFactory
+                                .getSql("FrmMcpLoading.deleteYdmBack");//
+                        PreparedStatement patsdeleteYdmBack = connection
+                                .prepareStatement(deleteYdmBack);
+
+                        patsdeleteYdmBack.setObject(1, pln.getPlineCode());
+                        patsdeleteYdmBack.setObject(2, lvMat.getMatNo());
+                        patsdeleteYdmBack.executeUpdate();
+                        patsdeleteYdmBack.close();
+
+                        // 上料炉号和判定炉号不一致 改成保存判定炉号的位置信息
+                        String insertYdmBack = CoreXmlSqlParsersFactory
+                                .getSql("FrmMcpLoading.insertYdmBack");//
+                        PreparedStatement patsinsertYdmBack = connection
+                                .prepareStatement(insertYdmBack);
+                        patsinsertYdmBack.setObject(1, pln.getPlineCode());
+                        patsinsertYdmBack.setObject(2, lvMat.getMatNo());
+                        patsinsertYdmBack.executeUpdate();
+                        patsinsertYdmBack.close();
+
+                    } else {
+
+                        if (CountInstorage == 0) {
+                            core.setV_errMsg("库存未在投料库,无法上料");
+                            return core;
+                        } else {
+                            core.setV_errMsg("只有" + CountInstorage
+                                    + "支在投料库 ,无法上足" + count + "支");
+                            return core;
+                        }
+                    }
+
+                }
+                CountInstorage++;
+
+                if ("1".equals(lvMat.getLockFlag())) {
+                    core.setV_errMsg("库存存在质量封锁料,无法上足" + count + "支");
+                    return core;
+                }
+
+                if ("1".equals(lvMat.getMngLockFlag())) {
+                    core.setV_errMsg("库存存在管理封锁料,无法上足" + count + "支");
+                    return core;
+                }
+
+                while (UsedNum >= CanLoadNum) {
+                    patupdate.setObject(1, UsedNum);
+                    patupdate.setObject(2, UsedWt);
+                    patupdate.setObject(3, pln.getHeatPlanNo());
+                    patupdate.setObject(4, CurrentJgxC.getHeatPlanSqe());
+                    patupdate.addBatch();
+
+                    CurrentCount++;
+
+                    if (CurrentCount >= plnCs.size()) {
+                        core.setV_errMsg("上料支超过排产支!");
+                        return core;
+                    }
+
+                    CurrentJgxC = plnCs.get(CurrentCount);
+                    CanLoadNum = Integer.parseInt(CurrentJgxC
+                            .getPlanIndoubleNum().equals("") ? "0"
+                            : CurrentJgxC.getPlanIndoubleNum())
+                            - Integer.parseInt(CurrentJgxC.getRealIndoubleNum()
+                                    .equals("") ? "0" : CurrentJgxC
+                                    .getRealIndoubleNum());
+
+                    UsedNum = 0;
+                    UsedWt = 0d;
+                }
+
+                patsport.setObject(1, Result.getCreatetUser());
+                patsport.setObject(2, Result.getLoadShift());
+                patsport.setObject(3, Result.getLoadGroup());
+                patsport.setObject(4, pln.getFeedHeatNo());
+                patsport.setObject(5, CurrentJgxC.getHeatPlanSqe());
+                patsport.setObject(6, BalYearMothDay);
+                patsport.setObject(7, BalYearMoth);
+                patsport.setObject(8, lvMat.getMatNo());
+                patsport.setObject(9, pln.getHeatPlanNo());
+                patsport.addBatch();
+
+                UsedNum++;
+                UsedWt = UsedWt + Double.parseDouble(lvMat.getActWeight());
+                TWt = TWt + Double.parseDouble(lvMat.getActWeight());
+
+                // 新增出库表
+                patsAddOut.setObject(1, sendOut
+                        + StringTool.formatDecimal(outNo, "0000"));
+                patsAddOut.setObject(2, HeatPlanNo);
+                patsAddOut.setObject(3, sendOut);
+                patsAddOut.setObject(4, "800801");
+                patsAddOut.setObject(5, "投料出库");
+                patsAddOut.setObject(6, lvMat.getMatNo());
+                patsAddOut.setObject(7, lvMat.getJudgeStoveNo());
+                patsAddOut.setObject(8, lvMat.getBatchNo());
+                patsAddOut.setObject(9, lvMat.getBatchGroudNo());
+                patsAddOut.setObject(10, lvMat.getMaterialNo());
+                patsAddOut.setObject(11, lvMat.getMaterialName());
+                patsAddOut.setObject(12, lvMat.getProduccode());
+                patsAddOut.setObject(13, lvMat.getProducname());
+                patsAddOut.setObject(14, lvMat.getStdCode());
+                patsAddOut.setObject(15, lvMat.getStdName());
+                patsAddOut.setObject(16, lvMat.getGradecode());
+                patsAddOut.setObject(17, lvMat.getGradename());
+                patsAddOut.setObject(18, lvMat.getSteelcode());
+                patsAddOut.setObject(19, lvMat.getSteelname());
+                patsAddOut.setObject(20, lvMat.getStdStyle());
+                patsAddOut.setObject(21, lvMat.getStdStyleDesc());
+                patsAddOut.setObject(22, lvMat.getSpecCode());
+                patsAddOut.setObject(23, lvMat.getSpecName());
+                patsAddOut.setObject(24, lvMat.getModelCode());
+                patsAddOut.setObject(25, lvMat.getModelDesc());
+                patsAddOut.setObject(26, (lvMat.getPlineCode().equals("100101")
+                        || lvMat.getPlineCode().equals("100102") || lvMat
+                        .getPlineCode().equals("100103")) ? (lvMat
+                        .getProcessCdoe().equals("D") ? "C008" : lvMat
+                        .getProcessCdoe().equals("E") ? "C013" : lvMat
+                        .getProcessCdoe().equals("F") ? "C022" : lvMat
+                        .getProcessCdoe().equals("G") ? "C028" : "C041")
+                        : lvMat.getPlineCode());
+                patsAddOut.setObject(27, (lvMat.getPlineCode().equals("100101")
+                        || lvMat.getPlineCode().equals("100102") || lvMat
+                        .getPlineCode().equals("100103")) ? (lvMat
+                        .getProcessCdoe().equals("D") ? "250机组" : lvMat
+                        .getProcessCdoe().equals("E") ? "冷轧机组" : lvMat
+                        .getProcessCdoe().equals("F") ? "热处理01#(管加工1号热)"
+                        : lvMat.getProcessCdoe().equals("G") ? "加工线01#(管加工1#线)"
+                                : "接箍1(美国PMC1077)") : lvMat.getPlineName());
+                patsAddOut.setObject(28, lvMat.getActDimater());
+                patsAddOut.setObject(29, lvMat.getActHeight());
+                patsAddOut.setObject(30, String.valueOf(lvMat.getActLen()));
+                patsAddOut.setObject(31, lvMat.getActLenMin());
+                patsAddOut.setObject(32, lvMat.getActLenMax());
+                patsAddOut.setObject(33, String.valueOf(lvMat.getActCount()));
+                patsAddOut.setObject(34, String.valueOf(lvMat.getActWeight()));
+                patsAddOut.setObject(35, String.valueOf(lvMat
+                        .getActTheoryWeight()));
+                patsAddOut.setObject(36, lvMat.getBelongCode());
+                patsAddOut.setObject(37, lvMat.getBelongName());
+                patsAddOut.setObject(38, lvMat.getStorageNo());
+                patsAddOut.setObject(39, lvMat.getLocationNo());
+                patsAddOut.setObject(40, lvMat.getLaryNo());
+                patsAddOut.setObject(41, lvMat.getLocNo());
+                patsAddOut.setObject(42, lvMat.getStorageAttr());
+                patsAddOut.setObject(43, lvMat.getStorageAttrName());
+                patsAddOut.setObject(44, lvMat.getStorageTypeNo());
+                patsAddOut.setObject(45, lvMat.getStorageTypeName());
+                patsAddOut.setObject(46, lvMat.getManagementNo());
+                patsAddOut.setObject(47, lvMat.getManagementName());
+                patsAddOut.setObject(48, systime);
+                patsAddOut.setObject(49, lvMat.getProBc());
+                patsAddOut.setObject(50, lvMat.getProBz());
+                patsAddOut.setObject(51, systime);
+                patsAddOut.setObject(52, Result.getLoadShift());
+                patsAddOut.setObject(53, Result.getLoadGroup());
+                patsAddOut.setObject(54, Result.getCreatetUser());
+                patsAddOut.setObject(55, systime);
+                patsAddOut.setObject(56, lvMat.getOrdPk());
+                patsAddOut.setObject(57, lvMat.getOrdLnPk());
+                patsAddOut.setObject(58, lvMat.getOrdLnDlyPk());
+                patsAddOut.setObject(59, lvMat.getDepartmentCode());
+                patsAddOut.setObject(60, lvMat.getDepartmentDesc());
+                patsAddOut.setObject(61, lvMat.getOrderNo());
+                patsAddOut.setObject(62, lvMat.getOrderSeq());
+                patsAddOut.setObject(63, pln.getDeliveryNo());
+                patsAddOut.setObject(64, "801401");
+                patsAddOut.setObject(65, "80150105");
+                patsAddOut.setObject(66, lvMat.getJudgeStdCode());
+                patsAddOut.setObject(67, lvMat.getJudgeStdName());
+                patsAddOut.setObject(68, pln.getZyBatchId());
+                patsAddOut.setObject(69, lvMat.getStoveNo());
+                patsAddOut.setObject(70, Result.getPlineCode());
+                patsAddOut.setObject(71, Result.getPlineCode());
+                patsAddOut.setObject(72, pln.getOrderNo() + "/"
+                        + pln.getOrderSeq());
+                patsAddOut.setObject(73, BalYearMoth);
+                patsAddOut.setObject(74, lvMat.getProcessCdoe());
+                patsAddOut.setObject(75, lvMat.getProcessDesc());
+                patsAddOut.addBatch();
+                outNo++;
+
+                // 新增产权出库
+                patsAddOutlist.setObject(1, sendOutlist
+                        + StringTool.formatDecimal(outNolist, "0000"));
+                patsAddOutlist.setObject(2, HeatPlanNo);
+                patsAddOutlist.setObject(3, sendOutlist);
+                patsAddOutlist.setObject(4, "800809");
+                patsAddOutlist.setObject(5, "产权出库");
+                patsAddOutlist.setObject(6, lvMat.getMatNo());
+                patsAddOutlist.setObject(7, lvMat.getJudgeStoveNo());
+                patsAddOutlist.setObject(8, lvMat.getBatchNo());
+                patsAddOutlist.setObject(9, lvMat.getBatchGroudNo());
+                patsAddOutlist.setObject(10, lvMat.getMaterialNo());
+                patsAddOutlist.setObject(11, lvMat.getMaterialName());
+                patsAddOutlist.setObject(12, lvMat.getProduccode());
+                patsAddOutlist.setObject(13, lvMat.getProducname());
+                patsAddOutlist.setObject(14, lvMat.getStdCode());
+                patsAddOutlist.setObject(15, lvMat.getStdName());
+                patsAddOutlist.setObject(16, lvMat.getGradecode());
+                patsAddOutlist.setObject(17, lvMat.getGradename());
+                patsAddOutlist.setObject(18, lvMat.getSteelcode());
+                patsAddOutlist.setObject(19, lvMat.getSteelname());
+                patsAddOutlist.setObject(20, lvMat.getStdStyle());
+                patsAddOutlist.setObject(21, lvMat.getStdStyleDesc());
+                patsAddOutlist.setObject(22, lvMat.getSpecCode());
+                patsAddOutlist.setObject(23, lvMat.getSpecName());
+                patsAddOutlist.setObject(24, lvMat.getModelCode());
+                patsAddOutlist.setObject(25, lvMat.getModelDesc());
+                patsAddOutlist.setObject(26, (lvMat.getPlineCode().equals(
+                        "100101")
+                        || lvMat.getPlineCode().equals("100102") || lvMat
+                        .getPlineCode().equals("100103")) ? (lvMat
+                        .getProcessCdoe().equals("D") ? "C008" : lvMat
+                        .getProcessCdoe().equals("E") ? "C013" : lvMat
+                        .getProcessCdoe().equals("F") ? "C022" : lvMat
+                        .getProcessCdoe().equals("G") ? "C028" : "C041")
+                        : lvMat.getPlineCode());
+                patsAddOutlist.setObject(27, (lvMat.getPlineCode().equals(
+                        "100101")
+                        || lvMat.getPlineCode().equals("100102") || lvMat
+                        .getPlineCode().equals("100103")) ? (lvMat
+                        .getProcessCdoe().equals("D") ? "250机组" : lvMat
+                        .getProcessCdoe().equals("E") ? "冷轧机组" : lvMat
+                        .getProcessCdoe().equals("F") ? "热处理01#(管加工1号热)"
+                        : lvMat.getProcessCdoe().equals("G") ? "加工线01#(管加工1#线)"
+                                : "接箍1(美国PMC1077)") : lvMat.getPlineName());
+                patsAddOutlist.setObject(28, lvMat.getActDimater());
+                patsAddOutlist.setObject(29, lvMat.getActHeight());
+                patsAddOutlist.setObject(30, String.valueOf(lvMat.getActLen()));
+                patsAddOutlist.setObject(31, lvMat.getActLenMin());
+                patsAddOutlist.setObject(32, lvMat.getActLenMax());
+                patsAddOutlist.setObject(33, String
+                        .valueOf(lvMat.getActCount()));
+                patsAddOutlist.setObject(34, String.valueOf(lvMat
+                        .getActWeight()));
+                patsAddOutlist.setObject(35, String.valueOf(lvMat
+                        .getActTheoryWeight()));
+                patsAddOutlist.setObject(36, lvMat.getBelongCode());
+                patsAddOutlist.setObject(37, lvMat.getBelongName());
+                patsAddOutlist.setObject(38, lvMat.getStorageNo());
+                patsAddOutlist.setObject(39, lvMat.getLocationNo());
+                patsAddOutlist.setObject(40, lvMat.getLaryNo());
+                patsAddOutlist.setObject(41, lvMat.getLocNo());
+                patsAddOutlist.setObject(42, lvMat.getStorageAttr());
+                patsAddOutlist.setObject(43, lvMat.getStorageAttrName());
+                patsAddOutlist.setObject(44, lvMat.getStorageTypeNo());
+                patsAddOutlist.setObject(45, lvMat.getStorageTypeName());
+                patsAddOutlist.setObject(46, lvMat.getManagementNo());
+                patsAddOutlist.setObject(47, lvMat.getManagementName());
+                patsAddOutlist.setObject(48, systime);
+                patsAddOutlist.setObject(49, lvMat.getProBc());
+                patsAddOutlist.setObject(50, lvMat.getProBz());
+                patsAddOutlist.setObject(51, systime);
+                patsAddOutlist.setObject(52, Result.getLoadShift());
+                patsAddOutlist.setObject(53, Result.getLoadGroup());
+                patsAddOutlist.setObject(54, Result.getCreatetUser());
+                patsAddOutlist.setObject(55, systime);
+                patsAddOutlist.setObject(56, lvMat.getOrdPk());
+                patsAddOutlist.setObject(57, lvMat.getOrdLnPk());
+                patsAddOutlist.setObject(58, lvMat.getOrdLnDlyPk());
+                patsAddOutlist.setObject(59, lvMat.getDepartmentCode());
+                patsAddOutlist.setObject(60, lvMat.getDepartmentDesc());
+                patsAddOutlist.setObject(61, lvMat.getOrderNo());
+                patsAddOutlist.setObject(62, lvMat.getOrderSeq());
+                patsAddOutlist.setObject(63, pln.getDeliveryNo());
+                patsAddOutlist.setObject(64, "801401");
+                patsAddOutlist.setObject(65, "80150105");
+                patsAddOutlist.setObject(66, lvMat.getJudgeStdCode());
+                patsAddOutlist.setObject(67, lvMat.getJudgeStdName());
+                patsAddOutlist.setObject(68, pln.getZyBatchId());
+                patsAddOutlist.setObject(69, lvMat.getStoveNo());
+                patsAddOutlist.setObject(70, Result.getPlineCode());
+                patsAddOutlist.setObject(71, Result.getPlineCode());
+                patsAddOutlist.setObject(72, pln.getOrderNo() + "/"
+                        + pln.getOrderSeq());
+                patsAddOutlist.setObject(73, BalYearMoth);
+                patsAddOutlist.setObject(74, lvMat.getProcessCdoe());
+                patsAddOutlist.setObject(75, lvMat.getProcessDesc());
+                if (!pln.getIfMatchOdd().equals("6"))
+                    patsAddOutlist.addBatch();
+
+                outNolist++;
+                // 修改库存状态
+                patsUpMat.setObject(1, "80150105");
+                patsUpMat.setObject(2, lvMat.getMatNo());
+                patsUpMat.addBatch();
+                // 删除位置表
+                patsButt.setObject(1, lvMat.getMatNo());
+                patsButt.addBatch();
+                // 把物料主表复制到List表
+                patsMat.setObject(1, lvMat.getMatNo());
+                patsMat.addBatch();
+                // 删除物料主表
+                deteleBcMatPath.setObject(1, lvMat.getMatNo());
+                deteleBcMatPath.addBatch();
+            }
+
+            patupdate.setObject(1, UsedNum);
+            patupdate.setObject(2, UsedWt);
+            patupdate.setObject(3, pln.getHeatPlanNo());
+            patupdate.setObject(4, CurrentJgxC.getHeatPlanSqe());
+            patupdate.addBatch();
+
+            patsport.executeBatch();
+            patsAddOut.executeBatch();
+            patsAddOutlist.executeBatch();
+            patsUpMat.executeBatch();
+            patsButt.executeBatch();
+            patsMat.executeBatch();
+            deteleBcMatPath.executeBatch();
+
+            Result.setOutstockDoc(sendOut);
+
+            // 新增上料实绩
+            patAdd.setObject(1, resultNo);
+            patAdd.setObject(2, Result.getZyBatchId());
+            patAdd.setObject(3, pln.getProPlanId());
+            patAdd.setObject(4, pln.getGxPlanNo());
+            patAdd.setObject(5, Result.getProNum());
+            patAdd.setObject(6, TWt);
+            patAdd.setObject(7, Result.getFailNum());
+            patAdd.setObject(8, Result.getFailWt());
+            patAdd.setObject(9, "");
+            patAdd.setObject(10, "");
+            patAdd.setObject(11, "");
+            patAdd.setObject(12, "");
+            patAdd.setObject(13, Result.getLoadTime());
+            patAdd.setObject(14, Result.getLoadShift());
+            patAdd.setObject(15, Result.getLoadGroup());
+            patAdd.setObject(16, "1");
+            patAdd.setObject(17, Result.getPlineCode());
+            patAdd.setObject(18, Result.getPlineName());
+            patAdd.setObject(19, Result.getHeatPlanNo());
+            patAdd.setObject(20, systime);
+            patAdd.setObject(21, Result.getProducer());
+            if (Result.getProducer().equals("")) {
+                patAdd.setObject(22, "");
+            } else {
+                patAdd.setObject(22, Result.getProducerTime());
+            }
+            patAdd.setObject(23, Result.getCreatetUser());
+            patAdd.setObject(24, Result.getOutnumCut());
+            patAdd.setObject(25, Result.getLengthIn());
+            patAdd.setObject(26, Result.getLengthmaxIn());
+            patAdd.setObject(27, Result.getLengthminIn());
+            patAdd.setObject(28, sendOut);
+            patAdd.setObject(29, Result.getJudgeStoveNo());
+            patAdd.setObject(30, Result.getBatchNo());
+            patAdd.setObject(31, Result.getBatchGroudNo());
+            patAdd.setObject(32, Result.getHeatPlanSqe());
+            patAdd.setObject(33, Result.getMatSource());
+            patAdd.setObject(34, BalYearMothDay);
+            patAdd.setObject(35, BalYearMoth);
+            patAdd.addBatch();
+
+            // 新增加工公共信息
+            patsPlan.setObject(1, resultNo);
+            patsPlan.setObject(2, pln.getZyBatchId());
+            patsPlan.setObject(3, "");
+            patsPlan.setObject(4, pln.getProPlanId());
+            patsPlan.setObject(5, pln.getGxPlanNo());
+            patsPlan.setObject(6, pln.getOrderSource());
+            patsPlan.setObject(7, pln.getOrderNo());
+            patsPlan.setObject(8, pln.getOrderSeq());
+            patsPlan.setObject(9, pln.getReqBlId());
+            patsPlan.setObject(10, pln.getPlineCode());
+            patsPlan.setObject(11, pln.getPlineName());
+            patsPlan.setObject(12, gx);
+            patsPlan.setObject(13, gx);
+            patsPlan.setObject(14, "");
+            patsPlan.setObject(15, "");
+            patsPlan.setObject(16, pln.getSteelcode());
+            patsPlan.setObject(17, pln.getSteelname());
+            patsPlan.setObject(18, pln.getOutdiameter());
+            patsPlan.setObject(19, pln.getWallthick());
+            patsPlan.setObject(20, "");
+            patsPlan.setObject(21, "");
+            patsPlan.setObject(22, "");
+            patsPlan.setObject(23, "");
+            patsPlan.setObject(24, "");
+            patsPlan.setObject(25, "");
+            patsPlan.setObject(26, "");
+            patsPlan.setObject(27, "");
+            patsPlan.setObject(28, pln.getOutwlId());
+            patsPlan.setObject(29, pln.getOutwlDesc());
+            patsPlan.setObject(30, pln.getInwlId());
+            patsPlan.setObject(31, pln.getInwlDesc());
+            patsPlan.setObject(32, pln.getMonitorPoint());
+            patsPlan.setObject(33, Result.getIfMonitorRcl());
+            patsPlan.setObject(34, pln.getPrdcrNo());
+            patsPlan.setObject(35, Result.getProducer());
+            if (Result.getProducer().equals("")) {
+                patsPlan.setObject(36, "");
+            } else {
+                patsPlan.setObject(36, Result.getProducerTime());
+            }
+            patsPlan.setObject(37, pln.getStationRoad());
+            patsPlan.setObject(38, pln.getCraftFileNo());
+            patsPlan.setObject(39, pln.getCraftFileMan());
+            patsPlan.setObject(40, pln.getCraftSeq());
+            patsPlan.setObject(41, Result.getProNum());
+            patsPlan.setObject(42, TWt);
+            patsPlan.setObject(43, Result.getFailNum());
+            patsPlan.setObject(44, Result.getFailWt());
+            patsPlan.setObject(45, Result.getOfflineNum());
+            patsPlan.setObject(46, Result.getOfflineWt());
+            patsPlan.setObject(47, Result.getReNum());
+            patsPlan.setObject(48, Result.getReWt());
+            patsPlan.setObject(49, "1");
+            patsPlan.setObject(50, Result.getLoadTime());
+            patsPlan.setObject(51, "");
+            patsPlan.setObject(52, Result.getLoadShift());
+            patsPlan.setObject(53, Result.getLoadGroup());
+            patsPlan.setObject(54, "1");
+            patsPlan.setObject(55, Result.getCreateTime());
+            patsPlan.setObject(56, Result.getCreatetUser());
+            patsPlan.setObject(57, pln.getHeatPlanNo());
+            patsPlan.setObject(58, pln.getJudgeStoveNo());
+            patsPlan.setObject(59, Result.getBatchNo());
+            patsPlan.setObject(60, Result.getBatchGroudNo());
+            patsPlan.setObject(61, pln.getProduccode());
+            patsPlan.setObject(62, pln.getProducname());
+            patsPlan.setObject(63, Result.getOutnumCut());
+            patsPlan.setObject(64, pln.getSpecCode());
+            patsPlan.setObject(65, pln.getSpecName());
+            patsPlan.addBatch();
+
+            // 修改计划主表状态
+            patupdatepln.setObject(1, "20");
+            patupdatepln.setObject(2, "00");
+            patupdatepln.setObject(3, HeatPlanNo);
+            patupdatepln.addBatch();
+
+            patupdate2.setObject(1, "00");
+            patupdate2.setObject(2, pln.getHeatPlanNo());
+            patupdate2.setObject(3, Result.getBatchNo());
+            patupdate2.addBatch();
+
+            patAdd.executeBatch();
+            patsPlan.executeBatch();
+            patupdate.executeBatch();
+            patupdate2.executeBatch();
+            patupdatepln.executeBatch();
+
+            FrmMchBugD.AddMchWaste(connection, HeatPlanNo, resultNo, Result
+                    .getPlineCode(), Result.getCreatetUser(), gx,
+                    SuspiciousList, ScrappedList);
+
+            // 更新运输需求上料时间
+            FrmVrpInStore frmVrpInStore = new FrmVrpInStore();
+             //  TZH 24.4.24 注销物流接口
+//            frmVrpInStore.updateTmsDemandMLoadTime(connection, connection2,
+//                    core, HeatPlanNo, "G");
+            if (core.getV_errMsg().equals("")) {
+                core.setV_errMsg("上料成功!");
+            }
+
+            // 财务系统接口数据处理
+            // FmisTool.addBcOutList(connection,core,HeatPlanNo,resultNo,"G");
+
+            core.setResult(1);
+            connection.commit();
+             //  TZH 24.4.24 注销物流接口
+//            connection2.commit();
+        } catch (Exception e) {
+            core.setV_errMsg(e.getMessage());
+            if (connection != null) {
+                try {
+                    connection.rollback(); // 回滚事务
+                     //  TZH 24.4.24 注销物流接口
+//                    connection2.rollback(); // 回滚事务
+                } catch (Exception e2) {
+                }
+            }
+             //  TZH 24.4.24 注销物流接口
+//            if (connection2 != null) {
+//                try {
+//                    connection.rollback(); // 回滚事务
+//                    connection2.rollback(); // 回滚事务
+//                } catch (Exception e2) {
+//                }
+//            }
+        } finally {
+            try {
+                if (connection != null && !connection.isClosed()) {
+                    connection.close();
+                }
+                 //  TZH 24.4.24 注销物流接口
+//                if (connection2 != null && !connection2.isClosed()) {
+//                    connection2.close();
+//                }
+            } catch (Exception e2) {
+            }
+        }
+        return core;
+    }
+```
+
+先不忙说长度,我们聊聊滥用事务
+
+```java
+            core.setResult(1);
+            connection.commit();
+             //  TZH 24.4.24 注销物流接口
+//            connection2.commit();
+        } catch (Exception e) {
+            core.setV_errMsg(e.getMessage());
+            if (connection != null) {
+                try {
+                    connection.rollback(); // 回滚事务
+                     //  TZH 24.4.24 注销物流接口
+//                    connection2.rollback(); // 回滚事务
+                } catch (Exception e2) {
+                }
+            }
+             //  TZH 24.4.24 注销物流接口
+//            if (connection2 != null) {
+//                try {
+//                    connection.rollback(); // 回滚事务
+//                    connection2.rollback(); // 回滚事务
+//                } catch (Exception e2) {
+//                }
+//            }
+        } finally {
+            try {
+                if (connection != null && !connection.isClosed()) {
+                    connection.close();
+                }
+                 //  TZH 24.4.24 注销物流接口
+//                if (connection2 != null && !connection2.isClosed()) {
+//                    connection2.close();
+//                }
+            } catch (Exception e2) {
+            }
+        }
+        return core;
+```
+
+> 1、明显采取隐藏事务方式
+> 
+> 2、也就是说,他们任意请求抬手就是事务
+> 
+> 3、异常随意丢弃
+
+ 我们再来聊聊魔法参数
+
+```java
+String sqlupdate2 = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.updatePlnZyRclM2");// 修改加工计划表从表的实际上料支吨
+            PreparedStatement patupdate2 = connection
+                    .prepareStatement(sqlupdate2);
+
+            String sqlupdatepln = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.updatePlnZyRclMpln");// 修改加工计划表
+            PreparedStatement patupdatepln = connection
+                    .prepareStatement(sqlupdatepln);
+            String addPlnInfo = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.AddComInfoResult");// 新增公共信息
+            PreparedStatement patsPlan = connection
+                    .prepareStatement(addPlnInfo);
+            String deleteButt = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.deleteButter");// 删除位置表
+            PreparedStatement patsButt = connection
+                    .prepareStatement(deleteButt);
+            String updateMat = CoreXmlSqlParsersFactory
+                    .getSql("FrmMcpLoading.updateMatZcPlan");// 修改库存状态
+            PreparedStatement patsUpMat = connection
+                    .prepareStatement(updateMat);
+```
+
+其中
+
+PreparedStatement patupdatepln = connection  
+       .prepareStatement(sqlupdatepln);
+
+就是定义一个带参数的请求的参数。
+
+```java
+// 新增加工公共信息
+            patsPlan.setObject(1, resultNo);
+            patsPlan.setObject(2, pln.getZyBatchId());
+            patsPlan.setObject(3, "");
+            patsPlan.setObject(4, pln.getProPlanId());
+            patsPlan.setObject(5, pln.getGxPlanNo());
+            patsPlan.setObject(6, pln.getOrderSource());
+            patsPlan.setObject(7, pln.getOrderNo());
+            patsPlan.setObject(8, pln.getOrderSeq());
+            patsPlan.setObject(9, pln.getReqBlId());
+            patsPlan.setObject(10, pln.getPlineCode());
+            patsPlan.setObject(11, pln.getPlineName());
+            patsPlan.setObject(12, gx);
+            patsPlan.setObject(13, gx);
+            patsPlan.setObject(14, "");
+            patsPlan.setObject(15, "");
+            patsPlan.setObject(16, pln.getSteelcode());
+            patsPlan.setObject(17, pln.getSteelname());
+            patsPlan.setObject(18, pln.getOutdiameter());
+            patsPlan.setObject(19, pln.getWallthick());
+            patsPlan.setObject(20, "");
+            patsPlan.setObject(21, "");
+            patsPlan.setObject(22, "");
+            patsPlan.setObject(23, "");
+            patsPlan.setObject(24, "");
+            patsPlan.setObject(25, "");
+            patsPlan.setObject(26, "");
+            patsPlan.setObject(27, "");
+            patsPlan.setObject(28, pln.getOutwlId());
+            patsPlan.setObject(29, pln.getOutwlDesc());
+            patsPlan.setObject(30, pln.getInwlId());
+            patsPlan.setObject(31, pln.getInwlDesc());
+            patsPlan.setObject(32, pln.getMonitorPoint());
+            patsPlan.setObject(33, Result.getIfMonitorRcl());
+            patsPlan.setObject(34, pln.getPrdcrNo());
+            patsPlan.setObject(35, Result.getProducer());
+            if (Result.getProducer().equals("")) {
+                patsPlan.setObject(36, "");
+            } else {
+                patsPlan.setObject(36, Result.getProducerTime());
+            }
+            patsPlan.setObject(37, pln.getStationRoad());
+            patsPlan.setObject(38, pln.getCraftFileNo());
+            patsPlan.setObject(39, pln.getCraftFileMan());
+            patsPlan.setObject(40, pln.getCraftSeq());
+            patsPlan.setObject(41, Result.getProNum());
+            patsPlan.setObject(42, TWt);
+            patsPlan.setObject(43, Result.getFailNum());
+            patsPlan.setObject(44, Result.getFailWt());
+            patsPlan.setObject(45, Result.getOfflineNum());
+            patsPlan.setObject(46, Result.getOfflineWt());
+            patsPlan.setObject(47, Result.getReNum());
+            patsPlan.setObject(48, Result.getReWt());
+            patsPlan.setObject(49, "1");
+            patsPlan.setObject(50, Result.getLoadTime());
+            patsPlan.setObject(51, "");
+            patsPlan.setObject(52, Result.getLoadShift());
+            patsPlan.setObject(53, Result.getLoadGroup());
+            patsPlan.setObject(54, "1");
+            patsPlan.setObject(55, Result.getCreateTime());
+            patsPlan.setObject(56, Result.getCreatetUser());
+            patsPlan.setObject(57, pln.getHeatPlanNo());
+            patsPlan.setObject(58, pln.getJudgeStoveNo());
+            patsPlan.setObject(59, Result.getBatchNo());
+            patsPlan.setObject(60, Result.getBatchGroudNo());
+            patsPlan.setObject(61, pln.getProduccode());
+            patsPlan.setObject(62, pln.getProducname());
+            patsPlan.setObject(63, Result.getOutnumCut());
+            patsPlan.setObject(64, pln.getSpecCode());
+            patsPlan.setObject(65, pln.getSpecName());
+            patsPlan.addBatch();
+```
+
+魔法赋值,如果错一个位置,整个sql无效
+
+#### 我们来看看他的魔法sql
+
+```xml
+    <query id="FrmMcpLoading.AddComInfoResult" desc=" 新增公共信息">
+        <![CDATA[ 
+        INSERT INTO MCH_COM_INFO (RESULT_NO, ZY_BATCH_ID,PROD_INDEX,PRO_PLAN_ID, 
+  GX_PLAN_NO, ORDER_SOURCE, ORDER_NO, ORDER_SEQ, REQ_BL_ID, PLINE_CODE, 
+  PLINE_NAME, STATION_CODE, STATION_DESC, GRADECODE, GRADENAME, STEELCODE, 
+  STEELNAME, DIMATER, HEIGHT, ACT_DIMATER, ACT_SPEC_CODE, ACT_SPEC_NAME, LEN, ACT_LEN_MIN, 
+  ACT_LEN_MAX, LEN_CUT_HEAD, LEN_CUT_END, ACT_MATERIAL_NO, ACT_MATERIAL_NAME, INWL_ID, INWL_DESC, 
+  MONITOR_POINT, IF_MONITOR_MCH, PRDCR_NO, PRODUCER, PRODUCER_TIME, STATION_ROAD, 
+  CRAFT_FILE_NO, CRAFT_FILE_MAN, CRAFT_SEQ, PRO_NUM, PRO_WT, FAIL_NUM, FAIL_WT, 
+  OFFLINE_NUM, OFFLINE_WT, RE_NUM, RE_WT, STATION_STATUS, RRO_TIME, RRO_TIME_NU, 
+   PRO_SHIFT, PRO_GROUP, VALIDFLAG, CREATE_TIME, COL_OPERATOR, 
+  HEAT_PLAN_NO,JUDGE_STOVE_NO,BATCH_NO,BATCH_GROUD_NO,
+  PRODUCCODE,PRODUCNAME,OUTNUM_CUT,SPEC_CODE,SPEC_NAME) VALUES (?, ?, ?, ?, ?,?, ?, ?, ?, ?, ?, ?, (SELECT T.BASENAME FROM COM_BASE_INFO T WHERE T.BASECODE = ?), ?, ?, ?, ?, ?, ?, 
+  ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, TO_DATE(?,'YYYY-MM-DD HH24:MI:SS'), 
+  ?, ?, ?, ?, ?, ?,?, ?, ?, ?, ?, ?, ?, TO_DATE(?,'YYYY-MM-DD HH24:MI:SS'), 
+  ?, ?, ?, ?, TO_DATE(?,'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, ?,?,?,?) 
+        ]]>
+    </query>
+```
+
+> 1、query标签里放insert就是常规操作
+> 
+> 2、并非mybatis框架
+> 
+> 3、sql里满是问号。随便动几个问号就会引起维护不走
+
+## 总结
+
+以上只是该系统里最简单的插入业务

BIN
规划/项目复杂度理解资源/ScreenShot_2026-02-25_151229_884.png


BIN
规划/项目复杂度理解资源/ScreenShot_2026-02-25_151446_072.png


BIN
规划/项目复杂度理解资源/ScreenShot_2026-02-25_152027_078.png